2015-07-08 9 views
20

Próbuję replikować ciągnąć do odświeżenia na UITableView użyciu nowego testowania ramy Xcode UI w Xcode 7 (beta 3)Replikacja pociągnąć, aby odświeżyć w XCTest UI testowania

Moje obecne podejście ciągnie się od stołu do Jakikolwiek element pod stołem mogę znaleźć. Działa to, gdy pod stołem znajduje się stały element, taki jak UIToolbar lub UITabBar Wolałbym nie polegać na posiadaniu UITabBar lub UIToolbar, ale nie mogę wymyślić sposobu wykonania operacji przeciągania w celu odświeżenia/przeciągnięcia bez użycia tej metody w XCUIElement.

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

Refresh success

Ale to się nie powiedzie, kiedy nie ma paska narzędzi/umieszczenie zakładek i próbują przeciągnąć za pomocą komórki

Refresh failure

Jest odpowiednia część mojego kodu:

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

Dodatkowa awaria atte MPTS:

  • swipeDown() (wielokrotności czasy również)
  • scrollByDeltaX/deltaY (OS X tylko)
+0

Dla tych, którzy czytali tak daleko, [moja odpowiedź] (http://stackoverflow.com/a/32694875/384110) działa w Xcode 7 i Xcode 7.1. –

Odpowiedz

14

Można użyć XCUICoordinate API do interakcji z konkretnych punktów na ekranie, niekoniecznie związany z dowolnego szczególny element.

  1. Złóż referencję do pierwszej komórki w tabeli. Następnie utwórz współrzędne o zerowym przesunięciu, CGVectorMake(0, 0). Spowoduje to znormalizowanie punktu tuż nad pierwszą komórką.
  2. Utwórz wyimaginowaną współrzędną znajdującą się dalej na ekranie. (Zauważyłem, że jeden z sześciu jest najmniejszą ilością potrzebną do uruchomienia gestu przeciągania i odświeżania.)
  3. Wykonaj gest, chwytając pierwszą współrzędną i przeciągając ją do drugiej.

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 wraz z working sample app jest również dostępna.

+1

Dzięki. Dla mnie działa na symulatorze, ale nie na prawdziwym iPhone 6. –

+1

Czy to działa dla Ciebie w Xcode 9b5? Użyłem tego obszernie w Xcode 7 i 8, ale wydaje się, że teraz jest zepsuty. –

3

Udało mi się wykonać takie zadania ze współrzędnymi, jak sugerował Joe. Ale poszedł o krok dalej, używając 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) 

teraz jestem w stanie przeciągnąć z określonego punktu do innego określonego punktu. Zaimplementowałem niestandardowe odświeżanie w niektórych widokach. Podczas realizacji tego, odkryłem również, że mogę nawet użyć tego, aby uzyskać dostęp do centrum sterowania lub górnego menu.

+0

Cześć Tomte, jaka jest wartość elementu ElementToSwipeOn, jeśli chcę przełączyć centrum sterowania? –

+0

@BillChan Spróbuj uzyskać wysokość głównego widoku (lub ostatniego punktu y dołu) i dodaj 10 lub coś do niego. to znaczy, przesunięcie rozpocznie się na zewnątrz ekranu. Ale możesz to osiągnąć, po prostu przesuwając palcem w górę. Ten kod jest przeznaczony do stosowania do przeciągania i przytrzymywania (na przykład do odświeżania widoku tableview). – Tomte