Невозможно отслеживать цикл событий и ждать, пока приложение простаивает

#ios #xcode #xctest #xctestcase

#iOS #xcode #xctest #xctestcase

Вопрос:

Я пишу сценарии UITest для своего приложения, используя XCTest. Приложение выполняет несколько вызовов сервера на главном экране. Я не смог перейти к следующему экрану. Автоматизация часто простаивает в течение 1 минуты или даже больше с сообщением

Подождите, пока приложение не будет работать в режиме ожидания

или

Невозможно отслеживать цикл событий

Есть ли способ заставить приложение выполнить мои тестовые примеры, нарушающие это???

Ответ №1:

Я установил аргумент в тестовом классе пользовательского интерфейса

 let app = XCUIApplication()
app.launchArguments = ["NoAnimations"]
app.launch()
  

В моем методе Appdelegate didFinishLaunchingWithOptions я выполнил проверку

  NSArray *args = [NSProcessInfo processInfo].arguments;
    
    for (NSString *arg in args){
        if ([arg isEqualToString:@"NoAnimations"]){
            [UIView setAnimationsEnabled:false];
        }
    }
  

Итак, теперь во всем моем приложении не будет никакой анимации, и мое приложение больше не заблокировано. Это сократило время моей автоматизации с 25 минут до 2 минут.

Ответ №2:

Мое предложение состояло бы в том, чтобы помочь вам использовать один из этих двух методов, приведенных ниже. На экране появляется первый ожидающий элемент. Второй элемент ожидает hittable. Но в любом случае эти методы помогут вам, возможно, вы сможете использовать метод sleep (параметр). Нравится sleep(5) . Ожидает 5 секунд

 import XCTest

class BaseTestCase: XCTestCase {

    func waitForElementToAppear(element: XCUIElement, timeout: NSTimeInterval = 60,  file: String = #file, line: UInt = #line) {
        let existsPredicate = NSPredicate(format: "exists == true")
        expectationForPredicate(existsPredicate,
                                evaluatedWithObject: element, handler: nil)
        waitForExpectationsWithTimeout(timeout) { (error) -> Void in
            if (error != nil) {
                let message = "Failed to find (element) after (timeout) seconds."
                self.recordFailureWithDescription(message, inFile: file, atLine: line, expected: true)
            }
        }
    }

    func waitForHittable(element: XCUIElement, timeout: NSTimeInterval = 70, file: String = #file, line: UInt = #line) {
        let existsPredicate = NSPredicate(format: "hittable == 1")
        expectationForPredicate(existsPredicate, evaluatedWithObject: element, handler: nil)

        waitForExpectationsWithTimeout(timeout) { (error) -> Void in
            if (error != nil) {
                let message = "Failed to find (element) after (timeout) seconds."
                self.recordFailureWithDescription(message,
                                                  inFile: file, atLine: line, expected: true)
            }
        }
    }
}
  

Я надеюсь, что это каким-то образом помогло

Комментарии:

1. Спасибо, что нашли время помочь мне. Элемент по-прежнему доступен для доступа и существует, но снова он долго ожидает с тем же сообщением «Подождите, пока приложение не будет работать в режиме ожидания». Иногда я вижу это сообщение —- «Уведомление о завершении анимации приложения не получено, будет предпринята попытка продолжить».