【问题标题】:Tell me why this does not end up with a timeout error (selenium 2 webdriver)?告诉我为什么这不会导致超时错误(selenium 2 webdriver)?
【发布时间】:2012-06-01 04:36:59
【问题描述】:
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,你会得到同样的结果。

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

【问题讨论】:

    标签: python selenium webdriver selenium-webdriver


    【解决方案1】:

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

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

    -> 将焦点放在按钮上,然后页面加载 -> 使用 java 代码触发点击(不是 webdriver。因为点击将等待下一页加载。) -> 放置一个线程。睡眠一两秒 -> 检查元素是否存在。

    【讨论】:

    • 我完全理解你的工作,谢谢伙计!但是从我看到的问题来看,browser.find_element_by_id("idstuff") 也存在问题,这意味着它实际上并没有开始检查该元素的存在,直到该页面完全加载,我不知道这个机制有什么意义,但是这个让我很烦恼,因为你无法控制这个。
    • 如果你还没有尝试过这个,你可以看看你是否在这里得到了一些东西。(特别是评论 4 听起来很有希望)这个链接code.google.com/p/selenium/issues/detail?id=687。随机搜索后出现。没有保证 :) –
    【解决方案2】:

    点击有一个内置的隐式等待来等待页面加载。目前仅在 FirefoxDriver 中完成的工作允许您设置 Selenium 等待页面加载的时间。

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

    【讨论】:

    • 我不太明白你的意思。请您说得更具体一些,我该怎么做?
    • ...升级到 2.22 后,我意识到我在不知不觉中依赖这种隐式等待的所有地方。 XD
    • 我认为这不太对。我相信您正在谈论 driver.set_page_load_timeout() ,但这与点击无关。并非所有点击都会触发页面加载。页面加载超时仅用于页面加载。提问者在简单地查找元素时也遇到了超时问题(不需要点击)。
    猜你喜欢
    • 2012-09-18
    • 2022-12-11
    • 1970-01-01
    • 2023-02-08
    • 2023-04-10
    • 1970-01-01
    • 2012-05-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多