如何在 swift UI 测试下检查应用程序状态
How to check application state under swift UI Test
一些背景
我目前正在为设置窗格编写 UI 测试,并单击按钮以启用某些权限,例如推送通知和定位服务。
但是,如果之前显示过该权限的警报(无论用户允许或拒绝访问该权限),该警报将不会再次显示,并且会只需将用户带到设置应用程序即可。不幸的是,这些设置不会重置,这意味着我第一次 运行 UI 测试时,会显示警报;在所有后续 UI 测试 运行 中,除非我在测试开始前重置设备,否则按钮将带我进入设置应用程序。
我的问题
因此,我的测试需要知道应用程序是否进入后台,并尝试将其置于前台以继续测试:
if app.state == background {
foregroundApp()
}
// continue with other tests
有什么方法可以判断应用程序是否在后台?
我试过的
我研究了通过 UI 测试确定应用程序 (running/background/etc) 状态的方法,但没有找到太多。我试图检查某些元素是否存在:
if (app.navigationBars.element.exists) ...
但是这会给我 运行时间错误[1] 如果用户被带到设置页面是因为被测应用程序在后台,并且测试无法查找导航栏(或其他元素)。
我尝试使用来自 Facebook 私有 headers 的一些方法用于 XCUIApplication()
和 XCUIElement()
。
XCUIApplication().state
总是 returns 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 的私有 headers for XCUIApplication/XCUIElement 中的大多数方法也不起作用。将应用程序置于前台也会导致问题,并且无法重新启动该应用程序; Siri 服务也不是。
您可以在 Swift 4 中执行此操作,使用 XCUIApplication.state
,这将为您提供有关应用程序状态的信息 - 无论是在前台还是后台等。但是,这是不可能的在 Swift 3 及以下找到此信息。本质上,UI Swift 3 中的测试不支持离开应用程序。
一些背景
我目前正在为设置窗格编写 UI 测试,并单击按钮以启用某些权限,例如推送通知和定位服务。
但是,如果之前显示过该权限的警报(无论用户允许或拒绝访问该权限),该警报将不会再次显示,并且会只需将用户带到设置应用程序即可。不幸的是,这些设置不会重置,这意味着我第一次 运行 UI 测试时,会显示警报;在所有后续 UI 测试 运行 中,除非我在测试开始前重置设备,否则按钮将带我进入设置应用程序。
我的问题
因此,我的测试需要知道应用程序是否进入后台,并尝试将其置于前台以继续测试:
if app.state == background {
foregroundApp()
}
// continue with other tests
有什么方法可以判断应用程序是否在后台?
我试过的
我研究了通过 UI 测试确定应用程序 (running/background/etc) 状态的方法,但没有找到太多。我试图检查某些元素是否存在:
if (app.navigationBars.element.exists) ...
但是这会给我 运行时间错误[1] 如果用户被带到设置页面是因为被测应用程序在后台,并且测试无法查找导航栏(或其他元素)。
我尝试使用来自 Facebook 私有 headers 的一些方法用于 XCUIApplication()
和 XCUIElement()
。
XCUIApplication().state
总是 returns 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 的私有 headers for XCUIApplication/XCUIElement 中的大多数方法也不起作用。将应用程序置于前台也会导致问题,并且无法重新启动该应用程序; Siri 服务也不是。
您可以在 Swift 4 中执行此操作,使用 XCUIApplication.state
,这将为您提供有关应用程序状态的信息 - 无论是在前台还是后台等。但是,这是不可能的在 Swift 3 及以下找到此信息。本质上,UI Swift 3 中的测试不支持离开应用程序。