2016-11-17 3 views
8

Ich war auf der Suche nach einer Lösung für mein Problem, wo ich meine App zu Hintergrund senden und neu von den jüngsten nach einem bestimmten Zeitintervall neu starten muss. InAs UIAutomation wurde dies mit deactivateAppForDuration() erreicht. Weiß jemand, wie man das in XCTest erreicht?App in den Hintergrund senden und neu starten in XCTest

+0

Sie können versuchen, nur den Fluss aufzuzeichnen, der Ihnen eine ziemlich gute Vorstellung davon geben sollte, wie Sie dies erreichen können. Die Aufnahme wird nicht beendet, nachdem die App an den Hintergrund gesendet wurde. Dann schlafe (n) deine Testausführung oder dispatch_after bis du es wieder in den Vordergrund bekommst (und stoppe die Aufnahme) – dogsgod

+0

das habe ich ausprobiert. Nachdem er während der Aufzeichnung in den Hintergrund gegangen ist, greift er über die letzten Apps mit den Elementen von XCUIApplication() auf die App zu (es scheint für Rekorder zu sein. System wird jetzt XCUIApplication). Daher wird beim Versuch, diese Aufzeichnung auszuführen, ein Fehler ausgegeben. Grundsätzlich verlieren Sie den XCUIApplication-Kontext Ihrer App, wenn Sie die App verlassen. – rachit

+0

@rachit hat die Lösung, die ich unten zur Verfügung gestellt habe, für Sie gearbeitet? – user3353890

Antwort

6

Nicht positiv, wenn das funktioniert, da ich es noch nicht getestet habe, aber es ist einen Versuch wert. Wenn nichts anderes, sollte es Ihnen eine gute Idee geben, wo Sie suchen.

XCUIApplication Klasse bietet Methoden, um sowohl zu beenden und die App starten programmatisch: https://developer.apple.com/reference/xctest/xcuiapplication

XCUIDevice Klasse können Sie eine Taste am Gerät simulieren: https://developer.apple.com/reference/xctest/xcuidevicebutton

Sie diese verwenden können, zusammen mit UIControl und NSURLSessionTask, um Ihre Anwendung zu unterbrechen.

Ein Beispiel für diesen Prozess so etwas wie dies mit Swift 3 aussehen könnte (Syntax etwas anders für Swift 2 sein kann und unten):

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() 
} 

Eine andere Möglichkeit kann einfach eine Home-Taste drücken ausführt, und dann Neubelebung der App nach einem Timer passiert:

func myXCTest { 

    XCUIDevice().press(XCUIDeviceButton.Home) 

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

Keine dieser Möglichkeiten können tun, was Sie fragen, oder perfekt funktionieren, aber hoffentlich wird es geben Ihnen einen Ausgangspunkt. Sie können damit spielen und eine Lösung finden, die für Sie arbeitet. Viel Glück!

+0

Ich habe es versucht, nachdem die Home-Taste gedrückt wurde, wurde die App in den Hintergrund verschoben. Aber die Funktion "Suspend" konnte die App nicht wieder in den Vordergrund bringen. – rachit

+0

Also hat der Timer die App nicht heruntergezählt und neu gestartet? – user3353890

+0

Hat diese Lösung für irgendjemanden funktioniert? Ich weiß, es hat 4 Stimmen, aber funktioniert es wirklich? Aufgrund der Kommentare ist es nicht klar. Vielen Dank. – rfodge

1

Wenn Sie Xcode 8.3 und iOS 10.3 mit Ihrem aktuellen Tests verwenden können, dann sollten Sie dies versuchen:

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

Seien Sie sicher, @available(iOS 10.3, *) an der Spitze Ihrer Testsuite-Datei aufzunehmen.

Dies entspricht relativ deactivateAppForDuration(). Ändern Sie einfach die sleep() auf Ihre gewünschte Dauer.

Verwandte Themen