Pruebas de interfaz de usuario: ¿cómo comprobar que estoy en el controller correcto?

Tengo el button en mi controller y después de hacer clic en el button hice la request y verifico el resultado. Si es un error que muestro una alerta más, realizo segue a otro controller. Me gustaría tener testings de interfaz de usuario para esto. Así es como se ve el final de mis methods de testing:

func testExample() { ... elementsQuery.buttons["CreateAccount"].tap() XCTAssertEqual(app.navigationBars.element.identifier, "ProgrammeViewController") } 

Me rompo en la última línea. Creo que no lo puse bien. Pero no estoy seguro de cómo configurarlo. Tengo el título en ese controller, pero lo cambio por cada idioma. Entonces quiero usar accessibilityLabel . Lo intenté:

 self.navigationController?.navigationBar.accessibilityLabel = "ProgrammeViewController" self.navigationItem.accessibilityLabel = "ProgrammeViewController" 

Pero no ayudó. Entonces, ¿cuál es la forma correcta de hacer esto? ¿Y debería configurar accessibilityLabel en viewDidLoad o viewWillAppear ? Creo que si quiero usar esto para varios controlleres, entonces, viewWillAppear sería mejor, ¿verdad? Gracias por la ayuda

Respuesta corta:

Establecer accessibilityIdentifier lugar de accessibilityLabel

 self.navigationController?.navigationBar.accessibilityIdentifier = "ProgrammeViewController" 

Respuesta larga:

Desde el protocolo de identificación de accesibilidad de UIA :

El protocolo UIAccessibilityIdentification se utiliza para asociar un identificador único con elementos en su interfaz de usuario. Puede usar los identificadores que defina en los scripts de automation de UI …

Este documento es un poco desactualizado ya que habla de UI Automation (marco de testings de interfaz de usuario de Apple antes de Xcode 7). El punto es que, para las testings de interfaz de usuario, recomienda usar la propiedad ( accessibilityIdentifier ) definida en este protocolo.

Y, desde el protocolo de accesibilidad UIA sobre accessibilityLabel:

Si un elemento de accesibilidad no muestra una label descriptiva, establezca esta propiedad para proporcionar una label breve y localizada que identifique de manera sucinta el elemento. Por ejemplo, un button "Reproducir música" puede mostrar un ícono que muestra a los usuarios videntes lo que hace. Para ser accesible, sin embargo, el button debe tener la label de acceso "Play" o "Play music" para que una aplicación de ayuda pueda proporcionar esta información a los usuarios con discapacidades.

Entonces, accessibilityLabel es para ayudar a los usuarios con discapacidad.

Discusión: Si bien puede usar both accessibilityLabel y accessibilityIdentifier en el código ITUesting porque, después de todo, UI Testing es como un usuario que pasa por nuestra aplicación, si el propósito del alma es identificar un elemento, no use la label .

Siempre use accessibilityIdentifier para identificar un elemento

accessibilityLabel no es para identificar elementos. Es para ayudar a las personas con discapacidades. Comprobar que está configurado correctamente es una testing válida. Por ejemplo, uno podría escribir una testing para el ícono Detener que verifica que la accessibilityLabel de accessibilityLabel es realmente "Stop" (o una variante localizada) en lugar de alguna otra cadena.

Idealmente, accessibilityLabel debería cambiar según la configuration regional del usuario, "Stop" debería convertirse en "رکیے" en urdu. Sin embargo, accessibilityIdentifier debería permanecer igual. El usuario nunca lo ve. Está allí para usted, el progtwigdor, para identificar los elementos en las testings de interfaz de usuario. accessibilityIdentifier = "MusicPlayerController" permanecerá "MusicPlayerController" independientemente de la configuration regional del usuario.

Dónde configurar accessibilityIdentifier

No importa si lo configura en viewWillAppear o viewDidLoad siempre que esté configurado por la hora en que se muestre la IU. Tiendo a establecerlos en Storyboard (o .Xib). No todos los controles exponen este campo en Storyboard aunque, por ejemplo, UITableView , para éstos lo configuré en viewDidLoad .