最佳实践
本指南旨在分享我们的最佳实践,帮助您编写高性能和稳健的测试。
使用稳健的选择器
使用对DOM变化具有弹性的选择器,当例如从元素中移除类时,您将会减少甚至不会出现测试失败的情况。
类可以应用于多个元素,如果可能的话应该避免使用,除非您故意想要获取所有具有该类的元素。
// 👎
await $('.button')
所有这些选择器都应该返回单个元素。
// 👍
await $('aria/Submit')
await $('[test-id="submit-button"]')
await $('#submit-button')
注意: 要了解WebdriverIO支持的所有可能的选择器,请查看我们的选择器页面。
限制元素查询的数量
每次使用$
或$$
命令(包括链式调用)时,WebdriverIO都会尝试在DOM中定位元素。这些查询是昂贵的,所以您应该尽量限制它们。
查询三个元素。
// 👎
await $('table').$('tr').$('td')
只查询一个元素。
// 👍
await $('table tr td')
唯一应该使用链式调用的时候是当您想要组合不同的选择器策略时。 在示例中,我们使用深层选择器,这是一种进入元素Shadow DOM的策略。
// 👍
await $('custom-datepicker').$('#calendar').$('aria/Select')
优先定位单个元素而不是从列表中选取一个
这并不总是可能的,但使用CSS伪类如:nth-child,您可以基于元素在其父元素子列表中的索引来匹配元素。
查询所有表格行。
// 👎
await $$('table tr')[15]
查询单个表格行。
// 👍
await $('table tr:nth-child(15)')
使用内置断言
不要使用不会自动等待结果匹配的手动断言,因为这会导致测试不稳定。
// 👎
expect(await button.isDisplayed()).toBe(true)
通过使用内置断言,WebdriverIO将自动等待实际结果与预期结果匹配,从而产生稳健的测试。 它通过自动重试断言直到通过或超时来实现这一点。
// 👍
await expect(button).toBeDisplayed()
懒加载和Promise链
WebdriverIO在编写干净代码方面有一些技巧,因为它可以懒加载元素,这允许您链接Promise并减少await