Selenium WebDriver JS - 显式等待

Moi*_*aja 21 javascript selenium-webdriver

我正在使用selenium-webdriverjs.我想等待显示某个元素,我已经创建了一个明确的等待,如下所示,它工作得很好,

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

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

cou*_*udy 28

您的代码将同步返回与异步回调混合,以下代码应该做正确的事情:

return driver.wait(function() {
    return driver.findElement(locator).isDisplayed();
}, timeout);
Run Code Online (Sandbox Code Playgroud)

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

  • 相反,`driver.isElementPresent(locator);`为我工作,对于那些无法使用此解决方案的人:) (8认同)

jsd*_*vel 5

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

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

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

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

  • 您应该尝试 Webdriver Js (https://code.google.com/p/selenium/wiki/WebDriverJs),它是 Selenium 人员提供的 webdriver 的“官方”javascript 版本。此外,它不难阅读,因为 webdriver js 提供了一个“承诺管理器”,让您可以使用“控制流”(https://code.google.com/p/selenium/wiki)以同步方式编写/执行代码/WebDriverJs#Control_Flows)。通过使用它,您的代码将更具可读性! (2认同)