app.spec.js 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278
  1. const { test, expect } = require('@playwright/test');
  2. const BASE_URL = 'http://localhost:3000';
  3. const TEST_ADMIN = { username: 'admin', password: 'admin123' };
  4. test.describe('登录模块', () => {
  5. test('TC-001: 正常登录', async ({ page }) => {
  6. await page.goto(`${BASE_URL}/#/login`);
  7. await page.waitForLoadState('networkidle');
  8. await page.fill('input[placeholder="请输入用户名"]', TEST_ADMIN.username);
  9. await page.fill('input[type="password"]', TEST_ADMIN.password);
  10. await page.click('button:has-text("登 录")');
  11. await page.waitForURL(`${BASE_URL}/#/**`, { timeout: 10000 });
  12. });
  13. test('TC-002: 用户名为空验证', async ({ page }) => {
  14. await page.goto(`${BASE_URL}/#/login`);
  15. await page.fill('input[type="password"]', TEST_ADMIN.password);
  16. await page.click('button:has-text("登 录")');
  17. await expect(page.locator('text=请输入用户名')).toBeVisible();
  18. });
  19. test('TC-003: 密码为空验证', async ({ page }) => {
  20. await page.goto(`${BASE_URL}/#/login`);
  21. await page.fill('input[placeholder="请输入用户名"]', TEST_ADMIN.username);
  22. await page.click('button:has-text("登 录")');
  23. await expect(page.locator('text=请输入密码')).toBeVisible();
  24. });
  25. test('TC-004: 错误账号登录', async ({ page }) => {
  26. await page.goto(`${BASE_URL}/#/login`);
  27. await page.fill('input[placeholder="请输入用户名"]', 'wronguser');
  28. await page.fill('input[type="password"]', 'wrongpass');
  29. await page.click('button:has-text("登 录")');
  30. await page.waitForTimeout(2000);
  31. });
  32. });
  33. test.describe('用户管理模块', () => {
  34. test.beforeEach(async ({ page }) => {
  35. await page.goto(`${BASE_URL}/#/login`);
  36. await page.fill('input[placeholder="请输入用户名"]', TEST_ADMIN.username);
  37. await page.fill('input[type="password"]', TEST_ADMIN.password);
  38. await page.click('button:has-text("登 录")');
  39. await page.waitForURL(`${BASE_URL}/#/**`, { timeout: 10000 });
  40. });
  41. test('TC-010: 查看用户列表', async ({ page }) => {
  42. await page.click('text=用户管理');
  43. await page.waitForTimeout(1000);
  44. await expect(page.locator('text=用户列表')).toBeVisible();
  45. });
  46. test('TC-011: 手机号格式验证', async ({ page }) => {
  47. await page.click('text=用户管理');
  48. await page.waitForTimeout(1000);
  49. await page.click('button:has-text("新增用户")');
  50. await page.fill('input[placeholder="请输入姓名"]', '测试用户');
  51. await page.fill('input[placeholder="请输入手机号"]', '12345');
  52. await page.click('button:has-text("确 定")');
  53. await expect(page.locator('text=手机号格式错误')).toBeVisible();
  54. });
  55. test('TC-012: 肩宽范围验证-男性', async ({ page }) => {
  56. await page.click('text=用户管理');
  57. await page.waitForTimeout(1000);
  58. await page.click('button:has-text("新增用户")');
  59. await page.fill('input[placeholder="请输入姓名"]', '测试用户');
  60. await page.click('.el-select:has-text("请选择性别")');
  61. await page.click('li:has-text("男")');
  62. await page.fill('input[placeholder="请输入肩宽(cm)"]', '35');
  63. await page.click('button:has-text("确 定")');
  64. await expect(page.locator('text=男性肩宽范围为36-52cm')).toBeVisible();
  65. });
  66. test('TC-012B: 肩宽范围验证-女性', async ({ page }) => {
  67. await page.click('text=用户管理');
  68. await page.waitForTimeout(1000);
  69. await page.click('button:has-text("新增用户")');
  70. await page.fill('input[placeholder="请输入姓名"]', '测试用户');
  71. await page.click('.el-select:has-text("请选择性别")');
  72. await page.click('li:has-text("女")');
  73. await page.fill('input[placeholder="请输入肩宽(cm)"]', '50');
  74. await page.click('button:has-text("确 定")');
  75. await expect(page.locator('text=女性肩宽范围为32-46cm')).toBeVisible();
  76. });
  77. test('TC-013: 姓名必填验证', async ({ page }) => {
  78. await page.click('text=用户管理');
  79. await page.waitForTimeout(1000);
  80. await page.click('button:has-text("新增用户")');
  81. await page.click('button:has-text("确 定")');
  82. await expect(page.locator('text=姓名为必填项')).toBeVisible();
  83. });
  84. test('TC-014: 手机号必填验证', async ({ page }) => {
  85. await page.click('text=用户管理');
  86. await page.waitForTimeout(1000);
  87. await page.click('button:has-text("新增用户")');
  88. await page.fill('input[placeholder="请输入姓名"]', '测试用户');
  89. await page.click('button:has-text("确 定")');
  90. await expect(page.locator('text=手机号为必填项')).toBeVisible();
  91. });
  92. test('TC-015: 年龄范围验证', async ({ page }) => {
  93. await page.click('text=用户管理');
  94. await page.waitForTimeout(1000);
  95. await page.click('button:has-text("新增用户")');
  96. await page.fill('input[placeholder="请输入姓名"]', '测试用户');
  97. await page.fill('input[placeholder="请输入手机号"]', '13900000000');
  98. await page.fill('input[placeholder="请输入年龄"]', '150');
  99. await page.click('button:has-text("确 定")');
  100. await expect(page.locator('text=年龄范围')).toBeVisible();
  101. });
  102. test('TC-016: 编辑用户', async ({ page }) => {
  103. await page.click('text=用户管理');
  104. await page.waitForTimeout(1000);
  105. await page.click('button:has-text("编辑") >> nth=0');
  106. await page.waitForTimeout(500);
  107. await expect(page.locator('text=编辑用户')).toBeVisible();
  108. });
  109. test('TC-017: 删除用户-取消', async ({ page }) => {
  110. await page.click('text=用户管理');
  111. await page.waitForTimeout(1000);
  112. await page.click('button:has-text("删除") >> nth=0');
  113. await page.waitForTimeout(500);
  114. await page.click('button:has-text("取 消")');
  115. await expect(page.locator('text=用户列表')).toBeVisible();
  116. });
  117. });
  118. test.describe('穴位管理模块', () => {
  119. test.beforeEach(async ({ page }) => {
  120. await page.goto(`${BASE_URL}/#/login`);
  121. await page.fill('input[placeholder="请输入用户名"]', TEST_ADMIN.username);
  122. await page.fill('input[type="password"]', TEST_ADMIN.password);
  123. await page.click('button:has-text("登 录")');
  124. await page.waitForURL(`${BASE_URL}/#/**`, { timeout: 10000 });
  125. });
  126. test('TC-020: 查看穴位列表', async ({ page }) => {
  127. await page.click('text=穴位管理');
  128. await page.waitForTimeout(1000);
  129. await expect(page.locator('text=穴位列表')).toBeVisible();
  130. });
  131. test('TC-021: 新增穴位-名称必填验证', async ({ page }) => {
  132. await page.click('text=穴位管理');
  133. await page.waitForTimeout(1000);
  134. await page.click('button:has-text("新增穴位")');
  135. await page.waitForTimeout(500);
  136. await page.click('button:has-text("确 定")');
  137. await expect(page.locator('text=穴位名称为必填项')).toBeVisible();
  138. });
  139. });
  140. test.describe('方案管理模块', () => {
  141. test.beforeEach(async ({ page }) => {
  142. await page.goto(`${BASE_URL}/#/login`);
  143. await page.fill('input[placeholder="请输入用户名"]', TEST_ADMIN.username);
  144. await page.fill('input[type="password"]', TEST_ADMIN.password);
  145. await page.click('button:has-text("登 录")');
  146. await page.waitForURL(`${BASE_URL}/#/**`, { timeout: 10000 });
  147. });
  148. test('TC-030: 查看方案列表', async ({ page }) => {
  149. await page.click('text=方案管理');
  150. await page.waitForTimeout(1000);
  151. await expect(page.locator('text=方案列表')).toBeVisible();
  152. });
  153. test('TC-031: 新增方案-名称必填验证', async ({ page }) => {
  154. await page.click('text=方案管理');
  155. await page.waitForTimeout(1000);
  156. await page.click('button:has-text("新增方案")');
  157. await page.waitForTimeout(500);
  158. await page.click('button:has-text("确 定")');
  159. await expect(page.locator('text=方案名称为必填项')).toBeVisible();
  160. });
  161. test('TC-032: 查看方案详情', async ({ page }) => {
  162. await page.click('text=方案管理');
  163. await page.waitForTimeout(1000);
  164. await page.click('button:has-text("查看") >> nth=0');
  165. await page.waitForTimeout(500);
  166. await expect(page.locator('text=方案详情')).toBeVisible();
  167. });
  168. test('TC-033: 编辑方案', async ({ page }) => {
  169. await page.click('text=方案管理');
  170. await page.waitForTimeout(1000);
  171. await page.click('button:has-text("编辑") >> nth=0');
  172. await page.waitForTimeout(500);
  173. await expect(page.locator('text=编辑方案')).toBeVisible();
  174. });
  175. });
  176. test.describe('设备管理模块', () => {
  177. test.beforeEach(async ({ page }) => {
  178. await page.goto(`${BASE_URL}/#/login`);
  179. await page.fill('input[placeholder="请输入用户名"]', TEST_ADMIN.username);
  180. await page.fill('input[type="password"]', TEST_ADMIN.password);
  181. await page.click('button:has-text("登 录")');
  182. await page.waitForURL(`${BASE_URL}/#/**`, { timeout: 10000 });
  183. });
  184. test('TC-040: 查看设备列表', async ({ page }) => {
  185. await page.click('text=设备管理');
  186. await page.waitForTimeout(1000);
  187. await expect(page.locator('text=设备列表')).toBeVisible();
  188. });
  189. test('TC-041: 新增设备-编号必填验证', async ({ page }) => {
  190. await page.click('text=设备管理');
  191. await page.waitForTimeout(1000);
  192. await page.click('button:has-text("新增设备")');
  193. await page.waitForTimeout(500);
  194. await page.fill('input[placeholder="请输入设备名称"]', '测试设备');
  195. await page.click('button:has-text("确 定")');
  196. await expect(page.locator('text=设备编号为必填项')).toBeVisible();
  197. });
  198. test('TC-042: 查看设备详情', async ({ page }) => {
  199. await page.click('text=设备管理');
  200. await page.waitForTimeout(1000);
  201. await page.click('button:has-text("查看") >> nth=0');
  202. await page.waitForTimeout(500);
  203. await expect(page.locator('text=设备详情')).toBeVisible();
  204. });
  205. });
  206. test.describe('系统管理模块', () => {
  207. test.beforeEach(async ({ page }) => {
  208. await page.goto(`${BASE_URL}/#/login`);
  209. await page.fill('input[placeholder="请输入用户名"]', TEST_ADMIN.username);
  210. await page.fill('input[type="password"]', TEST_ADMIN.password);
  211. await page.click('button:has-text("登 录")');
  212. await page.waitForURL(`${BASE_URL}/#/**`, { timeout: 10000 });
  213. });
  214. test('TC-050: 查看管理员列表', async ({ page }) => {
  215. await page.click('text=系统管理');
  216. await page.click('text=管理员');
  217. await page.waitForTimeout(1000);
  218. await expect(page.locator('text=管理员列表')).toBeVisible();
  219. });
  220. test('TC-051: 查看操作日志', async ({ page }) => {
  221. await page.click('text=系统管理');
  222. await page.click('text=系统日志');
  223. await page.waitForTimeout(1000);
  224. await expect(page.locator('text=操作日志')).toBeVisible();
  225. });
  226. test('TC-052: 新增管理员-用户名必填验证', async ({ page }) => {
  227. await page.click('text=系统管理');
  228. await page.click('text=管理员');
  229. await page.waitForTimeout(1000);
  230. await page.click('button:has-text("新增管理员")');
  231. await page.waitForTimeout(500);
  232. await page.click('button:has-text("确 定")');
  233. await expect(page.locator('text=用户名为必填项')).toBeVisible();
  234. });
  235. test('TC-053: 新增管理员-密码格式验证', async ({ page }) => {
  236. await page.click('text=系统管理');
  237. await page.click('text=管理员');
  238. await page.waitForTimeout(1000);
  239. await page.click('button:has-text("新增管理员")');
  240. await page.waitForTimeout(500);
  241. await page.fill('input[placeholder="请输入用户名"]', 'testadmin');
  242. await page.fill('input[placeholder="请输入密码"]', '123');
  243. await page.click('button:has-text("确 定")');
  244. await expect(page.locator('text=密码需8-20字符')).toBeVisible();
  245. });
  246. });