我刚刚开始为我的 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 子视图的出口:
@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 自动化认为控件不存在对我来说毫无意义。这么奇怪。一定有一些我遗漏的东西,但我的设置是如此基本,我无法想象它会是什么。