iOS 9 UI测试 – 测试失败,因为目标控件不可用(尚未)

我正在测试Xcode 7的新UI测试function(在WWDC 2015video“ Xcode中的UI测试 ”中介绍)。

在启动时,我的应用程序通过更新其垂直布局约束的值将“登录面板”设置为视图:面板从主视图下方(屏幕外)向上滑动到视图中。

该面板包含两个文本字段,分别用于用户名密码

当您在键盘上点击用户名文本字段的返回键(标记为“下一步”)时, 密码文本字段将成为第一响应者。 当您点击密码文本字段的后退键(标记为“开始”)时,面板被“关闭”(即,屏幕上显示动画),活动指示器开始旋转并开始身份validation。

我记录了一个执行上述操作的测试,但是当我尝试“重现”它时,它似乎失败了,因为文本字段不能立即输入:

测试套件’精选测试’开始于2015-08-14 13:14:19.454测试套件’MyAppUITests’开始于2015-08-14 13:14:19.454测试用例’ – [MyAppUITests.MyAppUITests testExample]’开始。
t = 0.00s开始测试
t = 0.00s设置
t = 0.00s启动com.myCompany.MyApp 2015-08-14 13:14:19.953 XCTRunner [4667:451922]继续在后台运行测试,任务ID为1
t = 2.64s等待加载的可访问性
t = 6.20s等待应用程序空闲
t = 6.49s点击“用户ID”TextField
t = 6.49s等待应用程序空闲
t = 6.57s找到“用户ID”TextField
t = 6.57s com.myCompany.MyApp的快照可访问性层次结构
t = 6.60s查找:Descendants匹配类型TextField
t = 6.60s查找:匹配谓词的元素’“用户ID”IN标识符’
t = 6.60s等待应用程序空闲
t = 6.67s合成事件
t = 6.74s将元素滚动到可见
t = 6.78s断言失败:UI测试失败 – 无法滚动到可见(通过AX操作)TextField 0x7fc90251a130:traits:146029150208,{{107.0,807.0},{200.0,30.0}},placeholderValue:’User ID’,value :fffffaaaa,错误:错误-25204执行AXAction 2003:0:错误: – [MyAppUITests.MyAppUITests testExample]: UI测试失败 – 无法滚动到可见(通过AX操作)TextField 0x7fc90251a130: traits:146029150208,{{107.0,807.0 },{200.0,30.0}},placeholderValue:’用户ID’,值:fffffaaaa,错误:错误-25204执行AXAction 2003
t = 6.78s撕下测试用例’ – [MyAppUITests.MyAppUITests testExample]’失败(6.783秒)。
测试套件’MyAppUITests’在2015-08-14 13:14:26.238失败了。
在6.783(6.784)秒内执行1次测试,1次失败(0次意外)

(强调我的。项目名称和包ID更改为假值)

我该如何处理这样的UI? (即,在目标控件变为可操作之前,测试代码必须等待某个动画完成)

我不记得提到这种“时机”问题的video。

我建议不要勾选运行循环,而是使用内置的XCTest异步API。 例如:

 let app = XCUIApplication() app.launch() let textField = app.textField["user name"] let existsPredicate = NSPredicate(format: "exists == 1") expectationForPredicate(existsPredicate, evaluatedWithObject: textField, handler: nil) waitForExpectationsWithTimeout(5, handler: nil) textField.tap() textField.type("joemasilotti") 

这将等到具有辅助function标签/标识符“username”的文本字段实际存在于屏幕上。 然后它将点击文本字段,使其处于活动状态,然后键入我的用户名。 如果在此之前经过五秒钟,则测试将失败。

我还写了一篇关于如何在我的博客上使用UI测试的文章,并为这样的场景编写了一个UI测试备忘单 。