camera.spec.ts 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. import { test, expect } from '@playwright/test'
  2. test.describe('Camera Management E2E Tests', () => {
  3. const username = process.env.TEST_USERNAME || 'admin'
  4. const password = process.env.TEST_PASSWORD || '123456'
  5. async function login(page: any) {
  6. await page.goto('/login')
  7. await page.getByPlaceholder('用户名').fill(username)
  8. await page.getByPlaceholder('密码').fill(password)
  9. await page.getByRole('button', { name: '登录' }).click()
  10. await expect(page).not.toHaveURL(/\/login/, { timeout: 10000 })
  11. }
  12. test.describe('Camera List Page', () => {
  13. test('should display camera management page', async ({ page }) => {
  14. await login(page)
  15. await page.goto('/camera')
  16. await expect(page.getByRole('button', { name: '新增' })).toBeVisible()
  17. await expect(page.locator('.el-table')).toBeVisible()
  18. })
  19. test('should have correct table columns', async ({ page }) => {
  20. await login(page)
  21. await page.goto('/camera')
  22. // 验证表头列 - 使用 thead 来区分
  23. await expect(page.locator('thead').getByText('摄像头ID')).toBeVisible()
  24. await expect(page.locator('thead').getByText('名称')).toBeVisible()
  25. await expect(page.locator('thead').getByText('IP地址')).toBeVisible()
  26. await expect(page.locator('thead').getByText('所属机器')).toBeVisible()
  27. await expect(page.locator('thead').getByText('状态')).toBeVisible()
  28. })
  29. test('should have machine filter', async ({ page }) => {
  30. await login(page)
  31. await page.goto('/camera')
  32. // 机器筛选下拉框
  33. await expect(page.locator('.el-select').first()).toBeVisible()
  34. })
  35. })
  36. test.describe('Add Camera Dialog', () => {
  37. test('should open add dialog when clicking add button', async ({ page }) => {
  38. await login(page)
  39. await page.goto('/camera')
  40. await page.getByRole('button', { name: '新增' }).click()
  41. await expect(page.getByRole('dialog')).toBeVisible()
  42. // 验证弹窗标题
  43. await expect(page.locator('.el-dialog__title')).toContainText('新增')
  44. })
  45. test('should validate required fields', async ({ page }) => {
  46. await login(page)
  47. await page.goto('/camera')
  48. await page.getByRole('button', { name: '新增' }).click()
  49. await expect(page.getByRole('dialog')).toBeVisible()
  50. // 等待弹窗完全加载
  51. await page.waitForTimeout(500)
  52. await page.getByRole('dialog').getByRole('button', { name: '确定' }).click()
  53. // 等待表单验证
  54. await page.waitForTimeout(500)
  55. // 验证弹窗仍然打开(因为验证失败)
  56. await expect(page.getByRole('dialog')).toBeVisible()
  57. })
  58. test('should close dialog when clicking cancel', async ({ page }) => {
  59. await login(page)
  60. await page.goto('/camera')
  61. await page.getByRole('button', { name: '新增' }).click()
  62. await expect(page.getByRole('dialog')).toBeVisible()
  63. await page.getByRole('dialog').getByRole('button', { name: '取消' }).click()
  64. await expect(page.getByRole('dialog')).not.toBeVisible()
  65. })
  66. })
  67. test.describe('Navigation', () => {
  68. test('should have camera menu item in sidebar', async ({ page }) => {
  69. await login(page)
  70. // 查找侧边栏中的摄像头管理菜单
  71. await expect(page.locator('.layout__nav').getByText('摄像头管理')).toBeVisible()
  72. })
  73. test('should navigate to camera page from sidebar', async ({ page }) => {
  74. await login(page)
  75. // 点击侧边栏摄像头管理菜单
  76. await page.locator('.layout__nav').getByText('摄像头管理').click()
  77. await expect(page).toHaveURL(/\/camera/)
  78. })
  79. })
  80. })