Desplácese hasta que el elemento esté visible Automatización de interfaz de usuario de iOS con xcode7

Entonces, con la nueva actualización de xcode, Apple ha mejorado la forma en que realizamos las testings de interfaz de usuario. En los instrumentos, utilizamos la function de script java "isVisible" para determinar si nuestro elemento objective es visible.

Estoy tratando de replicar esto en el objective c, pero no puedo encontrar el equivalente a esto. Tengo una vista de tabla, una celda prototipo con dos tags. Esta celda prototipo se reutiliza 50 veces, digamos.

Estoy intentando desplazarme hasta que la última celda esté visible, hice esto haciendo esto:

if (![[[[[[XCUIApplication alloc] init].tables childrenMatchingType:XCUIElementTypeCell] matchingIdentifier:@"cell"] elementBoundByIndex:49].staticTexts[@"text"] exists]) { [[[[[[XCUIApplication alloc] init].tables childrenMatchingType:XCUIElementTypeCell] matchingIdentifier:@"cell"] elementBoundByIndex:0].staticTexts[@"text"] swipeUp]; } 

Pero esto no se deslizará ya que el elemento existe cuando se carga la vista. Por favor ayuda porque esto me está volviendo loco.

Debe extender la list de methods de XCUIElement. El primer método ( scrollToElement: 🙂 se invocará en tableView, el segundo método de extensión lo ayudará a decidir si el elemento se encuentra en la window principal.

 extension XCUIElement { func scrollToElement(element: XCUIElement) { while !element.visible() { swipeUp() } } func visible() -> Bool { guard self.exists && !CGRectIsEmpty(self.frame) else { return false } return CGRectContainsRect(XCUIApplication().windows.elementBoundByIndex(0).frame, self.frame) } } 

El código de desplazamiento debería verse así (por ejemplo, desplazarse a la última celda):

 func testScrollTable() { let app = XCUIApplication() let table = app.tables.elementBoundByIndex(0) let lastCell = table.cells.elementBoundByIndex(table.cells.count-1) table.scrollToElement(lastCell) } 

Swift 3:

 extension XCUIElement { func scrollToElement(element: XCUIElement) { while !element.visible() { swipeUp() } } func visible() -> Bool { guard self.exists && !self.frame.isEmpty else { return false } return XCUIApplication().windows.element(boundBy: 0).frame.contains(self.frame) } } 

Todas las respuestas anteriores no son 100% a testing de fallas. El problema que enfrentaba es que swipeUp () tiene un desplazamiento mayor y no pude encontrar una manera de detener el desplazamiento cuando tengo el elemento en el puerto de vista. A veces, el elemento se desplaza por desplazamiento excesivo y, como resultado, el caso de testing falla. Sin embargo, logré controlar el desplazamiento usando la siguiente pieza de código.

 /** Scrolls to a particular element until it is rendenetworking in the visible rect - Parameter elememt: the element we want to scroll to */ func scrollToElement(element: XCUIElement) { while element.visible() == false { let app = XCUIApplication() let startCoord = app.collectionViews.element.coordinateWithNormalizedOffset(CGVector(dx: 0.5, dy: 0.5)) let endCoord = startCoord.coordinateWithOffset(CGVector(dx: 0.0, dy: -262)); startCoord.pressForDuration(0.01, thenDragToCoordinate: endCoord) } } func visible() -> Bool { guard self.exists && self.hittable && !CGRectIsEmpty(self.frame) else { return false } return CGRectContainsRect(XCUIApplication().windows.elementBoundByIndex(0).frame, self.frame) } 

Nota: utilice las tablas de aplicaciones si su vista está basada en tabla

Expandiendo en la respuesta de @ Kade , en mi caso, tuve que tener en count la barra de tabs en scrollToElement, de lo contrario podría recibir un button de barra de tabs tocada si la vista estaba debajo de la barra de tabs:

  func scrollToElement(element: XCUIElement) { while !element.visible() { swipeUp() } // Account for tabBar let tabBar = XCUIApplication().tabBars.element(boundBy: 0) if (tabBar.visible()) { while element.frame.intersects(tabBar.frame) { swipeUp() } } } 

Desafortunadamente .exists no confirma que un elemento esté actualmente visible; algo así todavía no es perfecto, pero proporcionará una validation más confiable al trabajar con las celdas de vista de tabla o colección:

 extension XCUIElement { var displayed: Bool { guard self.exists && !CGRectIsEmpty(frame) else { return false } return CGRectContainsRect(XCUIApplication().windows.elementBoundByIndex(0).frame, frame) } } 

entonces puedes escribir un ciclo simple como:

 func scrollDownUntilVisible(element: XCUIElement) { while !element.displayed { swipeDown() } } 

puedes hacer algo como esto:

 extension XCUIElement { internal func scrollToElement(element: XCUIElement) { while !element.exists { swipeDown() } } } 

y que usa scrollToElement para encontrar el elemento