login.page.ts 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. import { TIMEOUTS } from '../../utils/timeouts';
  2. import { Page, Locator, expect } from '@playwright/test';
  3. export class AdminLoginPage {
  4. readonly page: Page;
  5. readonly usernameInput: Locator;
  6. readonly passwordInput: Locator;
  7. readonly submitButton: Locator;
  8. readonly togglePasswordButton: Locator;
  9. readonly pageTitle: Locator;
  10. readonly welcomeText: Locator;
  11. readonly successToast: Locator;
  12. readonly errorToast: Locator;
  13. readonly usernameError: Locator;
  14. readonly passwordError: Locator;
  15. readonly testAccountInfo: Locator;
  16. readonly loadingSpinner: Locator;
  17. readonly backgroundElement: Locator;
  18. readonly loginCard: Locator;
  19. constructor(page: Page) {
  20. this.page = page;
  21. this.usernameInput = page.getByPlaceholder('请输入用户名');
  22. this.passwordInput = page.getByPlaceholder('请输入密码');
  23. this.submitButton = page.getByRole('button', { name: '登录' });
  24. this.togglePasswordButton = page.locator('button:has(svg)').last();
  25. this.pageTitle = page.getByRole('heading', { name: '管理后台登录' });
  26. this.welcomeText = page.getByText('请输入您的账号和密码继续操作');
  27. this.successToast = page.locator('[data-sonner-toast][data-type="success"]');
  28. this.errorToast = page.locator('[data-sonner-toast][data-type="error"]');
  29. this.usernameError = page.locator('text=请输入用户名');
  30. this.passwordError = page.locator('text=请输入密码');
  31. this.testAccountInfo = page.locator('text=测试账号:');
  32. this.loadingSpinner = page.locator('[aria-busy="true"], .loading-spinner, .spinner');
  33. this.backgroundElement = page.locator('div.flex.items-center.justify-center').first();
  34. this.loginCard = page.locator('.shadow-xl').first();
  35. }
  36. async goto() {
  37. await this.page.goto('/admin/login');
  38. await this.page.waitForLoadState('networkidle');
  39. }
  40. async expectLoginSuccess() {
  41. // 登录成功后应该重定向到管理后台dashboard
  42. await expect(this.page).toHaveURL('/admin/dashboard');
  43. await expect(this.page.locator('text=登录成功')).toBeVisible();
  44. }
  45. async expectLoginError() {
  46. await expect(this.errorToast).toBeVisible();
  47. }
  48. async expectToBeVisible(options?: { timeout?: number }) {
  49. await expect(this.pageTitle).toBeVisible(options);
  50. await expect(this.usernameInput).toBeVisible(options);
  51. await expect(this.passwordInput).toBeVisible(options);
  52. await expect(this.submitButton).toBeVisible(options);
  53. }
  54. async login(username: string, password: string) {
  55. await this.usernameInput.fill(username);
  56. await this.passwordInput.fill(password);
  57. await this.submitButton.click();
  58. // 等待登录完成
  59. await this.page.waitForLoadState('networkidle');
  60. await this.page.waitForTimeout(TIMEOUTS.VERY_LONG);
  61. }
  62. clone(newPage: Page): AdminLoginPage {
  63. return new AdminLoginPage(newPage);
  64. }
  65. }