machine.spec.ts 7.3 KB

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