如何在swift UI Test下检查应用程序状态

Posted

技术标签:

【中文标题】如何在swift UI Test下检查应用程序状态【英文标题】:How to check application state under swift UI Test 【发布时间】:2017-06-07 18:42:03 【问题描述】:

一些背景

我目前正在为设置窗格编写 UI 测试,并单击按钮以启用某些权限,例如推送通知和位置服务。

但是,如果之前已经显示过该权限的警报(无论用户是否允许或拒绝访问该权限),警报将不会再次显示,只会将用户带到设置应用程序。不幸的是,这些设置不会重置,这意味着我第一次运行 UI 测试时,会显示警报;并且在所有后续 UI 测试运行中,除非我在测试开始前重置设备,否则这些按钮会将我带到设置应用程序。

我的问题

因此,我的测试需要知道应用程序是否进入后台,并尝试将其置于前台以继续测试:

if app.state == background 
    foregroundApp()


// continue with other tests 

有没有办法判断应用是否在后台?

我尝试了什么

我研究了通过 UI 测试确定应用程序状态的方法(运行/后台/等),但没有找到太多。我试图检查某些元素是否存在:

if (app.navigationBars.element.exists) ...

但这会给我运行时错误[1]如果用户被带到设置页面,因为被测应用程序在后台,并且测试无法查找导航栏(或其他元素) .

我尝试使用 Facebook 的 XCUIApplication()XCUIElement() 的私有标头中的一些方法。

XCUIApplication().state 始终返回 3,无论应用当前处于何种状态,任何尝试调用 XCUIApplication().resolve() 将应用置于前台都会给我带来与以前相同的错误[1]

我尝试在恢复测试之前重写逻辑以将应用程序置于前台,但 XCUIApplication().launch() 等方法会在重新启动之前杀死应用程序,而我不能这样做。似乎只有 siri 服务对我有用,但我无法通过公司代理访问 siri 服务,并且不可能修改代理权限。

还有其他方法可以检查应用状态吗?

错误

[1] 每次我尝试执行涉及状态的操作时都会打印此错误。我确实在任何地方调用snapshotView,因此使用afterScreenUpdates 的建议是无用的。

Failure to get snapshot within 15.0s
Cannot snapshot view (<UIKeyboardImpl: 0x7febcc75d000; frame = (0 0; 
  414 226); layer = <CALayer: 0x608000625720>>) with 
  afterScreenUpdates:NO, because the view is not in a window. Use 
  afterScreenUpdates:YES.`

tl;博士

我需要检查我正在 UI 测试的应用程序是否已进入后台(即用户按下了主页按钮)。检查特定元素(例如导航栏)是否存在不起作用,Facebook 的 XCUIApplication/XCUIElement 私有标头中的大多数方法也不起作用。将应用程序置于前台也会导致问题,并且重新启动应用程序不是一种选择; siri 服务也不是。

【问题讨论】:

【参考方案1】:

您可以在 Swift 4 中执行此操作,使用 XCUIApplication.state,它将为您提供有关应用程序状态的信息 - 无论是在前台还是后台等。但是,在 Swift 3 中无法找到此信息,并且以下。本质上,Swift 3 中的 UI 测试不支持离开应用程序。

【讨论】:

你需要一个苹果开发者账号才能查看beta信息:developer.apple.com/documentation/xctest/xcuiapplication/… 确实,这是 xcode 9 中即将推出的功能,目前是测试版。谢谢

以上是关于如何在swift UI Test下检查应用程序状态的主要内容,如果未能解决你的问题,请参考以下文章

Swift UI 如何从子视图中检索状态

swift in UI test(测试UITableView中的单元格数)

在 UI 测试 Swift 中处理来自 API 的答案

如何在 swift 中检查处于失败状态的 JSON 条件

在 Swift UI 的布尔语句中使用状态变量

如何在 Enzyme / Jest Test 中切换和检查 Material UI 复选框