5

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

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

需要注意的另一件事是,我在情节提要编辑器的身份检查器中找不到任何可访问性部分,用于分段控件。但是,我暂时在主视图中添加了一个按钮,并使用可访问性标签对其进行了配置,只是为了测试在运行我的测试时,elements() 或 buttons() 调用是否会随后显示主视图的元素,但这些数组仍然返回为空,即使有按钮。

这是我的脚本:

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();

非常感谢任何帮助。

编辑:我将此添加到我的脚本中以从主窗口搜索整个视图层次结构,在 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");
}

....
}

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

在此处输入图像描述

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

这表明

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

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

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

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

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

var target = UIATarget.localTarget();

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

所以,我想在最坏的情况下我可以使用这样的东西,但 UI 自动化认为控件不存在对我来说毫无意义。这么奇怪。一定有一些我遗漏的东西,但我的设置是如此基本,我无法想象它会是什么。

4

2 回答 2

4

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

在医师CollectionView 渲染后的目标 C 代码中,删除标签和可访问性标志并改为执行以下操作:

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

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

于 2014-03-14T00:52:44.193 回答
1

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

UIATarget.localTarget().delay(3);

我认为您的应用程序可能在您上面发布的 logElementTree() 之前没有完成渲染/动画。我们在自动化测试脚本的开始和每个应用程序转换之间添加延迟,以确保屏幕已完成渲染。

编辑:在测试应用程序中弄乱了您的设置后,我相信您的问题是您在包含分段控件的 UIView 上启用了可访问性。在 UIView 上禁用可访问性后,我可以让 UISegmentedControl 在元素树中显示,但是一旦启用它,UIView 就会开始显示为没有子元素的 UIAElement。我的建议是禁用包含 UIView 的可访问性,并且仅对基本控件(如按钮、表格视图单元格或分段按钮控件)使用可访问性。

于 2013-02-14T21:00:36.937 回答