超时
WebdriverIO 中的每个命令都是一个异步操作。请求被发送到 Selenium 服务器(或像Sauce Labs这样的云服务),并且一旦操作完成或失败,其响应将包含结果。
因此,时间是整个测试过程中至关重要的一个组成部分。当某个操作依赖于另一个操作的状态时,您需要确保它们按正确的顺序执行。超时在处理这些问题时起着重要的作用。
Selenium 超时
会话脚本超时
会话有一个关联的会话脚本超时,它指定等待异步脚本运行的时间。除非另有说明,否则为 30 秒。您可以像这样设置此超时
await browser.setTimeout({ 'script': 60000 })
await browser.executeAsync((done) => {
console.log('this should not fail')
setTimeout(done, 59000)
})
会话页面加载超时
会话有一个关联的会话页面加载超时,它指定等待页面加载完成的时间。除非另有说明,否则为 300,000 毫秒。
您可以像这样设置此超时
await browser.setTimeout({ 'pageLoad': 10000 })
pageLoad
关键字是官方 WebDriver 规范的一部分,但可能不受支持您的浏览器(以前名称为page load
)。
会话隐式等待超时
会话有一个关联的会话隐式等待超时。这指定在使用findElement
或findElements
命令(分别为$
或$$
,在使用或不使用 WDIO 测试运行器运行 WebdriverIO 时)定位元素时等待隐式元素位置策略的时间。除非另有说明,否则为 0 毫秒。
您可以通过以下方式设置此超时
await browser.setTimeout({ 'implicit': 5000 })
WebdriverIO 相关的超时
WaitFor*
超时
WebdriverIO 提供了多个命令来等待元素达到特定状态(例如,已启用、可见、存在)。这些命令采用选择器参数和超时数字,该数字确定实例应等待该元素达到该状态多长时间。waitforTimeout
选项允许您为所有 waitFor*
命令设置全局超时,因此您无需一遍又一遍地设置相同的超时。(注意小写字母 f
!)
// wdio.conf.js
export const config = {
// ...
waitforTimeout: 5000,
// ...
}
在您的测试中,您现在可以这样做
const myElem = await $('#myElem')
await myElem.waitForDisplayed()
// you can also overwrite the default timeout if needed
await myElem.waitForDisplayed({ timeout: 10000 })
框架相关的超时
您与 WebdriverIO 一起使用的测试框架必须处理超时,尤其是在所有操作都是异步的情况下。它确保如果出现问题,测试过程不会卡住。
默认情况下,超时为 10 秒,这意味着单个测试不应超过此时间。
Mocha 中的单个测试如下所示
it('should login into the application', async () => {
await browser.url('/login')
const form = await $('form')
const username = await $('#username')
const password = await $('#password')
await username.setValue('userXY')
await password.setValue('******')
await form.submit()
expect(await browser.getTitle()).to.be.equal('Admin Area')
})
在 Cucumber 中,超时适用于单个步骤定义。但是,如果您想要增加超时时间,因为您的测试时间超过了默认值,则需要在框架选项中设置它。
- Mocha
- Jasmine
- Cucumber
// wdio.conf.js
export const config = {
// ...
framework: 'mocha',
mochaOpts: {
timeout: 20000
},
// ...
}
// wdio.conf.js
export const config = {
// ...
framework: 'jasmine',
jasmineOpts: {
defaultTimeoutInterval: 20000
},
// ...
}
// wdio.conf.js
export const config = {
// ...
framework: 'cucumber',
cucumberOpts: {
timeout: 20000
},
// ...
}