使用 Xcode 测试元素是否可见 7 UITest

Testing if an element is visible with Xcode 7 UITest

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

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

还有其他方法可以验证 "hidden" 属性 值吗?

自 Xcode 7.1 Beta 3 起,UI 测试目前不支持验证元素的可见性。建议备个雷达,给苹果带来必要的关注。

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

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

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

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

我同意 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,但适用于按钮。 Apple 应该在 .hittable.exists

中引入 .hidden.visible

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

我有一个标签,它的静态文本是"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

我的解决方案是动态添加可访问性标识符

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

func someOtherMethod {
    label.isHidden = false
    label. accessibilityIdentifier = "isVisible"
}

在 UITest 中,您可以将其用作

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

语法现在是 .isHittable:

isHittable only returns true if the element is already visible and hittable onscreen. It returns false for an offscreen element in a scrollable view, even if the element would be scrolled into a hittable position by calling click(), tap(), or another hit-point-related interaction method.

使用 .isHittable 属性 会起作用,因为隐藏元素在屏幕上 不可见或不可点击