import { expect, type Locator, type Page } from '@playwright/test'; import { BasePage } from './BasePage'; import { IPaymentDetails } from 'safelite-playwright-core'; export class PaypalPage extends BasePage { readonly page: Page; readonly loginWithPasswordButton: Locator; readonly usernameTextBox: Locator; readonly nextButton: Locator; readonly usePasswordInsteadButton: Locator; readonly passwordTextBox: Locator; readonly paypalLoginButton: Locator; readonly completePurchaseButton: Locator; readonly payWithRadioButton: Locator; readonly payButton: Locator; readonly tryAnotherWayButton: Locator; constructor(page: Page) { super(page); this.page = page; this.usernameTextBox = page.locator('#email'); this.nextButton = page.getByRole('button', { name: 'Next' }); this.loginWithPasswordButton = page.getByRole('link', { name: 'Log in with a password instead' }) this.usePasswordInsteadButton = page.getByRole('button', { name: 'Use password instead' }); this.passwordTextBox = page.getByPlaceholder('Password'); this.paypalLoginButton = page.getByRole('button', { name: 'Log In', exact: true }); this.completePurchaseButton = page.getByTestId('submit-button-initial') this.payWithRadioButton = page.getByRole('button').filter({ hasText: 'Pay with' }); this.payButton = page.locator('footer #one-time-cta'); this.tryAnotherWayButton = page.getByRole('button', { name: 'Try another way' }); } async completePaypalPurchase(paymentDetails: IPaymentDetails){ // Wait for the PayPal login page to load await this.page.waitForFunction(() => window.location.href.includes('sandbox.paypal.com'), null, { timeout: 10000 }); // handle flow with and without the "Log in with a password instead" link if (await this.loginWithPasswordButton.isVisible()) { await this.loginWithPasswordButton.click(); await this.passwordTextBox.fill(paymentDetails.password!); await this.paypalLoginButton.click(); await this.completePurchaseButton.click(); } else { await this.usernameTextBox.waitFor({ state: 'visible' }); await this.page.screenshot({ path: `test-results\\ortoni-data\\paypal-username-${Date.now()}.png`, fullPage: true }); await this.usernameTextBox.fill(paymentDetails.username!); await this.nextButton.click(); await this.tryAnotherWayButton.click(); await this.usePasswordInsteadButton.click(); await this.passwordTextBox.fill(paymentDetails.password!); await this.paypalLoginButton.click(); await this.payWithRadioButton.click(); await this.page.waitForTimeout(2000); await this.payButton.dblclick(); } } }