Xcode UI test-UI Testing Failure-Error al desplazarse a visible(por acción AX) cuando toca el campo de búsqueda "Cancelar"
xcode7 xcode-ui-testing (7)
Esta pregunta se clasifica bien para las consultas de Google sobre el término "Error al desplazarse al botón visible (por acción AX)" . Dada la antigüedad de la pregunta, me incliné a pensar que esto ya no era un problema con el marco XCUITest como sugiere la respuesta aceptada.
Encontré que este problema se debía a que
XCElement
existía, pero estaba oculto detrás del teclado del software.
El marco de trabajo emite el error, ya que no puede desplazar una vista que existe para que se pueda tocar.
En mi caso, el botón en cuestión estaba a
veces
detrás del teclado del software.
Encontré que el teclado del software del simulador de iOS se puede desactivar en algunos casos (por ejemplo, en su máquina) y en otros (por ejemplo: en su CI). En mi caso, había apagado el teclado del software en una máquina y, por defecto, estaba activado en otras.
Solución: deseche 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 obtener el respondedor actual para resignFirstResponder. Las vistas detrás de mis vistas de texto obligarán al primer respondedor a renunciar, así que toco en algún lugar 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)
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 agregado 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
En mi caso, tenía un elemento de interfaz de usuario agregado mediante programación que cubría el botón.
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, como el problema es que isHittable check arroja una excepción, no hago esta comprobación en absoluto y voy directamente a las coordenadas después de encontrar el elemento.
Para mí, la causa raíz era que los objetos que quería tocar
- se ha configurado en oculto (y atrás)
- se han eliminado y vuelto a conectar
En ambos casos, la propiedad
isAccessibilityElement
fue
false
después.
Establecerlo de nuevo en
true
arregló.
Si está utilizando el simulador AppCenter para ejecutar las pruebas, debe asegurarse de ejecutar las pruebas en la misma versión del dispositivo que su simulador local. Perdí 3 días de trabajo debido a esto.
Supongo que aquí el botón "Cancelar" devuelve
false
para la propiedad
hittable
, lo que impide que se toque.
Si ve
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 libre (y a ti también) de estos problemas, escribí una extensión en
XCUIElement
que permite tocar el elemento incluso si no es golpeable.
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()
}
}
}