web-dev-qa-db-ja.com

アプリをバックグラウンドからフォアグラウンドに移動することは可能ですか?

XCT UIテストを実行する場合、次の方法でアプリケーションをバックグラウンドでテストすることができます。

XCUIDevice().pressButton(XCUIDeviceButton.Home)

アプリケーションを再起動せずに、何らかの方法でアプリをフォアグラウンド(アクティブ状態)に戻すことは可能ですか?

15
PistolPete

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を介してその例があります。

7
Chase Holland

Xcode8.3およびiOS10.3以降、Siriでこれを実現できます。

_XCUIDevice.shared().press(XCUIDeviceButton.home)
XCUIDevice.shared().siriService.activate(voiceRecognitionText: "Open {appName}")
_

テストスイートファイルの先頭に@available(iOS 10.3, *)を含めれば、準備は完了です。

4
brandenbyers

誰かがアプリをバックグラウンドから戻す必要がある場合は、(上記の回答に基づいて)実際に機能するカテゴリを作成しました(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
1
alexdmukh

これは私がXCUITestに持っているものであり、チャームのように機能します(xcode10.1およびテストデバイスはiPhoneX 11.0です)

func testWhatever(){

//バックグラウンドのフォアグラウンドを実行する必要があるまで、ステップをテストします

XCUIDevice.shared.press(XCUIDevice.Button.home)//アプリをバックグラウンドにするXCUIApplication()。activate()//アプリを元に戻す

//バックグラウンドフォアグラウンドが実行された後、テストを続行します。 }

1
Jasmeet Singh

Swiftの場合、Bridging-Header.hで次のようにXCUIApplicationプライベートメソッドインターフェイスを宣言する必要があります。

@interface XCUIApplication (Private)
- (id)initPrivateWithPath:(NSString *)path bundleID:(NSString *)bundleID;
- (void)resolve;
@end

次に、テストケースでresolve()を呼び出して、アプリを元に戻します。

XCUIApplication().resolve()
0
Alex Bin Zhao