login-failure.cy.ts 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. /**
  2. * 测试文件: 阶段1-登录与注册
  3. * 路径: 异常1-登录失败
  4. *
  5. * 路径分析:
  6. * - POM: LoginPage
  7. * - Mock: mockLoginFail()
  8. * - 规格:
  9. * ✓ 输入错误的用户名和密码
  10. * ✓ 系统显示错误提示 "登录失败"
  11. * ✓ 停留在登录页面
  12. * - 需要新建: 无
  13. * - 需要添加: 错误提示的data-testid(可选,可用文本查找)
  14. * - 已有的data-testid:
  15. * - login-username-input - 用户名输入框
  16. * - login-password-input - 密码输入框
  17. * - login-submit-button - 登录按钮
  18. */
  19. import { mockLoginFail } from '../../support/mock/handlers/user';
  20. import LoginPage from '../../support/pageObjects/LoginPage';
  21. describe('阶段1:登录与注册 - 异常1:登录失败', () => {
  22. const loginPage = new LoginPage();
  23. beforeEach(() => {
  24. // 设置Mock API - 登录失败场景
  25. mockLoginFail();
  26. });
  27. it('应该显示错误提示并停留在登录页面', () => {
  28. /**
  29. * Given: 用户在登录页面
  30. * 步骤1: 打开登录界面(隐含)
  31. */
  32. loginPage.visit();
  33. // 验证登录页面元素可见
  34. loginPage.getUsernameInput().should('be.visible');
  35. loginPage.getPasswordInput().should('be.visible');
  36. loginPage.getSubmitButton().should('be.visible');
  37. /**
  38. * When: 用户输入错误的用户名和密码
  39. * 步骤1: 输入错误的用户名/密码
  40. */
  41. loginPage.login('wronguser', 'wrongpassword');
  42. /**
  43. * Then: 系统提示错误
  44. * 步骤2: 系统提示错误
  45. */
  46. // 等待登录API响应
  47. cy.wait('@loginFail').then((interception) => {
  48. // 验证API返回错误
  49. expect(interception.response?.statusCode).to.eq(200);
  50. expect(interception.response?.body.code).to.eq('0x000001');
  51. expect(interception.response?.body.description).to.include('Invalid username or password');
  52. });
  53. /**
  54. * Then: 显示登录失败提示,停留在登录页面
  55. * 步骤2-3: 系统提示错误 → 超过限制 → 账号锁定(本测试只验证单次失败)
  56. */
  57. // 验证显示登录失败提示
  58. cy.contains('登录失败').should('be.visible', { timeout: 10000 });
  59. /**
  60. * Then: 用户停留在登录页面
  61. * 验证仍在登录页面 - 登录按钮仍然可见
  62. */
  63. loginPage.getSubmitButton().should('be.visible');
  64. // 验证用户名输入框仍然可见(确认没有跳转)
  65. loginPage.getUsernameInput().should('be.visible');
  66. });
  67. });