login.page.ts 2.7 KB

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