const logger = require('./src/utils/logger');
const path = require('path');
// Use chrome-launcher and connect to it with puppeteer
(async () => {
try {
logger.info('[outlook-screenshot.js] Launching Chrome using chrome-launcher...', { fileName: 'outlook-screenshot.js' });
// Dynamically import chrome-launcher
const { launch } = await import('chrome-launcher');
// Launch Chrome with chrome-launcher using Promise chain instead of await
launch({
startingUrl: 'https://outlook.office.com/calendar/view/month',
chromeFlags: [
// '--disable-extensions',
'--new-window'
],
ignoreDefaultFlags: true,
logLevel: 'verbose',
userDataDir: 'C:\\Users\\idrees.khan1\\AppData\\Local\\Google\\Chrome\\User Data'
})
.then(chrome => {
logger.info(`[outlook-screenshot.js] Chrome launched with PID: ${chrome.pid} on port ${chrome.port}`, { fileName: 'outlook-screenshot.js' });
// Wait for Chrome to load the page
return new Promise(resolve => setTimeout(() => resolve(chrome), 10000));
})
.then(chrome => {
// Wait longer for Chrome to fully initialize and establish debugging server
logger.info('[outlook-screenshot.js] Waiting for Chrome debugging port to be available...', { fileName: 'outlook-screenshot.js' });
let portAvailable = false;
let maxRetries = 10;
(async function checkPort() {
for (let i = 0; i < maxRetries; i++) {
try {
// Check if the port is accessible
await new Promise((resolve, reject) => {
const net = require('net');
const socket = net.connect(chrome.port, '127.0.0.1');
socket.on('connect', () => {
socket.end();
portAvailable = true;
resolve();
});
socket.on('error', reject);
// Set timeout for connection attempt
setTimeout(() => {
socket.destroy();
reject(new Error('Connection timeout'));
}, 1000);
});
if (portAvailable) {
logger.info(`[outlook-screenshot.js] Chrome debugging port ${chrome.port} is now available`, { fileName: 'outlook-screenshot.js' });
break;
}
} catch (err) {
logger.warn(`[outlook-screenshot.js] Chrome debugging port not ready yet, retrying (${i+1}/${maxRetries})...`, { fileName: 'outlook-screenshot.js' });
await new Promise(resolve => setTimeout(resolve, 2000));
}
}
if (!portAvailable) {
throw new Error(`Chrome debugging port ${chrome.port} is not accessible after multiple attempts`);
}
// Now connect to Chrome with puppeteer using the chrome-launcher's port
logger.info('[outlook-screenshot.js] Connecting to Chrome with puppeteer...', { fileName: 'outlook-screenshot.js' });
const puppeteer = require('puppeteer-core');
// Connect to the Chrome instance that chrome-launcher started
const browser = await puppeteer.connect({
browserURL: `http://localhost:${chrome.port}`,
defaultViewport: { width: 1920, height: 1080 }
});
// Get the pages and use the first one (or create a new one)
const pages = await browser.pages();
const page = pages[0] || await browser.newPage();
// Navigate to Outlook (if not already there)
logger.info('[outlook-screenshot.js] Navigating to Outlook...', { fileName: 'outlook-screenshot.js' });
await page.goto('https://outlook.office.com/calendar/view/month', { waitUntil: 'networkidle2' });
// Wait a bit more to ensure dynamic content loads
await new Promise(resolve => setTimeout(resolve, 5000));
// Take a screenshot
logger.info('[outlook-screenshot.js] Taking screenshot...', { fileName: 'outlook-screenshot.js' });
const screenshotPath = path.join(__dirname, 'outlook.png');
await page.screenshot({ path: screenshotPath, fullPage: true });
logger.info(`[outlook-screenshot.js] Screenshot saved to: ${screenshotPath}`, { fileName: 'outlook-screenshot.js' });
// Disconnect from puppeteer (this doesn't close Chrome)
await browser.disconnect();
// Kill Chrome using chrome-launcher
await chrome.kill();
logger.info('[outlook-screenshot.js] Chrome closed.', { fileName: 'outlook-screenshot.js' });
})();
});
} catch (err) {
logger.error('[outlook-screenshot.js] Error occurred', { error: err.message, stack: err.stack, fileName: 'outlook-screenshot.js' });
process.exit(1);
}
})();
Mon, 12 May 2025 14:02:49 GMT LH:ChromeLauncher Waiting for browser.................................................................................
Mon, 12 May 2025 14:02:50 GMT LH:ChromeLauncher Waiting for browser...................................................................................
Mon, 12 May 2025 14:02:50 GMT LH:ChromeLauncher Waiting for browser.....................................................................................
Mon, 12 May 2025 14:02:51 GMT LH:ChromeLauncher Waiting for browser.......................................................................................
Mon, 12 May 2025 14:02:51 GMT LH:ChromeLauncher Waiting for browser.........................................................................................
Mon, 12 May 2025 14:02:52 GMT LH:ChromeLauncher Waiting for browser...........................................................................................
Mon, 12 May 2025 14:02:52 GMT LH:ChromeLauncher Waiting for browser.............................................................................................
Mon, 12 May 2025 14:02:53 GMT LH:ChromeLauncher Waiting for browser...............................................................................................
Mon, 12 May 2025 14:02:53 GMT LH:ChromeLauncher Waiting for browser.................................................................................................
Mon, 12 May 2025 14:02:54 GMT LH:ChromeLauncher Waiting for browser...................................................................................................
Mon, 12 May 2025 14:02:54 GMT LH:ChromeLauncher Waiting for browser.....................................................................................................
Mon, 12 May 2025 14:02:55 GMT LH:ChromeLauncher Waiting for browser.......................................................................................................
Mon, 12 May 2025 14:02:55 GMT LH:ChromeLauncher:error connect ECONNREFUSED 127.0.0.1:19874
Mon, 12 May 2025 14:02:55 GMT LH:ChromeLauncher:error Logging contents of C:\Users\idrees.khan1\AppData\Local\Google\Chrome\User Data/chrome-err.log
Mon, 12 May 2025 14:02:55 GMT LH:ChromeLauncher:error
node:internal/process/promises:391
triggerUncaughtException(err, true /* fromPromise */);
^
Error: connect ECONNREFUSED 127.0.0.1:19874
at TCPConnectWrap.afterConnect [as oncomplete] (node:net:1607:16) {
errno: -4078,
code: 'ECONNREFUSED',
syscall: 'connect',
address: '127.0.0.1',
port: 19874
}
Node.js v20.18.0
Got error with the following code: