Estoy tratando de descartar el campo de búsqueda tocando el botón "Cancelar" en la barra de búsqueda.
El caso de prueba no encuentra el botón cancelar. Funcionaba bien en Xcode 7.0.1
He añadido predicado para esperar a que aparezca el botón. El caso de prueba falla cuando tocamos el botón "cancelar"
let button = app.buttons[“Cancel”]
let existsPredicate = NSPredicate(format: "exists == 1")
expectationForPredicate(existsPredicate, evaluatedWithObject: button, handler: nil)
waitForExpectationsWithTimeout(5, handler: nil)
button.tap() // Failing here
registros :
t = 7.21s Tap SearchField
t = 7.21s Wait for app to idle
t = 7.29s Find the SearchField
t = 7.29s Snapshot accessibility hierarchy for com.test.mail
t = 7.49s Find: Descendants matching type SearchField
t = 7.49s Find: Element at index 0
t = 7.49s Wait for app to idle
t = 7.55s Synthesize event
t = 7.84s Wait for app to idle
t = 8.97s Type '[email protected]' into
t = 8.97s Wait for app to idle
t = 9.03s Find the "Search" SearchField
t = 9.03s Snapshot accessibility hierarchy for com.test.mail
t = 9.35s Find: Descendants matching type SearchField
t = 9.35s Find: Element at index 0
t = 9.36s Wait for app to idle
t = 9.42s Synthesize event
t = 10.37s Wait for app to idle
t = 10.44s Check predicate `exists == 1` against object `"Cancel" Button`
t = 10.44s Snapshot accessibility hierarchy for com.test.mail
t = 10.58s Find: Descendants matching type Button
t = 10.58s Find: Elements matching predicate '"Cancel" IN identifiers'
t = 10.58s Tap "Cancel" Button
t = 10.58s Wait for app to idle
t = 10.64s Find the "Cancel" Button
t = 10.64s Snapshot accessibility hierarchy for com.test.mail
t = 10.78s Find: Descendants matching type Button
t = 10.78s Find: Elements matching predicate '"Cancel" IN identifiers'
t = 10.79s Wait for app to idle
t = 11.08s Synthesize event
t = 11.13s Scroll element to visible
t = 11.14s Assertion Failure: UI Testing Failure - Failed to scroll to visible (by AX action) Button 0x7f7fcaebde40: traits: 8589934593, {{353.0, 26.0}, {53.0, 30.0}}, label: 'Cancel', error: Error -25204 performing AXAction 2003
xcode
xcode7
xcode-ui-testing
Vinpai
fuente
fuente
app.tables.cells.allElementsBoundByAccessibilityElement.count
antes de tocar el botón? Solo por curiosidad, esto me ha ayudado a 'actualizar' la pantalla a veces.Respuestas:
Creo que aquí "Cancelar" retornos botón
false
dehittable
la propiedad, que le impide tocar.Si ves
tap()
en la documentación dice/*! * Sends a tap event to a hittable point computed for the element. */ - (void)tap;
Parece que las cosas están rotas con XCode 7.1. Para mantenerme (y tú también;)) desbloqueado de estos problemas, escribí una extensión
XCUIElement
que permite tocar el elemento incluso si no es accesible. Lo siguiente puede ayudarte./*Sends a tap event to a hittable/unhittable element.*/ extension XCUIElement { func forceTapElement() { if self.hittable { self.tap() } else { let coordinate: XCUICoordinate = self.coordinateWithNormalizedOffset(CGVectorMake(0.0, 0.0)) coordinate.tap() } } }
Ahora puedes llamar como
button.forceTapElement()
Actualización : para swift 3 use lo siguiente:
extension XCUIElement { func forceTapElement() { if self.isHittable { self.tap() } else { let coordinate: XCUICoordinate = self.coordinate(withNormalizedOffset: CGVector(dx:0.0, dy:0.0)) coordinate.tap() } } }
fuente
cell.tap()
y esto lo solucionó. Algo parece haber cambiado en Xcode7.1 causando que algún elemento ya no se puedaself.app.navigationBars["Nav Title"].staticTexts["Custom Back Btn Title"].forceTapElement()
let coordinate: XCUICoordinate = self.coordinateWithNormalizedOffset(CGVectorMake(0.5, 0.5))
Para mí, la causa principal fue que los objetos que quería tocar
En ambos casos la
isAccessibilityElement
propiedad fuefalse
posterior. Poniéndolo de nuevo paratrue
arreglarlo.fuente
Encontré que este problema se debía a que
XCElement
existía, pero estaba oculto detrás del teclado del software. El marco emite el error, ya que no puede desplazar una vista que existe en la vista para poder tocarla. En mi caso, el botón en cuestión estaba detrás del teclado del software a veces .Encontré que el teclado del software del simulador de iOS puede desactivarse en algunos casos (por ejemplo, en su máquina) y activarse en otros (por ejemplo, en su CI). En mi caso, había desactivado el teclado del software en una máquina y, de forma predeterminada, estaba activado en otras.
Solución: descarte el teclado antes de intentar tocar los botones que pueden estar detrás de él.
Encontré que tocar en algún lugar que descartaba explícitamente el teclado antes de tocar el botón resolvió mi problema en todos los entornos.
Agregué agregar algunas acciones para que el respondedor actual resigneFirstResponder. Las vistas detrás de mis vistas de texto obligarán al primer respondedor a renunciar, así que toco en algún lugar justo debajo de la última área de texto.
/// The keyboard may be up, dismiss it by tapping just below the password field let pointBelowPassword = passwordSecureTextField.coordinate(withNormalizedOffset: CGVector(dx: 0.5, dy: 1)) pointBelowPassword.press(forDuration: 0.1)
fuente
Verifique el rasgo del elemento, estaba enfrentando el mismo problema con TableViewSectionHeader, estaba tratando de tocar pero fallaba en todos los puntos
fuente
La solución alternativa de Sandy pareció ayudar por un tiempo, pero luego no más; luego la cambié así:
func waitAndForceTap(timeout: UInt32 = 5000) { XCTAssert(waitForElement(timeout: timeout)) coordinate(withNormalizedOffset: CGVector(dx:0.5, dy:0.5)).tap() }
El punto principal es que, dado que el problema es que la verificación isHittable arroja una excepción, no hago esta verificación en absoluto y voy directamente a las coordenadas después de encontrar el elemento.
fuente
En mi caso, tenía un elemento de interfaz de usuario agregado mediante programación que cubría el botón.
fuente
Si está utilizando el simulador de AppCenter para ejecutar las pruebas, debe asegurarse de ejecutar las pruebas en la misma versión de dispositivo que su simulador local. Perdí 3 días de trabajo por esto.
fuente
En el espíritu de las cosas que pueden cubrir su elemento, tenía el depurador RN parcialmente superpuesto en la parte superior de mi icono:
fuente