【问题标题】:iOS UI Automation element finds no sub-elementsiOS UI 自动化元素找不到子元素
【发布时间】:2013-02-11 22:02:11
【问题描述】:

我刚刚开始为我的 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 自动化不认为控件存在对我来说毫无意义。这么奇怪。一定有什么我遗漏的东西,但我的设置太简单了,我无法想象它会是什么。

【问题讨论】:

  • 已投赞成票,以便您现在可以添加碎石镜头...
  • 尝试从您的脚本中调用app.logElementTree();,它将记录当前屏幕的完整元素树。
  • 感谢您的支持!还要感谢有关 logElementTree() 的信息。我将运行它并在此处发布输出。
  • 添加了该日志调用,果然,该视图没有分段控件和子元素。将屏幕截图附加到我的原始帖子。
  • PhysicianCollectionParentViewUIContainerView 吗?我也很困惑为什么会这样。我可以在我的应用程序中很好地访问自定义视图,并且我使用情节提要。您可以向我们提供有关 PhysicianCollectionParentView 及其内部内容的更多详细信息吗?你能发布故事板那部分的截图吗?

标签: ios objective-c ios-ui-automation


【解决方案1】:

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

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

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

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

【讨论】:

  • 谢谢,我会试一试!
【解决方案2】:

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

UIATarget.localTarget().delay(3);

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

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

【讨论】:

  • 谢谢。我确实尝试过,但会再试一次。你推荐多长时间?我尝试了 5 秒,但会为了看看而把它撞起来。分段控制肯定是可见的,但也许延迟足够的时间会处理它。
  • 这也为我解决了问题!非常感谢您抽出这么多时间来帮助我。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-09
  • 2018-08-10
  • 2017-08-03
  • 1970-01-01
  • 2012-01-19
  • 1970-01-01
  • 2017-12-05
相关资源
最近更新 更多