【问题标题】:iOS UITests - How to get XCUIElement list which exist in current viewiOS UITests - 如何获取当前视图中存在的 XCUIElement 列表
【发布时间】:2017-02-28 11:06:45
【问题描述】:

我需要获取当前视图中存在的 XCUIElement 列表。 例如,

let app = XCUIApplication()
let allElements = app.otherElements.allElementsBoundByIndex

返回 xcuielements 的完整列表,但我只想获取可点击且存在于当前视图中的元素。

【问题讨论】:

    标签: ios xcode testing automated-tests xcode-ui-testing


    【解决方案1】:

    如果您想要完整的元素列表,而不仅仅是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

    【讨论】:

    • allHittableElements 是否仅包含当前可见屏幕上的元素?如果您能指导如何使用 XCUIElementQuery,将会很有帮助。感谢您的帮助。
    • 本视频介绍了如何使用 XCTest 进行 UI 测试:developer.apple.com/videos/play/wwdc2015/406
    【解决方案2】:

    (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 { $0 }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多