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

Posted

技术标签:

【中文标题】如何使用 XCUIElementQuery 测试 UIView 的存在?【英文标题】:How can I test for the existence of a UIView using XCUIElementsQuery? 【发布时间】:2015-12-14 18:45:01 【问题描述】:

很难从 Apple 找到合适的 UI 测试框架文档。我已经看到了很多可以找到具有特定名称的按钮和标签的示例,但是如何查找通用 UIView?

例如,假设我设置了一个带有 accessibilityLabel == "Some View" 的视图,我如何在测试执行期间找到具有该名称的视图?

我尝试(不成功)以下代码:

XCUIElement *pvc = [[app childrenMatchingType:XCUIElementTypeAny] elementMatchingPredicate:[NSPredicate predicateWithFormat:@"accessibilityLabel == 'Places View'"]];

NSPredicate *exists = [NSPredicate predicateWithFormat:@"exists == true"];
[self expectationForPredicate:exists evaluatedWithObject:pvc handler:nil];
[self waitForExpectationsWithTimeout:10 handler:nil];

NSLog(@"%@", [[app childrenMatchingType:XCUIElementTypeAny] elementMatchingPredicate:[NSPredicate predicateWithFormat:@"accessibilityLabel == 'Places View Controller'"]]);

【问题讨论】:

【参考方案1】:

我在上面的代码中看到的问题是,您专门试图在应用程序的子项中查找视图,而不是在应用程序的后代中查找。子视图严格来说是视图的子视图,搜索不会查看子子视图等。除此之外,它看起来很好。

试试:

XCUIElement *pvc = [[app descendantsMatchingType:XCUIElementTypeAny] elementMatchingPredicate:[NSPredicate predicateWithFormat:@"accessibilityLabel == 'Places View'"]];

此外,UIView 的默认设置是根本不参与可访问性,因此除了设置标签(顺便说一下,您关于设置标签的问题中的代码 sn-p 是进行比较而不是赋值)之外,您还应确保启用可访问性:

view.isAccessibilityElement = YES
view.accessibilityLabel = @"AccessibilityLabel"

【讨论】:

哦,我发现我在寻找孩子时犯了错误。不幸的是,搜索后代也不起作用......我尝试设置一个大的超时,但 Xcode 没有找到具有该可访问性标签的视图。 如果您使用辅助功能检查器,您可以选择您要查找的视图吗?除了设置标签之外,您还需要确保启用了可访问性。默认情况下,我认为 UIView 未启用可访问性。【参考方案2】:

其他答案的查询有效,但我发现您也可以简单地通过以下方式找到视图:

app.otherElements["MenuViewController.menuView"].swipeLeft()

在我的例子中,MenuViewController.menuView 是一个带有accessibilityIdentifier 集的UIView

【讨论】:

以上是关于如何使用 XCUIElementQuery 测试 UIView 的存在?的主要内容,如果未能解决你的问题,请参考以下文章

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

如何在 XCUIElementQuery 中获取 XCUIElement 的索引?

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

UI 测试 NSPredicate 的单元格 staticTexts

使用 XCUIElementQuery 在 SwiftUI 中查找嵌入在表单中的 DatePicker() 的可访问性(标识符:)

UITest XCUIElementQuery 缺少元素