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
,则会得到相同的结果。
我的观点是,有时候点击一个元素后,由于代理程序错误导致页面加载可能需要几个小时,而你显然不要想要等待那么久,你想要的是超时异常。在这种情况下,你会如何使它工作?
答案 0 :(得分:4)
Clicks内置了一个隐式等待,等待加载页面。有一些工作,目前仅在FirefoxDriver中完成,允许您设置Selenium等待页面加载的时间。
这可能是在Selenium 2.22 for Python中,然后你的测试用例一旦设置就可能失败
答案 1 :(得分:0)
webdriver wait上的Until方法忽略指定的元素未找到的异常以及在指定的条件中发生的其他异常。在给定的时间之后,如果你没有元素存在,那么你最初会得到一个没有这样的元素异常,如果你处理'no such element'异常(最好是在try catch中),那么就会出现超时异常。
根据您的需要,您可以尝试以这种方式开展工作 -
- >将焦点置于按钮之后,页面加载 - >使用java代码触发单击(不是webdriver。因为点击将等待下一页加载。) - >把thread.sleep放一两秒 - >检查元素的偏好。