selenium webdriver 挂在非常简单的 javascript 代码中 promise.then

selenium webdriver hang in very simple javascript code with promise.then

我最近遇到了一个非常奇怪的 nodejs 和 selenium-webdriver 错误。它看起来与 nodejs event loop / promise / selenium-webdriver 有关。

简而言之:webdriver.get 与某些 promise.then.

一起使用时调用会挂起

首先,让我们看一段运行良好的javascript代码:

const WebDriver     = require('selenium-webdriver')

var driver = new WebDriver.Builder()
.setAlertBehavior('ignore')
.forBrowser('chrome')
.build()

function ok() {
  console.log('ok: driver.get will open a browser window\n' + '\n' + ok + '\n')
  driver.get('about:blank')
}

ok()

此代码将打开一个浏览器 window,它按预期工作。

但是下面的所有代码都会表现出奇怪的行为。

错误 - driver.get 会挂起

添加虚拟后 .then(() => 'test')

function bug() {
  console.log('bug: `driver.get` will hang\n' + '\n' + bug + '\n')
  Promise.resolve()
  .then(() => 'test')
  .then(() => driver.get('about:blank'))
}

Fix1 - 删除第一个 then 调用

function fire1() {
  console.log('fix1: delete the `then` call\n' + '\n' + fire1 + '\n')
  Promise.resolve()
  .then(() => driver.get('about:blank'))
}

Fix2 - 或添加 catch 调用

function fire2() {
  console.log('fix2: add a `catch` call\n' + '\n' + fire2 + '\n')
  Promise.resolve()
  .then(() => 'test')
  .catch(e => console.error(e))
  .then(() => driver.get('about:blank'))
}

Fix3 - 或者用 setTimeout 解决承诺而不是直接解决

function fire3() {
  console.log('fix3: resolve promise with a `setTimeout` call\n' + '\n' + fire3 + '\n')
  new Promise((resolve, reject) => {
    setTimeout(resolve, 0)
  })
  .then(() => 'test')
  .then(() => driver.get('about:blank'))
}

以上所有代码均在nodejs v6.0.0下测试。

有没有人遇到过这种问题?这背后的原因是什么?

我认为它可能与 nodejs 事件循环或本机 promise 实现有关...但我不知道如何深入。

要点中的代码:https://gist.github.com/zixia/77896cbd446c7282f760c60a025fee17

Github 问题:https://github.com/SeleniumHQ/selenium/issues/2233

这是一个已确认的 webdriver 错误,具有非本机承诺代码。

升级原生promise代码后,这个bug终于消失了

https://github.com/SeleniumHQ/selenium/issues/2233#issuecomment-225445538