【问题标题】:Testing if an element is visible with Xcode 7 UITest使用 Xcode 7 UITest 测试元素是否可见
【发布时间】:2016-01-19 17:31:39
【问题描述】:

我想根据其.hidden 属性验证元素是否可见,但我没有找到使用新的 Xcode 7 UI 测试内容的有效方法。

我已尝试使用 myelement.existsmyelement.hittable,但它们似乎没有按我预期的那样工作。我想他们与hidden 属性一起工作。隐藏元素不应该存在并且不可点击...但这不是当前行为(我可以理解 exists 行为...但隐藏元素不应该是可点击的 IMO)。

还有其他方法可以验证“隐藏”属性值吗?

【问题讨论】:

    标签: xcode swift ui-testing xcode-ui-testing


    【解决方案1】:

    从 Xcode 7.1 Beta 3 开始,UI 测试目前不支持验证元素的可见性。我建议提交一个雷达,以引起对 Apple 的必要关注。

    Xcode 7.1 已修复此问题。 hittable 现在检查元素是否正确。

    【讨论】:

    • 这对我在 Xcode 7.1 上不起作用。我将一些控件动态更新为隐藏并在之后进行测试,即使控件显然是隐藏的,这也总是返回 true。
    • Xcode 7.2 可命中测试也无法正常工作于隐藏元素
    • Xcode 7.2.1 可命中测试无法正常用于隐藏元素
    • 如果 Xcode 7.2 中出现问题,我建议向 Apple 提交错误报告。
    • 在 Xcode 7.3(7D175) 上,hittable 返回 false 用于自定义 NSControlNSAccessibilityCheckBoxRole 可访问性角色。 Accessibility Inspector 没有发现任何问题或错误,但在悬停时无法在 Inspector 面板中显示其属性。看来我错过了一些重要的事情。
    【解决方案2】:

    1) 我在 Xcode 7.3 中使用 swift 测试 UI,我同时使用 .hittable 和 .exists 来测试标签是否隐藏并且它们都可以工作。我测试“真”和“假”以确保任何一种方式都与结果一致。

    我有一个标签,其静态文本为“Track Info”,并设置为在首次加载应用程序时隐藏,然后按一个按钮显示标签,这是显示标签后的结果。

    // 测试失败

    let trackInfoLabel = app.staticTexts["Track info"]
    XCTAssertEqual(trackInfoLabel.exists, true)
    
    XCTAssertEqual(trackInfoLabel.hittable, true)
    

    // 测试通过

    XCTAssertEqual(trackInfoLabel.exists, false)
    XCTAssertEqual(trackInfoLabel.hittable, false)
    

    // 测试通过

    let trackInfoLabel = app.staticTexts["Track Info"]
    XCTAssertEqual(trackInfoLabel.exists, true)
    
    XCTAssertEqual(trackInfoLabel.hittable, true)
    

    // 测试失败

    XCTAssertEqual(trackInfoLabel.exists, false)
    XCTAssertEqual(trackInfoLabel.hittable, false)
    

    当我按下按钮隐藏标签时,所有结果都相反。这确认了两个属性(可命中和存在)都适用于 label.hidden 设置。

    2) 另一种判断元素是否隐藏的方法是 element.frame.size.width == 0 || element.frame.size.height == 0

    【讨论】:

      【解决方案3】:

      XCUIElement.hittable 对我有用(在我的特定测试用例中,我正在检查几个 UIButton 元素的可见性) - 很确定这不是正确的方法

      【讨论】:

        【解决方案4】:

        下一个代码对我有用。 在测试结束时,您可以通过以下代码:

        while ([app.staticTexts matchingIdentifier:@"accesibilityId"].count > 0) {
                sleep(1);
            }
        

        【讨论】:

          【解决方案5】:

          我同意 hittable 并不总是适用于按钮(Swift 2.0、XCode 7.2)

          我刚刚发现如果按钮是可见的,你只能在按钮中找到它,而如果按钮是隐藏的,你也可以在 staticTexts 中找到它的标签!

          XCTAssertFalse(app.buttons["Log out"].exists && app.staticTexts["Log out"].exists) // This button is visible (hidden = false)
          XCTAssert(app.buttons["Log in"].exists && app.staticTexts["Log in"].exists) // This one is hidden
          

          Hacky,但适用于按钮。苹果应该只介绍.hidden.visible 以及.hittable.exists

          【讨论】:

            【解决方案6】:

            我的解决方案是动态添加accessibilityIdentifier

            func someMethod() {
                label.isHidden = true
                label. accessibilityIdentifier = "isHidden"
            }
            
            func someOtherMethod {
                label.isHidden = false
                label. accessibilityIdentifier = "isVisible"
            }
            

            在 UITest 中你可以使用它

            if app.staticTexts["MyLabel"].identifier == "isHidden" {
                dosomething()
            }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-02-05
              • 1970-01-01
              相关资源
              最近更新 更多