iOS UITests - 如何获取当前视图中存在的XCUIElement列表

时间:2017-02-28 11:06:45

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

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

 @media only screen and (max-width: 768px) {
        user-access-panel .details-panel .panel-body {
            padding: 0px 0px 0px 0px !important;
            width: 100.29%;
            height: 130px;
            background-image: url("./images/icons/request-ID-card-bg.png");
            background-repeat: no-repeat;
            background-position: center;
            background-size: cover;
            color: #3d4045;
            /*font-family:  Helv-neue-light;*/
            background-color: white;
            font-family: sans-serif;
            font-size: 10pt;
            border: 1px solid lightgray;
            box-shadow: 2px 2px 10px 1px lightgray;
            vertical-align: middle;
        }
    }

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

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

(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 }
}