From 5c92fe832227f76c80fe8febe026892944337aa1 Mon Sep 17 00:00:00 2001 From: maguire-arman Date: Tue, 20 May 2025 10:06:03 -0400 Subject: [PATCH] Adapts PayPal login flow for different scenarios Adjusts the PayPal purchase completion logic to handle cases where the "Log in with password" option is immediately visible or requires an initial login step with email. This ensures a more robust and reliable payment process across different PayPal configurations. --- playwright-tests/pages/PaypalPage.ts | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/playwright-tests/pages/PaypalPage.ts b/playwright-tests/pages/PaypalPage.ts index 25a5be26b..7afda3d5b 100644 --- a/playwright-tests/pages/PaypalPage.ts +++ b/playwright-tests/pages/PaypalPage.ts @@ -11,26 +11,38 @@ export class PaypalPage extends BasePage { readonly passwordTextBox: Locator; readonly paypalLoginButton: Locator; readonly completePurchaseButton: Locator; + readonly payButton: Locator; constructor(page: Page) { super(page); this.page = page; this.usernameTextBox = page.getByPlaceholder('Email'); this.nextButton = page.getByRole('button', { name: 'Next' }); - this.loginWithPasswordButton = page.getByRole('button', { name: 'Use Password Instead' }); + 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.getByRole('button', { name: 'Pay $' }); + this.completePurchaseButton = page.getByTestId('submit-button-initial') + this.payButton = page.getByRole('button', { name: 'Pay $' }); } async completePaypalPurchase(paymentDetails: IPaymentDetails){ - if (!await this.loginWithPasswordButton.isVisible()) { + // 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.fill(paymentDetails.username!); await this.nextButton.click(); + await this.usePasswordInsteadButton.click(); + await this.passwordTextBox.fill(paymentDetails.password!); + await this.paypalLoginButton.click(); + await this.payButton.click(); } - await this.loginWithPasswordButton.click(); - await this.passwordTextBox.fill(paymentDetails.password!); - await this.paypalLoginButton.click(); - await this.completePurchaseButton.click(); } }