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