Ios XC UITesting在查找UIElements时闪烁

Ios XC UITesting在查找UIElements时闪烁,ios,swift3,xctest,xcode-ui-testing,uiaccessibility,Ios,Swift3,Xctest,Xcode Ui Testing,Uiaccessibility,我有一段代码,如果用户在登录后需要重新验证,它将运行。在UI测试期间,有时会显示此popover,因此我会检查它是否存在 if (XCUIApplication().staticText["authLabel"].exists) { completeAuthDialog() } 当它在本地运行时,一切正常,框架发现元素没有问题。但是,当在CI上运行夜间作业时,它第一次失败,但一旦设置要重建相同的构建,测试就通过了authLabel是UILabel的可访问性标识符(顺便说一句),所以我一

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

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

昨天我花了很多时间在这个问题上,而这个框架似乎有时候找不到元素?我使用了可访问性检查器来确保我在查询中看到的时间与它看到的时间相同

我甚至用4或5个额外的
|
扩展了if-check,以检查popover中的任何元素。这些元素都有可访问性标识符,我还使用了记录特性来确保它传回我正在使用的相同元素“名称”


我有点卡住了,我不知道还有什么可以尝试/可能导致这个问题。最糟糕的是它在几个月内运行良好,但现在似乎每晚都会失败,正如我所说的,当测试在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对话框没有出现,则更长的超时将导致测试等待更长的时间继续,但如果机器运行缓慢,则会给对话框更多的时间显示。尝试一下,看看测试有多不稳定,需要优化不同的超时时间。

我还想添加一个观察员,我曾考虑/尝试添加一个观察员,用于启动popover的通知,并使用KVO,但应用程序和测试框架在不同的进程上运行,这与我在这里从其他帖子中看到的类似。因为没有调用通知钩子/observedValue函数。当if检查在本地失败时,我可以看到屏幕上的元素(lol),在我发布此问题之前,我不知道
XCTWaiter()
。下周我将更新我的CI框以运行xcode 8.3。我认为这将解决这个问题,因为当对话框出现时,使用
exists==true
谓词非常有效,但是在
XCTWaiter()之前,如果预期超时,测试将失败。谢谢你的回答,我应该更新我的问题:)是的,如果等待失败,测试失败真是太烦人了!XCTWaiter真的很有帮助。:)