2015-07-08 3 views
20

Я пытаюсь повторить тянуть, чтобы обновить на UITableView, используя новую систему тестирования Xcode UI в Xcode 7 (бета 3)Replicate тянуть, чтобы обновить в тестировании XCTest UI

Мой текущий подход тащит со стола любой элемент под столом, который я могу найти. Это работает, когда есть фиксированный элемент под таблицей, такой как UIToolbar или UITabBar. Я бы предпочел не полагаться на наличие UITabBar или UIToolbar, но я не могу понять, как сделать pull для обновления/перетаскивания, не используя метод в XCUIElement.

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

Refresh success

Но он терпит неудачу, когда у меня нет панели инструментов/TabBar и попытаться перетащить с использованием клеток

Refresh failure

Это соответствующая часть моего кода:

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

Дополнительная неисправность atte MPTS:

  • swipeDown() (кратные раз, а)
  • scrollByDeltaX/deltaY (OS X только)
+0

Для тех, кто прочел это, [мой ответ] (http://stackoverflow.com/a/32694875/384110) работает в Xcode 7 и Xcode 7.1. –

ответ

14

Вы можете использовать XCUICoordinate API для взаимодействия с определенными точками на экране, не обязательно связаны с какой-либо конкретный элемент.

  1. Захватите ссылку на первую ячейку в таблице. Затем создайте координату с нулевым смещением, CGVectorMake(0, 0). Это нормализует точку прямо над первой ячейкой.
  2. Создайте мнимую координату дальше по экрану. (Я обнаружил, что dy из шести - это наименьшее количество, необходимое для запуска жестов притяжения к обновлению.)
  3. Выполните жест, захватив первую координату и перетащив ее на второй.

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 вместе с working sample app также доступна.

+1

Спасибо. Для меня он работает на симуляторах, но не на реальном iPhone 6. –

+1

Это работает для вас в Xcode 9b5? Я использовал это широко в Xcode 7 и 8, но теперь он сейчас сломан. –

3

Мне удалось выполнить такие задачи с координатами, как предложил Джо. Но я пошел на шаг дальше, используя 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) 

Теперь я могу перетащить из определенной точки в другую конкретную точку. Я реализовал пользовательское обновление некоторых моих представлений. Выполняя это, я также обнаружил, что могу даже использовать это для доступа к центру управления или в верхнем меню.

+0

Привет, Tomte, каково значение elementToSwipeOn, если я хочу переключить центр управления? –

+0

@BillChan Попытайтесь получить высоту вашего основного вида (или самой последней y-точки снизу) и добавить 10 или что-то к этому. это означает, что салфетка начнет выходить за пределы экрана. Но вы можете добиться этого, просто проскользнув. Этот код предназначен для использования для прокрутки и удержания (например, для обновления таблицы). – Tomte

Смежные вопросы