2015-07-08 11 views
20

Sto cercando di replicare un tiro per aggiornare su un UITableView utilizzando il nuovo framework di test Xcode interfaccia utente in Xcode 7 (beta 3)Replica tirare per aggiornare in XCTest UI test

mio approccio attuale sta trascinando dalla tabella per qualunque elemento sotto il tavolo riesca a trovare. Funziona quando c'è un elemento fisso sotto la tabella come un UIToolbar o UITabBar Preferisco non contare su un UITabBar o UIToolbar ma non riesco a capire un modo per eseguire il pull per aggiornare/trascinare l'azione senza utilizzare il metodo in XCUIElement.

func pressForDuration(duration: NSTimeInterval, thenDragToElement otherElement: XCUIElement) 

Refresh success

ma fallisce quando non ho una barra degli strumenti/barra delle linguette e tenta di trascinare utilizzando le cellule

Refresh failure

Questa è la quota di competenza del mio codice:

func testRefresh() { 
    //For testing cell 
    for _ in 0...9 { 
     addCell() 
    } 
    refreshTable() 
} 

func refreshTable(var tbl: XCUIElement? = nil) { 
    let app = XCUIApplication() 

    if tbl == nil { 
     let tables = app.tables 
     if tables.count > 0 { 
      tbl = tables.elementAtIndex(0) 
     } 
    } 

    guard let table = tbl else { 
     XCTFail("Cannot find a table to refresh, you can provide on explicitly if you do have a table") 
     return 
    } 

    var topElement = table 
    let bottomElement: XCUIElement? 

    //Try to drag to a tab bar then to a toolbar then to the last cell 
    if app.tabBars.count > 0 { 
     bottomElement = app.tabBars.elementAtIndex(0) 
    } 
    else if app.toolbars.count > 0 { 
     bottomElement = app.toolbars.elementAtIndex(0) 
    } 
    else { 
     let cells = app.cells 
     if cells.count > 0 { 
      topElement = cells.elementAtIndex(0) 
      bottomElement = cells.elementAtIndex(cells.count - 1) 
     } 
     else { 
      bottomElement = nil 
     } 
    } 
    if let dragTo = bottomElement { 
     topElement.pressForDuration(0.1, thenDragToElement: dragTo) 
    } 
} 

func addCell() { 
    let app = XCUIApplication() 
    app.navigationBars["Master"].buttons["Add"].tap() 
} 

ulteriore fallito MPTS:

  • swipeDown() (multipli volte così)
  • scrollByDeltaX/deltaY (OS X)
+0

Per coloro che hanno letto fino a qui, [la mia risposta] (http://stackoverflow.com/a/32694875/384110) funziona con Xcode 7 e Xcode 7.1. –

risposta

14

È possibile utilizzare il XCUICoordinate API per interagire con i punti specifici sullo schermo, non necessariamente legati ad alcuna elemento particolare.

  1. Prendere un riferimento alla prima cella della tabella. Quindi creare una coordinata con spostamento origine, CGVectorMake(0, 0). Questo normalizzerà un punto proprio sopra la prima cella.
  2. Creare una coordinata immaginaria più in basso sullo schermo. (Ho trovato che uno dy di sei è la quantità minima necessaria per attivare il gesto pull-to-refresh.)
  3. Esegui il gesto afferrando la prima coordinata e trascinandola sulla seconda.

enter image description here

let firstCell = app.staticTexts["Adrienne"] 
let start = firstCell.coordinateWithNormalizedOffset(CGVectorMake(0, 0)) 
let finish = firstCell.coordinateWithNormalizedOffset(CGVectorMake(0, 6)) 
start.pressForDuration(0, thenDragToCoordinate: finish) 

More information oltre ad working sample app è anche disponibile.

+1

Grazie. Per me, funziona su simulatori ma non su un vero iPhone 6. –

+1

Funziona in Xcode 9b5? Ho usato questo ampiamente in Xcode 7 e 8, ma sembra essere rotto ora. –

3

Sono riuscito a svolgere tali compiti con coordinate come suggeriva Joe. Ma sono andato un ulteriore passo avanti utilizzando coordinateWithOffset()

let startPosition = CGPointMake(200, 300) 
let endPosition = CGPointMake(200, 0) 
let start = elementToSwipeOn.coordinateWithNormalizedOffset(CGVectorMake(0, 0)).coordinateWithOffset(CGVector(dx: startPosition.x, dy: startPosition.y)) 
let finish = elementToSwipeOn.coordinateWithNormalizedOffset(CGVector(dx: 0, dy: 0)).coordinateWithOffset(CGVector(dx: endPosition.x, dy: endPosition.y)) 
start.pressForDuration(0, thenDragToCoordinate: finish) 

Ora sono in grado di trascinare da un punto specifico ad un altro punto specifico. Ho implementato un aggiornamento personalizzato su alcune delle mie visualizzazioni. Durante l'implementazione, ho anche scoperto che posso persino usarlo per accedere al centro di controllo o al menu principale.

+0

Ciao Tomte, qual è il valore di elementToSwipeOn se si desidera attivare il centro di controllo? –

+0

@BillChan Cerca di ottenere l'altezza della tua vista principale (o dell'ultimo punto y della parte inferiore) e aggiungi 10 o qualcosa. ciò significa che lo scorrimento inizierà all'esterno dello schermo. Ma puoi ottenere ciò semplicemente facendo scorrere verso l'alto. Questo codice è destinato a essere utilizzato per lo scorrimento e la conservazione (ad esempio per un aggiornamento di una vista tabella). – Tomte