在 JS 中使用 async/await 的 Selenium,找到并单击元素

Selenium with async/await in JS, find and click on element

我正在尝试使用 Selenium webdriver 和 Mocha 将我的测试重构为具有 async/await 功能的 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

单击方法returns webElement 之前的功能,如您所见:

布局:

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() returns a Promise,这就是上面第二个语法起作用的原因,因为执行被阻止,直到 Promise 解析为 WebElement 对象。

然而,在您在第一个示例中使用的语法中,它试图 await on (click()) 的函数永远不会被调用,因为 Promise 不会有一个 click() 功能。请注意,您的第二种语法中有两个 await,但第一种语法中只有一个。

要在一行中完成您想要做的事情,您必须执行以下操作:

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