2015-07-08 13 views
20

Tôi cố gắng để tái tạo một kéo để làm mới trên UITableView sử dụng khuôn khổ kiểm tra Xcode UI mới trong Xcode 7 (beta 3)Replicate kéo để làm mới trong XCTest UI thử nghiệm

cách tiếp cận hiện tại của tôi được kéo từ bảng để bất kỳ yếu tố nào bên dưới bảng tôi có thể tìm thấy. Điều này hoạt động khi có một mục cố định bên dưới bảng như UIToolbar hoặc UITabBar Tôi không muốn dựa vào việc có một số UITabBar hoặc UIToolbar nhưng tôi không thể tìm ra cách để thực hiện thao tác kéo/làm mới mà không sử dụng phương thức XCUIElement.

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

Refresh success

Nhưng nó không thành công khi tôi không có một thanh công cụ/thanh tabbar và cố gắng kéo bằng cách sử dụng các tế bào

Refresh failure

Đây là phần có liên quan của mã của tôi:

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

Thất bại bổ sung không thành công MPTS:

  • swipeDown() (bội số lần cũng)
  • scrollByDeltaX/deltaY (OS X chỉ)
+0

Đối với những người đã đọc bài viết này, [câu trả lời của tôi] (http://stackoverflow.com/a/32694875/384110) hoạt động trong Xcode 7 và Xcode 7.1. –

Trả lời

14

Bạn có thể sử dụng XCUICoordinate API để tương tác với các điểm cụ thể trên màn hình, không nhất thiết phải gắn liền với bất kỳ yếu tố cụ thể.

  1. Lấy tham chiếu đến ô đầu tiên trong bảng của bạn. Sau đó, tạo một tọa độ có bù trừ bằng không, CGVectorMake(0, 0). Điều này sẽ bình thường hóa một điểm ngay trên đầu của ô đầu tiên.
  2. Tạo một tọa độ tưởng tượng xa hơn trên màn hình. (Tôi thấy rằng dy trong số sáu là số tiền nhỏ nhất cần thiết để kích hoạt cử chỉ kéo-làm mới.)
  3. Thực hiện cử chỉ bằng cách lấy tọa độ đầu tiên và kéo nó đến vị trí thứ hai.

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 cùng với một working sample app cũng có sẵn.

+1

Cảm ơn. Đối với tôi, nó hoạt động trên mô phỏng nhưng không phải trên một chiếc iPhone thực sự. –

+1

Điều này có phù hợp với bạn trong Xcode 9b5 không? Tôi đã sử dụng rộng rãi trong Xcode 7 và 8, nhưng dường như nó đã bị hỏng. –

3

Tôi đã quản lý các tác vụ như vậy với các tọa độ như Joe đã đề xuất. Nhưng tôi đã đi một bước xa hơn bằng 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) 

Bây giờ tôi có thể kéo từ một điểm cụ thể đến một điểm cụ thể. Tôi đã triển khai làm mới tùy chỉnh trên một số chế độ xem của mình. Trong khi thực hiện điều này, tôi cũng phát hiện ra rằng tôi thậm chí có thể sử dụng điều này để truy cập vào trung tâm điều khiển hoặc menu trên cùng.

+0

Xin chào Tomte, giá trị của elementToSwipeOn là gì nếu tôi muốn chuyển đổi trung tâm điều khiển? –

+0

@BillChan Hãy thử để có được chiều cao của quan điểm chính của bạn (hoặc y cuối cùng của phía dưới) và thêm 10 hoặc một cái gì đó cho nó. điều đó có nghĩa là thao tác vuốt sẽ bắt đầu bên ngoài màn hình. Nhưng bạn có thể đạt được điều này bằng cách đơn giản là vuốt lên. Mã này nhằm mục đích được sử dụng để vuốt và giữ (ví dụ: để làm mới chế độ xem bảng). – Tomte

Các vấn đề liên quan