您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 
 

94 行
4.5 KiB

  1. import { captureScreenshot, expect, test } from './fixtures'
  2. import {
  3. adminCredentials,
  4. login,
  5. missingLoginOrganizationEnvironment,
  6. selectLoginOrganization,
  7. } from './helpers'
  8. test('登录页默认选择教员身份', async ({ page }) => {
  9. await page.goto('/login')
  10. await expect(page.locator('[data-role-code="teacher"]')).toHaveAttribute('aria-pressed', 'true')
  11. })
  12. test('管理员可以登录并安全退出', async ({ page }, testInfo) => {
  13. await page.goto('/login')
  14. const loginHeading = page.getByRole('heading', { name: '登录数字车间', includeHidden: true })
  15. await expect(loginHeading).toBeAttached()
  16. await expect(page.locator('.login-card > header')).toHaveCSS('position', 'absolute')
  17. await expect(page.locator('.login-card > header')).toHaveCSS('clip-path', 'inset(50%)')
  18. await expect(page.locator('.login-role-options > button')).toHaveCount(4)
  19. await expect(page.locator('[data-role-code="teacher"]')).toHaveAttribute('aria-pressed', 'true')
  20. await expect(page.getByRole('button', { name: /登录系统/ })).toBeDisabled()
  21. await captureScreenshot(page, testInfo, 'login-page')
  22. const credentials = adminCredentials()
  23. await page.locator('[data-role-code="admin"]').click()
  24. await page.locator('input[name="username"]').fill('__ute2e_missing_account__')
  25. await page.locator('input[name="password"]').fill('Uae2e-Invalid-Only')
  26. await page.getByRole('button', { name: /登录系统/ }).click()
  27. await expect(page.locator('.el-message--error')).toContainText('账号、密码或登录身份不匹配')
  28. await login(page, adminCredentials())
  29. await expect(page).toHaveURL(/\/dashboard(?:\?|$)/)
  30. await captureScreenshot(page, testInfo, 'login-success')
  31. await page.locator('.user-entry').click()
  32. await page.getByText('退出登录', { exact: true }).click()
  33. await expect(page).toHaveURL(/\/login(?:\?|$)/)
  34. const returnedLoginHeading = page.getByRole('heading', { name: '登录数字车间', includeHidden: true })
  35. await expect(returnedLoginHeading).toBeAttached()
  36. await expect(page.locator('.login-card > header')).toHaveCSS('position', 'absolute')
  37. await expect(page.locator('.login-card > header')).toHaveCSS('clip-path', 'inset(50%)')
  38. })
  39. test('强制改密账号首次登录后必须设置新密码', async ({ page }, testInfo) => {
  40. const username = process.env.E2E_FORCE_CHANGE_USERNAME?.trim()
  41. const password = process.env.E2E_FORCE_CHANGE_PASSWORD?.trim()
  42. const newPassword = process.env.E2E_FORCE_CHANGE_NEW_PASSWORD?.trim()
  43. const roleCode = (process.env.E2E_FORCE_CHANGE_ROLE_CODE?.trim() || 'teacher') as 'admin' | 'administrative' | 'teacher' | 'student'
  44. const missingOrganizationEnvironment = missingLoginOrganizationEnvironment(roleCode)
  45. test.skip(!username || !password || !newPassword, '未配置独立强制改密账号,按约定跳过该条件用例。')
  46. test.skip(username === process.env.E2E_ADMIN_USERNAME, '强制改密用例禁止复用管理员账号。')
  47. test.skip(
  48. missingOrganizationEnvironment.length > 0,
  49. `当前登录身份缺少组织配置:${missingOrganizationEnvironment.join('、')}。`,
  50. )
  51. await page.goto('/login')
  52. await page.locator(`[data-role-code="${roleCode}"]`).click()
  53. await selectLoginOrganization(page, roleCode)
  54. await page.locator('input[name="username"]').fill(username!)
  55. await page.locator('input[name="password"]').fill(password!)
  56. await page.getByRole('button', { name: /登录系统/ }).click()
  57. const surface = page.locator('.el-dialog:visible, .force-password-page, main').filter({ hasText: /修改密码|首次登录/ }).last()
  58. await expect(surface).toBeVisible()
  59. const currentPasswordInput = surface
  60. .locator('.el-form-item')
  61. .filter({ hasText: /当前密码/ })
  62. .locator('input')
  63. .first()
  64. const newPasswordInput = surface
  65. .locator('.el-form-item')
  66. .filter({ hasText: /新密码/ })
  67. .locator('input')
  68. .first()
  69. const confirmationInput = surface
  70. .locator('.el-form-item')
  71. .filter({ hasText: /确认密码|再次输入/ })
  72. .locator('input')
  73. .first()
  74. await currentPasswordInput.fill(password!)
  75. await newPasswordInput.fill(newPassword!)
  76. await confirmationInput.fill(newPassword!)
  77. await surface.getByRole('button', { name: /确认修改|修改密码|保存/ }).last().click()
  78. await expect(page).toHaveURL(/\/login(?:\?|$)/)
  79. await login(page, { username: username!, password: newPassword!, roleCode })
  80. await expect(page).toHaveURL(/\/dashboard(?:\?|$)/)
  81. await captureScreenshot(page, testInfo, 'forced-password-change-success')
  82. })