seleniumwebdriver挂在非常简单的JavaScript代码promise.then

最近我和nodejs&selenium-webdriver经历了一个非常奇怪的错误。 它看起来与nodejs事件循环/ 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() 

这段代码将打开一个浏览器窗口,按预期工作。

但是下面的所有代码都会显示奇怪的行为。

Bug – 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')) } 

修复1 – 删除第一个then调用

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

修复2 – 或添加一个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下进行了testing。

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

我认为它可能与nodejs事件循环,或本地承诺实现有关…但我不知道如何深入。

Gist代码: https : //gist.github.com/zixia/77896cbd446c7282f760c60a025fee17

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

这是一个确认的非本地承诺代码的web驱动程序错误。

升级到本地的promise代码后,这个bug终于消失了。

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