Подтвердить что ты не робот

Тест 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
4b9b3361

Ответ 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 вызывает исключение, я вообще не делаю эту проверку и выхожу прямо к координатам после того, как элемент найден.