allElementsBoundByAccessibilityElement的含义

时间:2018-03-15 19:11:38

标签: xctest xcode-ui-testing

我正在学习使用XCTest进行UI测试。我无法理解XCUIElementQuery.allElementsBoundByAccessibilityElement的文件:

  

立即评估查询并返回绑定的元素数组   得到的辅助功能元素。

“生成的辅助功能元素绑定的元素”是什么意思?另外,与allElementsBoundByIndex的区别是什么?

1 个答案:

答案 0 :(得分:2)

allElementsBoundByAccessibilityElement的文档不是很好,但是我通过调试器来确定与allElementsBoundByIndex的区别。

调用allElementsBoundByAccessibilityElementallElementsBoundByIndex将返回XCUIElement对象的数组。

let app = XCUIApplication();
app.launch();

let elementsByAccessibilityElement = app.images.allElementsBoundByAccessibilityElement;

let elementsByIndex = allElementsBoundByIndex;

返回此数组后,XCUIElement对象本身并没有真正解析,并保留了对原始查询的引用。

尝试通过.label访问诸如XCUIElement之类的属性...

您将看到元素通过对可访问性层次结构进行快照,然后重新运行原始查询来查找元素来解决自身。您可以在调试控制台中看到如下所示的输出:

    t =     5.76s Get all elements bound by index for: Descendants matching type Other
    t =     5.84s     Snapshot accessibility hierarchy for app with pid 4267
    t =    10.79s     Find: Descendants matching type Other

当元素解析并运行原始查询时,这两种方法之间的巨大差异。调用allElementsBoundByIndex时,XCUIElement实例通过运行原始查询然后在该索引处获取结果来查找自己。

这意味着,如果应用程序UI在调用allElementsBoundByIndex与实际解析数组中的XCUIElement对象之间进行了更改,则数组中的元素集可能会与您最初预期的不同。

调用allElementsBoundByAccessibilityElement时,XCUIElement实例通过运行原始查询并获取与该元素在创建查询时具有的可访问性标识符匹配的结果来查找自己。

如果应用程序UI在调用allElementsBoundByAccessibilityElement与实际解析数组中的XCUIElement对象之间切换,并且原始元素之一不再存在,则应用程序将引发错误。