5

我正在测试 Xcode 7 的新 UI 测试功能(在 WWDC 2015 视频“ Xcode 中的 UI 测试”中介绍)。

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

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

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

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

测试套件“选定测试”开始于 2015 年 8 月 14 日 13:14:19.454 测试套件“MyAppUITests”开始于 2015 年 8 月 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”文本字段
t = 6.57s com.myCompany.MyApp 的快照可访问性层次结构
t = 6.60s 查找:后代匹配类型 TextField
t = 6.60s 查找:匹配谓词“用户 ID”IN 标识符的元素
t = 6.60s 等待应用程序空闲
t = 6.67s 合成事件
t = 6.74s 将元素滚动到可见
t = 6.78s 断言失败:UI 测试失败 - 无法滚动到可见(通过 AX 操作)TextField 0x7fc90251a130:特征:146029150208,{{107.0,807.0},{200.0 , 30.0}},placeholderValue:'用户 ID',值:fffffaaaa,错误:执行 AXAction 2003 的错误 -25204:0:错误:-[MyAppUITests.MyAppUITests testExample]:UI 测试失败 - 无法滚动到可见(通过 AX 操作)TextField 0x7fc90251a130:特征:146029150208,{{107.0, 807.0},{200.0, 30.0}},placeholderValue:'用户 ID',值:fffffaaaa,错误:错误 - 25204 执行 AXAction 2003
t = 6.78s Tear Down Test Case '-[MyAppUITests.MyAppUITests testExample]' 失败(6.783 秒)。
测试套件“MyAppUITests”在 2015-08-14 13:14:26.238 失败。
执行 1 次测试,在 6.783 (6.784) 秒内有 1 次失败(0 次意外)

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

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

我不记得视频中提到了这些“时间”问题。

4

1 回答 1

11

我建议不要勾选运行循环,而是使用内置的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")

这将等到具有可访问性标签/标识符“用户名”的文本字段实际存在于屏幕上。然后它将点击文本字段,使其处于活动状态,然后输入我的用户名。如果在这成为 true 之前经过 5 秒,则测试将失败。

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

于 2015-09-09T13:40:51.707 回答