ios - XC UITesting 因查找 UIElements 而闪烁

标签 ios swift3 xctest xcode-ui-testing uiaccessibility

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

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

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

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

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

我有点卡住了,我不知道还有什么可以尝试/可能会导致这个问题。最糟糕的是,它运行了几个月,但现在似乎每天晚上都会失败,正如我所说,当测试在 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()
}

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

关于ios - XC UITesting 因查找 UIElements 而闪烁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46367466/

相关文章:

ios - 使用 Cocoapods 进行 Xcode 单元测试

iphone - 计算核心数据中的不同项目

ios - 在 Swift 3.0 中转义闭包内改变自身(结构/枚举)

ios - 如何在 Swift3 的 UIViewController 中获取 FCM 消息?

swift - 将结构数组保存到 NSUserDefault Swift 3?

ios - 如何测试 UIAlertController

iphone - 创建适合较小尺寸 iPhone 屏幕(4、4s)的新 iOS 项目

ios - 如何在边缘附近滚动的情况下将 View 拖动到 UIScrollView 内?

ios - 如何以编程方式初始化/使用带有 CellStyle = .value1 的 UITableViewCells?

ios - XCUITest等待可能出现的元素