iOS UITests - 如何获取当前视图中存在的 XCUIElement 列表
iOS UITests - How to get XCUIElement list which exist in current view
我需要获取当前视图中存在的 XCUIElement 列表。
例如,
let app = XCUIApplication()
let allElements = app.otherElements.allElementsBoundByIndex
returns xcuielements 的完整列表,但我只想获取可点击且存在于当前视图中的元素。
如果您想要完整的元素列表,而不仅仅是 otherElements
,它不包括按钮、标签和其他常见视图类型,您必须按元素类型 .Any
.
默认情况下不存在的元素不会出现在列表中,但您可以使用循环过滤 hittable
以将列表限制为仅显示在屏幕上的那些项目。
let app = XCUIApplication()
let allElements = app.descendantsMatchingType(.Any)
var allHittableElements = [XCUIElement]()
for i in 0..<allElements.count {
let element = allElements.elementBoundByIndex(i)
if element.hittable {
allHittableElements.append(element)
}
}
相当缓慢但简单的解决方案。
为了更快的解决方案,您可以使 XCUIElementQuery
符合 Collection
并使用 Collection.filter
.
(Swift 5.0 )
的功能方法
/**
* ## Example:
* hittableElements(query: XCUIApplication().descendants(matching: .any)).count // n
*/
func hittableElements(query: XCUIElementQuery) -> [XCUIElement] {
return (0..<query.count).indices.map { i in
let element = query(matching: .any).element(boundBy: i)
return element.isHittable ? element : nil
}.compactMap { [=10=] }
}
我需要获取当前视图中存在的 XCUIElement 列表。 例如,
let app = XCUIApplication()
let allElements = app.otherElements.allElementsBoundByIndex
returns xcuielements 的完整列表,但我只想获取可点击且存在于当前视图中的元素。
如果您想要完整的元素列表,而不仅仅是 otherElements
,它不包括按钮、标签和其他常见视图类型,您必须按元素类型 .Any
.
默认情况下不存在的元素不会出现在列表中,但您可以使用循环过滤 hittable
以将列表限制为仅显示在屏幕上的那些项目。
let app = XCUIApplication()
let allElements = app.descendantsMatchingType(.Any)
var allHittableElements = [XCUIElement]()
for i in 0..<allElements.count {
let element = allElements.elementBoundByIndex(i)
if element.hittable {
allHittableElements.append(element)
}
}
相当缓慢但简单的解决方案。
为了更快的解决方案,您可以使 XCUIElementQuery
符合 Collection
并使用 Collection.filter
.
(Swift 5.0 )
的功能方法/**
* ## Example:
* hittableElements(query: XCUIApplication().descendants(matching: .any)).count // n
*/
func hittableElements(query: XCUIElementQuery) -> [XCUIElement] {
return (0..<query.count).indices.map { i in
let element = query(matching: .any).element(boundBy: i)
return element.isHittable ? element : nil
}.compactMap { [=10=] }
}