Я пытаюсь выполнить тесты пользовательского интерфейса, используя 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)
}
Я пробовал эти шаги, пока он не стал таким:
- Только
element.tap()
и element.typeText()
. - Добавлен охранник для ожидания существования (блок
assertExists()
) - Добавлен
sleep()
для ожидания нескольких секунд в течение клавиатура, чтобы показать. - Добавлен
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)
}
Итак, я сделал:
- Только
element.tap()
и tap(pasteMenuItem, timeout: timeout, file: file, line: line)
(что было то же самое с app.menuItems["Paste"].tap()
) - Добавлен
element.doubleTap()
- Добавлен
element.press()
При использовании функции вставки иногда пункт меню Вставить не отображается с этой ошибкой: failed - Element: "Paste" MenuItem does not exist!
. Но иногда это работало просто отлично.
Итак, я сейчас в тупике. Как мне ввести текст в текстовое поле, которое наверняка будет работать при любых условиях, будь то запуск всех тестов или запуск отдельного тестового примера?
Заранее спасибо.
PS: Он отлично работает на моя машина CI. Это странно.