我正在使用mocha和selenium进行端到端集成测试。我正在使用beforeEach和afterEach挂钩初始化浏览器并在每次测试后将其终止。这是我的js文件,它有两个方法
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上运行测试服时,我经常看到这个("已经注册的电子邮件"是测试名称)
✓ email domain not allowed (4167ms)
1) "before each" hook for "email already registered"
some problem in before each of the test email already registered returning...
39 passing (9m)
1 pending
1 failing
1) "before each" hook for "email already registered":
Error: Timeout of 60000ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves.
要注意的是,一旦出现此错误,后续测试就不会运行。我的测试套装有100多个测试,并且在上面的运行中,一旦它遇到这个之前的每个错误并且没有运行下一组测试就退出。
我尝试了各种各样的东西,但似乎没有任何效果。调试中的任何指针都非常有用。提前谢谢。
答案 0 :(得分:0)
beforeEach永远不会解析并导致测试超时。您必须通过已解决的promise或者调用beforeEach完成的done()回调函数来表示。
您可以执行以下任一操作:
将beforeEach的主体包装成返回一个新的Promise:
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()回调函数添加到beforeEach定义中:
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)
}
})
我没有对这些进行测试,但其中任何一个都应该有效。