javascript - Selenium 在 JS 中使用 async/await,查找并单击元素

标签 javascript selenium-webdriver ecmascript-2017

我正在尝试使用 Selenium webdriver 和 Mocha 将我的测试重构为具有异步/等待功能的 ES7。我有以下代码:

await loginPage.loginAsAdmin()

/* THIS DOES NOT WORK */
//await layout.Elements.routePageButton().click()

/* THIS DOES WORK */
let a = await layout.Elements.routePageButton()
await a.click()

我不明白为什么特定的不起作用 - 我明白:

TypeError: layout.Elements.routePageButton(...).click is not a function

click方法返回webElement之前的函数,如您所见: Returned element

布局:

routePageButton:  async () => await findVisibleElement('#route_info a')
const findVisibleElement = utils.Methods.Element.findVisible

方法:

findVisible: async (cssSelector) => {
  let elm = await driver().findElement(by.css(cssSelector))
  return elm
}

最佳答案

这里的问题是误解 await 是 ES2017 中的一个语言关键字,它允许您阻止执行调用 async 函数,直到出现 Promise > 由调用的函数返回解析。

routePageButton() 返回一个 Promise,这就是上面第二个语法起作用的原因,因为执行被阻止,直到 Promise 解析为一个 WebElement 对象。

但是,在第一个示例中使用的语法中,它尝试 await 的函数 (click()) 永远不会被调用,因为 Promise 没有 click() 函数。请注意,第二个语法中有两个 await,但第一个语法中只有一个。

要在一行中完成您尝试执行的操作,您必须执行以下操作:

await (await layout.Elements.routePageButton()).click()

关于javascript - Selenium 在 JS 中使用 async/await,查找并单击元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43471166/

相关文章:

javascript - Bootstrap Validator - 将所有输入字段值发送到远程 PHP 文件

javascript - Facebook API - FB.Event.subscribe ('edge.create')不工作

python - 使用 selenium 从 html 表中获取数据(python): Submitting changes breaks loop

java - Selenium WebDriver 中的 "Element not found in the cache"

java - 如何使用 Chrome webdriver 缩小页面

javascript - ES2017 Async/await 函数 - 它们只适用于 promises 吗?

node.js - 使用 babel 和 Jest 在 ES2017 中导入意外 token

javascript - 如何在 Visual Studio Code 中将调试语句输出到控制台

javascript - 是否可以在没有 return 关键字的情况下解析异步函数

javascript - 在Vue中获取插槽数据作为变量?