Test dell'interfaccia utente Xcode - Errore del test dell'interfaccia utente - Impossibile scorrere fino a visibile (per azione AX) quando si tocca il campo di ricerca pulsante "Annulla"


85

Sto provando a chiudere il campo di ricerca toccando il pulsante "Annulla" nella barra di ricerca.

Il test case non riesce a trovare il pulsante Annulla. Funzionava bene in Xcode 7.0.1

Ho aggiunto il predicato per attendere la visualizzazione del pulsante. Il test case non riesce quando tocchiamo il pulsante "Annulla"

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

registri :

    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

@ Joe Masilotti qualche idea?
Vinpai

Solo un controllo di integrità, ma il pulsante Annulla è visualizzato sullo schermo o è necessario scorrere fino a? So che ci sono ancora problemi in cui lo scorrimento degli elementi non sempre funziona.
Joe Masilotti

@JoeMasilotti pulsante di annullamento è sullo schermo. Il pulsante Annulla è il pulsante predefinito del sistema che fa parte di UISearchbar. Funzionava bene in Xcode 7.0.1 quando ho eseguito [self.buttons [@ "Cancel"] tap];
Vinpai

1
@Vinpai cosa succede quando aggiungi un app.tables.cells.allElementsBoundByAccessibilityElement.countprima di toccare il tuo pulsante? Sono solo curioso: questo mi ha aiutato a "rinfrescare" lo schermo a volte.
torte88

@Konnor, ho provato con l'API che hai suggerito, ma non funziona quando tocco il pulsante Annulla. Quando interrogo application.buttons nel debugger, mostra il pulsante Annulla
Vinpai

Risposte:


140

Immagino che qui il pulsante "Annulla" ritorni falseper la hittableproprietà, che gli impedisce di toccare.

Se vedi tap()nella documentazione dice

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

Sembra che le cose non funzionino con XCode 7.1. Per mantenere me stesso (e anche tu;)) sbloccato da questi problemi ho scritto un'estensione su XCUIElementche consente di toccare l'elemento anche se non è modificabile. Seguire può aiutarti.

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

Ora puoi chiamare come

button.forceTapElement()

Aggiornamento : per swift 3 utilizzare quanto segue:

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

Grazie per la correzione. Ho riscontrato un problema simile con cell.tap()e questo lo ha risolto. Qualcosa sembra essere cambiato in Xcode7.1 facendo sì che alcuni elementi non siano più modificabili
francisOpt

Ho una barra di navigazione personalizzata backButtonItem che non è 'modificabile' in Xcode7.1 e questa soluzione funziona per meself.app.navigationBars["Nav Title"].staticTexts["Custom Back Btn Title"].forceTapElement()
Alex

Grazie - Ha funzionato per il mio stesso problema.
Tache

7
Nel mio caso ha funzionato quando il rubinetto è al centro della vista. Modificare l'offset in (0,5, 0,5). let coordinate: XCUICoordinate = self.coordinateWithNormalizedOffset(CGVectorMake(0.5, 0.5))
Graham Perks

1
ottimo lavoro. Stavo quasi iniziando a uccidere il mio macbook prima di vederlo.
ChaosSpeeder

11

Per me, la causa principale era che gli oggetti che volevo toccare

  • sono stati impostati su nascosto (e indietro)
  • sono stati rimossi e ricollegati

In entrambi i casi la isAccessibilityElementproprietà erafalse successivamente. Impostandolo di nuovo per truerisolverlo.


3
Questo era esattamente il mio problema. Stranamente, ha iniziato ad accadere su iOS 11 (funzionava bene su iOS 10).
Ricardo Sanchez-Saez

4

Questa domanda si colloca bene per le query di Google intorno al termine "Impossibile scorrere fino al pulsante visibile (per azione AX)" . Data l'età della domanda, ero incline a pensare che questo non fosse più un problema con il framework XCUITest come suggerisce la risposta accettata.

Ho scoperto che questo problema era dovuto XCElementall'esistente, ma nascosto dietro la tastiera del software. L'errore viene emesso dal framework poiché non è in grado di scorrere una vista esistente nella vista per essere toccabile. Nel mio caso il pulsante in questione era dietro la tastiera del software a volte .

Ho scoperto che la tastiera del software del simulatore iOS può essere disattivata in alcuni casi (ad esempio: sulla tua macchina) e attivata in altri (ad esempio: sul tuo CI). Nel mio caso avevo disattivato la tastiera del software su una macchina e per impostazione predefinita era attivata su altre.

Soluzione: chiudere la tastiera prima di tentare di toccare i pulsanti che potrebbero essere dietro di essa.

Ho scoperto che toccando da qualche parte che ignorava esplicitamente la tastiera prima di toccare il pulsante ha risolto il mio problema in tutti gli ambienti.

Ho aggiunto alcune azioni per convincere il risponditore corrente a resignFirstResponder. Le visualizzazioni dietro le mie visualizzazioni di testo costringeranno il primo risponditore a dimettersi, quindi tocco da qualche parte appena sotto l'ultima area di testo.

 /// 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

Si prega di controllare il tratto dell'elemento, stavo affrontando lo stesso problema con TableViewSectionHeader, stavo cercando di toccare ma non funzionava in ogni punto

inserisci qui la descrizione dell'immagine


1

La soluzione alternativa di Sandy è sembrata utile per un po 'ma poi non più - l'ho modificata in questo modo:

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

Il punto principale è che poiché il problema è che il controllo isHittable genera un'eccezione, non lo faccio affatto e vado direttamente per le coordinate dopo che l'elemento è stato trovato.


0

Nel mio caso si trattava di un elemento dell'interfaccia utente aggiunto a livello di codice che copriva il pulsante.


0

Se stai utilizzando il simulatore AppCenter per eseguire i test, assicurati di eseguire i test sulla stessa versione del dispositivo del simulatore locale. Ho perso 3 giorni di lavoro a causa di questo.


0

Nello spirito delle cose che possono coprire il tuo elemento, ho avuto il debugger RN parzialmente sovrapposto sopra la mia icona:

inserisci qui la descrizione dell'immagine

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.