import { configDotenv } from "dotenv";
import puppeteer from "puppeteer";
configDotenv({ path: "./config.env" });
let browserInstance;
export async function getBrowserInstance() {
try {
if (!browserInstance || !browserInstance.isConnected()) {
browserInstance = await puppeteer.launch({
// executablePath: process.env.CHROME,
headless: false,
args: [
'--disable-blink-features=AutomationControlled',
'--disable-infobars',
'--no-sandbox',
'--disable-dev-shm-usage',
'--start-maximized',
'--disable-extensions',
'--disable-default-apps',
'--disable-popup-blocking',
'--disable-renderer-backgrounding',
'--disable-background-timer-throttling',
'--disable-backgrounding-occluded-windows'
]
});
browserInstance.on('disconnected', () => {
console.error('Browser disconnected.');
browserInstance = undefined;
});
}
return browserInstance;
} catch (error) {
return error;
}
}
export async function newPage(browser, docSize) {
try {
if (!browser || !browser.isConnected()) throw new Error("Browser is not active!");
const page = await browser.newPage();
const { width, height } = docSize;
if (typeof width !== "number" || typeof height !== "number") {
throw new Error("The width and height of page should be type of number.");
}
await page.setUserAgent(process.env.USER_AGENT);
await page.evaluateOnNewDocument(() => {
Object.defineProperty(navigator, 'platform', {
get: () => 'Win32',
});
Object.defineProperty(navigator, 'webdriver', {
get: () => false,
});
window.chrome = {};
const originalQuery = window.navigator.permissions.query;
window.navigator.permissions.query = (parameters) =>
parameters.name === 'notifications'
? Promise.resolve({ state: 'denied' })
: originalQuery(parameters);
});
page.setDefaultNavigationTimeout(300000);
if (width && height) page.setViewport({ width, height });
return page;
} catch (error) {
return error.message;
}
}
export async function launchBrowserAndGotoPage(docSize, docUrl) {
let Browser, Page;
try {
Browser = await getBrowserInstance();
Page = await newPage(Browser, docSize);
console.log()
if (typeof Page === "string") throw new Error(Page);
const pageResponse = await Page.goto(docUrl, { waitUntil: "networkidle0" });
const pageStatus = pageResponse.status();
if (pageStatus !== 200) {
throw new Error(`The third-party server responded with ${pageStatus}`);
}
console.log("I am inside launchBrowserAndGotoPage ", Page)
console.log("Page type: ", Page.constructor.name) // Should print "Page"
console.log("Page object keys: ", Object.keys(Page)) // Explore what properties/methods are available
return { Browser, Page };
} catch (error) {
console.log(error);
if (typeof Page === "object") Page.close();
return { error: error.message }
}
}
When I call launchBrowserAndGotoPage(), the browser is launched, and the page with the provided link is opened. But object is incomplete and I am not able to use methods like page.pdf().
The logs are these:
I am inside launchBrowserAndGotoPage CdpPage { _isDragging: false, _timeoutSettings: TimeoutSettings {} }
Page type: CdpPage
Page object keys: [ '_isDragging', '_timeoutSettings' ]
Can anyone please help me solve this issue?
puppeteer version is 24.1.1
I also tried using 24.1.0 but the response is the same.