跳至主要内容

超时

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

会话隐式等待超时

会话有一个关联的会话隐式等待超时。这指定在使用findElementfindElements命令(分别为$$$,在使用或不使用 WDIO 测试运行器运行 WebdriverIO 时)定位元素时等待隐式元素位置策略的时间。除非另有说明,否则为 0 毫秒。

您可以通过以下方式设置此超时

await browser.setTimeout({ 'implicit': 5000 })

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 中,超时适用于单个步骤定义。但是,如果您想要增加超时时间,因为您的测试时间超过了默认值,则需要在框架选项中设置它。

// wdio.conf.js
export const config = {
// ...
framework: 'mocha',
mochaOpts: {
timeout: 20000
},
// ...
}

欢迎!我怎样才能帮到您?

WebdriverIO AI Copilot