使用 async/await 进行异步 mocha 测试时遇到问题

Posted

技术标签:

【中文标题】使用 async/await 进行异步 mocha 测试时遇到问题【英文标题】:Trouble making asynchronous mocha tests with async/await 【发布时间】:2018-08-21 22:21:27 【问题描述】:

我正在使用 mocha 和 selenium-webdriver 进行 E2E 测试。大多数测试都是异步的,我正在使用 async/await 函数来处理这个问题。不幸的是,我现在一个也做不了。这是我的代码的样子:

describe('Some test', function () 
  before(function () 
    driver.navigate().to('http://localhost:3000')
  )

  after(function () 
    driver.quit()
  )

  it('should display element', async function () 
    let elementFound = false
    try 
      await driver.wait(until.elementIsVisible(driver.findElement(By.className('element'))), 1000)
      assessForm = await driver.findElement(By.className('element')).isDisplayed()
      assert.ok(elementFound)
      console.log('elementFound', elementFound)
     catch (err) 
      console.log(err)
      assert.fail(err)
    
  )
)

发生的问题似乎是在测试完成之前调用了after 函数。以下是错误日志:

错误:超过 2000 毫秒的超时。对于异步测试和钩子,确保 “完成()”被调用;如果返回 Promise,请确保它已解决。

NoSuchSessionError:没有这样的会话(驱动程序信息: 铬驱动程序=2.36.540469 (1881fd7f8641508feb5166b7cae561d87723cfa8),平台=Mac OS X 10.13.3 x86_64) 在 Object.checkLegacyResponse (/Users/me./myproject/node_modules/selenium-webdriver/lib/error.js:585:15) 在 parseHttpResponse (/Users/me./myproject/node_modules/selenium-webdriver/lib/http.js:533:13) 在 Executor.execute (/Users/me./myproject/node_modules/selenium-webdriver/lib/http.js:468:26) 在 在 process._tickCallback (internal/process/next_tick.js:188:7) name: 'NoSuchSessionError', remoteStacktrace: ''

如果我删除我的 after() 函数,我仍然会得到

错误:超过 2000 毫秒的超时。对于异步测试和钩子,确保 “完成()”被调用;如果返回 Promise,请确保它已解决。

但是,我的 console.log 显示我的元素已找到。

如果我然后尝试使 after() 异步,像这样:

  after(async function () 
    await driver.quit()
  )

我得到与第一个相同的错误。

同样重要的是要注意,我已经读过我在执行 async/await 时不必使用done()。那么这到底是怎么回事呢?即使我这样做了,我也会不断收到同样的错误。

我该如何解决这个问题?似乎一切都井井有条,但我似乎无法适当地让测试通过而不相互碰撞。

【问题讨论】:

您的 console.log 何时显示您的元素已找到?超时错误之前还是之后? 这可能是你的before 函数也应该是异步的,这样测试才会在导航完成后开始。 【参考方案1】:

而不是使用:

await driver.wait(until.elementIsVisible(driver.findElement(By.className('element'))), 1000)

试试:

await driver.wait(until.elementLocated(By.className('element'))).isDisplayed()

【讨论】:

以上是关于使用 async/await 进行异步 mocha 测试时遇到问题的主要内容,如果未能解决你的问题,请参考以下文章

使用Mocha / Chai和async / await验证是否抛出异常

使用 async/await 进行异步编程

使用 async/ await 进行 异步 编程

async await进行异步处理

async await进行异步处理

async 和await