iOS UI自动化元素找不到子元素

我刚刚开始使用UI自动化为我的iOS应用程序,并已遇到麻烦。 我无法添加屏幕截图,所以我会尽我所能来描述我的情况。

我正在为iOS 6.0构build,并使用故事板。 该应用程序启动到导航控制器的屏幕。 根视图控制器包含一个主视图,它具有1个UIView子视图,占据屏幕底部的60%,以及位于该子视图之上的分段控件。 我能够configuration主视图(标签“mainview”)的可访问性。 那么我可以在我的testing中find这个元素没有问题。 但是,我现在无法find分段控制器。 所以我决定从我的“mainview”元素中注销“elements()”和“segementedControls()”的长度,每个数组的长度都是0.所以当testing运行我的应用程序时,它说没有子我的主要观点元素。

另外需要注意的是,我无法在分段控件的故事板编辑器的身份检查器中find任何可访问性部分。 然而,我暂时在我的主视图中添加了一个button,并使用可访问标签对其进行了configuration,只是为了testing在运行我的testing时,元素()或button()调用是否随后会显示主视图的元素,但是这些数组仍然是返回为空,即使button。

这是我的脚本:

var target = UIATarget.localTarget(); var app = target.frontMostApp(); function selectListView() { var testName = "selectListView"; UIALogger.logStart(testName); var view = app.mainWindow().elements()["mainview"]; if (!view.isValid()) { UIALogger.logFail("Could not locate main view"); } UIALogger.logMessage("Number of elements for sub element: " + view.elements().length); var segmentedControl = view.segmentedControls()[0]; if (!segmentedControl.isValid()) { UIALogger.logFail("Could not locate segmented control on physician collection parent view"); } var listButton = segmentedControl.buttons()[1]; if (!listButton.isValid()) { UIALogger.logFail("Could not locate list button on segemented controller on physician collection parent view"); } UIALogger.logMessage("Tapping List button on physician collection view's segmented control"); listButton.tap(); UIALogger.logPass(testName); } selectListView(); 

任何帮助不胜感激。

编辑:我添加到我的脚本从主窗口中search整个视图层次结构,在initWithCoder中为我的分段控件设置辅助function标签值(因为我似乎无法在分段控件的故事板编辑器中设置一个,正如我前面所述),仍然无法find元素 – 就好像它不在视图层次结构中,尽pipe它在屏幕上并且function正常:

 function traverse(root, name) { if (root.name() == name) { return root; } var elements = root.elements(); for (var i = 0; i < elements.length; i++) { var e = elements[i]; var result = traverse(e, name); if(result != null) { return result; } } return null; } function selectListView() { var testName = "selectListView"; var segmentedControl = traverse(UIATarget.localTarget().frontMostApp().mainWindow(), "mysegementedcontrol"); if (segmentedControl == null) { UIALogger.logMessage("Still could not find it"); } .... } 

编辑:添加到app.logElementTree()调用,仍然没有分段控制在视线(“PhysicianCollectionParentView”是我的“主视图” – 你可以看到,没有子元素):

在这里输入图像说明

编辑:这里有一些屏幕截图。 第一个显示我的“主”视图控制器。 下一个显示,除了分段控制还有一个UIView子视图。 第三个显示了我的故事板中的应用程序的基本入口点。

这显示了“主”视图控制器

这表明,除了分段控制之外,还有一个UIView子视图

这显示了我的故事板文件的基本入口点部分

这里是我的“主”视图控制器在这里的类扩展,显示分段控制和其他UIView子视图的sockets:

 @interface PhysicianCollectionMasterViewController () @property (strong, nonatomic) IBOutlet UISegmentedControl *viewSelectionControl; @property (strong, nonatomic) IBOutlet UIView *physicianCollectionView; @end 

编辑:这是一个非常有趣的东西 – 我决定去用一个全新的脚本内创build的脚本,并利用loggingfunction。 当我点击我的分段控件时,下面是它创build的JavaScript来向我展示它如何访问我的分段控件上的button:

 var target = UIATarget.localTarget(); target.frontMostApp().mainWindow().elements()["PhysicianCollectionParentView"].tapWithOptions({tapOffset:{x:0.45, y:0.04}}); 

所以,我认为最坏的情况是我可以这样做,但是对于我来说UI自动化并不认为这个控件是存在的。 这么奇怪。 必须有一些我失踪,但我的设置是如此基本,我无法想象它可能是什么。

为元素设置accessibilityLabel并将其标记为isAccessibilityElement = YES; 该元素的子视图是隐藏的。 对于自动化,您应该使用accessibilityIdentifier而不是accessibilityLabel并设置isAccessibilityElement = NO;

在physicianCollectionView渲染后的目标C代码中,移除标签和辅助function标记,然后执行此操作:

 physicianCollectionView.accessibilityIdentifier = @"PhysicianCollectionParentView"; physicianCollectionView.isAccessibilityElement = NO; 

对于元素树中没有子视图的最后一个元素,设置isAccessibilityElement = YES;

如果您还没有尝试过,可以尝试在脚本的开头添加延迟:

 UIATarget.localTarget().delay(3); 

我认为你的应用程序可能没有在上面发布的logElementTree()之前进行渲染/animation处理。 我们在自动化testing脚本的开始处和每次应用程序转换之间添加延迟,以确保屏幕已完成呈现。

编辑:在testing应用程序中搞乱了你的设置之后,我相信你的问题是你在包含你的分段控件的UIView上启用了辅助function。 随着UIView禁用辅助function,我能够得到UISegmentedControl显示在元素树,但一旦我启用它,UIView然后开始显示为一个没有孩子的UIAElement。 我的build议是禁用包含UIView的可访问性,只使用基本控件的可访问性(如button,表格视图单元格或分段的button控件)。