iPad模拟器XCUITest遇多个More按钮,如何指定点击目标?
问题描述
在XCUITest中点击More按钮的代码如下:
XCUIElement* moreKey = self.app.keys[@"more"]; [moreKey tap];
该代码在iPhone模拟器运行正常,但在iPad模拟器执行时崩溃,报错信息:
Failed to Error Domain=com.apple.dt.xctest.ui-testing.error Code=10006 "Multiple matching elements found for <XCUIElementQuery: 0x600000c51c20> ...
原因是iPad模拟器中存在两个标识符为more的按钮,查询结果显示:
...} ↪︎Find: Elements matching predicate '"more" IN identifiers' Output: { Key, 0x15e670f80, {{0.0, 1049.0}, {132.0, 60.0}}, identifier: 'more', label: 'numbers' Key, 0x15e678570, {{546.0, 1049.0}, {98.5, 60.0}}, identifier: 'more', label: 'numbers'
由于无法修改Apple自带More按钮的标识符,需要解决多元素匹配的问题,询问是否可以使用elementBoundByIndex:方法。
解决方案
1. 直接使用elementBoundByIndex:定位
这是最直接的解决方式,既然查询返回多个元素,可通过索引指定目标按钮:
// 点击第一个匹配的More按钮 XCUIElement* moreKey = [self.app.keys elementBoundByIndex:0]; [moreKey tap]; // 如需点击第二个,改用索引1 // XCUIElement* moreKey = [self.app.keys elementBoundByIndex:1]; // [moreKey tap];
注意:索引顺序基于查询结果的返回顺序,若后续UI布局变动,索引可能失效,需根据实际情况调整。
2. 通过元素位置筛选
从查询结果可见两个按钮坐标不同,可结合位置属性精准筛选:
// 筛选左侧的More按钮(x坐标小于300) NSPredicate *predicate = [NSPredicate predicateWithFormat:@"frame.origin.x < 300"]; XCUIElement* moreKey = [self.app.keys elementMatchingPredicate:predicate]; [moreKey tap];
3. 通过父容器缩小查询范围
若两个More按钮分属不同父视图,可先定位目标父容器,再查找子元素:
// 示例:定位到目标工具栏后再查找More按钮 XCUIElement* targetToolbar = self.app.toolbars[@"目标工具栏标识符"]; XCUIElement* moreKey = targetToolbar.keys[@"more"]; [moreKey tap];
内容的提问来源于stack exchange,提问作者InfiniteLoop
相关产品推荐
相关产品推荐

