Ошибка тестирования пользовательского интерфейса при отображении UIAlertController без кнопок
Мы используем UIAlertController
в качестве индикатора загрузки при выполнении сетевого запроса. Там нет действий, связанных с этим UIAlertController
так как он закрывается автоматически, когда сетевая активность завершена. Мы отображаем это предупреждение, когда пользователь нажимает кнопку входа в наше приложение.
Когда мы запускаем наши тесты, они терпят неудачу в точке сразу после этого с:
UI Testing Failure - Did not receive view did disappear notification within 2.0s
За другие ответы на SO, я пытался использовать addUIInterruptionMonitor
обрабатывать оповещения, но безуспешно. Я думаю, это потому, что на UIAlertController
, Поскольку для оповещения не может быть предпринято никаких действий, монитор прерываний выглядит так:
addUIInterruptionMonitor(withDescription: "Loading") { handler in
return true
}
Даже с этим, хотя, я получаю ту же ошибку. Как я могу обойти это?
РЕДАКТИРОВАТЬ: Соответствующий код тестирования пользовательского интерфейса ниже:
class UI_Tests: XCTestCase {
override func setUp() {
super.setUp()
continueAfterFailure = true
XCUIApplication().launch()
}
func testLogin() {
let app = XCUIApplication()
let tablesQuery = app.tables
let secureTextField = tablesQuery.cells.containing(.staticText, identifier:"PIN").children(matching: .secureTextField).element
secureTextField.tap()
secureTextField.typeText("1234")
app.buttons["Login"].tap()
addUIInterruptionMonitor(withDescription: "Loading") { handler in
return true
}
// Test failure occurs here.
let searchField = tablesQuery.searchFields.element(boundBy: 0)
searchField.tap()
searchField.typeText("hey")
}
}
2 ответа
После обращения к Apple DTS выясняется, что при отображении прерывания пользовательского интерфейса / UIAlertController
который отклоняет на основе тайм-аута, что вам нужно объединить монитор прерываний пользовательского интерфейса с ожиданием на основе тайм-аута (в противном случае монитор прерываний вернется до того, как предупреждение будет отклонено!).
Используя пример тестирования пользовательского интерфейса в вопросе, этот подход выглядит следующим образом:
class UI_Tests: XCTestCase {
override func setUp() {
super.setUp()
continueAfterFailure = true
XCUIApplication().launch()
}
func testLogin() {
let app = XCUIApplication()
let tablesQuery = app.tables
let secureTextField = tablesQuery.cells.containing(.staticText, identifier:"PIN").children(matching: .secureTextField).element
secureTextField.tap()
secureTextField.typeText("1234")
app.buttons["Login"].tap()
addUIInterruptionMonitor(withDescription: "Loading") { alert in
self.expectation(for: NSPredicate(format: "exists == false"), evaluatedWith: alert, handler: nil);
self.waitForExpectations(timeout: 10, handler: nil)
return true
}
// Test failure occurs here.
let searchField = tablesQuery.searchFields.element(boundBy: 0)
searchField.tap()
searchField.typeText("hey")
}
}
Это ожидание будет ждать 10 секунд для заполнения. Если предупреждение не исчезнет через 10 секунд, ожидание не будет выполнено и тест не пройден, но если это произойдет, тест завершится успешно.
Использовать UIActivityIndicatorView
вместо UIAlertController
,
Тесты пользовательского интерфейса предполагают, что оповещения будут обрабатываться пользователем, а не исчезать самостоятельно. Тесты пользовательского интерфейса также учитывают показатели активности и автоматически ждут их исчезновения, прежде чем продолжить.