dify/e2e/features/step-definitions/accessibility/keyboard-navigation.steps.ts
yyh d66de8a47b
test(e2e): harden behavior coverage and CI gates (#39043)
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
2026-07-16 07:32:11 +00:00

84 lines
3.2 KiB
TypeScript

import type { DifyWorld } from '../../support/world'
import { Then, When } from '@cucumber/cucumber'
import { expect } from '@playwright/test'
import { adminCredentials } from '../../../fixtures/auth'
import { e2eBrowser } from '../../../test-env'
const getAccountMenuTrigger = (world: DifyWorld) =>
world.getPage().getByRole('button', { name: 'Account' })
const getCreateAppMenuTrigger = (world: DifyWorld) =>
world.getPage().getByRole('main').getByRole('button', { name: 'Create', exact: true })
When(
'I focus and activate the skip navigation link with the keyboard',
async function (this: DifyWorld) {
const page = this.getPage()
const skipLink = page.getByRole('link', { name: 'Skip to main content' })
const nextClickableItemKey = e2eBrowser === 'webkit' ? 'Alt+Tab' : 'Tab'
await page.keyboard.press(nextClickableItemKey)
await expect(skipLink).toBeFocused()
await page.keyboard.press('Enter')
},
)
Then('the console main content should have keyboard focus', async function (this: DifyWorld) {
await expect(this.getPage().getByRole('main')).toBeFocused()
})
When('I complete the sign-in form using only the keyboard', async function (this: DifyWorld) {
const page = this.getPage()
const email = page.getByLabel('Email address')
const password = page.getByLabel('Password', { exact: true })
const showPassword = page.getByRole('button', { name: 'Show password' })
const submit = page.getByRole('button', { name: 'Sign in' })
await expect(email).toBeVisible()
for (let tabPresses = 0; tabPresses < 10; tabPresses += 1) {
await page.keyboard.press('Tab')
if (await email.evaluate((element) => element === document.activeElement)) break
}
await expect(email).toBeFocused()
await page.keyboard.insertText(adminCredentials.email)
await page.keyboard.press('Tab')
await expect(password).toBeFocused()
await page.keyboard.insertText(adminCredentials.password)
await page.keyboard.press('Tab')
await expect(showPassword).toBeFocused()
await page.keyboard.press('Tab')
await expect(submit).toBeFocused()
await page.keyboard.press('Enter')
})
When('I open and close the account menu using the keyboard', async function (this: DifyWorld) {
const page = this.getPage()
const trigger = getAccountMenuTrigger(this)
await expect(trigger).toBeEnabled()
await trigger.press('Enter')
await expect(trigger).toHaveAttribute('aria-expanded', 'true')
await page.keyboard.press('Escape')
await expect(trigger).toHaveAttribute('aria-expanded', 'false')
})
Then('the account menu trigger should regain keyboard focus', async function (this: DifyWorld) {
await expect(getAccountMenuTrigger(this)).toBeFocused()
})
When('I open and close the create app menu using the keyboard', async function (this: DifyWorld) {
const page = this.getPage()
const trigger = getCreateAppMenuTrigger(this)
await trigger.press('Enter')
await expect(trigger).toHaveAttribute('aria-expanded', 'true')
await page.keyboard.press('Escape')
await expect(trigger).toHaveAttribute('aria-expanded', 'false')
})
Then('the create app menu trigger should regain keyboard focus', async function (this: DifyWorld) {
await expect(getCreateAppMenuTrigger(this)).toBeFocused()
})