zfcsoftware / puppeteer-real-browser

This package is designed to bypass puppeteer's bot-detecting captchas such as Cloudflare. It acts like a real browser and can be managed with puppeteer.
https://www.npmjs.com/package/puppeteer-real-browser
MIT License
622 stars 84 forks source link

ERROR: Missing X server or $DISPLAY #182

Closed vince166 closed 1 hour ago

vince166 commented 2 days ago

Description

Issue: Error when running a script on RHEL 8.8 without Docker

Environment:

Error Message:

LH:ChromeLauncher:error [112261:112261:0927/144838.261739:ERROR:ozone_platform_x11.cc(240)] Missing X server or $DISPLAY

Observed Behavior:

  1. node test.js:

    • Always launches the browser in a visible X window
    • Behavior is consistent regardless of disableXvfb setting (In another word, I can't test xvfb is working or not.)
  2. DISPLAY= node test.js:

    • Results in the error message mentioned above
  3. Commenting out 'DISPLAY': process.env.DISPLAY, from launching arguments did not help.

Workaround:

Problem:

Full steps to reproduce the issue

const { connect } = require('puppeteer-real-browser');
const fs = require('fs/promises');
const fsSync = require('fs');
const path = require('path');

const tempProfilePath = fsSync.mkdtempSync(path.join(process.env.TMPDIR, 'puppeteer-profile-'));

async function setupBrowser() {
    const { browser, page } = await connect({
        headless: false,
        args: [
            '--start-maximized'
        ],
        customConfig: {
            chromePath: '/home/xxx/puppeteer/.local-chromium/chrome/linux-117.0.5938.92/chrome-linux64/chrome',
            userDataDir: tempProfilePath,
            envVars: {
                'DISPLAY': process.env.DISPLAY,
                'HOME': process.env.HOME,
                'LD_LIBRARY_PATH': '/lib:/lib64:/usr/lib:/usr/lib64',
                'TMPDIR': process.env.TMPDIR
            },
            logLevel: 'verbose'
        },
        connectOption: {
            defaultViewport: null
        },
        disableXvfb: false
    });
    return { browser, page };
}

async function logToFile(message) {
    const timestamp = new Date().toLocaleString();
    const logMessage = `${timestamp} - ${message}\n`;
    await fs.appendFile('scraper.log', logMessage);
    console.log(logMessage);
}

async function main() {
    let browser, page;
    try {
        ({ browser, page } = await setupBrowser());

        // Navigate to example.com
        await page.goto('https://www.example.com', { waitUntil: 'networkidle0' });
        await logToFile('Navigated to https://www.example.com');

    } catch (error) {
        console.error('An error occurred:', error);
        await logToFile(`Error: ${error.message}`);
    } finally {
        if (browser) await browser.close();
        await logToFile('Browser closed');
    }
}

main().catch(console.error);

Issue Type

Bug

Operating System

Linux

Do you use Docker?

I don't use Docker

rainb3rry commented 1 hour ago

Have you tried with process.env.DISPLAY = :10.0

zfcsoftware commented 1 hour ago

The library currently only supports ubuntu and windows operating systems. Thank you for this detailed problem, but I cannot reproduce this error. On ubuntu, xfvb and the browser connect by themselves.