ByRole
Esta página foi traduzida por PageTurner AI (beta). Não é oficialmente endossada pelo projeto. Encontrou um erro? 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
Consulta elementos com a função (role) especificada (e também aceita um
TextMatch). Funções padrão são consideradas,
por exemplo, <button /> tem a função button sem definir explicitamente o
atributo role. Aqui você pode ver
uma tabela de elementos HTML com suas funções padrão e desejadas.
Note que definir um atributo role e/ou aria-* que corresponda à semântica
implícita da ARIA é desnecessário e não recomendado, pois essas propriedades
já são definidas pelo navegador. Não devemos usar atributos role e aria-* de
forma conflitante com as semânticas descritas. Por exemplo, um elemento button
não pode ter o atributo role como heading, pois o elemento button tem
características padrão que conflitam com a função heading.
As funções são comparadas literalmente por igualdade de string, sem herdar da hierarquia de funções da ARIA. Portanto, consultar uma função superclasse como
checkboxnão incluirá elementos com uma subclasse de função comoswitch.
Você pode consultar o(s) elemento(s) retornado(s) pelo seu
nome ou descrição acessível. O nome
acessível, em casos simples, equivale ao rótulo de um elemento de formulário,
ao conteúdo de texto de um botão ou ao valor do atributo aria-label. Isso
permite consultar um elemento específico quando múltiplos elementos com mesma
função estão presentes. Para um guia detalhado, consulte
"O que é um nome acessível?" da TPGi.
Se você busca apenas um elemento com getByText('The name'), frequentemente é
melhor usar getByRole(expectedRole, { name: 'The name' }). A consulta por nome
acessível não substitui outras como *ByAlt ou
*ByTitle. Embora o nome
acessível possa ser igual a esses atributos, ele não substitui sua funcionalidade.
Por exemplo, <img aria-label="fancy image" src="fancy.jpg" /> será
retornado por getByRole('img', { name: 'fancy image' }). Contudo, a imagem
não exibirá sua descrição se fancy.jpg não carregar. Cabe a você decidir
se deseja verificar essa funcionalidade em seu teste.
Infelizmente, a especificação define que <input type="password" /> não tem
função implícita. Isso significa que para consultar esse tipo de elemento
precisamos recorrer a uma consulta menos poderosa como
ByLabelText.
Opções
hidden
Se você definir hidden como true, elementos normalmente excluídos da árvore
de acessibilidade também serão considerados na consulta. O comportamento padrão
segue https://www.w3.org/TR/wai-aria-1.2/#tree_exclusion, exceto para
role="none" e role="presentation", que sempre são considerados na consulta.
Por exemplo, em
<body>
<main aria-hidden="true">
<button>Open dialog</button>
</main>
<div role="dialog">
<button>Close dialog</button>
</div>
</body>
getByRole('button') retornaria apenas o botão Close dialog. Para verificar o botão Open dialog, você precisaria usar getAllByRole('button', { hidden: true }).
O valor padrão de hidden pode
ser configurado.
selected
Você pode filtrar os elementos retornados pelo estado de seleção usando
selected: true ou selected: false.
Por exemplo em
<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>
você pode obter a aba "Nativa" chamando getByRole('tab', { selected: true }).
Para saber mais sobre o estado selecionado e quais elementos podem ter esse estado,
veja ARIA aria-selected.
busy
Você pode filtrar os elementos retornados pelo estado de ocupação definindo busy: true
ou busy: false.
Por exemplo em
<body>
<section>
<div role="alert" aria-busy="false">Login failed</div>
<div role="alert" aria-busy="true">Error: Loading message...</div>
</section>
</body>
você pode obter o alerta "Falha no login" chamando
getByRole('alert', { busy: false }). Para saber mais sobre o estado de ocupação, veja
ARIA aria-busy e o
atributo aria-busy na MDN.
checked
Você pode filtrar os elementos retornados pelo estado de seleção definindo
checked: true ou checked: false.
Por exemplo em
<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>
você pode obter a opção "Açúcar" chamando
getByRole('checkbox', { checked: true }). Para saber mais sobre o estado de seleção
e quais elementos podem ter esse estado, veja
ARIA aria-checked.
Nota
Checkboxes têm um estado "misto", que não é considerado selecionado nem não selecionado (detalhes aqui).
current
Você pode filtrar os elementos retornados pelo estado atual definindo
current: boolean | string. Note que nenhum atributo aria-current corresponderá
a current: false, já que false é o valor padrão para aria-current.
Por exemplo em
<body>
<nav>
<a href="current/page" aria-current="page">👍</a>
<a href="another/page">👎</a>
</nav>
</body>
você pode obter o link "👍" chamando getByRole('link', { current: 'page' })
e o "👎" chamando getByRole('link', { current: false }). Para saber mais
sobre o estado atual, veja
ARIA aria-current.
pressed
Botões podem ter um estado de pressionado. Você pode filtrar os elementos retornados
por esse estado definindo pressed: true ou pressed: false.
Por exemplo em
<body>
<section>
<button aria-pressed="true">👍</button>
<button aria-pressed="false">👎</button>
</section>
</body>
você pode obter o botão "👍" chamando getByRole('button', { pressed: true }).
Para saber mais sobre o estado de pressionado, veja
ARIA aria-pressed.
suggest
Você pode desativar a capacidade de
lançar sugestões
para uma consulta específica definindo este valor como false.
Definir como true lançará sugestões para a consulta específica.
expanded
Você pode filtrar os elementos retornados pelo estado expandido definindo
expanded: true ou expanded: false.
Por exemplo em
<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>
você pode obter o link "Item de Menu Expansível" chamando
getByRole('link', { expanded: false }). Para saber mais sobre o estado expandido
e quais elementos podem ter esse estado, veja
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 padrão, assume-se que a primeira função (role) de cada elemento é suportada, então apenas a primeira função pode ser consultada. Se você precisar consultar um elemento por qualquer uma de suas funções alternativas, pode usar queryFallbacks: true.
Por exemplo, getByRole('switch') sempre corresponderia a <div role="switch checkbox" /> porque é a primeira função, enquanto getByRole('checkbox') não corresponderia. Porém, getByRole('checkbox', { queryFallbacks: true }) habilitaria todas as funções alternativas e assim corresponderia ao mesmo elemento.
Um elemento não tem múltiplas funções em um determinado ambiente. Ele tem uma única função. Múltiplas funções no atributo são avaliadas da esquerda para a direita até que o ambiente encontre a primeira função que ele entende. Isso é útil quando novas funções são introduzidas e você quer suportá-las enquanto mantém compatibilidade com ambientes antigos que ainda não entendem essa função.
level
Um elemento com a função heading pode ser consultado por qualquer nível de cabeçalho usando getByRole('heading') ou por um nível específico usando a opção level: getByRole('heading', { level: 2 }).
A opção level consulta elemento(s) com a função heading que correspondam ao nível indicado, determinado pelos elementos semânticos HTML <h1>-<h6> ou pelo atributo aria-level.
Dado o exemplo abaixo,
<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>
você pode consultar o cabeçalho 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>
// ]
Embora seja possível definir explicitamente role="heading" e o atributo aria-level em um elemento, é altamente recomendado usar os cabeçalhos semânticos HTML <h1>-<h6>.
Para saber mais sobre a propriedade aria-level, consulte ARIA aria-level.
A opção
levelé aplicável apenas à funçãoheading. Um erro será lançado se usada com qualquer outra função.
value
Um widget de intervalo pode ser consultado por qualquer valor com getByRole('spinbutton') ou por um valor específico usando a opção level: getByRole('spinbutton', { value: { now: 5, min: 0, max: 10, text: 'medium' } }).
Note que você não precisa especificar todas as propriedades em value. Um subconjunto é suficiente, por exemplo: getByRole('spinbutton', { value: { now: 5, text: 'medium' } }).
Dado o exemplo abaixo,
<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>
você pode consultar spinbutton(s) específicos com as seguintes consultas:
getByRole('spinbutton', {value: {now: 5}})
// <button>Volume</button>
getAllByRole('spinbutton', {value: {min: 0}})
// [
// <button>Volume</button>,
// <button>Pitch</button>
// ]
Toda propriedade especificada em
valuedeve corresponder. Por exemplo, se você consultar{value: {min: 0, now: 3}},aria-valuemindeve ser igual a 0 Earia-valuenowdeve ser igual a 3.
A opção
valueé aplicável apenas a certas funções (verifique as páginas da MDN vinculadas abaixo). Um erro será lançado se usada com qualquer outra função.
Para saber mais sobre as propriedades aria-value*, consulte:
MDN aria-valuemin,
MDN aria-valuemax,
MDN aria-valuenow,
MDN aria-valuetext.
description
Você pode filtrar os elementos retornados por sua
descrição acessível
para casos onde existem vários elementos com a mesma função que não possuem um
nome acessível, mas têm uma descrição.
Isso ocorre com elementos que usam
a função alertdialog, onde o
atributo aria-describedby é usado para descrever o conteúdo do elemento.
Por exemplo em
<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>
Você pode consultar um elemento específico assim
getByRole('alertdialog', {description: 'Your session is about to expire'})
Desempenho
getByRole é a consulta mais recomendada por se assemelhar mais à experiência do
usuário, porém os cálculos necessários para fornecer essa confiança podem ser
custosos (especialmente com grandes árvores DOM).
Quando o desempenho dos testes é crítico, pode ser vantajoso trocar parte dessa confiança por melhor desempenho.
O desempenho do getByRole pode ser melhorado definindo a opção
hidden como true, evitando assim verificações de visibilidade
custosas. Note que isso incluirá elementos inacessíveis no resultado.
Outra alternativa é substituir getByRole por consultas mais simples como
getByLabelText e getByText, que podem ser significativamente mais rápidas,
embora sejam alternativas menos robustas.