2016-04-20 4 views
3

Ich habe ein Problem, wenn ich versuche, Seriensystemalarm zu ermöglichen, arbeite nur einmal, und nächste Warnung nicht "Erlauben" Ich google mehr Zeit, und wissen über diesen Beitrag: (Xcode 7 UI Testing: how to dismiss a series of system alerts in code) Nichts .. nicht funktionieren. Hier mein aktueller Code, erster Alarm "erlaubt" erfolgreich, nächster Alarm nicht erkannt ..Xcode UI Testing erlauben Systemwarnungen Serie

XCUIApplication *app = [[XCUIApplication alloc] init]; 
app.launchEnvironment = @{ 
     @"isUITest" : @YES, 
     @"withFakeData" : fakeData 
}; 
[app launch]; 


for (int i = 1; i <= self.possibleSystemAlerts; i++) { 
    NSLog(@"%d", i); 
    XCTestExpectation *expectation = [self expectationWithDescription:@"High Expectations"]; 
    id monitor = [self addUIInterruptionMonitorWithDescription:@"Push notifications" handler:^BOOL(XCUIElement *_Nonnull interruptingElement) { 
     XCUIElement *element = interruptingElement; 
     XCUIElement *allow = element.buttons[@"Allow"]; 
     XCUIElement *ok = element.buttons[@"OK"]; 

     if ([ok exists]) { 
      [ok tap]; 
      [expectation fulfill]; 
      return YES; 
     } 

     if ([allow exists]) { 
      [allow forceTap]; 
      [expectation fulfill]; 
      return YES; 
     } 
     return NO; 
    }]; 
    [app tap]; 
    [self waitForExpectationsWithTimeout:6.0 handler:^(NSError *error) { 
     if (error) { 
      NSLog(@"Timeout Error: %@", error); 
     } 
    }]; 
    [self removeUIInterruptionMonitor:monitor]; 
} 

Mit freundlichen Grüßen, Ivan.

UPD:

Okay, fand ich Lösung, wie nach dem ersten Alarm, versuchen Sie an zweiter Stelle (Danke für diese Website: http://www.it1me.com/it-answers?id=32148965&s=Template:Viper&ttl=Xcode+7+UI+Testing%3A+how+to+dismiss+a+series+of+system+alerts+in+code) Nur immer brauchen Rückkehr NO.

Aber ein anderes Problem ...

t = 10.18s      Find: Descendants matching type Alert 
    t = 10.18s      Find: Identity Binding 
    t = 11.19s      Find the "Allow “MyApp” to access your location while you use the app?" Alert (retry 1) 
    t = 11.19s       Snapshot accessibility hierarchy for com.apple.springboard 
    t = 11.26s       Find: Descendants matching type Alert 
    t = 11.26s       Find: Identity Binding 
    t = 12.27s      Find the "Allow “MyApp” to access your location while you use the app?" Alert (retry 2) 
    t = 12.27s       Snapshot accessibility hierarchy for com.apple.springboard 
    t = 12.33s       Find: Descendants matching type Alert 
    t = 12.34s       Find: Identity Binding 
    t = 12.42s      Assertion Failure: UI Testing Failure - No matches found for "Allow “MyApp” to access your location while you use the app?" Alert 
Query input was {(
    Alert 0x7febe8731630: traits: 72057602627862528, {{25.0, 193.0}, {270.0, 182.0}}, label: '“MyApp” Would Like to Send You Notifications' 
)} 

Er versucht schließen dritte Benachrichtigung, nicht zweitens natürlich er dieses System Alarm wird nicht gefunden ...

+0

Ist die Seite, mit der du im Update verlinkt hast, nicht nur ein Scraping desselben Q/A, mit dem du in deinem ursprünglichen Post verlinkt hast? –

Antwort

1

Mit einem For-Schleife durch die Anzahl von Iterieren Mögliche Systemwarnungen scheinen der wahrscheinlichste Fehlerfall in Ihrem Code zu sein. Drehen Sie es in eine while-Schleife, die die Existenz eines Systemalarms bewertet, da die Bedingung visuell viel sauberer wäre, weniger Gesamtlogik beinhaltet und keine Fehlerbedingung hat, in der self.possibleSystemAlerts nicht der richtige Wert ist.

Ihre gesamte Monitorlogik kann auch herausgerissen werden. Der Test wartet, bis die App im Leerlauf ist. Zu diesem Zeitpunkt erhalten Sie eine Warnung oder keine Warnmeldung. Bewerten Sie seine Anwesenheit oder das Fehlen davon, interagieren Sie damit oder beenden Sie die Schleife.

+0

Bevor ich einen neuen Test starte, entferne ich die App aus meinem Simulator. Und ich benutze "waitForExpectationsWithTimeout", um die Haupttests nicht zu starten. – MeGaPk

+0

Aktualisierte Frage, bitte überprüfen. – MeGaPk

5

Erstellen Sie die Warnungshandler nacheinander, bevor die App gestartet wird. Stellen Sie außerdem sicher, dass Sie tap() irgendwo in der App vor der Interaktion mit der Warnung. Dies ist ein bekannter Fehler in Xcode.

Diese drei Antippvorgänge werden nacheinander für jeden Alert-Handler ausgeführt, ohne dass tatsächlich Ereignisse in Ihrer App ausgelöst werden. Beachten Sie auch, dass jeder Unterbrechungshandler nichts über die Warnung angibt, nur die Bestätigungsschaltfläche.

+0

Frage wurde unter Ziel c markiert. Diese Lösung ist auf Swift –

+0

Dies funktioniert nicht für uns versuchen, die "SFAuthenticationSession" Warnung unter Xcode 9/iOS 11 zu entlassen. –

+1

Aber diese Lösung funktioniert für uns: https://Stackoverflow.com/a/46951214/17294 –

Verwandte Themen