2016-04-20 4 views
3

У меня проблема, если я пытаюсь разрешить системное оповещение системы, работать только один раз, а следующее предупреждение не «разрешать» . Я больше не ищу больше времени и знаю об этом сообщении: (Xcode 7 UI Testing: how to dismiss a series of system alerts in code) Ничего .. не работает. Вот мой текущий код, первое предупреждение «разрешено» успешно, следующий сигнал тревоги не обнаружено ..Xcode UI Testing разрешает системные предупреждения серии

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]; 
} 

С наилучшими пожеланиями, Иван.

UPD:

Хорошо, я нашел решение, как после первого сигнала, попробуйте второе место (спасибо за этот сайт: 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) Просто нужно возвращать всегда НЕТ.

Но другая проблема ...

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

Он попробовать близко третье уведомление, а не второй, конечно, он не нашел эту систему предупреждение ...

+0

Не сайт, на который вы связались в обновлении, просто скрежет того же Q/A, с которым вы связались в своем оригинальном посте? –

ответ

1

Использование Для цикла переборе числа возможные системные предупреждения кажутся наиболее вероятными в вашем коде. Превращая его в цикл while, который оценивает существование системного оповещения, поскольку условное выражение будет намного более чистым визуально, задействовать менее общую логику и не иметь условие сбоя, когда self.possibleSystemAlerts не является правильным значением.

Вся ваша логика монитора также может быть вырвана. Тест будет ждать, пока приложение не пройдёт, и к этому времени у вас будет предупреждение или нет предупреждения. Оцените его присутствие или отсутствие, взаимодействуйте с ним или завершите цикл.

+0

Перед тем, как начать новый тест, я удаляю приложение из своего симулятора. И я использую «waitForExpectationsWithTimeout», чтобы не запускать основные тесты. – MeGaPk

+0

обновленный вопрос, проверьте пожалуйста. – MeGaPk

5

Создайте обработчики предупреждений один за другим, прежде чем приложение запустится. Кроме того, перед взаимодействием с предупреждением убедитесь, что он находится в любом месте приложения tap(). Это известная ошибка в Xcode.

addUIInterruptionMonitor(withDescription:"First Dialog") { (alert) -> Bool in 
    alert.buttons["Allow"].tap() 
    return true 
} 

addUIInterruptionMonitor(withDescription:"Second Dialog") { (alert) -> Bool in 
    alert.buttons["Allow"].tap() 
    return true 
} 

addUIInterruptionMonitor(withDescription:"Third Dialog") { (alert) -> Bool in 
    alert.buttons["Allow"].tap() 
    return true 
} 

let app = XCUIApplication() 
app.launch() 

app.tap() 
app.tap() 
app.tap() 

Эти три ответвления будут каждый обработчик предупреждений подряд без фактического запуска любых событий в вашем приложении. Также обратите внимание, что каждый обработчик прерывания не указывает ничего о предупреждении, только кнопка подтверждения.

+0

вопрос был помечен под объектив c. это решение находится на Swift –

+0

Это не работает для нас, пытаясь отклонить оповещение «SFAuthenticationSession» в Xcode 9/iOS 11. –

+1

Но это решение работает для нас: https://stackoverflow.com/a/46951214/17294 –