XC通过查找UIElements

时间:2017-09-22 14:45:36

标签: ios swift3 xctest xcode-ui-testing uiaccessibility

如果用户需要在登录后重新验证,我会运行一段代码。在UI测试期间,有时会显示此弹出窗口,因此我检查它是否存在

if (XCUIApplication().staticText["authLabel"].exists) {
    completeAuthDialog()
}

当它在本地运行时,它很好,完成并且框架发现元素没有问题。但是当CI上的夜间作业运行时,它第一次失败,但是一旦相同的构建被重建,测试就会通过。 authLabel是UILabel的可访问性标识符(顺便说一句),所以我一直试图找出导致闪烁的原因。

昨天我花时间在这个问题上,似乎框架有时候找不到元素?我已经使用了辅助功能检查器,以确保我在查看的同时进行查询。

我甚至扩展了,如果检查4或5个额外的||来检查弹出窗口内的任何元素。元素都有可访问性标识符,我还使用了记录功能,以确保它传回我正在使用的相同元素“名称”。

我有点卡住,我不知道还有什么可以尝试/可能导致这个问题。最糟糕的是,它运行了好几个月,但现在似乎每天晚上都失败了,正如我所说,当测试在xcode内部运行时,它们会很好地通过。这可能是从命令行构建的问题吗?

1 个答案:

答案 0 :(得分:1)

当您的测试在不同的计算机上执行时,通常会更慢,这个问题在CI计算机上看起来特别普遍,因为它们往往功率不足。

如果你只是对现有元素进行一次检查,那么测试只有一个时间点才能正确,如果应用程序显示元素的速度很慢,那么测试将失败。

您可以通过使用服务员在几秒钟内检查几次以确保您在继续操作之前给予应用程序足够的时间来显示身份验证对话框,从而防止进行不稳定的测试。

let authElement = XCUIApplication().staticText["authLabel"]
let existsPredicate = NSPredicate(format: "exists == true")
let expectation = XCTNSPredicateExpectation(predicate: existsPredicate, object: authElement)
let result = XCTWaiter().wait(for: [expectation], timeout: 5)
if (result == .completed) {
    completeAuthDialog()
}

您可以调整超时以满足您的需要 - 如果auth对话框没有显示,则更长的超时将导致测试等待更长时间才能继续,但如果机器出现,将使对话框有更多时间出现是慢的。尝试一下,看看测试有多么不稳定,以便进行优化。