在没有可访问性 ID 的 Xcode UI 测试中定位元素

Posted

技术标签:

【中文标题】在没有可访问性 ID 的 Xcode UI 测试中定位元素【英文标题】:Locating element in Xcode UI Test without accessiblity id 【发布时间】:2016-11-08 14:48:11 【问题描述】:

最近我开始学习 XCode UI Test,使用 Xcode 的 UI 测试功能编写功能自动化测试。

我需要读取原生应用元素的文本值。我可以在元素文本的帮助下获取元素,但问题是我不能使用文本,因为它是动态的,它会在一段时间或下次启动应用程序后更改。

我熟悉使用 WebDriver 和 Appium,我可以通过编写父子 xpath 来解决这个问题。

任何人都可以提出解决此问题的方法吗?请发布示例代码 sn-p 以及您的解决方案,因为我是苹果技术/swift 的新手。

感谢您的帮助。

【问题讨论】:

【参考方案1】:

在您的应用代码中,为您要检查的元素添加一个可访问性标识符,然后使用该标识符在您的 UI 测试代码中查找该元素。

// app code
let myLabel = UILabel()
myLabel.accessibilityIdentifier = "myDescriptionLabel"
// add other label configuration...

// UI test code
let app = XCUIApplication()
let descriptionLabel = app.staticTexts["myDescriptionLabel"]
let description = descriptionLabel.value as String

【讨论】:

感谢您的回答,但问题是我不允许更改开发代码。并且有许多元素没有 accessiblityIdentifier。 (它是“空的”)所以只是试图找出任何其他方式。我知道我可以使用 decendentsMatching 或 containsg... 但 with 不是那么用户友好。我觉得特别是 Xpath 的 appium 定位器要好得多。 您几乎可以做与 Xpath 相同的事情,尽管这是一种非常脆弱的技术,并且为了使您的应用程序可正确测试,开发人员确实应该花几分钟时间添加可访问性 ID。您可以使用 app.staticTexts.element(boundBy: 2) 之类的东西来获取屏幕上的第三个标签,或者通过视图层次结构缩小范围,例如,第二个表格单元格中的第一个标签:app.tables.element(boundBy: 0).cells.element(boundBy: 1).staticTexts.element(boundBy: 0)

以上是关于在没有可访问性 ID 的 Xcode UI 测试中定位元素的主要内容,如果未能解决你的问题,请参考以下文章

如何检测键盘是不是显示在 Xcode UI 测试中

我可以在界面生成器中设置可访问性标识符吗? Xcode4.2

XCode 7 UI 测试 - 可用的操作

使用 Kif 进行 Swift UI 测试

XCTest:有没有办法在 UI 测试中通过 ID 查找任何类型的视图?

XCUITest 无法检测到我动态生成的 tableView 的可访问性 id