Ir al contenido

Blog ·

Una excepción de accesibilidad que se mide sola

Todo comprobador de accesibilidad acaba con una lista de excepciones. La nuestra tiene dos, cada una con una medición, y falla si una deja de coincidir.

Por Provibr

Apuntar un comprobador automático de accesibilidad a un producto real da un número. Arreglar todo lo que encontró da un número más pequeño. En algún punto de ese proceso aparece un hallazgo que genuinamente no es un defecto, y en ese momento se escribe la primera excepción.

Esa es la parte interesante, porque una lista de excepciones es donde muere sin ruido un programa de accesibilidad. Empieza con dos entradas bien argumentadas. Un año después tiene once, tres de las cuales ya no coinciden con nada, una de las cuales esconde un problema real, y nadie recuerda por qué está ahí ninguna de ellas. El informe dice cero y no significa nada.

Este mes construimos el comprobador para nuestro panel. No informa de ningún hallazgo en ninguna gravedad, y este texto trata sobre todo de por qué no nos creemos ese número por sí solo.

Tres reglas estaban apagadas por defecto, y dos de ellas ocultaban hallazgos

La biblioteca que usamos trae algunas reglas desactivadas por defecto. Comprobamos cuáles, preguntándoselo en vez de suponerlo: discrepancia entre nombre y contenido, celdas de tabla sin encabezado y tamaño del objetivo están las tres apagadas de fábrica.

Dos de ellas produjeron hallazgos reales en nuestro panel, 36 entre las dos, incluidos los dos puntos que una ronda anterior había dejado abiertos. Un comprobador que se ejecuta con el conjunto de reglas por defecto está por tanto verde exactamente en los fallos que alguien ya había ido a buscar, que es la peor clase de verde: es indistinguible de un producto que está bien.

Están encendidas de forma explícita, y esa sola decisión cambió la línea base más que ninguna otra opción de configuración.

Nueve idiomas, porque un idioma es cara o cruz

El selector de idioma de nuestra cabecera muestra un código de dos letras y tiene un nombre accesible que dice de qué idioma se trata. En inglés el botón pone EN y se llama «Language: English», y la regla pasa, porque en aparece por casualidad dentro de English.

En neerlandés falla. Mismo componente, mismo código, mismo marcado.

Medido en los nueve idiomas que publicamos: tres fallan y seis pasan, y cada uno de esos seis pasa por coincidencia: en dentro de English, de dentro de Deutsch, fr dentro de Français, it dentro de Italiano, es dentro de Español, ro dentro de Română. Probar aquí un solo idioma da un verde vacuo.

Así que el recorrido de marketing ejecuta todos los idiomas sobre las reglas cuyo resultado puede depender del idioma. Cuesta tiempo y es la única manera de que ese hallazgo exista.

La línea base, y de qué estaba hecha

La primera pasada completa sobre marketing, inicio de sesión y el panel con sesión iniciada informó de 3 críticos, 51 graves, 72 moderados y 6 menores. Ocho reglas daban cuenta de todo ello.

ReglaHallazgos
contenido fuera de un punto de referencia60
discrepancia entre nombre y contenido33
contraste de color13
sin punto de referencia main9
encabezado de tabla vacío6
región desplazable sin foco5
celda de tabla sin encabezado3
orden de encabezados3

Casi todo era estructural y no visual. Las páginas de inicio de sesión y el panel no tenían elemento main ni enlace de salto. Las tablas de los artículos tenían encabezados vacíos. Los bloques de código se desplazan en horizontal y no se podía llegar a ellos con el teclado, lo que significa que quien usa teclado sencillamente no puede leer el lado derecho de un comando largo. La pestaña de estadísticas ponía un encabezado de gráfico en el nivel equivocado bajo el encabezado de la página.

Después de las reparaciones: cero, cero, cero y cero. Lo que devuelve a la pregunta de cuánto vale ese cero.

Dos excepciones, cada una con una medición

La lista de excepciones tiene exactamente dos entradas, y cada una de ellas lleva un motivo y una medición que se tomó de verdad.

Contraste de color con colores forzados. Ejecutar el panel con colores forzados activos produjo 610 fallos de contraste en doce páginas. Eso no es un defecto del producto, es una interacción entre el comprobador y el navegador. El comprobador lee -webkit-text-fill-color antes que color, y Chrome no fuerza la primera. En la página de inicio de sesión, sobre el mismo encabezado, en la misma carga de página:

propiedadnormalcolores forzados
colorrgb(16, 19, 25)rgb(255, 255, 255)
-webkit-text-fill-colorrgb(16, 19, 25)rgb(16, 19, 25)
fondo de la páginargb(244, 246, 248)rgb(0, 0, 0)

Así que compara el primer plano definido por el autor contra el fondo forzado e informa de 1,12 a 1 donde la pantalla muestra en realidad 21 a 1. En ese modo el requisito de contraste no se aplica de todos modos, porque la paleta pertenece a quien la usa.

La regla está apagada en ese único modo, y el motivo se vuelve a medir en cada ejecución. Si Chrome o el comprobador arreglan esto, esa autocomprobación falla y hay que volver a argumentar la excepción. Una excepción sin autocomprobación es una lista de permitidos silenciosa.

El botón de cuenta. La regla de discrepancia entre nombre y contenido se dispara sobre el botón del menú de usuario del panel. Se pusieron seis nombres accesibles candidatos en el botón real y se ejecutó la regla contra cada uno. Solo pasa cuando el nombre contiene literalmente la cadena DKDemo Klant€0.00, en la que las iniciales y el nombre de la cuenta han quedado pegados, y falla con ese mismo texto separado por espacios como DK Demo Klant €0.00, y también con el nombre real. Los tres hijos de ese botón están ocultos a las tecnologías de apoyo, cosa que la regla ignora.

