Replicar extracción para actualizar en la testing de interfaz de usuario XCTest

Estoy intentando replicar un pull para actualizar en UITableView usando el nuevo marco de testing de UI de Xcode en Xcode 7 (beta 3)

Mi enfoque actual se está arrastrando desde la tabla a cualquier elemento debajo de la tabla que pueda encontrar. Esto funciona cuando hay un elemento fijo debajo de la tabla como un UIToolbar o UITabBar . Prefiero no confiar en tener una UITabBar o una UITabBar UIToolbar pero no puedo encontrar una manera de hacer la extracción para actualizar / arrastrar la acción sin usar el método en XCUIElement

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

Actualice el éxito

Pero falla cuando no tengo una barra de herramientas / tabbar e bash arrastrar con las celdas

Falla de actualización

Esta es la parte relevante de mi código:

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

Los bashs fallidos adicionales:

  • swipeDown() (múltiples veces también)
  • scrollByDeltaX/deltaY (solo OS X)

Puede utilizar la API XCUICoordinate para interactuar con puntos específicos de la pantalla, no necesariamente vinculados a ningún elemento en particular.

  1. Toma una reference a la primera celda de tu table. Luego cree una coorderada con desplazamiento de cero, CGVectorMake(0, 0) . Esto normalizará un punto justo en la parte superior de la primera celda.
  2. Cree una coorderada imaginaria más abajo en la pantalla. (He descubierto que una dy de seis es la cantidad más pequeña que se necesita para activar el gesto de jalar para actualizar.)
  3. Ejecute el gesto agarrando la primera coorderada y arrastrándola a la segunda.

introduzca la descripción de la imagen aquí

 let firstCell = app.staticTexts["Adrienne"] let start = firstCell.coordinateWithNormalizedOffset(CGVectorMake(0, 0)) let finish = firstCell.coordinateWithNormalizedOffset(CGVectorMake(0, 6)) start.pressForDuration(0, thenDragToCoordinate: finish) 

Más información junto con una aplicación de muestra de trabajo también está disponible.

Logré hacer esas tareas con coorderadas como Joe sugirió. Pero fui un paso más allá usando 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) 

Ahora puedo arrastrar desde un punto específico a otro punto específico. Implementé una actualización personalizada en algunas de mis vistas. Al implementar esto, también descubrí que incluso puedo usar esto para acceder al centro de control o al menu superior.