Selenium WebDriver JS - 显式等待

Posted

技术标签:

【中文标题】Selenium WebDriver JS - 显式等待【英文标题】:Selenium WebDriver JS - Explicit Wait 【发布时间】: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 承诺时,显示的值才会改变。

【问题讨论】:

【参考方案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 以纯同步方式编写的解决方案版本。

以上是关于Selenium WebDriver JS - 显式等待的主要内容,如果未能解决你的问题,请参考以下文章

何时在 Selenium Webdriver 中使用显式等待与隐式等待?

selenium webdriver 的三种等待方式

java selenium webdriver处理JS操作窗口滚动条

精华 selenium_webdriver(python)调用js脚本

如何用selenium webdriver 捕获js error

selenium 设置元素等待