Selenium WebDriver JS - 显式等待

IT技术 javascript selenium-webdriver
2021-02-20 01:21:41

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

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

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

2个回答

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

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

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

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

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

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

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

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

@cSn,我真的很喜欢 Webdriver JS 团队努力看起来尽可能同步;然而,正如这里提到的,知道什么是同步的,什么不是同步的,常常令人困惑。即使使用基于 Promise 的方法,您仍然会遇到陷入嵌套回调的场景(例如在检索元素的文本后执行某些操作)。
2021-05-14 01:21:41
您应该尝试 Webdriver Js ( code.google.com/p/selenium/wiki/WebDriverJs ),它是由 Selenium 人员提供的 webdriver 的“官方”javascript 版本。此外,它不难阅读,因为 webdriver js 提供了一个“Promise管理器”,让您可以使用“控制流”(code.google.com/p/selenium/wiki/WebDriverJs#Control_Flows)以同步方式编写/执行代码)。通过使用它,您的代码将更具可读性!
2021-05-17 01:21:41
是一个要点,它显示了使用webdriver-sync.
2021-05-20 01:21:41