Ввод текстовых полей неэффективен при одновременном запуске всех тестов с использованием параллельного тестирования - PullRequest
1 голос

Я пытаюсь выполнить тесты пользовательского интерфейса, используя XCUITest. В настоящее время у меня есть небольшая проблема при вводе текста в UITextField. Вот что у меня есть в моем классе Robot для ввода текста с клавиатуры:

func typeTextToTextField(_ element: XCUIElement, text: String, timeout: TimeInterval = timeInterval,
                     file: StaticString, line: UInt) {
    guard assertExists(element, timeout: timeout, file: file, line: line),
        element.isHittable else {
            return
    }

    element.tap()
    sleep(2)
    app.activate()
    element.typeText("\(text)\n")
    sleep(2)
}

Я пробовал эти шаги, пока он не стал таким:

  1. Только element.tap() и element.typeText().
  2. Добавлен охранник для ожидания существования (блок assertExists())
  3. Добавлен sleep() для ожидания нескольких секунд в течение клавиатура, чтобы показать.
  4. Добавлен app.activate(), потому что, очевидно, иногда это занимало слишком много времени, чтобы сделать запрос. И ответ об ошибке здесь сказал, что я должен сначала вызвать app.activate ().

Если я запускаю все тесты одновременно с параллельным тестированием, некоторые из тестов, которые используют это, будут работать, но некоторые потерпят неудачу. Некоторые из них будут правильно отображать клавиатуру и вводить текст правильно, в то время как другие не будут отображать клавиатуру и отображают эту ошибку Failed to synthesize event: Neither element nor any descendant has keyboard focus.. Но когда я запускаю тест по одному, все они будут зелеными и отлично работают.

Итак, затем я попытался изменить способ ввода путем вставки текста вместо его ввода. Это также не работает. Вот код:

func pasteToTextField(_ element: XCUIElement, text: String, timeout: TimeInterval = timeInterval,
                      file: StaticString, line: UInt) {
    app.activate()
    guard assertExists(element, timeout: timeout, file: file, line: line),
        element.isHittable else {
            return
    }

    UIPasteboard.general.string = text
    app.activate()
    element.tap()
    element.doubleTap()
    element.press(forDuration: 1.2)
    tap(pasteMenuItem, timeout: timeout, file: file, line: line)
    sleep(5)
}

Итак, я сделал:

  1. Только element.tap() и tap(pasteMenuItem, timeout: timeout, file: file, line: line) (что было то же самое с app.menuItems["Paste"].tap())
  2. Добавлен element.doubleTap()
  3. Добавлен element.press()

При использовании функции вставки иногда пункт меню Вставить не отображается с этой ошибкой: failed - Element: "Paste" MenuItem does not exist!. Но иногда это работало просто отлично.

Итак, я сейчас в тупике. Как мне ввести текст в текстовое поле, которое наверняка будет работать при любых условиях, будь то запуск всех тестов или запуск отдельного тестового примера?

Заранее спасибо.

PS: Он отлично работает на моя машина CI. Это странно.

...