You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 07:41:30