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
我最近遇到了一个非常奇怪的 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