Pasar significaría por tanto que un lector de pantalla anuncia DKDemo como una sola palabra. Eso es un botón peor, adoptado para satisfacer una regla que la propia biblioteca marca como experimental y entrega desactivada. El requisito funcional se cumple: alguien que usa control por voz dice «Demo Klant», y eso está en el nombre.

La excepción que murió sin decir nada

Esta es la parte que vale por todo el artículo.

Una excepción tiene que reconocer el elemento al que se aplica. El selector CSS del propio comprobador no es lo bastante estable para eso: el mismo botón de cuenta se identificaba de una manera en una página y de otra en la siguiente, así que una excepción que coincide sobre el selector cubre una página y no la otra. En su lugar, la excepción coincide sobre un atributo marcador que pone el propio componente, dentro del fragmento HTML del elemento.

El fragmento del que informa el comprobador se corta a 140 caracteres.

La etiqueta accesible del botón creció, porque se le añadió el saldo de la cuenta. El marcador se deslizó más allá del límite de 140 caracteres. El fragmento terminaba ahora en ... Credit €0.00." data-us. La excepción no coincidió con nada, en silencio, y la ejecución informó de 27 hallazgos graves que había cubierto la vez anterior.

Nada de ese fallo es ruidoso. La excepción no dio error, la lista no se encogió, no cambió ninguna configuración. Un cambio de interfaz en una funcionalidad sin relación movió una cadena, y una pieza de infraestructura de seguridad dejó de funcionar. La corrección es hacer coincidir contra la etiqueta de apertura sin cortar, que el comprobador también proporciona.

La lección general es más grande que la accesibilidad: cualquier cosa que coincida contra texto cortado es una protección que falla justo en el momento en que algo cambia, que es el único momento en que hacía falta.

Una excepción que no coincide con nada hace fallar la ejecución

Cada entrada se cuenta. Si una ejecución completa termina con una excepción que se usó cero veces, la ejecución está en rojo.

Esa es la misma forma que una lista de constantes en otra parte de este código, y por la misma razón: una excepción que ya no cubre nada debe borrarse, no dejarse ahí. Dejada ahí, es una línea más sobre la que tiene que razonar la siguiente persona, y con el tiempo deja de leerse del todo.

El recuento solo se aplica a una ejecución completa. Al restringir la ejecución a un recorrido o a un modo, «no usada» no significa nada.

Demostrar que un cero es un cero real

El tamaño del objetivo, el requisito de que un control mida al menos 24 por 24 píxeles, es una de las tres reglas que la biblioteca entrega desactivadas. La encendimos y escribimos al lado una segunda medición propia, porque las dos excepciones que la propia norma concede hay que medirlas en vez de darlas por supuestas. La ejecución final examinó 2056 objetivos. 155 estaban por debajo del tamaño. 70 de ellos caían bajo la excepción de texto en línea de la norma, es decir, que el objetivo está dentro de una frase, y 85 bajo la excepción de espaciado, es decir, que un círculo de 24 píxeles a su alrededor no toca nada más. No quedó ninguno.

Un cero salido de una sonda escrita por uno mismo no se distingue de una sonda que no puede informar de nada. Así que un script aparte inyecta un botón de 16 por 16 píxeles junto a un vecino en una página en vivo y ejecuta sobre él este mismo texto de sonda, leído del fichero fuente en vez de copiado. Pasa de 0 a 1 y nombra el elemento. La vía de informe funciona, así que el cero es un resultado y no un silencio.

Las dos excepciones de la norma se miden en lugar de suponerse. Texto en línea significa que el valor calculado de display es exactamente inline y que el ancestro de bloque más cercano contiene además otro texto, que es lo que significa de verdad «estar dentro de una frase». Eso no es una lista de nombres de clase. Y la prueba de espaciado mide el círculo contra los rectángulos de los demás objetivos y no contra sus círculos, que es más estricto que la norma: puede producir un rojo falso, nunca un verde falso.

Lo que una máquina no puede hacer

Hay un manual corto de cuatro puertas que necesitan una persona, porque son las cosas a las que no llega ningún comprobador: si el orden de lectura tiene sentido y el anuncio llega de verdad, si un recorrido se puede completar solo con el teclado en vez de ser meramente alcanzable, si la maquetación sigue siendo legible al 200 por ciento en vez de meramente caber, y si la pantalla sigue significando algo en la paleta propia de quien la usa.

Esas cuatro están abiertas. Decirlo es parte del argumento: un informe que dice cero y no dice qué no miró es el mismo fallo que una excepción sin medición.

Lo que dejaríamos por escrito

  1. Preguntar a la biblioteca qué reglas están apagadas, no suponerlo. Las desactivadas eran donde estaban nuestros hallazgos.
  2. Ejecutar todos los idiomas que se publican sobre cualquier regla cuyo resultado pueda depender del texto.
  3. Dar a cada excepción un motivo y una medición, escritos donde vive la excepción.
  4. Hacer que una excepción que no coincide con nada haga fallar la ejecución.
  5. No hacer coincidir nunca una protección contra texto cortado.
  6. Demostrar los ceros inyectando algo que debería quedar atrapado.
  7. Publicar lo que una máquina no puede comprobar, para que el número se lea por lo que es.

El mismo instinto, aplicado a las traducciones en vez de al marcado, está en dieciséis mil claves, nueve idiomas.

Del trabajo de panel en Provibr.

Empiece con un host y un agente

Cree una cuenta, instale el agente con un solo comando y conecte su primer host de Proxmox. El periodo de prueba dura 14 días y no pide ningún dato de pago.