【问题标题】:Controlling poll frequency of browser.wait() (Fluent Wait)控制 browser.wait() 的轮询频率(流利等待)
【发布时间】:2016-02-15 16:46:48
【问题描述】:

故事:

在 Java selenium 语言绑定中有一个 FluentWait class,它允许严格控制如何检查预期条件:

每个 FluentWait 实例定义等待的最长时间 对于条件,以及检查的频率 健康)状况。此外,用户可以将等待配置为忽略 等待期间的特定类型的异常,例如 在页面上搜索元素时出现 NoSuchElementExceptions。

换句话说,可以更改应用预期条件检查的轮询间隔,默认为 500 毫秒。另外,可以设置要忽略的异常。

它是also possible in PythonWebDriverWait 类有相关的poll_frequencyignored_exceptions 参数。

问题:

在 Protractor/WebDriverJS 中使用browser.wait() 时,是否可以控制验证预期条件的轮询频率


根据browser.wait() documentation,只有3 个可能的参数:作为预期条件的函数、超时值和可选的超时错误消息。我希望有不同的设置或方法来更改投票频率。

【问题讨论】:

  • 来自this,看起来 JS 会尽可能快地进行轮询。所以基本上我认为它没有你想要的参数。但我想 2 种可能的解决方法可能是: 1. 编写一个自定义 Condition,如果条件在返回之前不为真,则在内部休眠 2. 改为构造 Promise,根据相同的文档其行为不同 3. 第三个选项是重写wait 或将其包装在一些自定义函数中。虽然不是一个不错的选择。
  • @KirilS。进行了更多研究并在答案中总结了您的观点。再次感谢!

标签: javascript selenium selenium-webdriver protractor end-to-end


【解决方案1】:

在@Kirill S. 的帮助下,经过进一步研究和检查WebdriverJS source code,我可以得出结论,javascript selenium 绑定中不存在“轮询频率”之类的东西。无法配置后续条件检查调用之间的间隔 - 它会尽快执行检查。

这与 Python 或 Java selenium 绑定中的情况不同,其中在预期的条件状态检查之间存在可配置的超时。默认情况下,it would wait for 500ms before the next check

WebDriverWait 默认每 500 次调用 ExpectedCondition 毫秒 直到它成功返回。一个成功的回报是 ExpectedCondition 类型为 Boolean 返回 true 或非 null 返回值 对于所有其他 ExpectedCondition 类型。

【讨论】:

    【解决方案2】:

    嗯,根据我阅读的文档,似乎没有反映FluentWait 功能的实际方法。相反,这个 sn-p 可用于更改轮询频率,它几乎可以避开所有异常(几乎所有)。

    def wait_until(predicate, timeout_seconds, period=0.25, show_log=True):
        """
        @summary Call repeatedly the predicate until it returns true or timeout_seconds passed.
        @param predicate: a condition, modelized as a callable,  that will valued either as True or False
        @param timeout_seconds: the timeout in second
        @param period: the time to sleep between 2 calls to predicate. Defaults to 0.25s.
        @return True if a call to predicate returned True before timeout_seconds passed, else False
        """
        if show_log:
            myLogger.logger.info("waiting until predicate is true for {end} seconds".format(end=timeout_seconds))
        ultimatum = time.time() + timeout_seconds
        while time.time() < ultimatum:
            myLogger.logger.debug("checking predicate for wait until : {spent} / {end}".format(spent=str(time.time() - (ultimatum - timeout_seconds)), end=timeout_seconds))
            try:
                if predicate():
                    return True
                time.sleep(period)
            except Exception as e:
                myLogger.logger.warn("Exception found: {}".format(e))
        return False
    

    因此,谓词可以是您传递的 lambda,用于验证所讨论的 WebElement 的状态。

    【讨论】:

    • 感谢参与!它是基于 Python 的解决方案吗?..问题是关于 Protractor/WebDriverJS..
    • 是的,它是基于python的,但我想同样的想法可以应用在javascript中。
    • 这样的事情对您有帮助吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-04
    • 1970-01-01
    • 1970-01-01
    • 2014-11-01
    • 1970-01-01
    相关资源
    最近更新 更多