断言
该WDIO 测试运行器带有一个内置的断言库,允许您对浏览器或(Web)应用程序中元素的各个方面进行强大的断言。它扩展了Jest Matchers的功能,并添加了一些针对 e2e 测试优化的匹配器,例如:
const $button = await $('button')
await expect($button).toBeDisplayed()
或
const selectOptions = await $$('form select>option')
// make sure there is at least one option in select
await expect(selectOptions).toHaveChildren({ gte: 1 })
有关完整列表,请参阅expect API 文档。
从 Chai 迁移
Chai 和 expect-webdriverio 可以共存,并且只需进行一些小的调整即可实现平滑过渡到 expect-webdriverio。如果您已升级到 WebdriverIO v6,则默认情况下,您可以开箱即用地访问 expect-webdriverio
中的所有断言。这意味着,在全局范围内,无论您在何处使用 expect
,您都将调用 expect-webdriverio
断言。也就是说,除非您将injectGlobals
设置为 false
或已明确地覆盖了全局 expect
以使用 Chai。在这种情况下,您将无法访问任何 expect-webdriverio 断言,除非您在需要的地方显式导入 expect-webdriverio 包。
本指南将展示如何在本地覆盖 Chai 时以及在全局覆盖 Chai 时如何从 Chai 迁移。
本地
假设 Chai 在文件中被显式导入,例如:
// myfile.js - original code
import { expect as expectChai } from 'chai'
describe('Homepage', () => {
it('should assert', async () => {
await browser.url('./')
expectChai(await browser.getUrl()).to.include('/login')
})
})
要迁移此代码,请删除 Chai 导入并使用新的 expect-webdriverio 断言方法 toHaveUrl
代替
// myfile.js - migrated code
describe('Homepage', () => {
it('should assert', async () => {
await browser.url('./')
await expect(browser).toHaveUrl('/login') // new expect-webdriverio API method https://webdriverio.node.org.cn/docs/api/expect-webdriverio.html#tohaveurl
});
});
如果您想在同一文件中同时使用 Chai 和 expect-webdriverio,则保留 Chai 导入,expect
将默认为 expect-webdriverio 断言,例如:
// myfile.js
import { expect as expectChai } from 'chai'
import { expect as expectWDIO } from '@wdio/globals'
describe('Element', () => {
it('should be displayed', async () => {
const isDisplayed = await $("#element").isDisplayed()
expectChai(isDisplayed).to.equal(true); // Chai assertion
})
});
describe('Other element', () => {
it('should not be displayed', async () => {
await expectWDIO($("#element")).not.toBeDisplayed(); // expect-webdriverio assertion
})
})
全局
假设 expect
已全局覆盖以使用 Chai。为了使用 expect-webdriverio 断言,我们需要在 "before" 钩子中全局设置一个变量,例如:
// wdio.conf.js
before: async () => {
await import('expect-webdriverio');
global.wdioExpect = global.expect;
const chai = await import('chai');
global.expect = chai.expect;
}
现在 Chai 和 expect-webdriverio 可以一起使用。在您的代码中,您将按如下方式使用 Chai 和 expect-webdriverio 断言,例如:
// myfile.js
describe('Element', () => {
it('should be displayed', async () => {
const isDisplayed = await $("#element").isDisplayed()
expect(isDisplayed).to.equal(true); // Chai assertion
});
});
describe('Other element', () => {
it('should not be displayed', async () => {
await expectWdio($("#element")).not.toBeDisplayed(); // expect-webdriverio assertion
});
});
要迁移,您将逐渐将每个 Chai 断言迁移到 expect-webdriverio。一旦代码库中所有 Chai 断言都被替换,就可以删除 "before" 钩子。然后,全局查找和替换以将所有 wdioExpect
实例替换为 expect
将完成迁移。