Тест пользовательского интерфейса Xcode - Ошибка тестирования пользовательского интерфейса - Не удалось перейти к отображению (с помощью действия AX) при нажатии кнопки «Отмена» в поле поиска.


85

Я пытаюсь закрыть поле поиска, нажав кнопку «Отмена» в строке поиска.

Тестовый пример не может найти кнопку отмены. Он отлично работал в 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 'vinayak@xmd.net' 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

@ Джо Масилотти есть идеи?
Vinpai

Просто проверка работоспособности, но есть ли кнопка Отмена на экране или ее нужно прокручивать? Я знаю, что по-прежнему существуют проблемы, при которых прокрутка к элементам не всегда работает.
Джо Масилотти

Кнопка отмены @JoeMasilotti находится на экране. Кнопка отмены - это системная кнопка по умолчанию, которая является частью UISearchbar. Он отлично работал в Xcode 7.0.1, когда я сделал [self.buttons [@ "Cancel"] tap];
Vinpai

1
@Vinpai, что происходит, когда вы добавляете app.tables.cells.allElementsBoundByAccessibilityElement.countзначок перед нажатием кнопки? Просто любопытно - это иногда помогало мне «освежить» экран.
cakes88

@Konnor, я пробовал использовать предложенный вами API, но он терпит неудачу, когда я нажимаю кнопку "Отмена". Когда я запрашиваю application.buttons в отладчике, отображается кнопка отмены
Vinpai

Ответы:


140

Я думаю, здесь кнопка "Отмена" возвращается falseдляhittable свойства, что предотвращает его нажатие.

Если вы видите tap()в документации, это говорит

/*!
 * Sends a tap event to a hittable point computed for the element.
 */
- (void)tap;

Похоже, что с XCode 7.1 что-то не так. Чтобы не блокировать себя (и вас тоже;)) от этих проблем, я написал расширение, XCUIElementкоторое позволяет нажимать на элемент, даже если он не поражается. Следующее может вам помочь.

/*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()

Обновление - для swift 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()
        }
    }
}

Спасибо за исправление. Я столкнулся с аналогичной проблемой, cell.tap()и это исправило ее. Что-то, кажется, изменилось в Xcode7.1, из-за чего какой-то элемент больше не поражается
francisOpt

У меня есть настраиваемая панель навигации backButtonItem, которая не является «Hittable» в Xcode7.1, и это решение работает для меня,self.app.navigationBars["Nav Title"].staticTexts["Custom Back Btn Title"].forceTapElement()
Алекс

Спасибо - работал с моей той же проблемой.
Tache

7
В моем случае это сработало, когда кран находится в центре обзора. Измените смещение на (0,5, 0,5). let coordinate: XCUICoordinate = self.coordinateWithNormalizedOffset(CGVectorMake(0.5, 0.5))
Грэм Перкс,

1
отличная работа. Я почти начал убивать свой макбук, прежде чем увидел это.
ChaosSpeeder

11

Для меня основной причиной было то, что объекты, которые я хотел коснуться

  • были установлены как скрытые (и обратно)
  • были удалены и снова прикреплены

В обоих случаях isAccessibilityElementсобственность была falseпотом. Установка его обратно, чтобы trueисправить это.


3
Это была моя проблема. Как ни странно, это начало происходить на iOS 11 (на iOS 10 все работало нормально).
Рикардо Санчес-Саез,

4

Этот вопрос хорошо подходит для запросов Google по поводу термина «Не удалось прокрутить до видимой (с помощью действия AX) кнопки» . Учитывая возраст вопроса, я был склонен думать, что это больше не проблема с фреймворком XCUITest, как следует из принятого ответа.

Я обнаружил, что эта проблема связана с XCElementсуществующей, но скрытой за программной клавиатурой. Ошибка возникает из-за того, что фреймворк не может прокрутить существующее представление для доступа к нему. В моем случае рассматриваемая кнопка иногда находилась за программной клавиатурой .

Я обнаружил, что программная клавиатура симулятора iOS в некоторых случаях может быть отключена (например, на вашем компьютере) и включена в других (например, на вашем 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)

2

Пожалуйста, проверьте черту элемента, я столкнулся с той же проблемой с TableViewSectionHeader, я пытался нажать, но на каждом этапе происходил сбой

введите описание изображения здесь


1

Временное решение Sandy показалось мне полезным, но не более того - я изменил его следующим образом:

func waitAndForceTap(timeout: UInt32 = 5000) {
    XCTAssert(waitForElement(timeout: timeout))
    coordinate(withNormalizedOffset: CGVector(dx:0.5, dy:0.5)).tap()
}

Основная идея заключается в том, что, поскольку проблема в том, что проверка isHittable вызывает исключение, я вообще не выполняю эту проверку и сразу ищу координаты после того, как элемент найден.


0

В моем случае это был программно добавленный элемент пользовательского интерфейса, закрывающий кнопку.


0

Если вы используете симулятор AppCenter для запуска тестов, вы должны убедиться, что вы запускаете тесты на той же версии устройства, что и ваш локальный симулятор. Я потерял из-за этого 3 дня работы.


0

В духе вещей, которые могут охватывать ваш элемент, отладчик RN частично наложен поверх моего значка:

введите описание изображения здесь

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.