new Builder()。forBrowser(' chrome')。build()无限期挂起

时间:2017-05-09 16:41:31

标签: node.js selenium-webdriver mocha

我正在使用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多个测试,并且在上面的运行中,一旦它遇到这个之前的每个错误并且没有运行下一组测试就退出。

我尝试了各种各样的东西,但似乎没有任何效果。调试中的任何指针都非常有用。提前谢谢。

1 个答案:

答案 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)
  }
})

我没有对这些进行测试,但其中任何一个都应该有效。