告诉我为什么这不会以超时错误结束(selenium 2 webdriver)?

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! Just clicked! And I'm expecting timeout error! 出现了,令我惊讶的是new_element = WebDriverWait(browser, 0.1).until(lambda browser : browser.find_element_by_id("element"))等到整个页面加载new_element = WebDriverWait(browser, 0.1).until(lambda browser : browser.find_element_by_id("element")) 。 如果你使用implicit waits ,你会得到相同的结果。

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


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

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


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

为了您的需要,您可以尝试围绕这种方式开展工作 -

- >将焦点放在按钮之后,有一个页面加载 - >用java代码点击点击(不是webdriver,因为点击会等待下一页加载。) - >将thread.sleep放置一秒钟或两个 - >检查元素的上限。

链接地址: http://www.djcxy.com/p/59827.html

上一篇: Tell me why this does not end up with a timeout error (selenium 2 webdriver)?

下一篇: How to register HttpContextBase with Autofac in Asp.Net (not MVC)