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

33

我想验证一个元素是否可见,取决于其.hidden 属性,但是我找不到一种有效的方法来使用新的Xcode 7 UI测试工具进行操作。

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

是否有另一种验证“hidden”属性值的方法?

7个回答

34
截至Xcode 7.1 Beta 3,UI测试目前不支持验证元素的可见性。建议提交雷达以引起苹果的必要关注。
Xcode 7.1已经修复了这个问题。现在hittable会检查元素是否正确。

3
在Xcode 7.1上,这对我不起作用。我动态地将一些控件更新为隐藏状态,然后进行测试,但它总是返回真,即使控件显然已经被隐藏了。 - Alex
Xcode 7.2的可点击测试对于隐藏元素无法正常工作。 - Eugene Gordin
Xcode 7.2.1的可点击测试对于隐藏元素无法正常工作。 - san
如果在Xcode 7.2中出现了此问题,我建议向苹果公司提交错误报告。 - Joe Masilotti
在Xcode 7.3(7D175)中,使用NSAccessibilityCheckBoxRole辅助功能角色的自定义NSControlhittable返回false。辅助功能检查器没有发现任何问题或错误,但是在悬停时无法在检查器面板中显示其属性。看起来我错过了一些重要的东西。 - Andriy
XCUIElement 上的这个属性现在被称为 isHittable。值得阅读文档,了解它可能返回 truefalse 的情况。 - mokagio

11

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属性的两个特性(hittable和exists)都可以用于设置。

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


3

XCUIElement.hittable 对于我来说效果很好(在我的特定测试用例中,我正在检查几个 UIButton 元素的可见性)- 虽然我相当确定这不是正确的方法


2

以下代码对我有效。 在测试结束时,您可以将代码粘贴如下:

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

1
语法现在是 .isHittable

.isHittable 仅在元素已经可见且可以被点击时返回 true。对于滚动视图中的屏幕外元素,即使调用 click()、tap() 或其他与点击点相关的交互方法也会返回 false,除非该元素将被滚动到可点击的位置。

使用 .isHittable 属性是可行的,因为隐藏的元素在屏幕上不可见或无法点击。

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

虽然有点巧妙,但适用于按钮。苹果应该引入.hidden.visible以及.hittable.exists


0
我的解决方案是动态添加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()
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接