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

时间:2015-08-14 04:33:47

标签: ios ios9 xcode-ui-testing

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

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

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

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

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

  

测试套件'选定测试'开始于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等待app闲置
      t = 6.49s点击“用户ID”TextField
      t = 6.49s等待app闲置
      t = 6.57s找到“用户ID”TextField
      t = 6.57s com.myCompany.MyApp的快照可访问性层次结构
      t = 6.60s查找:后代匹配类型TextField
      t = 6.60s查找:元素匹配谓词'“用户ID”IN标识符'
      t = 6.60s等待app闲置
      t = 6.67s合成事件
      t = 6.74s将元素滚动到可见的
      t = 6.78s断言失败:UI测试失败 - 无法滚动到可见(通过AX操作)TextField 0x7fc90251a130:   性状:146029150208,{{107.0,807.0},{200.0,30.0}},   placeholderValue:'User ID',值:fffffaaaa,错误:错误-25204   执行AXAction 2003: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撕下测试案例' - [MyAppUITests.MyAppUITests testExample]'失败(6.783秒)。
  测试套件'MyAppUITests'在2015-08-14 13:14:26.238失败   在6.783(6.784)中执行1次测试,1次失败(0次意外)   秒

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

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

我不记得提到这种“时间”问题的视频。

1 个答案:

答案 0 :(得分: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")

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

我还在我的博客上写了一篇关于how to use UI Testing的帖子,并为这样的场景整理了UI Testing Cheat Sheet