Node.js new Builder().forBrowser(';chrome';).build()无限期挂起
我正在使用mocha和selenium进行端到端集成测试。我使用beforeach和afterEach钩子来初始化浏览器,并在每次测试后终止它。这是我的js文件,它有两种方法Node.js new Builder().forBrowser(';chrome';).build()无限期挂起,node.js,selenium-webdriver,mocha.js,Node.js,Selenium Webdriver,Mocha.js,我正在使用mocha和selenium进行端到端集成测试。我使用beforeach和afterEach钩子来初始化浏览器,并在每次测试后终止它。这是我的js文件,它有两种方法 require('chromedriver') // globals global.assert = require('assert') global.driver = null const { Builder, By, until, promise } = require('selenium-webdriver')
require('chromedriver')
// globals
global.assert = require('assert')
global.driver = null
const { Builder, By, until, promise } = require('selenium-webdriver')
// setup
beforeEach(async function () {
this.timeout(utils.DEFAULT_TEST_TIMEOUT)
while (driver !== null) {
console.log('waiting for driver to quit from last test')
await utils.sleep(1000)
}
try {
driver = await new Builder().forBrowser('chrome').build()
await driver.manage().window().setSize(1600, 900)
} catch (ex) {
console.log(ex.stack)
}
})
afterEach(async function () {
this.timeout(utils.DEFAULT_TEST_TIMEOUT)
if (driver === null) {
console.log('some problem in before each of the test ' + this.currentTest.title + ' returning...')
return
}
await saveScreenShot(SCREENSHOTS_PATH + this.currentTest.parent.title, this.currentTest.title)
await driver.quit()
driver = null
})
现在,当我在jenkins上运行测试套装时,我经常看到这样的情况(“电子邮件已注册”是一个测试名称)
需要注意的是,一旦出现此错误,后续测试就不会运行。我的测试套件有100个测试,在上面的运行中,它在每次出错之前遇到这个问题并没有运行下一组测试时退出
我试过各种方法,但似乎都不管用。调试这个过程中的任何指针都将非常有用。提前感谢。beforeach从未解析并导致测试超时。必须通过已解析的承诺或调用done()回调函数来表示beforeach已完成 您可以执行以下任一操作: 将beforeach的主体包装为返回新承诺:
beforeEach(async function () {
return new Promise(async (resolve,reject) => {
this.timeout(60000)
try {
driver = await new webdriver.Builder().forBrowser('chrome').build()
await driver.manage().window().setSize(1600, 900)
resolve()
} catch (ex) {
reject(ex.stack)
}
})
})
也可以将done()回调函数添加到beforeach定义中:
beforeEach(async function (done) {
this.timeout(60000)
try {
driver = await new webdriver.Builder().forBrowser('chrome').build()
await driver.manage().window().setSize(1600, 900)
done();
} catch (ex) {
done(ex.stack)
}
})
我没有测试这些,但它们中的任何一个都应该可以工作。beforeach从未解析并导致测试超时。必须通过已解析的承诺或调用done()回调函数来表示beforeach已完成 您可以执行以下任一操作: 将beforeach的主体包装为返回新承诺:
beforeEach(async function () {
return new Promise(async (resolve,reject) => {
this.timeout(60000)
try {
driver = await new webdriver.Builder().forBrowser('chrome').build()
await driver.manage().window().setSize(1600, 900)
resolve()
} catch (ex) {
reject(ex.stack)
}
})
})
也可以将done()回调函数添加到beforeach定义中:
beforeEach(async function (done) {
this.timeout(60000)
try {
driver = await new webdriver.Builder().forBrowser('chrome').build()
await driver.manage().window().setSize(1600, 900)
done();
} catch (ex) {
done(ex.stack)
}
})
我没有测试这些,但它们中的任何一个都应该有效。感谢您的建议,我尝试了第一个解决方案,但仍然看到相同的问题。当我尝试第二个时,我得到了这个错误1)“在每个”钩子之前正确显示“Admin”:错误:解析方法被过度指定。指定回调或返回承诺;不是两者都有。我现在正在看SeleniumWebDriver的文档。我可能弄错了,但新webdriver的构造看起来不是异步的吗?也许你可以试着消除你的等待?我的一个问题是,使用返回的承诺解决方案,beforeach和afterEach需要异步吗?beforeach和afterEach不需要异步。但是使用wait意味着您正在执行异步函数。另外,我认为在beforEach/afterEach中声明函数async,他们将期望一个承诺得到解决。例如,如果您删除了异步声明,并删除了等待,那么它将同步执行。感谢您的建议,我尝试了第一个解决方案,但仍然看到相同的问题。当我尝试第二个时,我得到了这个错误1)“在每个”钩子之前正确显示“Admin”:错误:解析方法被过度指定。指定回调或返回承诺;不是两者都有。我现在正在看SeleniumWebDriver的文档。我可能弄错了,但新webdriver的构造看起来不是异步的吗?也许你可以试着消除你的等待?我的一个问题是,使用返回的承诺解决方案,beforeach和afterEach需要异步吗?beforeach和afterEach不需要异步。但是使用wait意味着您正在执行异步函数。另外,我认为在beforEach/afterEach中声明函数async,他们将期望一个承诺得到解决。例如,如果您删除了异步声明,并删除了等待,那么它将同步执行。