2

我是 Selenium 的新手,我尝试单击第二页上的链接(在登录页面之后)。登录部分有效,浏览器转到下一页,但是在下一页它引发异常:

这是我的回溯:

Traceback (most recent call last):
  File "d:/Personal_projects/Programmeren/Python/Automate the boring stuff/Chapter12/seleniumTest.py", line 22, in <module>
    weekElem = browser.find_element(By.PARTIAL_LINK_TEXT,'/go/')
  File "C:\Users\****\AppData\Roaming\Python\Python37\site-packages\selenium\webdriver\remote\webdriver.py", line 1246, in find_element
    'value': value})['value']
  File "C:\Users\****\AppData\Roaming\Python\Python37\site-packages\selenium\webdriver\remote\webdriver.py", line 424, in execute
    self.error_handler.check_response(response)
  File "C:\Users\****\AppData\Roaming\Python\Python37\site-packages\selenium\webdriver\remote\errorhandler.py", line 247, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"partial link text","selector":"/go/"}
  (Session info: chrome=96.0.4664.93)

这是我的代码(登录信息明显模糊):

#! python3

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

import time
browser = webdriver.Chrome()

# First webpage
browser.get('https://www.signupgenius.com/register')
userElem = browser.find_element(By.ID,'email')
userElem.send_keys('************')
passwordElem = browser.find_element(By.ID,'pword')
passwordElem.send_keys('**********')
loginBtnElem = browser.find_element(By.ID,'loginBtnId')
loginBtnElem.click()
time.sleep(10)

# Second  webpage
weekElem = browser.find_element(By.PARTIAL_LINK_TEXT,'/go/')
weekElem.click()

我正在寻找的元素是:

<a href="/go/10C426245672F85" class="text-orange text-underlined"><strong class="ng-binding">1212</strong></a>

(/go/ 之后的部分每周都会更改,这就是我使用 Partial Link Text 的原因)

我希望有人能帮我解决这个问题!

编辑我找到了修复,通过使用 Xpath 解决了问题:

weekElem = browser.find_element(By.XPATH, '//a[contains(@href,"/go/")]')

如果有人能详细说明为什么部分链接文本不起作用,那会让我更深入地了解 Selenium 的工作原理!

4

1 回答 1

0

字符串go不是A标记的LINK_TEXT的一部分。相反,它是属性值的一部分。因此,您不能将go用作PARTIAL_LINK_TEXThref


解决方案

您可以使用字符串go作为href属性值的一部分,如下所示:

  • 使用starts-with()

    weekElem = browser.find_element(By.XPATH, '//a[starts-with(@href,"/go/")]/strong')
    
  • 使用contains()

    weekElem = browser.find_element(By.XPATH, '//a[contains(@href,"/go/")]/strong')
    
于 2021-12-11T22:29:00.213 回答