【发布时间】:2013-05-20 07:28:55
【问题描述】:
我正在使用带有 selenium webdriver 的 python 单元测试库 (unittest)。我正在尝试按其名称查找元素。大约有一半的时间,测试会抛出 NoSuchElementException,而其他时候则不会抛出异常。
我想知道这是否与 selenium webdriver 没有等待足够长的时间来加载页面有关。
【问题讨论】:
我正在使用带有 selenium webdriver 的 python 单元测试库 (unittest)。我正在尝试按其名称查找元素。大约有一半的时间,测试会抛出 NoSuchElementException,而其他时候则不会抛出异常。
我想知道这是否与 selenium webdriver 没有等待足够长的时间来加载页面有关。
【问题讨论】:
我也看到了。我所做的就是等待它......
你可以试试:
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 将您的 selenium 更新到最新版本
【讨论】:
处理等待元素出现的一种方法如下:
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()。
【讨论】:
driver = webdriver.WhatEverBrowser()
driver.implicitly_wait(60) # This line will cause it to search for 60 seconds
它只需要在你的代码中插入一次(我通常在创建 webdriver 对象后立即执行)
例如,如果您的页面由于某种原因需要 30 秒才能加载(购买新服务器),并且该元素是页面上最后显示的内容之一,它几乎只是一遍又一遍地检查再次,如果元素存在 60 秒,那么如果它没有找到它,它会抛出异常。
还要确保您的范围是正确的,即:如果您专注于一个框架,并且您要查找的元素不在该框架中,它将不会找到它。
【讨论】:
driver.get() 是阻塞操作; webdriver 浏览器插件不会响应调用客户端(以您选择的语言绑定),直到驱动程序确定页面已完全加载,基本上是在所有 GET 已返回并且 DOM 完成时。但是,如果您有异步内容(在初始页面加载完成后修改 DOM 的 JS 等),您可能需要等待一个元素,因为它不会在初始完成的 DOM 中。设置全局隐式等待是一种快速解决方法,但如果测试运行时对您很重要,它可能会产生负面影响。
我把钱放在了框架上,因为我以前遇到过类似的问题 :)
再次检查您的 html 并检查您是否正在处理框架。如果是那么切换到正确的框架将能够定位元素。
Python
driver.switch_to_frame("frameName")
然后搜索元素。
如果没有,请尝试按照其他人的建议设置等待时间。
【讨论】:
要解决此查询,您必须定义显式等待。这样在页面加载之前它不会搜索任何 WebElement。 下面的 url 帮助。 http://docs.seleniumhq.org/docs/04_webdriver_advanced.jsp
【讨论】:
你需要有一个 waitUntil (你的元素加载)。如果您确定您的元素最终会出现在页面上,这将确保只有在您预期的元素加载后才会进行验证。
【讨论】:
我觉得可能是同步问题(即 webdriver 速度和应用程序速度不匹配)
使用隐式等待:
driver.manage.timeouts.implicitlyWait(9000 TIMEUNITS.miliseconds)
【讨论】: