diff --git a/sidecars/reddit-post/tests/reddit-post.spec.js b/sidecars/reddit-post/tests/reddit-post.spec.js index f540bc6..5a396db 100644 --- a/sidecars/reddit-post/tests/reddit-post.spec.js +++ b/sidecars/reddit-post/tests/reddit-post.spec.js @@ -42,16 +42,41 @@ test.describe('reddit post', () => { try { await page.goto('https://www.reddit.com/login/'); - await page.fill('input[name="username"]', /** @type {string} */ (username)); - await page.fill('input[name="password"]', /** @type {string} */ (password)); - await page.click('button[type="submit"]'); + const blockedHeading = page.getByText(/blocked by network security/i); + if (await blockedHeading.isVisible({ timeout: 3_000 }).catch(() => false)) { + outcome = { + success: false, + error: 'Reddit blocked this request at the network level ("blocked by network security") before login could be attempted — this is not a credentials or selector issue, it means the current network/IP is being flagged as automation by Reddit', + }; + outcomeFinalized = true; + throw new Error(outcome.error); + } + + const rejectCookies = page.getByRole('button', { name: 'Reject Optional Cookies' }); + if (await rejectCookies.isVisible({ timeout: 5_000 }).catch(() => false)) { + await rejectCookies.click(); + } + + const usernameField = page.getByLabel(/email or username/i); + await usernameField.click(); + await usernameField.fill(/** @type {string} */ (username)); + + const passwordField = page.getByLabel(/^password/i); + await passwordField.click(); + await passwordField.fill(/** @type {string} */ (password)); + + await page.getByRole('button', { name: 'Log In' }).click(); try { await expect(page.locator('span[name="avatar"], #USER_DROPDOWN_ID, [icon-name="account-circle-outline"]').first()).toBeVisible({ timeout: 20_000 }); } catch { + const loginErrorBanner = page.getByText(/something went wrong logging in|invalid username|invalid password/i); + const bannerText = await loginErrorBanner.first().textContent().catch(() => null); outcome = { success: false, - error: 'Login did not complete — possible CAPTCHA, 2FA prompt, or invalid credentials', + error: bannerText + ? `Login failed: ${bannerText.trim()}` + : 'Login did not complete — possible CAPTCHA, 2FA prompt, or invalid credentials', }; outcomeFinalized = true; throw new Error(outcome.error);