使用 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 测试查找父级或兄弟级的主要内容,如果未能解决你的问题,请参考以下文章
Elasticsearch:Elasticsearch 中的父级和兄弟级聚合
Elasticsearch:Elasticsearch 中的父级和兄弟级聚合
如何检查 a href 是不是包含 aria-current。如果为 true,则对父级和兄弟级执行代码。使用 jQuery