ByRole
Esta página fue traducida por PageTurner AI (beta). No está respaldada oficialmente por el proyecto. ¿Encontraste un error? Reportar problema →
getByRole, queryByRole, getAllByRole, queryAllByRole, findByRole, findAllByRole
API
getByRole(
// If you're using `screen`, then skip the container argument:
container: HTMLElement,
role: string,
options?: {
hidden?: boolean = false,
name?: TextMatch,
description?: TextMatch,
selected?: boolean,
busy?: boolean,
checked?: boolean,
pressed?: boolean,
suggest?: boolean,
current?: boolean | string,
expanded?: boolean,
queryFallbacks?: boolean,
level?: number,
value?: {
min?: number,
max?: number,
now?: number,
text?: TextMatch,
}
}): HTMLElement
Realiza consultas de elementos con el rol especificado (y también acepta un
TextMatch). Se consideran los roles predeterminados,
por ejemplo <button /> tiene el rol button sin establecer explícitamente
el atributo role. Aquí puedes consultar
una tabla de elementos HTML con sus roles predeterminados y deseados.
Ten en cuenta que establecer un atributo role y/o aria-* que coincida con
la semántica ARIA implícita es innecesario y no se recomienda, ya que estas
propiedades ya están configuradas por el navegador. No debemos usar los atributos
role y aria-* de manera que entren en conflicto con la semántica descrita.
Por ejemplo, un elemento button no puede tener el atributo role como heading,
porque el elemento button tiene características predeterminadas que entran en
conflicto con el rol heading.
Los roles coinciden literalmente por igualdad de cadena, sin heredar de la jerarquía de roles ARIA. Como resultado, consultar un rol superclase como
checkboxno incluirá elementos con un rol subclase comoswitch.
Puedes consultar el/los elemento(s) devuelto(s) por su
nombre o descripción accesible. El nombre
accesible en casos simples equivale, por ejemplo, a la etiqueta de un elemento
de formulario, el contenido de texto de un botón o el valor del atributo
aria-label. Se puede usar para consultar un elemento específico si hay múltiples
elementos con el mismo rol en el contenido renderizado. Para una guía detallada,
consulta
"¿Qué es un nombre accesible?" de TPGi.
Si solo consultas un único elemento con getByText('The name'), muchas veces
es mejor usar getByRole(expectedRole, { name: 'The name' }). La consulta por
nombre accesible no reemplaza otras consultas como *ByAlt o
*ByTitle. Aunque el nombre accesible puede ser igual a estos atributos, no reemplaza su
funcionalidad. Por ejemplo,
<img aria-label="fancy image" src="fancy.jpg" /> será devuelta por
getByRole('img', { name: 'fancy image' }). Sin embargo, la imagen no mostrará
su descripción si fancy.jpg no pudo cargarse. Si deseas verificar esta
funcionalidad en tu prueba, dependerá de tus necesidades.
Lamentablemente, la especificación define que <input type="password" /> no tiene
rol implícito. Esto significa que para consultar este tipo de elemento debemos
recurrir a consultas menos potentes como ByLabelText.
Opciones
hidden
Si estableces hidden como true, también se considerarán para la consulta
elementos que normalmente están excluidos del árbol de accesibilidad. El
comportamiento predeterminado sigue https://www.w3.org/TR/wai-aria-1.2/#tree_exclusion
con la excepción de role="none" y role="presentation", que siempre se consideran
en la consulta. Por ejemplo, en
<body>
<main aria-hidden="true">
<button>Open dialog</button>
</main>
<div role="dialog">
<button>Close dialog</button>
</div>
</body>
getByRole('button') solo devolvería el botón Close dialog. Para realizar
afirmaciones sobre el botón Open dialog, necesitarías usar
getAllByRole('button', { hidden: true }).
El valor predeterminado de hidden puede
configurarse.
selected
Puedes filtrar los elementos devueltos por su estado de selección estableciendo
selected: true o selected: false.
Por ejemplo, en
<body>
<div role="tablist">
<button role="tab" aria-selected="true">Native</button>
<button role="tab" aria-selected="false">React</button>
<button role="tab" aria-selected="false">Cypress</button>
</div>
</body>
puedes obtener la pestaña "Native" llamando a getByRole('tab', { selected: true }).
Para aprender más sobre el estado seleccionado y qué elementos pueden tener este estado,
consulta ARIA aria-selected.
busy
Puedes filtrar los elementos devueltos por su estado de ocupado configurando busy: true
o busy: false.
Por ejemplo, en
<body>
<section>
<div role="alert" aria-busy="false">Login failed</div>
<div role="alert" aria-busy="true">Error: Loading message...</div>
</section>
</body>
puedes obtener la alerta "Login failed" llamando a
getByRole('alert', { busy: false }). Para aprender más sobre el estado de ocupado, consulta
ARIA aria-busy y
MDN aria-busy attribute.
checked
Puedes filtrar los elementos devueltos por su estado de marcado configurando
checked: true o checked: false.
Por ejemplo, en
<body>
<section>
<button role="checkbox" aria-checked="true">Sugar</button>
<button role="checkbox" aria-checked="false">Gummy bears</button>
<button role="checkbox" aria-checked="false">Whipped cream</button>
</section>
</body>
puedes obtener la opción "Sugar" llamando a
getByRole('checkbox', { checked: true }). Para aprender más sobre el estado de marcado
y qué elementos pueden tener este estado, consulta
ARIA aria-checked.
Nota
Las casillas de verificación tienen un estado "mixto", que no se considera marcado ni desmarcado (detalles aquí).
current
Puedes filtrar los elementos devueltos por su estado actual configurando
current: boolean | string. Ten en cuenta que ningún atributo aria-current coincidirá
con current: false ya que false es el valor predeterminado para aria-current.
Por ejemplo, en
<body>
<nav>
<a href="current/page" aria-current="page">👍</a>
<a href="another/page">👎</a>
</nav>
</body>
puedes obtener el enlace "👍" llamando a getByRole('link', { current: 'page' })
y el "👎" llamando a getByRole('link', { current: false }). Para aprender más
sobre el estado actual, consulta
ARIA aria-current.
pressed
Los botones pueden tener un estado de presionado. Puedes filtrar los elementos devueltos por su
estado de presionado configurando pressed: true o pressed: false.
Por ejemplo, en
<body>
<section>
<button aria-pressed="true">👍</button>
<button aria-pressed="false">👎</button>
</section>
</body>
puedes obtener el botón "👍" llamando a getByRole('button', { pressed: true }).
Para aprender más sobre el estado de presionado, consulta
ARIA aria-pressed.
suggest
Puedes deshabilitar la capacidad de
lanzar sugerencias
para una consulta específica configurando este valor en false.
Configurar este valor en true lanzará sugerencias para la consulta específica.
expanded
Puedes filtrar los elementos devueltos por su estado expandido configurando
expanded: true o expanded: false.
Por ejemplo, en
<body>
<nav>
<ul>
<li>
<a aria-expanded="false" aria-haspopup="true" href="..."
>Expandable Menu Item</a
>
<ul>
<li><a href="#">Submenu Item 1</a></li>
<li><a href="#">Submenu Item 1</a></li>
</ul>
</li>
<li><a href="#">Regular Menu Item</a></li>
</ul>
</nav>
</body>
puedes obtener el enlace "Expandable Menu Item" llamando a
getByRole('link', { expanded: false }). Para aprender más sobre el estado expandido
y qué elementos pueden tener este estado, consulta
ARIA aria-expanded.
<div role="dialog">...</div>
- Native
- React
- Angular
- Cypress
import {screen} from '@testing-library/dom'
const dialogContainer = screen.getByRole('dialog')
import {render, screen} from '@testing-library/react'
render(<MyComponent />)
const dialogContainer = screen.getByRole('dialog')
import {render, screen} from '@testing-library/angular'
await render(MyComponent)
const dialogContainer = screen.getByRole('dialog')
cy.findByRole('dialog').should('exist')
queryFallbacks
Por defecto, se asume que se admite el primer rol de cada elemento, por lo que solo se puede consultar el primer rol. Si necesitas consultar un elemento por cualquiera de sus roles alternativos, puedes usar queryFallbacks: true.
Por ejemplo, getByRole('switch') siempre coincidiría con <div role="switch checkbox" /> porque es el primer rol, mientras que getByRole('checkbox') no lo haría. Sin embargo, getByRole('checkbox', { queryFallbacks: true }) habilitaría todos los roles alternativos y por lo tanto coincidiría con el mismo elemento.
Un elemento no tiene múltiples roles en un entorno dado. Tiene un único rol. Los múltiples roles en el atributo se evalúan de izquierda a derecha hasta que el entorno encuentra el primer rol que comprende. Esto es útil cuando se introducen nuevos roles y deseas comenzar a admitirlos junto con entornos más antiguos que aún no entienden ese rol.
level
Un elemento con el rol heading puede consultarse por cualquier nivel de encabezado getByRole('heading') o por un nivel específico usando la opción level getByRole('heading', { level: 2 }).
La opción level consulta los elementos con el rol heading que coinciden con el nivel indicado determinado por los elementos semánticos HTML <h1>-<h6> o que coinciden con el atributo aria-level.
Dado el ejemplo siguiente,
<body>
<section>
<h1>Heading Level One</h1>
<h2>First Heading Level Two</h2>
<h3>Heading Level Three</h3>
<div role="heading" aria-level="2">Second Heading Level Two</div>
</section>
</body>
puedes consultar el encabezado Heading Level Three usando getByRole('heading', { level: 3 }).
getByRole('heading', {level: 1})
// <h1>Heading Level One</h1>
getAllByRole('heading', {level: 2})
// [
// <h2>First Heading Level Two</h2>,
// <div role="heading" aria-level="2">Second Heading Level Two</div>
// ]
Si bien es posible establecer explícitamente role="heading" y el atributo aria-level en un elemento, se recomienda encarecidamente usar los elementos semánticos HTML <h1>-<h6>.
Para aprender más sobre la propiedad aria-level, consulta ARIA aria-level.
La opción
leveles exclusivamente aplicable al rolheading. Se producirá un error si se usa con cualquier otro rol.
value
Un widget de rango puede consultarse por cualquier valor getByRole('spinbutton') o por un valor específico usando la opción level getByRole('spinbutton', { value: { now: 5, min: 0, max: 10, text: 'medium' } }).
Nota que no necesitas especificar todas las propiedades en value. Un subconjunto es suficiente, p.ej. getByRole('spinbutton', { value: { now: 5, text: 'medium' } }).
Dado el ejemplo siguiente,
<body>
<section>
<button
role="spinbutton"
aria-valuenow="5"
aria-valuemin="0"
aria-valuemax="10"
aria-valuetext="medium"
>
Volume
</button>
<button
role="spinbutton"
aria-valuenow="3"
aria-valuemin="0"
aria-valuemax="10"
aria-valuetext="medium"
>
Pitch
</button>
</section>
</body>
puedes consultar spinbuttons específicos con las siguientes consultas:
getByRole('spinbutton', {value: {now: 5}})
// <button>Volume</button>
getAllByRole('spinbutton', {value: {min: 0}})
// [
// <button>Volume</button>,
// <button>Pitch</button>
// ]
Cada propiedad especificada en
valuedebe coincidir. Por ejemplo, si consultas{value: {min: 0, now: 3}},aria-valuemindebe ser igual a 0 Yaria-valuenowdebe ser igual a 3.
La opción
valuees exclusivamente aplicable a ciertos roles (consulta las páginas MDN enlazadas a continuación para roles aplicables). Se producirá un error si se usa con cualquier otro rol.
Para aprender más sobre las propiedades aria-value*, consulta:
MDN aria-valuemin,
MDN aria-valuemax,
MDN aria-valuenow,
MDN aria-valuetext.
description
Puedes filtrar los elementos devueltos por su
descripción accesible
para casos donde tengas varios elementos con el mismo rol que no poseen un nombre accesible pero sí una descripción.
Esto aplicaría para elementos con rol
alertdialog, donde el atributo
aria-describedby se usa para describir el contenido del elemento.
Por ejemplo, en
<body>
<ul>
<li role="alertdialog" aria-describedby="notification-id-1">
<div><button>Close</button></div>
<div id="notification-id-1">You have unread emails</div>
</li>
<li role="alertdialog" aria-describedby="notification-id-2">
<div><button>Close</button></div>
<div id="notification-id-2">Your session is about to expire</div>
</li>
</ul>
</body>
Puedes consultar un elemento específico así:
getByRole('alertdialog', {description: 'Your session is about to expire'})
Rendimiento
getByRole es la consulta preferida por su cercanía a la experiencia de usuario, pero los cálculos que realiza para garantizar esta confianza pueden ser costosos (especialmente en árboles DOM grandes).
Cuando el rendimiento de pruebas es crítico, puede ser conveniente sacrificar parte de esta confianza a cambio de mejoras de rendimiento.
El rendimiento de getByRole puede optimizarse configurando la opción hidden como true, evitando así costosas comprobaciones de visibilidad. Ten en cuenta que esto incluirá elementos inaccesibles en los resultados.
Otra alternativa sería sustituir getByRole por consultas más simples como getByLabelText o getByText, que son significativamente más rápidas aunque menos robustas.