Я пытаюсь закрыть поле поиска, нажав кнопку «Отмена» в строке поиска.
Тестовый пример не может найти кнопку отмены. Он отлично работал в 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
xcode
xcode7
xcode-ui-testing
Винпай
источник
источник
app.tables.cells.allElementsBoundByAccessibilityElement.count
значок перед нажатием кнопки? Просто любопытно - это иногда помогало мне «освежить» экран.Ответы:
Я думаю, здесь кнопка "Отмена" возвращается
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, из-за чего какой-то элемент больше не поражаетсяself.app.navigationBars["Nav Title"].staticTexts["Custom Back Btn Title"].forceTapElement()
let coordinate: XCUICoordinate = self.coordinateWithNormalizedOffset(CGVectorMake(0.5, 0.5))
Для меня основной причиной было то, что объекты, которые я хотел коснуться
В обоих случаях
isAccessibilityElement
собственность былаfalse
потом. Установка его обратно, чтобыtrue
исправить это.источник
Я обнаружил, что эта проблема связана с
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)
источник
Пожалуйста, проверьте черту элемента, я столкнулся с той же проблемой с TableViewSectionHeader, я пытался нажать, но на каждом этапе происходил сбой
источник
Временное решение Sandy показалось мне полезным, но не более того - я изменил его следующим образом:
func waitAndForceTap(timeout: UInt32 = 5000) { XCTAssert(waitForElement(timeout: timeout)) coordinate(withNormalizedOffset: CGVector(dx:0.5, dy:0.5)).tap() }
Основная идея заключается в том, что, поскольку проблема в том, что проверка isHittable вызывает исключение, я вообще не выполняю эту проверку и сразу ищу координаты после того, как элемент найден.
источник
В моем случае это был программно добавленный элемент пользовательского интерфейса, закрывающий кнопку.
источник
Если вы используете симулятор AppCenter для запуска тестов, вы должны убедиться, что вы запускаете тесты на той же версии устройства, что и ваш локальный симулятор. Я потерял из-за этого 3 дня работы.
источник
В духе вещей, которые могут охватывать ваш элемент, отладчик RN частично наложен поверх моего значка:
источник