-
Notifications
You must be signed in to change notification settings - Fork 468
Description
@testing-library/dom
version: 9.3.0- Testing Framework and version: Jest/React
- DOM Environment:
The Issue
If an img
tag has an alt
attribute, its role shows up as presentation
instead of as img
. So, e.g., this test:
import { render, screen } from '@testing-library/react';
test("Displays an img", () => {
render (<img src="https://http.cat/418" alt="404" />);
screen.getByRole('img')
})
produces this result:

ARIA Background
According to the ARIA docs an img
should only default to the role of presentation
if it has an alt
attribute equal to "":
Source of the Problem and Proposed Solution
The problem arises when the selector is being made in role-helpers.js
:
dom-testing-library/src/role-helpers.js
Lines 80 to 94 in d09b3c2
function buildElementRoleList(elementRolesMap) { | |
function makeElementSelector({name, attributes}) { | |
return `${name}${attributes | |
.map(({name: attributeName, value, constraints = []}) => { | |
const shouldNotExist = constraints.indexOf('undefined') !== -1 | |
if (shouldNotExist) { | |
return `:not([${attributeName}])` | |
} else if (value) { | |
return `[${attributeName}="${value}"]` | |
} else { | |
return `[${attributeName}]` | |
} | |
}) | |
.join('')}` | |
} |
Because a value of ""
resolves to false in line 87, the selector for a presentation img
ends up returning [alt]
instead of [alt=""]
as its characteristic attribute, meaning that any img
with an alt
attribute will be marked with a presentation
role. Simply adding an explicit check for value === ""
on line 87 fixes the issue. (The check could be made more specific if that is needed.)
I will submit a PR with the proposed fix and updated tests.