iOS UI Automation元素不会找到子元素

fog*_*olf 5 objective-c ios ios-ui-automation

我刚刚开始使用UI自动化iOS应用程序,我已经遇到了麻烦.我无法附加屏幕截图,所以我会尽力描述我的场景.

我正在为iOS 6.0构建并使用故事板.该应用程序启动到带有导航控制器的屏幕.根视图控制器包含一个主视图,该视图具有占据屏幕底部60%的1个UIView子视图和位于该子视图上方的分段控件.我能够为主视图配置辅助功能(标签"mainview").然后我能够在我的测试中找到这个元素没问题.但是,我现在无法找到分段控制器.所以我决定从我的"mainview"元素中注销"elements()"和"segementedControls()"的长度,每个数组的长度为0.所以当测试运行我的应用程序时,它说没有子 - 我的主要观点上的元素.

需要注意的另一件事是我在故事板编辑器的身份检查器中找不到任何可访问性部分用于分段控件.但是我暂时在主视图中添加了一个按钮,并使用辅助功能标签对其进行了配置,以便测试在运行我的测试时,elements()或者按钮()调用是否随后会显示主视图的元素,但是这些数组仍然是即使按下按钮也会返回空白状态.

这是我的脚本:

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();
Run Code Online (Sandbox Code Playgroud)

任何帮助非常感谢.

编辑:我将此添加到我的脚本中以从主窗口搜索整个视图层次结构,在initWithCoder中为我的分段控件设置辅助功能标签值(因为我似乎无法在故事板编辑器中为分段控件设置一个,正如我之前所说的那样)并且仍然找不到元素 - 就好像它不在视图层次结构中,虽然它在屏幕上并且运行正常:

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");
}

....
}
Run Code Online (Sandbox Code Playgroud)

编辑:添加了对app.logElementTree()的调用,仍然没有看到分段控件("PhysicianCollectionParentView"是我的"主视图" - 你可以看到,那里没有子元素):

在此输入图像描述

编辑:这是一些屏幕截图.第一个显示我的"主"视图控制器.接下来显示除了分段控件之外,还有一个UIView子视图.第3部分显示了我的故事板中应用程序的基本入口点.

这显示了

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

这显示了我的storyboard文件的基本入口点部分

这里是我的"主"视图控制器的类扩展,显示了分段控件和其他UIView子视图的出口:

@interface PhysicianCollectionMasterViewController ()
@property (strong, nonatomic) IBOutlet UISegmentedControl *viewSelectionControl;
@property (strong, nonatomic) IBOutlet UIView *physicianCollectionView;
@end
Run Code Online (Sandbox Code Playgroud)

编辑:这里有一些非常有趣的东西 - 我决定使用在乐器中创建的全新脚本并利用录制功能.当我点击我的分段控件时,这里是它创建的JavaScript,向我展示它是如何访问我的分段控件上的一个按钮的:

var target = UIATarget.localTarget();

target.frontMostApp().mainWindow().elements()["PhysicianCollectionParentView"].tapWithOptions({tapOffset:{x:0.45, y:0.04}});
Run Code Online (Sandbox Code Playgroud)

所以,我猜最糟糕的情况我可以选择这样的东西,但对我来说,UI自动化只是不认为控件存在是没有意义的.这么奇怪.必须有一些我缺少的东西,但我的设置是如此基本,我无法想象它可能是什么.

小智 4

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

在呈现 doctorCollectionView 后的目标 C 代码中,删除标签和可访问性标志并执行以下操作:

physicianCollectionView.accessibilityIdentifier = @"PhysicianCollectionParentView";
physicianCollectionView.isAccessibilityElement = NO;
Run Code Online (Sandbox Code Playgroud)

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