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

时间:2017-02-27 05:06:11

标签: ios xcode user-interface testing xcode-ui-testing

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

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已经处理以及哪些尚未处理。

2 个答案:

答案 0 :(得分:3)

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

我认为你需要指定“屏幕”的标准以及如何访问它们。

基本上,可以采用以下结构

- 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实例,获取相关的View(并递归执行以下调用)。

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

通过这种方式,您应该可以在应用层次结构中浏览很多视图,但是您需要一些UIBarButtonItems,自定义手势识别器的扩展,当然还有一些可以监听值更改并执行的“特殊”控件布局改变。

访问特定元素

除了上面的方法,您只需获取特定类型的元素数组,您就可以访问特定元素(例如,您知道它们是具有某些ValueChangeListeners的特定类型的元素)

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

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

然后做:

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

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

获取元素的相关标识符的一个好方法是使用Apple的Accessibility Inspector: https://developer.apple.com/library/content/technotes/TestingAccessibilityOfiOSApps/TestAccessibilityiniOSSimulatorwithAccessibilityInspector/TestAccessibilityiniOSSimulatorwithAccessibilityInspector.html

一般访问元素

要访问一般的元素,您需要使用这些对象的XCUIElementType,在这里您将根据它们的类访问对象。 例如。你可以打电话: 一般来说,元素中的“tabBars”,“navBars”,“表格”,“按钮”等等。

你仍然会遇到“特殊控制”的问题。由于Apple文档缺少(imho)有关属性和属性的一些细节,我建议在此处提供文档:https://blog.metova.com/guide-xcode-ui-test/它提供了可访问内容的精彩概述,可以帮助您更好地理解。

可在此处找到可用XCUIElementTypes的概述。基本上,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

答案 1 :(得分:2)

我能想到的唯一方法是使用Xcode UI测试记录器功能。 在录制时,通过设备/模拟器浏览所有屏幕,然后使用适当的参考记录XCUIApplication()变量。 如果按钮/导航栏/任何元素上有文本,它将显示在录制的代码中,否则将以数字方式引用。

希望有所帮助。

亲切的问候, 木孔德