const puppeteer = require('puppeteer'); const fs = require('fs'); const sleep = ms => new Promise(r => setTimeout(r, ms)); (async () => { const browser = await puppeteer.launch({ headless: false, args: ['--no-sandbox', '--disable-setuid-sandbox'] }); const page = await browser.newPage(); console.log('šŸš€ Navigating to Reonomy...'); await page.goto('https://app.reonomy.com/#!/account', { waitUntil: 'networkidle2' }); // Fill credentials console.log('šŸ“ Filling credentials...'); await page.type('input[type="email"]', 'henry@realestateenhanced.com', { delay: 100 }); await page.type('input[type="password"]', '9082166532', { delay: 100 }); // Click login console.log('šŸ” Clicking login...'); await Promise.race([ page.click('button[type="submit"]'), sleep(2000) ]); // Wait for redirect console.log('ā³ Waiting for redirect...'); await sleep(10000); const currentUrl = page.url(); console.log('Current URL:', currentUrl); // If still on login page, something went wrong if (currentUrl.includes('login')) { console.log('āŒ Still on login page. Checking for errors...'); const pageContent = await page.content(); fs.writeFileSync('/tmp/reonomy-login-error.html', pageContent); console.log('šŸ“„ Saved login page HTML to /tmp/reonomy-login-error.html'); await page.screenshot({ path: '/tmp/reonomy-login-error.png' }); await browser.close(); process.exit(1); } // Navigate to search page console.log('šŸ” Navigating to search...'); await page.goto('https://app.reonomy.com/#!/search', { waitUntil: 'networkidle2' }); await sleep(5000); console.log('šŸ“ø Taking screenshot of search results...'); await page.screenshot({ path: '/tmp/reonomy-search-results.png', fullPage: true }); console.log('šŸ’¾ Saved to /tmp/reonomy-search-results.png'); // Find a property or owner link console.log('šŸ”Ž Looking for property/owner links...'); const links = await page.evaluate(() => { const results = []; const propertyLinks = document.querySelectorAll('a[href*="/property/"]'); const ownerLinks = document.querySelectorAll('a[href*="/person/"]'); propertyLinks.forEach((link, i) => { if (i < 3) { results.push({ type: 'property', url: link.href, text: link.textContent.trim().substring(0, 50) }); } }); ownerLinks.forEach((link, i) => { if (i < 3) { results.push({ type: 'owner', url: link.href, text: link.textContent.trim().substring(0, 50) }); } }); return results; }); console.log('Found links:', JSON.stringify(links, null, 2)); // Navigate to first owner page to inspect contact info const firstOwner = links.find(l => l.type === 'owner'); if (firstOwner) { console.log(`\nšŸ‘¤ Navigating to owner page: ${firstOwner.url}`); await page.goto(firstOwner.url, { waitUntil: 'networkidle2' }); await sleep(5000); console.log('šŸ“ø Taking screenshot of owner page...'); await page.screenshot({ path: '/tmp/reonomy-owner-page.png', fullPage: true }); console.log('šŸ’¾ Saved to /tmp/reonomy-owner-page.png'); // Save HTML for inspection const html = await page.content(); fs.writeFileSync('/tmp/reonomy-owner-page.html', html); console.log('šŸ“„ Saved HTML to /tmp/reonomy-owner-page.html'); // Look for email/phone patterns in the page console.log('\nšŸ” Looking for email/phone patterns...'); const contactInfo = await page.evaluate(() => { const results = { emailElements: [], phoneElements: [], allContactSelectors: [] }; // Check various selectors const selectors = [ 'a[href^="mailto:"]', 'a[href^="tel:"]', '[class*="email"]', '[class*="phone"]', '[class*="contact"]', '[data-testid*="email"]', '[data-testid*="phone"]', '[data-test*="email"]', '[data-test*="phone"]', '.email-address', '.phone-number', '.contact-info' ]; selectors.forEach(sel => { const elements = document.querySelectorAll(sel); if (elements.length > 0) { results.allContactSelectors.push({ selector: sel, count: elements.length }); Array.from(elements).forEach((el, i) => { if (i < 3) { results.allContactSelectors.push({ selector: sel, text: el.textContent.trim().substring(0, 100), html: el.outerHTML.substring(0, 200) }); } }); } }); // Specific: email links document.querySelectorAll('a[href^="mailto:"]').forEach((el, i) => { if (i < 5) { results.emailElements.push({ href: el.href, text: el.textContent.trim() }); } }); // Specific: phone links document.querySelectorAll('a[href^="tel:"]').forEach((el, i) => { if (i < 5) { results.phoneElements.push({ href: el.href, text: el.textContent.trim() }); } }); return results; }); console.log('\nšŸ“Š Contact Info Analysis:'); console.log('Email elements:', JSON.stringify(contactInfo.emailElements, null, 2)); console.log('\nPhone elements:', JSON.stringify(contactInfo.phoneElements, null, 2)); console.log('\nAll matching selectors:', JSON.stringify(contactInfo.allContactSelectors.slice(0, 20), null, 2)); fs.writeFileSync('/tmp/reonomy-contact-analysis.json', JSON.stringify(contactInfo, null, 2)); console.log('\nšŸ’¾ Full analysis saved to /tmp/reonomy-contact-analysis.json'); } else { console.log('āš ļø No owner links found on search page'); } console.log('\nāœ… Inspection complete!'); console.log(' Files saved:'); console.log(' - /tmp/reonomy-search-results.png'); console.log(' - /tmp/reonomy-owner-page.png'); console.log(' - /tmp/reonomy-owner-page.html'); console.log(' - /tmp/reonomy-contact-analysis.json'); console.log('\nšŸ” Browser is open for manual inspection.'); console.log(' Press Ctrl+C in terminal to close it.'); // Keep browser open await new Promise(() => {}); await browser.close(); })();