Test interfejsu użytkownika Xcode - niepowodzenie testowania interfejsu użytkownika - nie udało się przewinąć do widocznego (przez działanie AX) po dotknięciu przycisku „Anuluj” w polu wyszukiwania

85

Próbuję zamknąć pole wyszukiwania, naciskając przycisk „Anuluj” na pasku wyszukiwania.

Przypadek testowy nie znalazł przycisku anulowania. Działał dobrze w Xcode 7.0.1

Dodałem predykat, aby czekać na pojawienie się przycisku. Przypadek testowy kończy się niepowodzeniem, gdy klikniemy przycisk „anuluj”

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

dzienniki :

    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
Vinpai
źródło
@ Joe Masilotti jakiś pomysł?
Vinpai
Tylko sprawdzenie poczytalności, ale czy przycisk Anuluj jest na ekranie, czy też trzeba go przewinąć do? Wiem, że nadal występują problemy, w których przewijanie do elementów nie zawsze działa.
Joe Masilotti
Przycisk anulowania @JoeMasilotti jest na ekranie. Przycisk Anuluj jest domyślnym przyciskiem systemu, który jest częścią paska UISearch. Działało dobrze w Xcode 7.0.1, kiedy zrobiłem [self.buttons [@ "Cancel"] tap];
Vinpai
1
@Vinpai co się stanie, gdy dodasz a app.tables.cells.allElementsBoundByAccessibilityElement.countprzed dotknięciem przycisku? Po prostu ciekawy - czasami pomagało mi to „odświeżyć” ekran.
ciasta88
@Konnor, próbowałem z sugerowanym przez ciebie API, ale kończy się to niepowodzeniem, gdy stukam w przycisk Anuluj. Kiedy
pytam o

Odpowiedzi:

140

Chyba tutaj „Anuluj” powraca przycisk falsedla hittablenieruchomości, która powstrzymuje go od stukanie.

Jeśli widzisz tap()w dokumentacji, to mówi

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

Wygląda na to, że w XCode 7.1 wszystko jest zepsute. Aby nie dopuścić do tego, aby mnie (i Ty też;)) nie było problemu, napisałem rozszerzenie, XCUIElementktóre umożliwia dotknięcie elementu, nawet jeśli nie jest to możliwe. Poniższe mogą ci pomóc.

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

Teraz możesz dzwonić jako

button.forceTapElement()

Aktualizacja - dla Swift 3 użyj następujących:

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()
        }
    }
}
Piaszczysty
źródło
Dzięki za poprawkę. Miałem podobny problem z cell.tap()i to go naprawiło. Wydaje się, że coś się zmieniło w Xcode7.1, powodując, że niektóre elementy nie są już możliwe do przebicia
francisOpt
Mam niestandardowy element navigationBar backButtonItem, który nie jest `` hittable '' w Xcode7.1, a to rozwiązanie działa dla mnieself.app.navigationBars["Nav Title"].staticTexts["Custom Back Btn Title"].forceTapElement()
Alex
Dzięki - działał w przypadku mojego samego problemu.
Tache
7
W moim przypadku zadziałało, gdy kran jest pośrodku widoku. Zmień przesunięcie na (0,5, 0,5). let coordinate: XCUICoordinate = self.coordinateWithNormalizedOffset(CGVectorMake(0.5, 0.5))
Graham Perks
1
świetna robota. Prawie zacząłem zabijać mojego Macbooka, zanim to zobaczyłem.
ChaosSpeeder
11

Dla mnie główną przyczyną było to, że obiekty, które chciałem dotknąć

  • zostały ustawione jako ukryte (iz powrotem)
  • zostały usunięte i ponownie podłączone

W obu przypadkach isAccessibilityElementmajątek był falsepóźniej. Ustawiam go z powrotem, żeby trueto naprawić.

dog
źródło
3
To był dokładnie mój problem. Co dziwne, zaczęło się to dziać na iOS 11 (działało dobrze na iOS 10).
Ricardo Sanchez-Saez
4

To pytanie zajmuje dobre miejsce w zapytaniach Google związanych z hasłem „Nie udało się przewinąć do widocznego (przez działanie AX) przycisku” . Biorąc pod uwagę wiek pytania, byłem skłonny sądzić, że nie jest to już problem z ramą XCUITest, jak sugeruje przyjęta odpowiedź.

Zauważyłem, że ten problem był spowodowany XCElementistniejącym, ale ukrytym za klawiaturą oprogramowania. Błąd jest emitowany przez platformę, ponieważ nie jest w stanie przewinąć widoku, który istnieje, aby można go było kliknąć. W moim przypadku ten przycisk znajdował się czasami za klawiaturą programową .

Zauważyłem, że klawiatura oprogramowania iOS Simulator może być w niektórych przypadkach wyłączana (np. Na twoim komputerze) i włączana w innych (np. Na twoim CI). W moim przypadku musiałem wyłączyć klawiaturę programową na jednym komputerze, a domyślnie była włączona na innych.

Rozwiązanie: Odłącz klawiaturę przed próbą dotknięcia przycisków, które mogą znajdować się za nią.

Zauważyłem, że dotknięcie miejsca, w którym wyraźnie odrzucono klawiaturę, przed dotknięciem przycisku, rozwiązało mój problem we wszystkich środowiskach.

Dodałem kilka akcji, aby aktualny responder zrezygnował z pierwszej odpowiedzi. Widoki za moimi widokami tekstu zmuszą pierwszego ratownika do rezygnacji, więc dotykam miejsca tuż pod ostatnim obszarem tekstowym.

 /// 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)
Jessedc
źródło
2

Sprawdź cechę elementu, napotkałem ten sam problem z TableViewSectionHeader, próbowałem dotknąć, ale kończyło się to niepowodzeniem w każdym punkcie

wprowadź opis obrazu tutaj

Nagaraj
źródło
1

Obejście Sandy wydawało się pomocne przez chwilę, ale potem nie więcej - potem zmieniłem to w następujący sposób:

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

Główną kwestią jest to, że ponieważ problem polega na tym, że sprawdzenie Hittable zgłasza wyjątek, nie robię tego sprawdzenia w ogóle i idę prosto do współrzędnych po znalezieniu elementu.

Aistė Stikliūtė
źródło
0

W moim przypadku był to programowo dodany element UI zakrywający przycisk.

PruitIgoe
źródło
0

Jeśli używasz symulatora AppCenter do uruchamiania testów, upewnij się, że uruchamiasz testy na tej samej wersji urządzenia, co lokalny symulator. Straciłem przez to 3 dni pracy.

fdelam
źródło
0

W duchu rzeczy, które mogą zakryć twój element, miałem debugger RN częściowo nałożony na moją ikonę:

wprowadź opis obrazu tutaj

Jeroen Vannevel
źródło