Тест інтерфейсу 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

@ Джо Масілотті будь-яка ідея?
Вінпай

Просто перевірка стану розумності, але кнопка Скасувати на екрані чи її потрібно прокрутити? Я знаю, що все ще є проблеми, коли прокрутка до елементів не завжди працює.
Джо Масілотті

На екрані є кнопка скасування @JoeMasilotti. Кнопка "Скасувати" - це кнопка за замовчуванням, яка є частиною панелі UISearch. У Xcode 7.0.1 він працював нормально, коли я робив [self.buttons [@ "Cancel"] tap];
Вінпай

1
@Vinpai, що відбувається, коли ви додаєте a app.tables.cells.allElementsBoundByAccessibilityElement.countперед натисканням кнопки? Просто цікаво - це іноді допомагало мені «оновлювати» екран.
cakes88

@Konnor, я спробував із запропонованим вами API, але він не вдається, коли я натискаю кнопку Скасувати. Коли я
запитую

Відповіді:


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

Оновлення - Для швидкого 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, внаслідок чого якийсь елемент більше не піддається
francis,

У мене є спеціальна навігаційна панель backButtonItem, яка не є "доступною для удару" в 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
чудова робота. Я майже починав вбивати свій macbook, перш ніж це побачив.
ChaosSpeeder

11

Для мене першопричиною було те, що об’єкти, якими я хотів торкнутися

  • було встановлено як приховане (і назад)
  • були вилучені та знову прикріплені

В обох випадках isAccessibilityElementмайно було falseзгодом. Повернення його до trueфіксованого.


3
Це була саме моя проблема. Як не дивно, це почало відбуватися на iOS 11 (на iOS 10 він працював нормально).
Рікардо Санчес-Саес,

4

Це запитання добре відповідає запитам 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)

2

Будь ласка, перевірте властивість елемента, я стикався з тією ж проблемою з TableViewSectionHeader, я намагався натиснути, але це не вдавалося в кожному пункті

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


1

Обхідний шлях Сенді на деякий час здавався допоміжним, але потім не більше - потім я змінив його так:

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.