Хорошо, после нескольких дней расследования у нас есть обходной путь. К сожалению, он использует частный API, но мы не слишком беспокоимся, поскольку он предназначен для тестов и лучше, чем любой другой обходной путь, который мы пробовали до сих пор.
Используя частный API, можно выяснитьUIAccessibilityTraits
представления, который представляет XCUIElement
:
var underlyingAccessibilityTraits: UIAccessibilityTraits {
guard let rawValue = value(forKey: "traits") as? UInt64 else { return [] }
return UIAccessibilityTraits(rawValue: rawValue)
}
Теперь, когда у нас есть черты, мы можем запросить их так же, как и любые другие OptionSet
:
element.underlyingAccessibilityTraits.contains(.header)
И мы можем использовать это для построения нашего собственного запроса, вместо использования XCUIElementQuery
:
let allElementsMatchingID = XCUIApplication().descendants(matching: .any).matching(.any, identifier: id) // id is an optional string as an ID, like when using `XCUIApplication().otherElements[id]`
let allHeaders = allElementsMatchingID.allElementsBoundByAccessibilityElement.filter { $0.underlyingAccessibilityTraits.contains(.header) }
let element = allHeaders[index] // index is an int, like when using `element(boundBy: 0`
Недостатком этого (кроме необходимости использования частного API) является то, что в отличие от обычных XCUIElementQuery
s, это приведет к сбою, если индекс выходит за границы, но если вы всегда ожидаете, что элемент будет существовать, это не такая уж большая проблема.