iOS UITest - 导航到所有可用屏幕

iOS UITest - Navigate to all available screens

我正在为 Swift 应用程序使用 iOS UITest。我使用类似的东西,

func testAllScreenNavigation() {

    let app = XCUIApplication()
    app.tabBars.buttons["Home"].tap()
    app.navigationBars["Home"].buttons["More"].tap()
    app.sheets.buttons["Cancel"].tap()
}

等导航一些特定的、选项卡、按钮等,并切换到相应的屏幕。但是我想导航我的应用程序的每个屏幕(无论是 BFS 样式导航还是 DFS 样式导航)。有什么方法 iOS 可以让我获取所有可导航的元素,然后自动为我的应用程序进行更深入的探索吗?

我还需要跟踪屏幕中的哪些 xcuoelement 已经处理,哪些尚未处理。

我能想到的唯一方法是使用 Xcode UI 测试记录器功能。 在录制时,通过 device/simulator 浏览所有屏幕,然后 XCUIApplication() 变量将与适当的引用一起录制。 如果 button/nav bar/any 元素上有文本,它将显示在记录的代码中,否则将以数字方式引用。

希望对您有所帮助。

亲切的问候, 穆昆德

我喜欢你的想法,例如获取所有视图并检查布局和本地化是否正常。

我认为您需要指定 "screens" 的条件以及访问它们的方式。

基本上,一个可以是以下结构的东西

- UITabBarController
-- UISplitViewController
--- UINavigationController
---- UIViewController
----- UIBarButtonItems
----- UIView
----- UIButton
----- UISwitch
----- UITableViewCell

您现在可以从 UITabBarController 自上而下转到下一个控制实例(也可以跳过一个,例如 iPhone 上的 SplitViewControllers)。

可以使用一般的属性:

XCUIApplication().tabBars

尽管如此,这个转换是问题所在:你如何从一个 ViewController 到另一个 ViewController 并且它们都位于 ViewController 的视图中还是你必须循环一个子视图查看。

UIButton -> Touch Up Inside
UISwitch -> Value Changed
UITableViewCell -> DidSelectRowAtIndexPath
UIView -> UILongPressGestureRecognizer

这就是我的基本设置方式: 对于每个 UIViewController 实例,获取相关的视图(并递归执行以下调用)。

检查一个视图的所有子视图。 对于 UIViews,更进一步检查它们的子视图 对于 UIButtons,执行 TouchUpInside 等等。 确保有一个停止深入的条件,因为 UITableViews 有很多子视图,否则你的 UIWebViews 当然会以不同的方式设置。

通过这种方式,您应该能够在应用层次结构中浏览大量视图,但您需要对 UIBarButtonItems、自定义手势识别器以及可能会监听的 "special" 控件进行一些扩展值更改并执行布局更改。


访问特定元素

除了上述方法(您只需获取特定类型的元素数组)之外,您还可以访问特定元素(例如,那些您知道它们属于具有某些 ValueChangeListeners 或其他东西的非常特定类型的元素)

要特别访问特定对象,如上面的 TabBar 示例,您可以像这样使用 accessibilityLabel。首先,您需要在您的代码或 .xib-file/.storyboard 中声明 accessibilityLabel:

// just to illustrate, so you get an idea:
self.tabBarController.isAccessibilityElement = true
self.tabBarController.accessibilityLabel = "tabBar"

然后做:

let tabBar = XCUIApplication().tabBars["tabBar"]

这是 Apple 用于设置这些 accessibilityLabel 的文档: https://developer.apple.com/library/content/documentation/UserExperience/Conceptual/iPhoneAccessibility/Making_Application_Accessible/Making_Application_Accessible.html

获取元素相关标识符的一种好方法是使用 Apple 的辅助功能检查器: https://developer.apple.com/library/content/technotes/TestingAccessibilityOfiOSApps/TestAccessibilityiniOSSimulatorwithAccessibilityInspector/TestAccessibilityiniOSSimulatorwithAccessibilityInspector.html


一般访问元素

一般要访问元素,您需要使用这些对象的XCUIElementType,这里您将根据它们类访问这些对象。 例如。你可以打电话: "tabBars"、"navBars"、"tables"、"buttons" 等一般来自元素。

您仍然会遇到 "special controls" 的问题。由于 Apple 文档缺少(恕我直言)有关特性和属性的一些详细信息,我推荐此处的文档:https://blog.metova.com/guide-xcode-ui-test/ 它提供了有关可访问内容的重要概述,可以帮助您更好地理解。

可在此处找到可用 XCUIElementType 的概述。基本上,elementType 属性 是一个枚举值,表示元素的类型。 XCUIElementType 是一个非常大的枚举,它的一些成员不适用于 iOS 应用程序(它们适用于 MacOS X 应用程序)。一些更常用的值是:

Alert
Button
NavigationBar
TabBar
ToolBar
ActivityIndicator
SegmentedControl
Picker
Image
StaticText
TextField
DatePicker
TextView
WebView

https://developer.apple.com/reference/xctest/xcuielementtype?language=objc