2016-11-17 15 views
8

Szukałem rozwiązania mojego problemu, w którym muszę wysłać moją aplikację do tła i ponownie uruchomić ją z ostatnich po określonym czasie. deactivateAppForDuration() został użyty do osiągnięcia tego w UIAutomation Instruments. Czy ktoś wie, jak to osiągnąć w XCTest?Wysyłanie aplikacji na tło i ponowne jej uruchamianie od czasu do czasu w XCTest

+0

Możesz spróbować po prostu zarejestrować przepływ, który powinien dać Ci całkiem niezły pomysł, jak to osiągnąć. Nagrywanie nie zatrzyma się po przesłaniu aplikacji do tła. Następnie przespij się (n) swoją egzekucją testową lub dispatch_after, aż wrócisz na pierwszy plan (i zatrzymaj nagrywanie). – dogsgod

+0

Próbowałem tego. Po przejściu do tła podczas nagrywania, uzyskuje dostęp do aplikacji z ostatnich aplikacji przy użyciu elementów XCUIApplication() (Wydaje się, że dla rejestratora system ui staje się teraz XCUIApplication). Dlatego próbując uruchomić to nagranie, powoduje błąd. Zasadniczo tracisz aplikację XCUIApplication, jeśli opuścisz aplikację. – rachit

+0

@rachit czy rozwiązanie, które podałem poniżej, działa dla ciebie? – user3353890

Odpowiedz

6

Nie jest pozytywne, jeśli to zadziała, ponieważ jeszcze tego nie testowałem, ale warto spróbować. Jeśli nic innego nie powinno dać ci dobrego pomysłu, gdzie szukać.

klasa XCUIApplication zapewnia metody zarówno zakończyć i uruchomić aplikację programowo: https://developer.apple.com/reference/xctest/xcuiapplication

klasa XCUIDevice pozwala symulować nacisnąć przycisk na urządzeniu: https://developer.apple.com/reference/xctest/xcuidevicebutton

można użyć tych wraz z UIControl i NSURLSessionTask do zawieszenia aplikacji.

Przykładem tego procesu z wykorzystaniem Swift 3 może wyglądać mniej więcej tak (składnia może być nieco inna dla Swift 2 i poniżej):

func myXCTest() { 

    UIControl().sendAction(#selector(NSURLSessionTask.suspend), to: UIApplication.shared(), for: nil) 

    Timer.scheduledTimer(timeInterval: 5.0, target: self, selector: #selector(launchApp), userInfo: nil, repeats: false) 
} 

func launchApp() { 
    XCUIApplication().launch() 
} 

Innym sposobem może być po prostu wykonującemu naciśnij przycisk HOME, a następnie wznowienie aplikację po przejechaniu timer:

func myXCTest { 

    XCUIDevice().press(XCUIDeviceButton.Home) 

    Timer.scheduledTimer(timeInterval: 5.0, target: self, selector: #selector(launchApp), userInfo: nil, repeats: false)  
} 

Żaden z tych sposobów może robić co pytasz, czy działa idealnie, ale miejmy nadzieję, że to daje punkt wyjścia. Możesz się z nim bawić i znaleźć rozwiązanie, które będzie dla ciebie skuteczne. Powodzenia!

+0

Próbowałem, Po naciśnięciu przycisku home aplikacja została przeniesiona do tła. Ale funkcja zawieszenia nie była w stanie ponownie przywrócić aplikacji na pierwszy plan. – rachit

+0

Więc timer nie odliczał i ponownie uruchomił aplikacji? – user3353890

+0

Czy to rozwiązanie działa u każdego? Wiem, że ma 4 głosy na górę, ale czy to rzeczywiście działa? Na podstawie komentarzy nie jest jasne. Dzięki. – rfodge

1

Jeśli można użyć Xcode 8.3 i iOS 10,3 z aktualnych badań, to może chcesz spróbować to:

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

Pamiętaj, aby podać @available(iOS 10.3, *) na górze pliku zestawu testowego. To jest względnie równoważne z deactivateAppForDuration(). Po prostu zmień sleep() na żądany czas.

Powiązane problemy