2012-05-25 41 views
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,你会得到相同的结果。告诉我为什么这不会以超时错误结束(selenium 2 webdriver)?

我的意思是,你点击一个元素有时后可能需要长达甚至几个小时的页面加载,因为一个坏的代理了,你显然不要要等那么久,你想要的是超时异常。在这种情况下,你如何使它工作?

回答

4

点击有一个隐含的等待内置到他们等待页面加载时等待。目前只有FirefoxDriver完成了这项工作,它允许您设置Selenium等待页面加载的时间。

这可能会在硒2.22 Python的,然后你的测试情况很可能会失败,一旦它被设置

+0

我不完全明白你的意思。你能否更具体一些,我该怎么做? – Shane

+0

...升级到2.22后,我意识到我无意中依赖这种隐含的等待的所有地方。 XD – Isaac

+0

我不认为这是正确的。你正在讨论driver.set_page_load_timeout()我相信,但是这并不需要点击。并非所有的点击都会触发页面加载。页面加载超时仅用于页面加载。发问者在简单查找元素时也遇到了超时问题(不需要参与点击)。 – Purrell

0

的,直到webdriver的wait方法忽略了元素未发现异常及其他异常,其occures在条件你在您指定的时间段内指定。在给定的时间之后,如果你没有这个元素,并且如果你处理'no such element'异常(最好在try catch中),那么你最初会得到一个没有这样的元素异常。

您的需求,您可以尝试解决此一工作way-

- >把焦点到按钮后,其中有一个页面加载 - >火java代码的点击(不是因为的webdriver点击。将等待下一页加载。) - >将thread.sleep放置第二个或两个 - >检查元素的上限。

+0

不知道它如何与python一起工作。但多数民众赞成在..如何去.. – QVSJ

+0

我完全理解你的工作,谢谢队友!但是从我看到的问题来看,也有一种生活在browser.find_element_by_id(“idstuff”)中,这意味着它实际上并没有开始检查该元素的存在,直到该页面完全加载完毕,我不知道该点是什么在这个机制中,但是这让我感到很困惑,因为你无法控制这个。 – Shane

+0

如果你还没有试过这个,你可以看看你是否在这里得到了一些东西(特别是评论4听起来很有希望)这个链接http://code.google.com/p/selenium/issues/detail?id=687 。随机搜索后出现。没有条款:) - – QVSJ

相关问题