19

这个问题其实很简单:

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

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

假设我想测试我的“将新单元格添加到表格”功能,我可以测试确实有一个新单元格添加到列表中,但我不知道新单元格是添加到列表顶部还是底部或介于两者之间。

对我来说,在 UI 测试方面,检查特定元素是否具有特定值的简单方法应该是不费吹灰之力。

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

4

4 回答 4

24

确保在设置 UILabel 的 .text 值时设置其 .accessibilityValue 属性。然后在 UITest 中,您可以像这样测试可访问性值:

    let labelElement = app.staticTexts["myLabel"]
    ...
    XCTAssertEqual(labelElement.value as! String, "the expected text")
于 2016-07-23T09:28:23.963 回答
11

我认为您在问一些不同的问题,因此我将尝试单独回答每个问题。

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

简而言之,没有。UI 测试通过挂钩可访问性 API 来工作,因此您仅限于基于该 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)
  1. 对我来说,在 UI 测试方面,检查特定元素是否具有特定值的简单方法应该是不费吹灰之力。

如果您从可访问性的角度考虑所有事情,这将不是问题。UI 测试只能通过可访问性 API 与您的元素交互,因此您必须实现它们。在启用这些设置的情况下,您还可以获得使用户更容易访问您的应用程序的额外好处。

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

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

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

XCTest / UI 测试文档

于 2015-09-01T13:39:02.373 回答
9

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

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

  return myLabelUIElement.label
}

使用 Xcode 8 和 iOS 10 测试

于 2016-07-28T21:50:29.007 回答
3

从苹果论坛看起来可以获取标签的值:

我发现的唯一方法是不设置辅助功能标签,而是使用标识符。然后 XCUIElement.label 将更改以匹配标签的当前文本。

但是有一个问题:如果您之前在 XC 中设置了辅助功能标签并将其删除,则将标签设置为“”的条目将保留在情节提要中。在这种情况下,调用 .label 不仅会返回 "",而且您将无法通过它的文本查询标签!

您唯一能做的就是删除并重新添加标签,或者手动编辑 xml。

lastobelus - https://forums.developer.apple.com/thread/10428

于 2015-11-30T14:42:36.753 回答