7
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait

browser = webdriver.Firefox()

browser.get("http://testsite.com")

element = WebDriverWait(browser, 10).until(lambda browser : browser.find_element_by_id("element"))

element.click() # it actually goes to page http://testsite.com/test-page.html

print "Just clicked! And I'm expecting timeout error!"

new_element = WebDriverWait(browser, 0.1).until(lambda browser : browser.find_element_by_id("element"))

print "Too bad there's no timeout error, why?!"

好的,正如您所看到的,即使我将等待时间设置为 0.1 秒,仍然没有抛出超时异常。执行时element.click()它不会阻塞,直到整个页面加载,这就是Just clicked! And I'm expecting timeout error!出现的原因,令我惊讶new_element = WebDriverWait(browser, 0.1).until(lambda browser : browser.find_element_by_id("element"))的是等到整个页面加载。如果你使用implicit waits,你会得到相同的结果。

我的观点是,有时在您单击一个元素后,由于代理错误,页面加载可能需要几个小时,而且您显然不想等待那么久,您想要的是超时异常。在这种情况下,您将如何使其工作?

4

2 回答 2

4

单击具有内置的隐式等待,以等待页面加载。目前仅在 FirefoxDriver 中完成的工作允许您设置 Selenium 等待页面加载的时间。

这可能会在 Python 的 Selenium 2.22 中,然后一旦设置,您的测试用例可能会失败

于 2012-05-25T15:26:56.463 回答
0

webdriver wait 上的 Until 方法在您指定的时间段内忽略在您指定的条件下发生的元素未找到异常和其他异常。在给定的时间之后,如果您不存在该元素,您最初会得到一个 no such element 异常,然后如果您处理“no such element”异常(最好是在 try catch 中),则会出现超时异常。

根据您的需要,您可以尝试以这种方式解决 -

-> 将焦点放在加载页面后的按钮上 -> 使用 java 代码触发点击(不是 webdriver。因为点击将等待下一页加载。) -> 放置一个 thread.sleep 秒或二 -> 检查元素的存在。

于 2012-05-26T10:00:39.097 回答