const { chromium } = require("playwright"); const { randomUUID } = require("crypto"); (async () => { console.log("šŸŽ­ Starting Live UI Testing Demo\n"); const testEmail = `testcompany${randomUUID().slice(0, 8)}@test.com`; const testPassword = "TestPassword123!"; const testCompanyName = `Test Company ${randomUUID().slice(0, 6)}`; const firstName = "John"; const lastName = "Doe"; console.log("šŸ“§ Test Email:", testEmail); console.log("šŸ‘¤ Name:", firstName, lastName); console.log("šŸ¢ Company Name:", testCompanyName); console.log("\nšŸš€ Launching Chromium browser with visible window...\n"); const browser = await chromium.launch({ headless: false, slowMo: 800, args: ["--window-size=1400,900"], }); const context = await browser.newContext({ viewport: { width: 1400, height: 900 }, }); const page = await context.newPage(); try { // Step 1: Navigate to signup console.log("šŸ“ Step 1: Opening signup page..."); await page.goto("http://localhost:3001/signup?intent=company"); await page.waitForTimeout(3000); // Step 2: Fill ALL required fields console.log("āœļø Step 2: Filling ALL required fields...\n"); // First Name console.log(" → First Name..."); const firstNameInput = await page .locator('input[name="firstName"], input[placeholder*="First"]') .first(); await firstNameInput.fill(firstName); await page.waitForTimeout(500); // Last Name console.log(" → Last Name..."); const lastNameInput = await page .locator('input[name="lastName"], input[placeholder*="Last"]') .first(); await lastNameInput.fill(lastName); await page.waitForTimeout(500); // Email console.log(" → Email..."); const emailInput = await page .locator('input[type="email"], input[name="email"]') .first(); await emailInput.fill(testEmail); await page.waitForTimeout(500); // Password console.log(" → Password..."); const passwordInput = await page.locator('input[name="password"]').first(); await passwordInput.fill(testPassword); await page.waitForTimeout(500); // Confirm Password console.log(" → Confirm Password..."); const confirmInput = await page .locator('input[name="confirmPassword"], input[name="confirm"]') .first(); await confirmInput.fill(testPassword); await page.waitForTimeout(500); // CAPTCHA - Read the code from the canvas/image console.log(" → Reading CAPTCHA code..."); const captchaText = await page .locator(".captcha-code, [data-captcha], .captcha-display") .textContent() .catch(() => null); if (captchaText) { console.log(" → CAPTCHA found:", captchaText.trim()); const captchaInput = await page .locator('input[name="captcha"], input[placeholder*="CAPTCHA"]') .first(); await captchaInput.fill(captchaText.trim()); } else { console.log(" → CAPTCHA not readable, will try to find input..."); // Try to get from a data attribute or regenerate const captchaInput = await page.locator('input[name="captcha"]').first(); if (captchaInput) { // Look for any visible captcha text const captchaCode = await page.evaluate(() => { const el = document.querySelector( ".captcha-code, .captcha-text, [data-captcha]", ); return el ? el.textContent || el.getAttribute("data-captcha") : null; }); if (captchaCode) { await captchaInput.fill(captchaCode.trim()); console.log(" → CAPTCHA filled:", captchaCode.trim()); } } } await page.waitForTimeout(500); // Terms Checkbox console.log(" → Checking Terms & Conditions..."); const termsCheckbox = await page .locator( 'input[type="checkbox"][name*="terms"], input[type="checkbox"][name*="agree"]', ) .first(); if (termsCheckbox) { await termsCheckbox.check(); console.log(" āœ… Terms checkbox checked"); } await page.waitForTimeout(500); console.log("\nāœ… All fields filled!"); await page.waitForTimeout(2000); // Step 3: Submit signup console.log("\nšŸ“¤ Step 3: Clicking Sign Up button..."); const submitBtn = await page .locator( 'button[type="submit"]:has-text("Sign"), button:has-text("Create"), button:has-text("Register")', ) .first(); // Check if button is enabled const isDisabled = await submitBtn.isDisabled().catch(() => false); if (isDisabled) { console.log("āš ļø Button is disabled - checking what field is missing..."); // Take screenshot to debug await page.screenshot({ path: "./test-results/signup-debug.png", fullPage: true, }); } else { await submitBtn.click(); console.log("āœ… Sign Up button clicked"); } await page.waitForTimeout(5000); // Step 4: Check current page const currentUrl = page.url(); console.log("\nšŸ“ Current URL:", currentUrl); if (currentUrl.includes("verify") || currentUrl.includes("otp")) { console.log("šŸ“§ Step 4: OTP verification page detected"); console.log(" → Entering OTP..."); // Fill OTP (6 digits) const otpDigits = ["1", "2", "3", "4", "5", "6"]; for (let i = 0; i < 6; i++) { const otpInput = await page .locator(`input[name="otp${i}"], input[aria-label*="digit ${i + 1}"]`) .first(); if (otpInput) { await otpInput.fill(otpDigits[i]); await page.waitForTimeout(200); } } // Submit OTP const verifyBtn = await page .locator('button:has-text("Verify"), button[type="submit"]') .first(); await verifyBtn.click(); console.log("āœ… OTP submitted"); await page.waitForTimeout(4000); } // Step 5: Select Company role if on role selection page console.log("\nšŸŽÆ Step 5: Checking for role selection..."); const roleOption = await page.locator("text=Company").first(); if (await roleOption.isVisible().catch(() => false)) { await roleOption.click(); console.log("āœ… Company role selected"); await page.waitForTimeout(3000); } // Step 6: Fill Company Profile console.log("\nšŸ“ Step 6: Filling company profile..."); // Company name const nameInputs = await page .locator( 'input[name*="company"], input[name*="name"], input[placeholder*="Company"]', ) .all(); for (const input of nameInputs.slice(0, 3)) { try { const placeholder = await input.getAttribute("placeholder"); const name = await input.getAttribute("name"); if ( placeholder?.toLowerCase().includes("company") || name?.toLowerCase().includes("company") ) { await input.fill(testCompanyName); console.log(" āœ… Company name:", testCompanyName); break; } } catch (e) {} } await page.waitForTimeout(1000); // Fill other profile fields const inputs = await page.locator("input, textarea, select").all(); for (const input of inputs) { try { const type = await input.getAttribute("type"); const name = await input.getAttribute("name"); const tagName = await input.evaluate((el) => el.tagName.toLowerCase()); if (tagName === "select") { // Select dropdown const options = await input.locator("option").all(); if (options.length > 1) { await input.selectOption({ index: 1 }); } } else if (type === "email" || name?.includes("email")) { await input.fill(testEmail); } else if (name?.includes("phone") || name?.includes("contact")) { await input.fill("+91 9876543210"); } else if (name?.includes("city")) { await input.fill("Bangalore"); } else if (name?.includes("state")) { await input.fill("Karnataka"); } else if (name?.includes("country")) { await input.fill("India"); } else if (name?.includes("address")) { await input.fill("123 Tech Park, Bangalore"); } else if (name?.includes("website")) { await input.fill("https://testcompany.com"); } else if (name?.includes("industry")) { await input.fill("Technology"); } else if (name?.includes("description") || name?.includes("about")) { await input.fill( "We are a technology company looking for talented professionals to join our team. We offer competitive salaries and a great work environment.", ); } else if (type === "text" && !name?.includes("name")) { // Fill any empty text fields const value = await input.inputValue(); if (!value) { await input.fill("Test Data"); } } } catch (e) {} } console.log(" āœ… Profile fields filled"); await page.waitForTimeout(2000); // Step 7: Submit for verification console.log("\nšŸš€ Step 7: Submitting profile for verification..."); const profileSubmitBtn = await page .locator( 'button[type="submit"], button:has-text("Submit"), button:has-text("Save"), button:has-text("Continue")', ) .first(); await profileSubmitBtn.click(); console.log("āœ… Profile submitted"); await page.waitForTimeout(5000); // Take screenshot await page.screenshot({ path: "./test-results/after-profile-submit.png", fullPage: true, }); console.log("šŸ“ø Screenshot saved: after-profile-submit.png"); // Step 8: Open Admin Panel in new tab console.log("\nšŸ” Step 8: Opening admin panel..."); const adminPage = await context.newPage(); await adminPage.goto("http://localhost:3000/login"); await adminPage.waitForTimeout(3000); // Admin login console.log("šŸ”‘ Logging into admin panel..."); const adminEmailInput = await adminPage .locator('input[type="email"], input[name="email"]') .first(); await adminEmailInput.fill("admin@nxtgauge.com"); await adminPage.waitForTimeout(500); const adminPasswordInput = await adminPage .locator('input[type="password"]') .first(); await adminPasswordInput.fill("admin123"); await adminPage.waitForTimeout(500); const adminLoginBtn = await adminPage .locator('button[type="submit"]') .first(); await adminLoginBtn.click(); console.log("āœ… Admin login submitted"); await adminPage.waitForTimeout(4000); // Step 9: Navigate to Verifications console.log("\nšŸ” Step 9: Navigating to Verification Management..."); await adminPage.goto("http://localhost:3000/admin/verification"); await adminPage.waitForTimeout(4000); // Step 10: Search for the company console.log("\nšŸ”Ž Step 10: Searching for submitted company..."); const searchInput = await adminPage .locator( 'input[type="search"], input[name="search"], input[placeholder*="search"]', ) .first(); if (searchInput) { await searchInput.fill(testCompanyName); console.log(` āœ… Searching for: ${testCompanyName}`); await adminPage.waitForTimeout(3000); } // Take final screenshot await adminPage.screenshot({ path: "./test-results/admin-verification.png", fullPage: true, }); console.log("šŸ“ø Screenshot saved: admin-verification.png"); // Check if company is found const companyFound = await adminPage .locator(`text=${testCompanyName}`) .isVisible() .catch(() => false); if (companyFound) { console.log( "\nāœ… SUCCESS! Company verification request found in admin panel!", ); console.log(` Company: ${testCompanyName}`); console.log(` Email: ${testEmail}`); } else { console.log("\nāš ļø Company not immediately visible. Check:"); console.log(" - Filters may need adjustment"); console.log(" - Verification may still be processing"); console.log(" - Try searching by email instead"); } console.log("\nā³ Keeping browser open for 20 seconds..."); console.log(" Screenshots saved in ./test-results/"); await new Promise((resolve) => setTimeout(resolve, 20000)); } catch (error) { console.error("\nāŒ Error:", error.message); await page.screenshot({ path: "./test-results/error.png", fullPage: true }); } finally { await context.close(); await browser.close(); console.log("\nāœ… Test completed"); } })();