【问题标题】:Selenium WebDriver JS - Explicit WaitSelenium WebDriver JS - 显式等待
【发布时间】:2013-05-28 18:49:54
【问题描述】:

我正在使用 selenium-webdriverjs。我想等待某个元素显示出来,我为此创建了一个显式等待,如下所示,它工作得很好,

var displayed = false;
driver.wait(function(){
    driver.findElement(locator).isDisplayed().then(function(value){
        displayed = value;
    });
    return displayed;
}, timeout);

这是我能做的最好的还是有更好的方法来做到这一点?我问的原因是第一次调用等待回调(在我的情况下)它总是返回false。只有随后执行 isDisplayed 承诺时,显示的值才会改变。

【问题讨论】:

    标签: javascript selenium-webdriver


    【解决方案1】:

    您的代码混合了同步返回和异步回调,下面的代码应该做正确的事:

    return driver.wait(function() {
        return driver.findElement(locator).isDisplayed();
    }, timeout);
    

    内部函数将返回一个driver.wait 将等待的promise,并将其值(真/假)作为等待条件。

    【讨论】:

    • 大家好,这个解决方案给了我Error: This Deferred has already been resolved.这对你有用吗?
    • 相反,driver.isElementPresent(locator); 为我工作,为那些无法使用此解决方案的人工作:)
    • 顺便说一句,“超时”似乎以毫秒为单位。我知道它通常是在 JavaScript 中,但这是一个绑定,所以我不太确定。文档没有费心指定。感谢您的回答。 Haeljeong87 的小费对我有用。
    • @coudy(以及所有):您提到 Moiz Raza 正在“将同步返回与异步回调混合”。我有同样的问题 - 我不知道哪个是哪个!有没有办法知道哪些回调/函数是同步的,哪些是异步的?我发现这一切都非常令人困惑......
    • @rinogo 通常,需要时间或涉及外部参与者(浏览器、文件系统)的操作将是异步的,并且该函数将进行回调。一些“默认”异步函数具有同步对应项,函数名称后附加“同步”。
    【解决方案2】:

    为了避免 webdriver 和 js 的异步风格所涉及的大部分混淆,您可以尝试 webdriver-sync:https://npmjs.org/package/webdriver-sync

    根据我的经验,在嵌套回调过多后,异步版本的 webdriver API 变得难以阅读。

    这当然假设您没有保持异步的要求。

    免责声明:我是这个软件(webdriver-sync)的创建者

    【讨论】:

    • 您应该尝试 Webdriver Js (code.google.com/p/selenium/wiki/WebDriverJs),它是 Selenium 人提供的 webdriver 的“官方”javascript 版本。此外,阅读起来并不难,因为 webdriver js 提供了一个“承诺管理器”,让您可以使用“控制流”(code.google.com/p/selenium/wiki/WebDriverJs#Control_Flows)以同步方式编写/执行代码。通过使用它,您的代码将更具可读性!
    • @cSn,我真的很喜欢 Webdriver JS 团队努力看起来尽可能同步;然而,正如here 所提到的,知道什么是同步的,什么不是同步的通常会让人感到困惑。即使使用基于 Promise 的方法,您仍然会遇到嵌套回调的情况(例如在检索到元素的文本后执行某些操作)。
    • Here 是一个要点,它显示了使用 webdriver-sync 以纯同步方式编写的解决方案版本。
    猜你喜欢
    • 2013-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-24
    • 2017-04-19
    • 1970-01-01
    • 2012-05-11
    相关资源
    最近更新 更多