选择器
WebDriver 协议提供了多种选择器策略来查询元素。WebdriverIO 简化了这些策略,使选择元素变得简单。请注意,尽管查询元素的命令被称为 $ 和 $$,但它们与 jQuery 或 Sizzle 选择器引擎没有任何关系。
虽然有很多不同的选择器可用,但只有少数几个提供了一种稳健的方式来找到正确的元素。例如,给定以下按钮:
<button
id="main"
class="btn btn-large"
name="submission"
role="button"
data-testid="submit"
>
Submit
</button>
我们__推荐__和__不推荐__以下选择器:
| 选择器 | 推荐 | 说明 |
|---|---|---|
$('button') | 🚨 永不 | 最差 - 太过通用,没有上下文。 |
$('.btn.btn-large') | 🚨 永不 | 不好。与样式耦合。极易变更。 |
$('#main') | ⚠️ 谨慎使用 | 更好。但仍与样式或JS事件监听器耦合。 |
$(() => document.queryElement('button')) | ⚠️ 谨慎使用 | 有效查询,但编写复杂。 |
$('button[name="submission"]') | ⚠️ 谨慎使用 | 与具有HTML语义的name属性耦合。 |
$('button[data-testid="submit"]') | ✅ 好 | 需要额外属性,不与无障碍功能相连。 |
$('aria/Submit') | ✅ 好 | 好。类似于用户与页面交互的方式。建议使用翻译文件,这样当翻译更新时测试不会中断。注意:此选择器在大页面上可能比其他选择器慢。 |
$('button=Submit') | ✅ 始终 | 最佳。类似于用户与页面交互的方式且速度快。建议使用翻译文件,这样当翻译更新时测试不会中断。 |
CSS 查询选择器
如果没有特别指明,WebdriverIO 将使用 CSS 选择器 模式查询元素,例如:
selectors/example.js
loading...
链接文本
要获取具有特定文本的锚点元素,请使用以等号(=)开始的文本进行查询。
例如:
selectors/example.html
loading...
你可以通过以下方式查询该元素:
selectors/example.js
loading...
部分链接文本
要查找可见文本部分匹配你的搜索值的锚点元素,
可以在查询字符串前使用 *= 进行查询(例如 *=driver)。
你也可以通过以下方式查询上面示例中的元素:
selectors/example.js
loading...
注意: 你不能在一个选择器中混合使用多种选择器策略。使用多个链式元素查询来达到相同的目标,例如:
const elem = await $('header h1*=Welcome') // 这不起作用!!!
// 应该使用
const elem = await $('header').$('*=driver')
具有特定文本的元素
同样的技术也可以应用于元素。此外,还可以使用 .= 或 .*= 进行不区分大小写的匹配。
例如,这里查询文本为"Welcome to my Page"的一级标题:
selectors/example.html
loading...
你可以通过以下方式查询该元素:
selectors/example.js
loading...
或使用查询部分文本:
selectors/example.js
loading...
同样适用于 id 和 class 名称:
selectors/example.html
loading...
你可以通过以下方式查询该元素:
selectors/example.js
loading...
注意: 你不能在一个选择器中混合使用多种选择器策略。使用多个链式元素查询来达到相同的目标,例如:
const elem = await $('header h1*=Welcome') // 这不起作用!!!
// 应该使用
const elem = await $('header').$('h1*=Welcome')