运行XCT UI测试时,可以通过以下方式将被测试的应用程序置于后台:
XCUIDevice().pressButton(XCUIDeviceButton.Home)
有没有办法将应用程序重新置于前台(活动状态)而无需重新启动应用程序?
运行XCT UI测试时,可以通过以下方式将被测试的应用程序置于后台:
XCUIDevice().pressButton(XCUIDeviceButton.Home)
有没有办法将应用程序重新置于前台(活动状态)而无需重新启动应用程序?
Xcode 9更新:从Xcode 9开始,你可以在任何XCUIApplication上直接调用activate()
。
let myApp = XCUIApplication()
myApp.activate() // bring to foreground
https://developer.apple.com/documentation/xctest/xcuiapplication/2873317-activate
是的,确实需要。但是,您需要 XCUIElement 的私有头文件(可通过从 Facebook 此处 获得头文件转储)。为了将应用程序置于前台,您需要调用 resolve,我相信这会解析元素的查询(对于应用程序而言,这意味着将应用程序置于前台)。
对于 Swift,您需要将 XCUIElement.h 导入到桥接头文件中。 对于 Objective-C,您只需要导入 XCUIElement.h。
将应用程序置于后台:
Swift:
XCUIApplication().resolve()
Objective-C
[[XCUIApplication new] resolve];
如果这是您所需的唯一功能,那么您可以编写一个快速的ObjC类别。
@interface XCUIElement (Tests)
- (void) resolve;
@end
如果您需要启动/解决另一个应用程序。Facebook通过Springboard的方式提供了一个示例。XCUIApplication().launch()
,它需要更多的绕路。 - skim从Xcode 8.3和iOS 10.3开始,您可以通过Siri实现此功能:
XCUIDevice.shared().press(XCUIDeviceButton.home)
XCUIDevice.shared().siriService.activate(voiceRecognitionText: "Open {appName}")
在测试套件文件的顶部包含@available(iOS 10.3, *)
,然后您就可以开始了!
以下是我在我的XCUITest中使用的代码,它可以完美运行(xcode 10.1和测试设备为iPhone X 11.0)
func testWhatever() {
// 在此处添加测试步骤,直到需要在后台前台运行
XCUIDevice.shared.press(XCUIDevice.Button.home) // 将应用程序放入后台 XCUIApplication().activate() // 将应用程序带回前台
// 在完成后台前台操作后,继续执行测试。 }
@implementation XCUIApplication(SpringBoard)
+ (instancetype)springBoard
{
XCUIApplication * springboard = [[XCUIApplication alloc] performSelector:@selector(initPrivateWithPath:bundleID:)
withObject:nil
withObject:@"com.apple.springboard"];
[springboard performSelector:@selector(resolve) ];
return springboard;
}
- (void)tapApplicationWithIdentifier:(NSString *)identifier
{
XCUIElement *appElement = [[self descendantsMatchingType:XCUIElementTypeAny]
elementMatchingPredicate:[NSPredicate predicateWithFormat:@"identifier = %@", identifier]
];
[appElement tap];
}
@end
自从 Xcode 13 后,我们遇到了几个错误,即在返回应用程序后应用程序未处于前台状态。
将此代码应用于我们的“goToSpringboardAndBack()”可正常工作。
XCUIDevice.shared.press(XCUIDevice.Button.home)
if XCUIApplication().wait(for: .runningBackground, timeout: 5.0) {
XCUIApplication().activate()
}
_ = XCUIApplication().wait(for: .runningForeground, timeout: 5.0)
´´´
@interface XCUIApplication (Private)
- (id)initPrivateWithPath:(NSString *)path bundleID:(NSString *)bundleID;
- (void)resolve;
@end
然后在您的测试用例中调用resolve()将应用程序恢复:
XCUIApplication().resolve()