我正在使用带有 selenium webdriver 的 python 单元测试库 (unittest)。我正在尝试按其名称查找元素。大约有一半的时间,测试会抛出 NoSuchElementException,而其他时候则不会抛出异常。
我想知道它是否与硒网络驱动程序没有等待足够长的时间来加载页面有关。
driver = webdriver.WhatEverBrowser()
driver.implicitly_wait(60) # This line will cause it to search for 60 seconds
它只需要在您的代码中插入一次(我通常在创建 webdriver 对象后立即执行)
例如,如果您的页面由于某种原因需要 30 秒来加载(购买新服务器),并且该元素是页面上最后显示的内容之一,那么它几乎只是一遍又一遍地检查,如果元素存在 60 秒,然后如果它没有找到它,它会抛出异常。
还要确保您的范围是正确的,即:如果您专注于一个框架,并且您要查找的元素不在该框架中,它将不会找到它。
我也看到了。我要做的就是等待它...
你可以试试:
while True:
try:
x = driver.find_by_name('some_name')
break
except NoSuchElementException:
time.sleep(1)
# possibly use driver.get() again if needed
另外,尝试将您的硒更新到最新版本pip install --update selenium
我把钱放在了框架上,因为我以前遇到过类似的问题:)
再次检查您的 html 并检查您是否正在处理框架。如果是那么切换到正确的框架将能够定位元素。
Python
driver.switch_to_frame("frameName")
然后搜索元素。
如果没有,请尝试按照其他人的建议设置等待时间。
处理等待元素出现的一种方法是这样的:
import selenium.webdriver.support.ui as ui
wait = ui.WebDriverWait(driver,10)
wait.until(lambda driver: driver.find_by_name('some_name') )
elem = driver.find_by_name('some_name')
您是正确的,webdriver 没有等待页面加载,没有内置的默认等待driver.get()
。
要解决此查询,您必须定义显式等待。这样在页面加载之前它不会搜索任何 WebElement。下面的 url 帮助。 http://docs.seleniumhq.org/docs/04_webdriver_advanced.jsp
我觉得可能是同步问题(即 webdriver 速度和应用程序速度不匹配)
使用隐式等待:
driver.manage.timeouts.implicitlyWait(9000 TIMEUNITS.miliseconds)
你需要有一个 waitUntil (你的元素加载)。如果您确定您的元素最终会出现在页面上,这将确保只有在您的预期元素加载后才会发生验证。