Node.js new Builder().forBrowser(';chrome';).build()无限期挂起

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')

我正在使用mocha和selenium进行端到端集成测试。我使用beforeach和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上运行测试套装时,我经常看到这样的情况(“电子邮件已注册”是一个测试名称)

需要注意的是,一旦出现此错误,后续测试就不会运行。我的测试套件有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,他们将期望一个承诺得到解决。例如,如果您删除了异步声明,并删除了等待,那么它将同步执行。