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
xcode
xcode7
xcode-ui-testing
Vinpai
źródło
źródło
app.tables.cells.allElementsBoundByAccessibilityElement.count
przed dotknięciem przycisku? Po prostu ciekawy - czasami pomagało mi to „odświeżyć” ekran.Odpowiedzi:
Chyba tutaj „Anuluj” powraca przycisk
false
dlahittable
nieruchomoś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,
XCUIElement
któ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() } } }
źródło
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 przebiciaself.app.navigationBars["Nav Title"].staticTexts["Custom Back Btn Title"].forceTapElement()
let coordinate: XCUICoordinate = self.coordinateWithNormalizedOffset(CGVectorMake(0.5, 0.5))
Dla mnie główną przyczyną było to, że obiekty, które chciałem dotknąć
W obu przypadkach
isAccessibilityElement
majątek byłfalse
później. Ustawiam go z powrotem, żebytrue
to naprawić.źródło
Zauważyłem, że ten problem był spowodowany
XCElement
istnieją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)
źródło
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
źródło
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.
źródło
W moim przypadku był to programowo dodany element UI zakrywający przycisk.
źródło
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.
źródło
W duchu rzeczy, które mogą zakryć twój element, miałem debugger RN częściowo nałożony na moją ikonę:
źródło