无头ChromePuppeteer在本地docker和远程dockerAW​​S EC2中运行的不同行为

问题描述

我正在尝试调试一个问题,该问题导致使用Puppeteer的无头Chrome在我的本地环境和远程环境(例如AWS或Heroku)上的行为有所不同。 该应用程序尝试在不进行身份验证的情况下搜索LinkedIn上的公共可用职位(无需查看个人资料),URL格式如下:https://www.linkedin.com/jobs/search?keywords=Engineer&location=New+York&redirect=false&position=1&pageNum=0

当我在本地环境中打开此URL时,我没有问题,但是当我尝试在诸如AWS EC2或Heroku Dyno之类的远程计算机上执行相同操作时,LinkedIn会将我重定向登录表单。为了调试这种差异,我构建了一个Docker映像(基于this image)以与本地Chrome /配置文件隔离:

Dockerfile

FROM buildkite/puppeteer

workdir /app

copY . .

RUN npm install

CMD node index.js

EXPOSE 9222

index.js

const puppeteer = require("puppeteer-extra");
puppeteer.use(require("puppeteer-extra-plugin-stealth")());

const testPuppeteer = async () => {
    console.log('opening browser');
    const browser = await puppeteer.launch({
        headless: true,slowMo: 20,args: [
            '--remote-debugging-address=0.0.0.0','--remote-debugging-port=9222','--single-process','--lang=en-GB','--disable-dev-shm-usage','--no-sandBox','--disable-setuid-sandBox',"--proxy-server='direct://",'--proxy-bypass-list=*','--disable-gpu','--allow-running-insecure-content','--enable-automation',],});

    console.log('opening page...');
    const page = await browser.newPage();
    console.log('Page open');

    const url = "https://www.linkedin.com/jobs/search?keywords=Engineer&location=New+York&redirect=false&position=1&pageNum=0";
    console.log('opening url',url);
    await page.goto(url,{
        waitUntil: 'networkidle0',});
    console.log('Url open');

    // page && await page.close();
    // browser && await browser.close();

    console.log("Done! Leaving page open for remote inspection...");
};

(async () => {
    await testPuppeteer();
})();

此测试使用的docker映像可以找到here。 我已经使用以下命令在本地环境中运行了该映像:

docker run -p 9222:9222 spinlud/puppeteer-linkedin-test

然后从本地Chrome浏览器chrome://inspect中可以检查应用程序的GUI(我故意在无头浏览器中打开页面):

enter image description here

您甚至可以在本地docker中看到该页面,无需身份验证即可打开。

我已经在AWS EC2(Amazon Linux 2)with Docker installed上进行了相同的测试。它必须是具有SSH访问权限和入站规则的公共实例,以允许通过端口9222进行通信(用于远程Chrome调试)。 我运行了相同的命令:

docker run -p 9222:9222 spinlud/puppeteer-linkedin-test

然后再次从本地Chrome浏览器chrome://inspect添加了EC2的远程公共IP,我也能够检查远程无头Chrome的GUI:

enter image description here

如您所见,这次LinkedIn要求进行身份验证。我们还可以看到Cookie的不同之处:

enter image description here

我不了解本地环境和远程环境之间这种不同行为背后的原因。从理论上讲,Docker应该提供隔离,并且在这两种环境中,无头浏览器都应该以没有cookie和全新(空会话)的方式启动。仍然有区别,我不知道为什么。

有人有任何线索吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)