[Security Solution] Fix Accessibility Tests (#162143)

## Summary

This PR un-skips security solution a11y tests.

There were four main issues fixes:

1. All list items (`li`) must be contained within `ul` or `ol` parent
elements:
https://dequeuniversity.com/rules/axe/4.6/listitem?application=axeAPI
2. Lists must be marked up correctly, meaning they must not contain
content elements other than `li` elements:
https://dequeuniversity.com/rules/axe/4.6/list?application=axeAPI
3. Ensures elements marked `role="img"` elements have alternate text:
https://dequeuniversity.com/rules/axe/4.6/role-img-alt?application=axeAPI
4. Each `select` element must have a programmatically associated label
element:
https://dequeuniversity.com/rules/axe/4.6/select-name?application=axeAPI


Fixes next tests:
1. https://github.com/elastic/kibana/issues/95707
2. https://github.com/elastic/kibana/issues/101923
This commit is contained in:
Ievgen Sorokopud 2023-07-27 20:41:16 +02:00 committed by GitHub
parent 614044bff5
commit 5f913066a9
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 34 additions and 35 deletions

View file

@ -106,28 +106,25 @@ export const SolutionSideNav: React.FC<SolutionSideNavProps> = React.memo(functi
<EuiFlexGroup gutterSize="none" direction="column">
<EuiFlexItem>
<EuiFlexGroup gutterSize="none" direction="column">
<EuiFlexItem>
<EuiListGroup gutterSize="none">
<SolutionSideNavItems
items={topItems}
categories={categories}
selectedId={selectedId}
activePanelNavId={activePanelNavId}
isMobileSize={isMobileSize}
onOpenPanelNav={openPanelNav}
/>
</EuiListGroup>
</EuiFlexItem>
<EuiFlexItem grow={false}>
<EuiListGroup gutterSize="none">
<SolutionSideNavItems
items={bottomItems}
selectedId={selectedId}
activePanelNavId={activePanelNavId}
isMobileSize={isMobileSize}
onOpenPanelNav={openPanelNav}
/>
</EuiListGroup>
<SolutionSideNavItems
items={topItems}
categories={categories}
selectedId={selectedId}
activePanelNavId={activePanelNavId}
isMobileSize={isMobileSize}
onOpenPanelNav={openPanelNav}
/>
</EuiFlexItem>
<EuiFlexItem />
<EuiFlexItem grow={false}>
<SolutionSideNavItems
items={bottomItems}
selectedId={selectedId}
activePanelNavId={activePanelNavId}
isMobileSize={isMobileSize}
onOpenPanelNav={openPanelNav}
/>
</EuiFlexItem>
</EuiFlexGroup>
</EuiFlexItem>
@ -284,16 +281,18 @@ const SolutionSideNavItem: React.FC<SolutionSideNavItemProps> = React.memo(
<>
<EuiFlexGroup alignItems="center" gutterSize="xs">
<EuiFlexItem>
<EuiListGroupItem
label={itemLabel}
href={href}
wrapText
onClick={onLinkClicked}
className={itemClassNames}
color="text"
size="s"
data-test-subj={`solutionSideNavItemLink-${id}`}
/>
<EuiListGroup gutterSize="none">
<EuiListGroupItem
label={itemLabel}
href={href}
wrapText
onClick={onLinkClicked}
className={itemClassNames}
color="text"
size="s"
data-test-subj={`solutionSideNavItemLink-${id}`}
/>
</EuiListGroup>
</EuiFlexItem>
{hasPanelNav && (
<EuiFlexItem grow={0}>

View file

@ -179,6 +179,7 @@ export const ScheduleItem = ({
options={timeTypeOptions.filter((type) => timeTypes.includes(type.value))}
onChange={onChangeTimeType}
value={timeType}
aria-label={field.label}
data-test-subj="timeType"
{...rest}
/>

View file

@ -31,7 +31,7 @@ const RuleStatusIconComponent: React.FC<RuleStatusIconProps> = ({ name, type })
const color = type === 'passive' ? theme.euiColorLightestShade : theme.euiColorPrimary;
return (
<RuleStatusIconStyled>
<EuiAvatar color={color} name={type === 'valid' ? '' : name} size="l" />
<EuiAvatar color={color} name={type === 'valid' ? '' : name} size="l" aria-label={name} />
{type === 'valid' ? <EuiIcon type="check" color={theme.euiColorEmptyShade} size="l" /> : null}
</RuleStatusIconStyled>
);

View file

@ -14,8 +14,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) {
const toasts = getService('toasts');
const testSubjects = getService('testSubjects');
// FLAKY: https://github.com/elastic/kibana/issues/95707
describe.skip('Security Solution Accessibility', () => {
describe('Security Solution Accessibility', () => {
before(async () => {
await security.testUser.setRoles(['superuser'], { skipBrowserRefresh: true });
await common.navigateToApp('security');

View file

@ -121,7 +121,7 @@ export class DetectionsPageObject extends FtrService {
async preview(): Promise<void> {
await this.common.clickAndValidate(
'queryPreviewButton',
'previewSubmitButton',
'queryPreviewCustomHistogram',
undefined,
500