machine.spec.ts 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. import { test, expect } from '@playwright/test'
  2. // 测试账号配置
  3. const TEST_USERNAME = process.env.TEST_USERNAME || 'admin'
  4. const TEST_PASSWORD = process.env.TEST_PASSWORD || '123456'
  5. // 生成唯一的测试机器ID
  6. const generateMachineId = () => `TEST_${Date.now()}`
  7. test.describe('机器管理 CRUD 测试', () => {
  8. // 登录辅助函数
  9. async function login(page: any) {
  10. await page.goto('/login')
  11. await page.evaluate(() => {
  12. localStorage.clear()
  13. document.cookie.split(';').forEach((c) => {
  14. document.cookie = c.replace(/^ +/, '').replace(/=.*/, '=;expires=' + new Date().toUTCString() + ';path=/')
  15. })
  16. })
  17. await page.reload()
  18. await page.getByPlaceholder('请输入用户名').fill(TEST_USERNAME)
  19. await page.getByPlaceholder('请输入密码').fill(TEST_PASSWORD)
  20. await page.getByRole('button', { name: '登 录' }).click()
  21. await expect(page).not.toHaveURL(/\/login/, { timeout: 15000 })
  22. }
  23. test('机器管理页面正确显示', async ({ page }) => {
  24. await login(page)
  25. await page.goto('/machine')
  26. // 验证页面元素
  27. await expect(page.getByRole('button', { name: '新增机器' })).toBeVisible()
  28. await expect(page.getByRole('button', { name: '刷新列表' })).toBeVisible()
  29. await expect(page.locator('.el-table')).toBeVisible()
  30. // 验证表头
  31. await expect(page.getByText('机器ID')).toBeVisible()
  32. await expect(page.getByText('名称')).toBeVisible()
  33. await expect(page.getByText('位置')).toBeVisible()
  34. })
  35. test('刷新列表功能', async ({ page }) => {
  36. await login(page)
  37. await page.goto('/machine')
  38. // 等待表格加载
  39. await expect(page.locator('.el-table')).toBeVisible()
  40. // 点击刷新按钮
  41. await page.getByRole('button', { name: '刷新列表' }).click()
  42. // 验证加载状态(可能很快消失)
  43. await page.waitForTimeout(500)
  44. // 表格应该仍然可见
  45. await expect(page.locator('.el-table')).toBeVisible()
  46. })
  47. test('新增机器完整流程', async ({ page }) => {
  48. await login(page)
  49. await page.goto('/machine')
  50. const machineId = generateMachineId()
  51. const machineName = `测试机器_${Date.now()}`
  52. // 点击新增按钮
  53. await page.getByRole('button', { name: '新增机器' }).click()
  54. // 验证弹窗打开
  55. await expect(page.getByRole('dialog')).toBeVisible()
  56. await expect(page.locator('.el-dialog__title')).toContainText('新增机器')
  57. // 填写表单
  58. await page.getByPlaceholder('请输入机器ID').fill(machineId)
  59. await page.getByPlaceholder('请输入名称').fill(machineName)
  60. await page.getByPlaceholder('请输入位置').fill('测试位置')
  61. await page.getByPlaceholder('请输入描述').fill('E2E测试创建的机器')
  62. // 提交表单
  63. await page.getByRole('dialog').getByRole('button', { name: '确定' }).click()
  64. // 等待成功消息
  65. await expect(page.locator('.el-message--success')).toBeVisible({ timeout: 10000 })
  66. // 验证弹窗关闭
  67. await expect(page.getByRole('dialog')).not.toBeVisible({ timeout: 5000 })
  68. // 验证新机器出现在列表中
  69. await expect(page.getByText(machineId)).toBeVisible({ timeout: 5000 })
  70. await expect(page.getByText(machineName)).toBeVisible()
  71. })
  72. test('编辑机器功能', async ({ page }) => {
  73. await login(page)
  74. await page.goto('/machine')
  75. // 等待表格加载
  76. await expect(page.locator('.el-table')).toBeVisible()
  77. await page.waitForTimeout(1000)
  78. // 找到第一行的编辑按钮
  79. const firstEditButton = page.locator('.el-table__body-wrapper').getByText('编辑').first()
  80. // 检查是否有数据可编辑
  81. const editButtonCount = await firstEditButton.count()
  82. if (editButtonCount === 0) {
  83. test.skip()
  84. return
  85. }
  86. await firstEditButton.click()
  87. // 验证弹窗打开
  88. await expect(page.getByRole('dialog')).toBeVisible()
  89. await expect(page.locator('.el-dialog__title')).toContainText('编辑机器')
  90. // 修改名称
  91. const nameInput = page.getByPlaceholder('请输入名称')
  92. await nameInput.clear()
  93. await nameInput.fill(`编辑测试_${Date.now()}`)
  94. // 提交
  95. await page.getByRole('dialog').getByRole('button', { name: '确定' }).click()
  96. // 等待成功消息
  97. await expect(page.locator('.el-message--success')).toBeVisible({ timeout: 10000 })
  98. // 验证弹窗关闭
  99. await expect(page.getByRole('dialog')).not.toBeVisible({ timeout: 5000 })
  100. })
  101. test('删除机器功能', async ({ page }) => {
  102. await login(page)
  103. await page.goto('/machine')
  104. // 先创建一个测试机器用于删除
  105. const machineId = `DEL_${Date.now()}`
  106. const machineName = `待删除机器_${Date.now()}`
  107. // 新增机器
  108. await page.getByRole('button', { name: '新增机器' }).click()
  109. await page.getByPlaceholder('请输入机器ID').fill(machineId)
  110. await page.getByPlaceholder('请输入名称').fill(machineName)
  111. await page.getByRole('dialog').getByRole('button', { name: '确定' }).click()
  112. await expect(page.locator('.el-message--success')).toBeVisible({ timeout: 10000 })
  113. await page.waitForTimeout(1000)
  114. // 找到刚创建的机器的删除按钮
  115. const row = page.locator('.el-table__row').filter({ hasText: machineId })
  116. await row.getByText('删除').click()
  117. // 确认删除对话框
  118. await expect(page.locator('.el-message-box')).toBeVisible()
  119. await page.locator('.el-message-box').getByRole('button', { name: '确定' }).click()
  120. // 等待成功消息
  121. await expect(page.locator('.el-message--success')).toBeVisible({ timeout: 10000 })
  122. // 验证机器从列表中消失
  123. await expect(page.getByText(machineId)).not.toBeVisible({ timeout: 5000 })
  124. })
  125. test('新增机器表单验证', async ({ page }) => {
  126. await login(page)
  127. await page.goto('/machine')
  128. // 点击新增按钮
  129. await page.getByRole('button', { name: '新增机器' }).click()
  130. await expect(page.getByRole('dialog')).toBeVisible()
  131. // 直接点击确定,不填写任何内容
  132. await page.getByRole('dialog').getByRole('button', { name: '确定' }).click()
  133. // 验证显示验证错误
  134. await expect(page.getByText('请输入机器ID')).toBeVisible()
  135. await expect(page.getByText('请输入名称')).toBeVisible()
  136. })
  137. test('取消新增机器', async ({ page }) => {
  138. await login(page)
  139. await page.goto('/machine')
  140. // 点击新增按钮
  141. await page.getByRole('button', { name: '新增机器' }).click()
  142. await expect(page.getByRole('dialog')).toBeVisible()
  143. // 填写部分内容
  144. await page.getByPlaceholder('请输入机器ID').fill('TEST_CANCEL')
  145. // 点击取消
  146. await page.getByRole('dialog').getByRole('button', { name: '取消' }).click()
  147. // 验证弹窗关闭
  148. await expect(page.getByRole('dialog')).not.toBeVisible()
  149. })
  150. test('从侧边栏导航到机器管理', async ({ page }) => {
  151. await login(page)
  152. // 点击侧边栏机器管理菜单
  153. await page.getByText('机器管理').click()
  154. // 验证跳转到机器管理页面
  155. await expect(page).toHaveURL(/\/machine/)
  156. await expect(page.getByRole('button', { name: '新增机器' })).toBeVisible()
  157. })
  158. })