Selenium:明确/无条件等待,即"等待"

时间:2015-02-10 12:58:56

标签: selenium selenium-webdriver

事实证明,WebDriverWait类不允许进行"无条件等待":你总是必须指定一个等待的特定条件。但是,例如在设置项目和开发第一个测试时,无条件等待是一个有用的功能。通常不鼓励使用Thread.sleep()。是否有更好的解决方案,只需等待" -problem?

我现在使用最新的Selenium / WebDriver版本 - 2.44.0

2 个答案:

答案 0 :(得分:5)

如果您只是需要等待,那么Sleep就可以了。

不使用Sleep的重点不在于睡眠本身,而在于正在等待,正如您所描述的那样。 只是等待是你不应该的。尝试改变你的想法,找到一些可以附加等待的事件。让它有条件。

在网络测试中,您通常不需要等待。你等到页面加载,直到动画结束,直到表单发送,元素可点击,用户登录,脚本执行,数据被处理...这就是为什么不鼓励Sleep,但如果你真的 don' t 只有一个您正在等待的活动,只需要等待,然后使用Sleep就可以了。

答案 1 :(得分:2)

Qwerty's answer在原则上是正确的,用来解释:

  

不要等待"等等"如果你真的可以等待在浏览器中发生重大事件。换句话说,你正在等待一个特定的事件,而不是等待"。等等。

好的,但为了争论,我们假设您处于绝对肯定无事件的情况下,您可以等待。我有使用Selenium的大型测试套件,我从来没有遇到过这种情况,但我并不是无所不知。可能有些情况我没有预见到。 Thread.sleep()可能会让您想要,但是:

  1. 如果您在Sauce Labs或浏览器堆栈等远程配置服务上运行浏览器,他们可能会决定您的脚本已关闭并关闭浏览器。 (Sauce Labs肯定会这样做。我从来没有使用过浏览器堆栈,但我也希望如此。)

  2. 如果您在等待期间发生网络问题并且导致测试失败,则在您Thread.sleep()呼叫完成之前,您将无法知晓。如果您使用上述我提供的服务,也可能会发生这种情况。它偶尔发生在我的测试套件中。

  3. 或者如果您在本地进行测试:浏览器崩溃或进入无限循环。我没有经历过崩溃,但我经历过无限循环。同样,如果你使用Thread.sleep(),在等待之前你就不会知道这个问题。

  4. 当然,您想要等待的时间越长,问题就越多。如果你只是想等一下......那么你应该对Thread.sleep()没问题。否则,如果我被挡在墙上而 到了#34;只需等待"我仍然 使用Selenium的等待设施,我会这样做:

    try: 
        WebDriverWait(driver, timeout).until(
            lambda driver: driver.execute_script("return false"))
    except TimeoutException:
        pass # Do nothing
    

    这是Python代码,但Selenium支持的任何语言的原理都是相同的:只是等待一些不可能发生的事情。 等待执行浏览器端的测试非常重要,因为这样做而不是使用像Thread.sleep()这样的东西是为了联系浏览器,我们尽早发现问题 WebDriverWait的工作方式,它会经常轮询浏览器(每0.5秒是Python实现中的默认值)。测试可以是find_element方法,用于搜索不存在的元素。我使用了返回execute_script的{​​{1}}。由于它永远不会返回false值,因此等待将超时。 (执行一个空脚本也会起作用,因为它会返回true转换为假值,但undefined看起来是故意的,而空脚本看起来像是一个错误。)然后你只需要忽略异常由于超时而被提出。如果你经常这样做,你甚至可以将整个事物包装在效用函数中。