选择器
WebdriverIO MCP 服务器支持多种选择器策略,用于定位网页和移动应用程序中的元素。
信息
有关包括所有 WebdriverIO 选择器策略在内的综合选择器文档,请参阅主要的选择器指南。本页面主要关注 MCP 服务器常用的选择器。
Web 选择器
对于浏览器自动化,MCP 服务器支持所有标准的 WebdriverIO 选择器。最常用的包括:
| 选择器 | 示例 | 描述 |
|---|---|---|
| CSS | #login-button, .submit-btn | 标准 CSS 选择器 |
| XPath | //button[@id='submit'] | XPath 表达式 |
| 文本 | button=Submit, a*=Click | WebdriverIO 文本选择器 |
| ARIA | aria/Submit Button | 无障碍名称选择器 |
| 测试 ID | [data-testid="submit"] | 推荐用于测试 |
有关详细示例和最佳实践,请参阅选择器文档。
移动端选择器
移动端选择器通过 Appium 在 iOS 和 Android 平台上工作。
无障碍 ID(推荐)
无障碍 ID 是最可靠的跨平台选择器。它们在 iOS 和 Android 上都能工作,并在应用更新中保持稳定。
# 语法
~accessibilityId
# 示例
~loginButton
~submitForm
~usernameField
最佳实践
尽可能首选无障碍 ID。它们提供:
- 跨平台兼容性(iOS + Android)
- 在 UI 变化中保持稳定
- 更好的测试可维护性
- 改善应用的无障碍性
Android 选择器
UiAutomator
UiAutomator 选择器对 Android 来说强大且快速。
# 通过文本
android=new UiSelector().text("Login")
# 通过部分文本
android=new UiSelector().textContains("Log")
# 通过资源 ID
android=new UiSelector().resourceId("com.example:id/login_button")
# 通过类名
android=new UiSelector().className("android.widget.Button")
# 通过描述(无障碍)
android=new UiSelector().description("Login button")
# 组合条件
android=new UiSelector().className("android.widget.Button").text("Login")
# 可滚动容器
android=new UiScrollable(new UiSelector().scrollable(true)).scrollIntoView(new UiSelector().text("Item"))
资源 ID
资源 ID 在 Android 上提供稳定的元素标识。
# 完整资源 ID
id=com.example.app:id/login_button
# 部分 ID(推断应用包)
id=login_button
XPath (Android)
XPath 在 Android 上有效,但比 UiAutomator 慢。
# 通过类和文本
//android.widget.Button[@text='Login']
# 通过资源 ID
//android.widget.EditText[@resource-id='com.example:id/username']
# 通过内容描述
//android.widget.ImageButton[@content-desc='Menu']
# 层次结构
//android.widget.LinearLayout/android.widget.Button[1]
iOS 选择器
谓词字符串
iOS 谓词字符串对 iOS 自动化来说快速而强大。
# 通过标签
-ios predicate string:label == "Login"
# 通过部分标签
-ios predicate string:label CONTAINS "Log"
# 通过名称
-ios predicate string:name == "loginButton"
# 通过类型
-ios predicate string:type == "XCUIElementTypeButton"
# 通过值
-ios predicate string:value == "ON"
# 组合条件
-ios predicate string:type == "XCUIElementTypeButton" AND label == "Login"
# 可见性
-ios predicate string:label == "Login" AND visible == 1
# 不区分大小写
-ios predicate string:label ==[c] "login"
谓词运算符:
| 运算符 | 描述 |
|---|---|
== | 等于 |
!= | 不等于 |
CONTAINS | 包含子字符串 |
BEGINSWITH | 以...开始 |
ENDSWITH | 以...结束 |
LIKE | 通配符匹配 |
MATCHES | 正则表达式匹配 |
AND | 逻辑与 |
OR | 逻辑或 |
类链
iOS 类链提供层次结构元素定位,性能良好。
# 直接子元素
-ios class chain:**/XCUIElementTypeButton[`label == "Login"`]
# 任何后代
-ios class chain:**/XCUIElementTypeButton
# 通过索引
-ios class chain:**/XCUIElementTypeCell[3]
# 与谓词组合
-ios class chain:**/XCUIElementTypeButton[`name == "submit" AND visible == 1`]
# 层次结构
-ios class chain:**/XCUIElementTypeTable/XCUIElementTypeCell[`label == "Settings"`]
# 最后一个元素
-ios class chain:**/XCUIElementTypeButton[-1]
XPath (iOS)
XPath 在 iOS 上有效,但比谓词字符串慢。
# 通过类型和标签
//XCUIElementTypeButton[@label='Login']
# 通过名称
//XCUIElementTypeTextField[@name='username']
# 通过值
//XCUIElementTypeSwitch[@value='1']
# 层次结构
//XCUIElementTypeTable/XCUIElementTypeCell[1]
跨平台选择器策略
当编写需要在 iOS 和 Android 上都能工作的测试时,请按此优先顺序使用: