2015-07-08 11 views
20

Ich versuche, einen Pull zu replizieren auf einem UITableView mit dem neuen Xcode UI-Test-Framework in Xcode 7 (Beta 3)Replizieren ziehen in XCTest UI-Tests aktualisieren

Mein aktuellen Ansatz aktualisieren wird aus der Tabelle ziehen zu welches Element unter dem Tisch ich finden kann. Dies funktioniert, wenn es ein festes Element unterhalb der Tabelle wie eine UIToolbar oder UITabBar Ich würde lieber nicht auf UITabBar oder UIToolbar verlassen, aber ich kann nicht eine Möglichkeit, die Pull zu aktualisieren/ziehen Aktion ohne die Methode in XCUIElement.

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

Refresh success

aber es funktioniert nicht, wenn ich um die Zellen zu ziehen nicht eine Symbolleiste/Tabbar haben und versuchen Sie es mit

Refresh failure

Dies ist der relevante Teil meines Codes:

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

Zusätzliche fehlgeschlagene attest MPTS:

  • swipeDown() (Multiples mal auch)
  • scrollByDeltaX/deltaY (OS X nur)
+0

Für diejenigen, die so weit gelesen haben, funktioniert [meine Antwort] (http://stackoverflow.com/a/32694875/384110) in Xcode 7 und Xcode 7.1. –

Antwort

14

Sie können die XCUICoordinate API verwenden, um mit spezifischen Punkten auf dem Bildschirm zu interagieren, die nicht unbedingt zu einem gebunden bestimmtes Element.

  1. Ergreifen Sie einen Verweis auf die erste Zelle in Ihrer Tabelle. Dann erstellen Sie eine Koordinate mit Null-Offset, CGVectorMake(0, 0). Dies normalisiert einen Punkt direkt über der ersten Zelle.
  2. Erstellen Sie eine imaginäre Koordinate weiter unten auf dem Bildschirm. (Ich habe festgestellt, dass ein dy von sechs die kleinste Menge ist, die benötigt wird, um die Pull-to-Refresh-Geste auszulösen.)
  3. Führen Sie die Geste aus, indem Sie die erste Koordinate greifen und auf die zweite ziehen.

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 zusammen mit einem working sample app ist ebenfalls verfügbar.

+1

Danke. Für mich funktioniert es auf Simulatoren aber nicht auf einem echten iPhone 6. –

+1

Funktioniert das für Sie in Xcode 9b5? Ich habe dies ausführlich in Xcode 7 und 8 verwendet, aber es scheint jetzt gebrochen zu sein. –

3

Ich habe es geschafft, solche Aufgaben mit Koordinaten wie Joe vorgeschlagen. Aber ich ging einen Schritt weiter mit 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) 

Jetzt bin ich in der Lage von einem bestimmten Punkt zu einem anderen bestimmten Punkt zu ziehen. Ich habe eine benutzerdefinierte Aktualisierung für einige meiner Ansichten implementiert. Bei der Umsetzung habe ich auch festgestellt, dass ich damit sogar auf das Kontrollzentrum oder das Hauptmenü zugreifen kann.

+0

Hallo Tomte, was ist der Wert von elementToSwipeOn, wenn ich Control Center umschalten möchte? –

+0

@BillChan Versuchen Sie, die Höhe Ihrer Hauptansicht (oder den allerletzten y-Punkt der Unterseite) zu erhalten und fügen Sie 10 oder etwas hinzu. Das bedeutet, dass der Swipe außerhalb des Bildschirms gestartet wird. Aber Sie können dies erreichen, indem Sie einfach nach oben wischen. Dieser Code soll zum Durchziehen und Halten verwendet werden (z. B. für eine Aktualisierung einer Tabellenansicht). – Tomte