Тест Uc Xcode - Неисправность тестирования пользовательского интерфейса - Не удалось прокрутить до видимого (с помощью действия AX), если нажать на поле поиска "Отмена"
Я пытаюсь удалить поле поиска, нажав кнопку "Отменить" в строке поиска.
В тестовом случае отсутствует кнопка отмены. Он отлично работает в Xcode 7.0.1
Я добавил предикат, чтобы ждать появления кнопки. Сбой теста при нажатии кнопки "Отмена"
let button = app.buttons["Cancel"]
let existsPredicate = NSPredicate(format: "exists == 1")
expectationForPredicate(existsPredicate, evaluatedWithObject: button, handler: nil)
waitForExpectationsWithTimeout(5, handler: nil)
button.tap() // Failing here
журналы
t = 7.21s Tap SearchField
t = 7.21s Wait for app to idle
t = 7.29s Find the SearchField
t = 7.29s Snapshot accessibility hierarchy for com.test.mail
t = 7.49s Find: Descendants matching type SearchField
t = 7.49s Find: Element at index 0
t = 7.49s Wait for app to idle
t = 7.55s Synthesize event
t = 7.84s Wait for app to idle
t = 8.97s Type '[email protected]' into
t = 8.97s Wait for app to idle
t = 9.03s Find the "Search" SearchField
t = 9.03s Snapshot accessibility hierarchy for com.test.mail
t = 9.35s Find: Descendants matching type SearchField
t = 9.35s Find: Element at index 0
t = 9.36s Wait for app to idle
t = 9.42s Synthesize event
t = 10.37s Wait for app to idle
t = 10.44s Check predicate `exists == 1` against object `"Cancel" Button`
t = 10.44s Snapshot accessibility hierarchy for com.test.mail
t = 10.58s Find: Descendants matching type Button
t = 10.58s Find: Elements matching predicate '"Cancel" IN identifiers'
t = 10.58s Tap "Cancel" Button
t = 10.58s Wait for app to idle
t = 10.64s Find the "Cancel" Button
t = 10.64s Snapshot accessibility hierarchy for com.test.mail
t = 10.78s Find: Descendants matching type Button
t = 10.78s Find: Elements matching predicate '"Cancel" IN identifiers'
t = 10.79s Wait for app to idle
t = 11.08s Synthesize event
t = 11.13s Scroll element to visible
t = 11.14s Assertion Failure: UI Testing Failure - Failed to scroll to visible (by AX action) Button 0x7f7fcaebde40: traits: 8589934593, {{353.0, 26.0}, {53.0, 30.0}}, label: 'Cancel', error: Error -25204 performing AXAction 2003
Ответы
Ответ 1
Я предполагаю, что здесь кнопка "Отмена" возвращает свойство false
для hittable
, что препятствует его нажатию.
Если вы видите tap()
в документации, он говорит
/*!
* Sends a tap event to a hittable point computed for the element.
*/
- (void)tap;
Кажется, что все побито с XCode 7.1. Чтобы сохранить себя (и u тоже;)), разблокированный из этих проблем, я написал расширение на XCUIElement
, которое позволяет использовать элемент, даже если он не является hittable. Следующее может вам помочь.
/*Sends a tap event to a hittable/unhittable element.*/
extension XCUIElement {
func forceTapElement() {
if self.hittable {
self.tap()
}
else {
let coordinate: XCUICoordinate = self.coordinateWithNormalizedOffset(CGVectorMake(0.0, 0.0))
coordinate.tap()
}
}
}
Теперь вы можете позвонить как
button.forceTapElement()
Обновление. Для быстрого 3 используйте следующее:
extension XCUIElement {
func forceTapElement() {
if self.isHittable {
self.tap()
}
else {
let coordinate: XCUICoordinate = self.coordinate(withNormalizedOffset: CGVector(dx:0.0, dy:0.0))
coordinate.tap()
}
}
}
Ответ 2
Для меня основной причиной было то, что объекты, которые я хотел нажать
- были установлены скрытые (и обратно)
- были удалены и повторно подключены
В обоих случаях свойство isAccessibilityElement
было false
впоследствии. Вернувшись к true
, он зафиксировал его.
Ответ 3
Этот вопрос хорошо подходит для запросов Google, связанных с термином "Не удалось прокрутить до видимой (по действию AX) кнопки". Учитывая возраст вопроса, я был склонен думать, что это больше не является проблемой со структурой XCUITest, как предполагает принятый ответ.
Я обнаружил, что эта проблема была из-за существующего XCElement
, но скрытого за программной клавиатурой. Ошибка испускается платформой, так как она не может прокрутить представление, которое существует в представлении, для возможности его применения. В моем случае рассматриваемая кнопка иногда находилась за программной клавиатурой.
Я обнаружил, что программная клавиатура iOS Simulator может быть отключена в некоторых случаях (например, на вашем компьютере) и включена в других (например, на вашем CI). В моем случае я выключил программную клавиатуру на одном компьютере, и по умолчанию он был включен на других.
Решение. Отключите клавиатуру, прежде чем нажимать кнопки, которые могут быть за ней.
Я обнаружил, что постукивание по клавиатуре, которое явно отклонило клавиатуру, до нажатия на кнопку решило мою проблему во всех средах.
Я добавил добавить некоторые действия, чтобы получить текущий респондент resignFirstResponder. Представления за моими текстовыми представлениями заставят первого респондента подать в отставку, поэтому я нажимаю где-то под последней текстовой областью.
/// The keyboard may be up, dismiss it by tapping just below the password field
let pointBelowPassword = passwordSecureTextField.coordinate(withNormalizedOffset: CGVector(dx: 0.5, dy: 1))
pointBelowPassword.press(forDuration: 0.1)
Ответ 4
Пожалуйста, проверьте черту элемента, я столкнулся с той же проблемой с TableViewSectionHeader, я пытался нажать, но он не удался в каждой точке
![enter image description here]()
Ответ 5
В моем случае это был программно добавленный элемент пользовательского интерфейса, закрывающий кнопку.
Ответ 6
Если вы используете симулятор AppCenter для запуска тестов, вы должны убедиться, что вы запускаете тесты на той же версии устройства, что и ваш локальный симулятор. Я потерял 3 дня работы из-за этого.
Ответ 7
Обходное решение Сэнди какое-то время казалось полезным, но не более - тогда я изменил его так:
func waitAndForceTap(timeout: UInt32 = 5000) {
XCTAssert(waitForElement(timeout: timeout))
coordinate(withNormalizedOffset: CGVector(dx:0.5, dy:0.5)).tap()
}
Суть в том, что, поскольку проблема заключается в том, что проверка isHittable вызывает исключение, я вообще не делаю эту проверку и выхожу прямо к координатам после того, как элемент найден.