如何 UI 测试使用系统提供的控制器的工作流

Posted

技术标签:

【中文标题】如何 UI 测试使用系统提供的控制器的工作流【英文标题】:How to UI test workflows that uses controllers provided by the system 【发布时间】:2018-08-17 07:33:31 【问题描述】:

我想通过 UI 测试一个应用工作流程,该工作流程除其他外调用 UIDocumentPickerViewController。我试图在 Xcode 中记录这个工作流,但是当我到达这个控制器时,我收到一条错误消息说

时间戳事件匹配错误:未能找到匹配元素

我有办法传递这样的控制器或模拟它们,在这种情况下,返回一个文件?

【问题讨论】:

【参考方案1】:

我遇到了同样的麻烦。我的解决方法:

在您的 UI 测试中放置一个断点,当文件选择器位于前台时将触发该断点。

样本测试:

    func testBlah() 
        let app = XCUIApplication()
        // The next 2 lines interact with my app to cause it to pop up the file picker.
        // These will be different for your app :)
        app.navigationBars["Dashboard"].buttons["download"].tap()
        app.staticTexts["Browse"].tap()
        sleep(3) // Can place breakpoint here for example
    

点击断点后,通过在调试器的右侧窗格中键入 po app(将 app 替换为您的 XCUIApplication 对象的名称)来查看视图层次结构:

(lldb) po app
    t =   193.67s Snapshot accessibility hierarchy for app with pid 941
    t =   194.22s Snapshot accessibility hierarchy for app with pid 941
Attributes: Application, pid: 941, label: 'Redacted'
Element subtree:
 →Application, 0x2814fdea0, pid: 941, label: 'Redacted'
    Window (Main), 0x2814fe4c0, 0.0, 0.0, 375.0, 667.0
      Other, 0x2814fe3e0, 0.0, 0.0, 375.0, 667.0

剪辑

Cell, 0x2814f42a0, 257.0, 131.0, 90.0, 175.0, identifier: 'Waterfall Loop Trail, xml', label: 'Waterfall Loop Trail, xml, 9/16/19, 42 KB'
Cell, 0x2814f4380, 28.0, 321.0, 90.0, 175.0, identifier: 'Waterfall Loop Trail, gpx', label: 'Waterfall Loop Trail, gpx, 9/16/19, 42 KB'

由于我正在尝试点击Waterfall Loop Trail, gpx,我现在可以执行以下操作: app.cells["Waterfall Loop Trail, gpx"].tap()

我想我可以使用类似的策略与屏幕上的其他元素进行交互。超级烦人,Xcode 似乎在刻录机中不支持它。

【讨论】:

多么棒的技巧,解决了我的问题,非常感谢!我不得不添加更多的东西来使它适用于选择代表文档的单元格,希望它可以帮助其他人.. 使用显式单元格。与标识符匹配。获取集合视图中单元格的第二个元素,因为第一个元素触发了排序按钮。最后使用 forceTapElement,它是在这里找到的扩展:***.com/a/33534187/4417912 代码:app.cells.matching(identifier: "your identifier found with po app").element(boundBy: 1).forceTapElement() 优秀的答案。

以上是关于如何 UI 测试使用系统提供的控制器的工作流的主要内容,如果未能解决你的问题,请参考以下文章

如何从 XCTest 中的 UI 目标调用主目标中的方法?

Android:如何正确隐藏系统 UI

UI 测试标签栏控制器

如何在 Xcode UI 测试中识别控制中心元素?

如何在 Xcode 的 UITest 中访问当前的 UIViewController?

使用 XCUI 进行 UI 测试