unit test ios swift xctest xcode7 xcode-ui-testing

ios - unit test swift



Replique la extracción para actualizar en las pruebas de XCTest UI (2)

Estoy tratando de replicar una extracción para actualizar en un UITableView usando el nuevo marco de prueba de Xcode UI en Xcode 7 (beta 3)

Mi enfoque actual es arrastrar 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 un UITabBar . Preferiría no confiar en tener un UITabBar o un UIToolbar pero no puedo encontrar una manera de realizar la acción de extracción / actualización sin utilizar el método en XCUIElement .

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

Pero falla cuando no tengo una barra de herramientas / barra de herramientas e intento arrastrar usando las celdas

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

Intentos fallidos adicionales:

  • swipeDown() (varias veces también)
  • scrollByDeltaX/deltaY (solo OS X)

Me las arreglé para hacer esas tareas con coordenadas como Joe sugirió. Pero fui un paso más allá utilizando 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 menú superior.


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

  1. Toma una referencia a la primera celda de tu mesa. Luego cree una coordenada con desplazamiento cero, CGVectorMake(0, 0) . Esto normalizará un punto justo encima de la primera celda.
  2. Crea una coordenada imaginaria más abajo en la pantalla. (Descubrí que un día de seis es la cantidad más pequeña que se necesita para activar el gesto de recuperación).
  3. Ejecute el gesto agarrando la primera coordenada y arrastrándola a la segunda.

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 ejemplo de trabajo también está disponible.