WebDriver waitAndFind 相关

被 JavaScript 的 Promise 折磨了两三天后,终于有所收获,故此记录

实现在 Selenium WebDriver 中,封装一个实用函数,同时 wait until located & visible 并返回 the fisrt visible element,并保持 thenable,极大兼容性了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
driver.find = function (locator, timeout = 30000) {
return this.findElement(async () => {
return Promise.any(await this.wait(until.elementsLocated(locator), timeout).then((elements) => {
return elements.map(element => this.wait(until.elementIsVisible(element), timeout));
}));
});
}


describe('Wait & Click the first visible element', () => {
it('usage', async () => {
await driver.get('a-RHEL-nginx-index.html');
await driver.find(By.xpath("//div[@class='logos']/a").click();
});
}

NOTE

  • find() 并不是一个 async function,不然返回的是一个 Promise,需要进一步 await,无法 then 链式
  • 使用 findElement() 替我们返回了一个 WebElementPromise,WebElementPromise 才有 then(),才能 thenable [1]
  • Promise.any() 是个好东西,但方法依然是实验性的,尚未被所有的浏览器完全支持。它当前处于 TC39 第四阶段草案 [2],希望正式了之后能在 selenium-webdriver/lib/promise.js [3] 中封装一个 promise.any()
  • wait until 好像只能在这里,没有 async function 不能用 await,也不能在执行的时候它还是个 Promise {}

XXX

JavaScript 的 async, promise, await 快赶上 C 的指针了,真的头大


  1. https://github.com/SeleniumHQ/selenium/blob/944aad294d14a13345ebaf0e64df3aa68218521f/javascript/node/selenium-webdriver/lib/webdriver.js#L2402 ↩︎

  2. https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Promise/any ↩︎

  3. https://github.com/SeleniumHQ/selenium/blob/944aad294d14a13345ebaf0e64df3aa68218521f/javascript/node/selenium-webdriver/lib/promise.js ↩︎