Xcode UI测试[xcode7-beta6] - 使用辅助功能标签时断言实际标签值

weg*_*mic 18 testing ios xcode-ui-testing xcode7-beta6

问题其实很简单:

有没有办法在此对象上使用可访问性标签时断言特定标签(例如UILabel)的显示值?

据我所知,在示例中做出的所有断言(例如XCTAssertEquals),无论是来自WWDC Talk还是Blogposts,都只检查是否存在查询的元素,XCTAssertEquals(app.staticTexts["myValue"].exists, true)或者表中单元格的数量是否正确XCTAssertEquals(app.tables.cells.count, 5).因此,当避免使用可访问性标签时,可以检查对象是否显示某个值,而不是哪个对象/元素.当使用可访问性标签时,它会让我有机会查询显示的值,因为app.staticTexts["myValue"]现在无法提供结果但app.staticTexts["myAccessibilityLabel"]会命中.

假设我想测试我的"将新单元格添加到表格"功能,我可以测试列表中是否添加了新单元格,但我不知道新单元格是添加到列表的顶部还是底部或介于两者之间.

对我来说,检查特定元素是否具有特定值的简单方法应该是UI测试的明智之举.

由于缺少文档,我可能会忽略显而易见的事实.如果是这样,请告诉我.

小智 23

每当设置其.text值时,请务必设置UILabel的.accessibilityValue属性.然后在UITest中,您可以像这样测试可访问性值:

    let labelElement = app.staticTexts["myLabel"]
    ...
    XCTAssertEqual(labelElement.value as! String, "the expected text")
Run Code Online (Sandbox Code Playgroud)


Joe*_*tti 11

我想你会问几个不同的东西,所以我会尝试单独回答每个问题.

  1. 有没有办法在此对象上使用可访问性标签时断言特定标签(例如UILabel)的显示值?

简而言之,没有.UI测试通过挂钩到辅助功能API来工作,因此您只能基于此查询对象.但是,您可以检查-value某些元素的属性,例如控件.这用于测试开关是打开还是关闭.请注意,这些也可以使用辅助功能API,只是一个不同的方法(-accessibilityValueover -accessibilityIdentifier-accessibilityLabel).

  1. ...但我不知道新单元格是添加在列表的顶部还是底部,还是介于两者之间.

要查询XCUIElement其框架,您可以使用XCUIElementAttributes公开的新协议-frame.例如:

let app = XCUIApplication()
app.launch()

app.buttons["Add New Cell to Table"].tap()

let lastCell = app.cells["Last Cell"]
let newCell = app.cells["New Cell"]

XCTAssert(newCell.exists)
XCTAssert(newCell.frame.minY > lastCell.frame.maxY)
Run Code Online (Sandbox Code Playgroud)
  1. 对我来说,检查特定元素是否具有特定值的简单方法应该是UI测试的明智之举.

如果从可访问性的角度考虑所有事情,这就成了一个问题.UI测试只能通过辅助功能API与您的元素进行交互,因此您必须实现它们.您还可以获得额外的好处,即在启用这些设置的情况下让用户更容易访问您的应用.

尝试将单元格-accessibilityLabel-accessibilityIdentifier单元格设置为显示的文本.UI测试可能很挑剔它使用哪一个.

  1. 由于缺少文档,我可能会忽略显而易见的事实.如果是这样,请告诉我.

XCTest和UI Testing没有任何官方文档.所以我已经离开了从框架中公开的头文件中提取自己的东西.请注意,即使它们是从源头提取的,它们也是非官方的.

XCTest/UI测试文档

  • 非常感谢@joe.但您确实同意,您可以检查复选框(活动与否)的值,但不检查UILabel的值(显示的文本).对?对我来说,这意味着我不能将UI测试用于功能测试用例,因为我遇到的大多数都包含如_if你在文本字段'a'中输入'abc'和点击按钮'b'的要求,那么标签'c'应该显示"xyz'_. (3认同)

Mar*_*olz 8

对我来说有用的是设置UILabel的可访问性标识符MyLabel.

func myLabelText() -> String {
  let myLabelUIElement: XCUIElement = self.application.staticTexts["MyLabel"]

  return myLabelUIElement.label
}
Run Code Online (Sandbox Code Playgroud)

使用Xcode 8和iOS 10进行测试