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已经处理以及哪些尚未处理.
解决方法
我认为您需要指定“屏幕”的标准以及如何访问它们.
基本上,可以是以下结构的东西
- UITabBarController -- UISplitViewController --- UINavigationController ---- UIViewController ----- UIBarButtonItems ----- UIView ----- UIButton ----- UISwitch ----- UITableViewCell
您现在可以从UITabBarController自上而下到下一个控制实例(也可以跳过一个,例如iPhone上的SplitViewControllers).
您可以使用一般属性:
XCUIApplication().tabBars
然而,转换是一个问题:你如何从一个ViewController到另一个ViewController并且它们都在ViewController的View中定位,或者你是否必须循环视图的子视图.
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