allElementsBoundByAccessibilityElement 的含义

Meaning of allElementsBoundByAccessibilityElement

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

的文档

Immediately evaluates the query and returns an array of elements bound to the resulting accessibility elements.

"elements bound to the resulting accessibility elements"是什么意思?还有,和allElementsBoundByIndex有什么区别?

allElementsBoundByAccessibilityElement 的文档不是很好,但我通过使用调试器四处寻找与 allElementsBoundByIndex 的区别。

调用 allElementsBoundByAccessibilityElementallElementsBoundByIndex 将 return 一个包含 XCUIElement 个对象的数组。

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

let elementsByAccessibilityElement = app.images.allElementsBoundByAccessibilityElement;

let elementsByIndex = allElementsBoundByIndex;

在 returning 这个数组之后,XCUIElement 对象本身并没有真正解析,而是保留对原始查询的引用。

尽管在 XCUIElement 上尝试访问 属性 之类的 .label...

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

    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 对象之间发生变化,并且原始元素之一不再存在,应用将抛出一个错误。