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


我正在使用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,它没有staticTexts。

编辑

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

在快速,它看起来像这样

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

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

app.cells.staticTexts["My Text"] 

1601
2017-12-03 13:52


起源

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


答案:


你尝试过使用过吗? containingType 代替 containingPredicate?它似乎正好能满足您的需求。我对Swift不太熟悉,但在Objective C中,它看起来像这样:

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

11
2017-12-04 02:13



我认为方法中的'标识符'是元素的标识符属性,这要归功于修正 - Alex
迅速: app.cells.staticTexts["My Text"] - Joe Masilotti
@JoeMasilotti任何想法为什么方法签名是标识符:,但是这不对应于XCUIElement上的标识符属性? XCUIElementQuery的标识符是括号中的东西? - Alex
@Alex真棒,我很高兴它有所帮助! - James Goe
@Alex The X in staticTexts["X"]可用于匹配可访问性标签,可访问性标识符,标题,名称和/或值,具体取决于相关元素。我还没有找到一个确定的答案,用于哪个。 - Joe Masilotti