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をインポートする必要があります。
アプリをバックグラウンドで:
迅速:
XCUIApplication().resolve()
Objective-C
[[XCUIApplication new] resolve];
これが必要な機能だけである場合は、簡単なObjCカテゴリを作成できます。
@interface XCUIElement (Tests)
- (void) resolve;
@end
別のアプリを起動/解決する必要がある場合。 Facebookには、Springboardを介してその例があります。
Xcode8.3およびiOS10.3以降、Siriでこれを実現できます。
_XCUIDevice.shared().press(XCUIDeviceButton.home)
XCUIDevice.shared().siriService.activate(voiceRecognitionText: "Open {appName}")
_
テストスイートファイルの先頭に@available(iOS 10.3, *)
を含めれば、準備は完了です。
誰かがアプリをバックグラウンドから戻す必要がある場合は、(上記の回答に基づいて)実際に機能するカテゴリを作成しました(FB gitをポイントしてくれてありがとう)
@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
これは私がXCUITestに持っているものであり、チャームのように機能します(xcode10.1およびテストデバイスはiPhoneX 11.0です)
func testWhatever(){
//バックグラウンドのフォアグラウンドを実行する必要があるまで、ステップをテストします
XCUIDevice.shared.press(XCUIDevice.Button.home)//アプリをバックグラウンドにするXCUIApplication()。activate()//アプリを元に戻す
//バックグラウンドフォアグラウンドが実行された後、テストを続行します。 }
Swiftの場合、Bridging-Header.hで次のようにXCUIApplicationプライベートメソッドインターフェイスを宣言する必要があります。
@interface XCUIApplication (Private)
- (id)initPrivateWithPath:(NSString *)path bundleID:(NSString *)bundleID;
- (void)resolve;
@end
次に、テストケースでresolve()を呼び出して、アプリを元に戻します。
XCUIApplication().resolve()