使用 Xcode UI 测试查找父级或兄弟级

Posted

技术标签:

【中文标题】使用 Xcode UI 测试查找父级或兄弟级【英文标题】:Find parent or sibling with Xcode UI testing 【发布时间】:2015-12-03 13:52:40 【问题描述】:

我正在使用 UITableViews,我想找到与单元格内的控件或静态文本相对应的单元格。

更一般地说,找到给定元素的任何父级或兄弟级的好方法是很高兴知道。

现在我只是循环遍历单元格,直到找到正确的单元格,我想避免这种情况。我试过使用app.tables.cells.containingPredicate,但没有任何运气。

let pred = NSPredicate  (element, bindings: [String : AnyObject]?) -> Bool in
      return element.staticTexts["My Text"].exists

let cells = app.tables.cells.containingPredicate(pred)

传递给谓词块的元素是一个没有静态文本的 XCElementSnapshot。

编辑

James 是正确的,containingType:identifier: 方法效果很好。

在swift中,它看起来像这样

let cell = app.tables.cells.containingType(.StaticText, identifier: "My Text")

方法签名中的标识符与元素的标识符属性不对应,而只是通过括号中的文本访问元素的常规方式。

app.cells.staticTexts["My Text"] 

【问题讨论】:

我仍然对为什么 app.cells.staticTexts["My Text"] 不适合你感到困惑。如果字符串“My Text”属于任何单元格,则应用的可访问性层次结构的快照会找到该字符串并与之匹配。 containingType:identifier: 方法会创建一个XCUIElementQuery,这并不意味着此查询中的XCUIElement 确实存在于您的应用中。 app.cells.staticTexts[] 会给我一个静态文本,即 UILabel,而我需要 UITableViewCell,而不是标签 我明白了。如果我错了,请纠正我,但执行let cell = app.tables.cells.containingType(.StaticText, identifier: "My Text") 是创建一个 XCUIElementQuery,而不是 XCUIElement,因此您实际上并没有在应用程序中实例化一个元素,只是创建一个对甚至可能不存在的元素的查询。如果在控制台上执行po app.tables.cells.containingType(.StaticText, identifier: "blah blah"),即使它不存在,它也将始终返回一个对象,并且您无法在 XCUIElementQuery 上运行任何断言,甚至无法运行 .exist 或 .hittable 方法来查看您的元素是否真实. @FranciscoJ.Mejias 您可以使用.element 获取查询的元素,然后对其进行断言 知道了,所以你正在做 app.tables.cells.containingType(.StaticText, identifier: "My Text").element.exists 例如。感谢您帮助我理解 =) 【参考方案1】:

您是否尝试过使用containingType 而不是containingPredicate?它似乎给了你你正在寻找的东西。我对 Swift 不太熟悉,但是在 Objective C 中,它看起来像这样:

    [app.cells containingType:XCUIElementTypeStaticText identifier:@"My Text"];

【讨论】:

我以为方法中的“标识符”是元素的标识符属性,谢谢指正 斯威夫特:app.cells.staticTexts["My Text"] @JoeMasilotti 知道为什么方法签名是 identifier: ,但这与 XCUIElement 上的 identifier 属性不对应吗? XCUIElementQuery 的标识符是括号里的东西? @Alex 真棒,我很高兴它有帮助! @Alex staticTexts["X"] 中的 X 可用于匹配可访问性标签、可访问性标识符、标题、名称和/或值,具体取决于相关元素。我还没有找到一个明确的答案。【参考方案2】:

这是我找到的获取兄弟元素的方法示例。我试图根据指定的名称元素获取价格元素,但我没有可使用的 ID。

我的 xml 结构或多或少像这样:

 <pre><code>Other
                  Other 
                       Cell
                           Other
                           Other
                           StaticText
                           Other
                           StaticText, label: 'Name1'
                           StaticText, label: '$5.00'
                       Cell
                           Other
                           Other
                           StaticText
                           Other
                           StaticText, label: 'Name2'
                           StaticText, label: '$2.00' </code></pre>

我想获取“Name1”或“Name2”价格的标签文本。

我使用以下内容来获取元素: app.cells.containing(nameNSPredicate).children(matching: .staticText).element(matching: priceNSPredicate).firstMatch

【讨论】:

以上是关于使用 Xcode UI 测试查找父级或兄弟级的主要内容,如果未能解决你的问题,请参考以下文章

jQuery获取父级兄弟节点的方法

jquery获取父级元素子级元素兄弟元素的方法

Elasticsearch:Elasticsearch 中的父级和兄弟级聚合

Elasticsearch:Elasticsearch 中的父级和兄弟级聚合

如何检查 a href 是不是包含 aria-current。如果为 true,则对父级和兄弟级执行代码。使用 jQuery

在 SwiftUI 中的兄弟姐妹之间从父级共享状态