最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - Selenium with asyncawait in JS, find and click on element - Stack Overflow

programmeradmin9浏览0评论

I'm trying to refactor my tests using Selenium webdriver and Mocha to ES7 with async/await functionality. I have got following piece of code:

await loginPage.loginAsAdmin()

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

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

I don't understand why the particular does not work - I get:

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

Function before click method returns webElement, as you can see:

Layout:

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

Method:

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

I'm trying to refactor my tests using Selenium webdriver and Mocha to ES7 with async/await functionality. I have got following piece of code:

await loginPage.loginAsAdmin()

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

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

I don't understand why the particular does not work - I get:

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

Function before click method returns webElement, as you can see:

Layout:

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

Method:

findVisible: async (cssSelector) => {
  let elm = await driver().findElement(by.css(cssSelector))
  return elm
}
Share Improve this question edited Apr 18, 2017 at 17:48 Felix Kling 818k181 gold badges1.1k silver badges1.2k bronze badges asked Apr 18, 2017 at 11:42 petrppepetrppe 1553 silver badges15 bronze badges 1
  • async/await is part of ES2017, not ES2016 (ES7). – Felix Kling Commented Apr 18, 2017 at 17:48
Add a ment  | 

1 Answer 1

Reset to default 4

The problem here is misunderstanding that await is a language keyword in ES2017 that allows you to block execution of the calling async function until a Promise returned by an invoked function resolves.

routePageButton() returns a Promise, and this is why the second syntax above works, as execution is blocked until the Promise resolves to a WebElement object.

However in the syntax you are using in the first example, the function that it is attempting to await on (click()) is never called, because a Promise does not have a click() function. Note that you have two awaits in your second syntax, but only one in your first.

To do what you are attempting to do in one line, you would have to do something like:

await (await layout.Elements.routePageButton()).click()
发布评论

评论列表(0)

  1. 暂无评论