XC UITesting 闪烁并找到 UIElements

XC UITesting flickering with finding UIElements

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

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

当它在本地运行时,它很好,完成并且框架找到元素没问题。但是当CI上的nightly job是运行时,第一次就失败了,但是一旦设置了相同的构建重新构建,测试就通过了。 authLabel 是 UI 标签的可访问性标识符(顺便说一句),所以我一直在试图找出导致闪烁的原因。

昨天我在这个问题上花了点时间,似乎框架有时找不到元素?我使用了可访问性检查器来确保我在它看到的同时进行查询。

我什至扩展了 if 检查 4 或 5 个额外的 || 以检查弹出框内的任何元素。元素都有可访问性标识符,我还使用了记录功能来确保它传回我正在使用的相同元素 "names"。

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

当您的测试在不同的机器上执行时通常会变慢,这个问题似乎在 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()
}

您可以根据需要调整超时时间 - 较长的超时时间会导致测试在未出现身份验证对话框时等待更长时间才能继续,但如果机器是慢的。尝试一下,看看使用不同超时优化的测试有多不稳定。