2015-07-08 19 views
20

Xcode 7'de yeni Xcode UI test çerçevesini kullanarak bir UITableView üzerine yenilemek için bir çekme çoğaltmak için çalışıyorum içinde yenilemek için çekin Benim şu anki yaklaşımı tablodan sürükleyerek edilir (beta 3)Çoğalt XCTest UI testi

masanın altındaki herhangi bir element bulabilirim. Bu tablo, bir veya UITabBar gibi bir sabit öğe olduğunda çalışır, UITabBar veya UIToolbar sahip olmak istemiyorum, ancak bu yöntemi kullanmadan işlemi yenilemek/sürüklemek için çekme işlemini yapmanın bir yolunu anlayamıyorum XCUIElement.

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

Refresh success

Ama araç çubuğu/tabbar sahip ve hücreleri

Refresh failure

Bu benim kod ilgili kısmıdır kullanarak sürüklemek kalkmayın zaman başarısız:

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

Ek başarısız atte MPTS:

  • swipeDown() (yanı katları kez)
  • scrollByDeltaX/deltaY (yalnızca OS X)
+0

Şimdiye kadar okuyanlar için, [yanıtım] (http://stackoverflow.com/a/32694875/384110) Xcode 7 ve Xcode 7.1'de çalışır. –

cevap

14

Ekranda belirli noktaları ile etkileşim XCUICoordinate API kullanabilirsiniz, mutlaka herhangi bir ilgisi belirli bir öğe.

  1. Tablonuzdaki ilk hücreye bir başvuru yapın. Sonra sıfır ofset, CGVectorMake(0, 0) ile bir koordinat oluşturun. Bu, ilk hücrenin üstündeki bir noktayı normalleştirecektir.
  2. Ekranın aşağısında sanal bir koordinat oluşturun. (Toplamda dy'un açma-kapama hareketini tetiklemek için gereken en küçük miktar olduğunu buldum.)
  3. İlk koordinatı yakalayıp ikinciye sürükleyerek hareketi gerçekleştirin. Bir working sample app birlikte
    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 informationenter image description here

de mevcuttur.

+1

Teşekkürler. Benim için simülatörler üzerinde çalışıyor ancak gerçek bir iPhone 6 üzerinde çalışıyor. –

+1

Xcode 9b5'te bu sizin için mi çalışıyor? Bunu yaygın olarak Xcode 7 ve 8'de kullandım, ama şimdi kırılmış gibi görünüyor. –

3

Bu tür görevleri Joe'nun önerdiği gibi koordinatlarla yapmayı başardım. Ama şimdi ben başka belli bir noktaya, belirli bir noktadan sürüklemek mümkün duyuyorum ayrıca

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) 

coordinateWithOffset() kullanarak bir adım daha gitti. Bazı görüşlerim için özel bir yenileme gerçekleştirdim. Bunu yaparken de kontrol merkezi veya üst menüye erişmek için bunu kullanabileceğimi de keşfettim.

+0

Merhaba Tomte, kontrol merkezini değiştirmek istiyorsam elementToSwipeOn'un değeri nedir? –

+0

@BillChan Ana görünümünüzün yüksekliğini (ya da en son en son y-noktasını) almaya çalışın ve ona 10 ya da bir şey ekleyin. Bu, tokatın dış ekrandan başlayacağı anlamına gelir. Ancak bunu basitçe yukarı doğru kaydırarak yapabilirsiniz. Bu kod, hızlıca kaydırmak ve tutmak için (örneğin, bir tablo görünümünü yenilemek için) kullanılmak üzere tasarlanmıştır. – Tomte

İlgili konular