XCUIElementQuery 将匹配自定义类的所有实例

Posted

技术标签:

【中文标题】XCUIElementQuery 将匹配自定义类的所有实例【英文标题】:XCUIElementQuery that will match all instances of a custom class 【发布时间】:2021-09-10 20:24:27 【问题描述】:

我用自定义类替换了我的应用程序中的所有UISwitch 实例——我们称之为MySwitch——因此XCUIElementTypeQueryProvider.switches 查询不包含任何结果。如何创建一个确实 匹配作为MySwitch 实例的所有后代的查询?

理想情况下,我想要的是能够调用someElement.switches 并让它返回UISwitchMySwitch 的所有实例,或者调用someElement.mySwitches 并让它返回MySwitch 的所有实例。

【问题讨论】:

【参考方案1】:

您需要一种唯一标识您的开关的方法,因为大概它们现在返回为otherElement,并且对所有这些的查询会返回大量垃圾(取决于您的应用程序)。将mySwitch 的可访问性ID(或任何您想要的)添加到您的交换机,您应该能够使用myElement.otherElements[“mySwitch”] 将它们全部取回。

如果您需要一个同时返回自定义开关(通过标识符找到)和标准开关的查询,您将不得不想出一个复合谓词。我已经猜测了第二个谓词应该是什么(未测试/从未编写过 elementType 谓词,因此您可能需要玩一下),但应该是这样的:

let mySwitchPredicate = NSPredicate(format: "identifier = %@", "mySwitch")
let standardSwitchPredicate = NSPredicate(format: "elementType = %@", ".switch")
let predicate = NSCompoundPredicate(orPredicateWithSubpredicates: [mySwitchPredicate, standardSwitchPredicate])

【讨论】:

感谢您的建议!可访问性标识符方法是我现在正在做的事情,它足以编写我的测试用例,但这不是我正在寻找的解决方案,因为如果我想为特定开关提供唯一标识符,它就会崩溃——比如元素可以通过其唯一标识符找到,但不会提供通用查询。如果这意味着我的问题没有解决方案,正如我严格定义的那样,那么至少我会了解 UI 测试框架可以被推动的极限。 是的,因为您发现非标准组件更难使用。也许您的开关包含在唯一可识别的对象中(例如可以为每个开关添加 ID 的单元格),您可以使用这些对象找到它们?

以上是关于XCUIElementQuery 将匹配自定义类的所有实例的主要内容,如果未能解决你的问题,请参考以下文章

如何将expectationForPredicate 与XCUIElementQuery UISwitch 一起使用

Xcode 7 UI 测试 XCUIElementQuery 随机未正确更新

如何使用 XCUIElementQuery 测试 UIView 的存在?

UITest XCUIElementQuery 缺少元素

第十一课异常类的构建-------------狄泰软件学院

Qt 将信号与自定义插槽匹配