【问题标题】:Xcode UI Testing [xcode7-beta6] - Asserting actual label values when using accessibility labelsXcode UI 测试 [xcode7-beta6] - 使用可访问性标签时断言实际标签值
【发布时间】:2015-11-25 16:40:02
【问题描述】:

这个问题其实很简单:

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

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

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

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

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

【问题讨论】:

    标签: ios testing xcode-ui-testing xcode7-beta6


    【解决方案1】:

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

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

    使用 Xcode 8 和 iOS 10 测试

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 这种方法也适用于 objc 但你必须使用 XCTAssertEqualObjects((NSString *)labelElement.value, @"the expected text", @"这些字符串应该相等!");跨度>
      • 您还可以在 Storyboard 中或以编程方式设置accessibilityIdentifier,并以此获取XCUIElement。
      • 什么,如果我们必须根据tag而不是标签文本或可访问性标识符来查找静态文本???
      【解决方案3】:

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

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

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

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

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

      【讨论】:

        【解决方案4】:

        我认为你问的问题有些不同,所以我会尝试单独回答每个问题。

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

        简而言之,没有。 UI 测试通过挂钩可访问性 API 来工作,因此您仅限于基于该 API 查询对象。但是,您可以检查某些元素(例如控件)的 -value 属性。这用于测试开关是打开还是关闭。请注意,这些也归结为使用可访问性 API,只是一种不同的方法(-accessibilityValue 优于 -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 Testing Documentation

        【讨论】:

        • 非常感谢@joe。但是您确实同意,您可以检查复选框的值(活动与否),但不能检查 UILabel 的值(显示的文本),这很奇怪。正确的?对我来说,这意味着我不能将 UI 测试用于功能测试用例,因为我遇到的大多数情况都包含这样的要求' 应该显示 'xyz'.
        • @wegenmic 建议稍微不同的想法。请记住,UIElement 不是实际的 UI 对象,它是 UI 对象的搜索路径。您只需创建另一个“搜索路径”。 app.staticTexts["New Label Text"]。一开始就让我陷入循环......“价值”并不是特别有用。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-29
        • 1970-01-01
        相关资源
        最近更新 更多