小编Md.*_*her的帖子

表单提交后,Puppeteer等待页面加载

我使用以下代码提交表单,我希望Puppeteer在表单提交后等待页面加载.

await page.click("button[type=submit]");

//how to wait until the new page loads before taking screenshot?
// i don't want this:
// await page.waitFor(1*1000);  //? unwanted workaround
await page.screenshot({path: 'example.png'});
Run Code Online (Sandbox Code Playgroud)

如何与木偶戏等待页面加载?

javascript puppeteer

50
推荐指数
8
解决办法
4万
查看次数

Headless Chrome 中的 Service Worker 安装(通过 puppeteer)

我有一名注册的服务人员

if ('serviceWorker' in navigator) {
    navigator.serviceWorker.register('/service-worker.bundle.js').then(registration => {
        console.log('Service worker was registered');
    }).catch(error => {
        console.log('Registration failed: ', error);
    });
}
Run Code Online (Sandbox Code Playgroud)

实际的服务工作者正在使用常规的 console.log() 调用来记录其事件installactivate事件,所有这些都按预期工作。

然而,当涉及到测试自动化时,Headless Chrome / puppeteer解决方案没有按预期工作,服务工作线程也没有工作installed(安装事件没有发生)。那么,问题是,是否有任何特殊的方法可以使用Headless Chrome / puppeteer来测试服务工作者的页面?

傀儡代码:

const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch({ args: ['--no-sandbox']});
  const page = await browser.newPage();
  page.on('console', msg => console.log('PAGE LOG:', msg.text()));

  await page.goto('https://***.com', { waitUntil: 'networkidle0' });
  await page.waitFor(1*4000);
  console.log('Before …
Run Code Online (Sandbox Code Playgroud)

javascript google-chrome google-chrome-devtools google-chrome-headless puppeteer

5
推荐指数
1
解决办法
4445
查看次数

如何使用puppeteer在页面上下载图像?

我是网络抓取的新手,并想使用puppeteer在网页上下载所有图像:

const puppeteer = require('puppeteer');

let scrape = async () => {
  // Actual Scraping goes Here...

  const browser = await puppeteer.launch({headless: false});
  const page = await browser.newPage();
  await page.goto('https://memeculture69.tumblr.com/');

  //   Right click and save images

};

scrape().then((value) => {
    console.log(value); // Success!
});
Run Code Online (Sandbox Code Playgroud)

我看过API了吗?文档,但不知道如何实现这一目标。因此,感谢您的帮助。

javascript web-scraping google-chrome-headless puppeteer

5
推荐指数
5
解决办法
1万
查看次数

我们如何使用 Puppeteer 编写/自动化一个 Electron 应用程序?

是否可以?某处有指南吗?基本上,我想对 Electron 应用程序进行 E2E 测试,并将编写用户交互脚本,即创建一个在 Electron 应用程序内部交互的“机器人”或“傀儡”用户。

javascript automation e2e-testing electron puppeteer

5
推荐指数
1
解决办法
1705
查看次数

Puppeteer:setDefaultNavigationTimeout 为 0 仍然超时

每次我运行这个脚本时都会超时。是否setDefaultNavigationTimeout真正避免超时?

我浏览了大约 26 个 URL,每个页面都有大量图像。无法想象 Puppeteer 仅仅因为图片太重而无法处理这些页面?

const url = 'test.com';
const jsonReturn = [];


async function runScraper() {

  const browser = await puppeteer.launch(prodConfig);

  const page = await browser.newPage({
    timeout: 0
  });

  page.setDefaultNavigationTimeout(0);
  await page.goto(url, { waitUntil: 'domcontentloaded' });
  await page.waitForSelector('.featured-shows-featured-show');

  let featuredShowsURLs = await page.$$eval('.featured-shows-featured-show > a', (links) => {
    return links.map(link => {
      return link.href;
    });
  });


  featuredShowsURLs = _.uniq(featuredShowsURLs)

  for (const featuredShowsURL of featuredShowsURLs) {
    const page = await browser.newPage({
      timeout: 0
    });
    try { …
Run Code Online (Sandbox Code Playgroud)

javascript puppeteer

5
推荐指数
0
解决办法
1546
查看次数

在Puppeteer中进行网页搜刮时如何处理验证码?

我正在使用Puppeteer进行Web爬网,但我刚刚注意到,有时由于我在计算机上进行的访问次数众多,我试图抓取的网站会要求提供验证码。验证码形式如下所示:

验证码

因此,我将需要有关如何处理此问题的帮助。我一直在考虑将验证码表单发送到客户端,因为我使用Express和EJS来将值发送到我的索引网站,但是我不知道Puppeteer是否可以发送类似的内容。

有任何想法吗?

javascript captcha web-scraping puppeteer

5
推荐指数
2
解决办法
2188
查看次数

Puppeteer 中 main 函数和渲染器函数之间的通信

有没有一种方法可以在 Puppeteer 中的主进程和渲染器进程之间进行通信,类似于Electron 中ipcMainipcRenderer函数。

这篇文章展示了一个简单的应用程序。我发现此功能可通过触发从page主函数到主函数的事件进行调试,反之亦然。

javascript puppeteer

4
推荐指数
1
解决办法
873
查看次数

Bitbucket 管道和非无头 Puppeteer?

我正在尝试运行 non-headless puppeteer 来测试管道中的 chrome 扩展。

当我用谷歌搜索这个话题时,我发现很多人能够让无头木偶操纵者在管道上工作,但由于某种原因,我无法让它与非无头人偶一起工作。

Puppeteer 故障排除文档说 TravisCI 是可能的,所以管道也应该是可能的?

我尝试了许多不同的 docker 图像,但似乎没有一个起作用。这是我目前的设置:

image: node:9

pipelines:
  branches:
    staging:
      - step:
        script:
          - node -v
          - yarn -v
          - yarn install
          - apt update && apt install -yq gconf-service libasound2 libatk1.0-0 libc6 libcairo2 libcups2 libdbus-1-3 libexpat1 libfontconfig1 libgcc1 libgconf-2-4 libgdk-pixbuf2.0-0 libglib2.0-0 libgtk-3-0 libnspr4 libpango-1.0-0 libpangocairo-1.0-0 libstdc++6 libx11-6 libx11-xcb1 libxcb1 libxcomposite1 libxcursor1 libxdamage1 libxext6 libxfixes3 libxi6 libxrandr2 libxrender1 libxss1 libxtst6 ca-certificates fonts-liberation libappindicator1 libnss3 lsb-release xdg-utils wget
          - apt-get install -y …
Run Code Online (Sandbox Code Playgroud)

javascript continuous-integration automated-tests bitbucket-pipelines puppeteer

4
推荐指数
1
解决办法
1798
查看次数

使用Puppeteer将CSS注入网站

如果操作成功或失败时,我正在Puppeteer上运行自动化测试的网站将显示信息弹出窗口。不幸的是,这些弹出窗口有时掩盖了我的脚本必须单击的按钮。如果我可以在站点中注入一些CSS来隐藏这些弹出窗口,那就太好了。有内置的方法可以做到这一点吗?

javascript puppeteer

4
推荐指数
1
解决办法
3286
查看次数

Puppeteer Crawler - 错误:net::ERR_TUNNEL_CONNECTION_FAILED

目前,我的 Puppeteer 在 Heroku 上使用代理运行。在本地,代理中继完全正常。但是我收到错误错误:net::ERR_TUNNEL_CONNECTION_FAILED。我已经在 Heroku 配置变量中设置了所有 .env 信息,所以它们都可用。

知道如何修复此错误并解决问题吗?

我目前有

 const browser = await puppeteer.launch({
      args: [
      "--proxy-server=https=myproxy:myproxyport",
      "--no-sandbox",
      '--disable-gpu',
      "--disable-setuid-sandbox",
      ],
      timeout: 0,
      headless: true,
    });
Run Code Online (Sandbox Code Playgroud)

javascript proxy web-crawler puppeteer

4
推荐指数
1
解决办法
5066
查看次数

Puppeteer $.eval 选择嵌套元素

可以说我给出的情况像这个页面

<div id="details-container" class="style-scope ytd-channel-about-metadata-renderer">
         <yt-formatted-string class="subheadline style-scope ytd-channel-about-metadata-renderer">Details</yt-formatted-string>
        <table class="style-scope ytd-channel-about-metadata-renderer">
          <tbody class="style-scope ytd-channel-about-metadata-renderer"><tr class="style-scope ytd-channel-about-metadata-renderer">
            <td class="label style-scope ytd-channel-about-metadata-renderer">
              <yt-formatted-string class="style-scope ytd-channel-about-metadata-renderer"></yt-formatted-string>
            </td>
            <td class="style-scope ytd-channel-about-metadata-renderer">
              <ytd-button-renderer align-by-text="" class="style-scope ytd-channel-about-metadata-renderer" button-renderer=""></ytd-button-renderer>
              <div id="captcha-container" class="style-scope ytd-channel-about-metadata-renderer"></div>
              <div id="email-container" class="style-scope ytd-channel-about-metadata-renderer"></div>
              <a id="email" target="_blank" class="style-scope ytd-channel-about-metadata-renderer" href="mailto:undefined" hidden=""></a>
            </td>
          </tr>
          <tr class="style-scope ytd-channel-about-metadata-renderer">
            <td class="label style-scope ytd-channel-about-metadata-renderer">
              <yt-formatted-string class="style-scope ytd-channel-about-metadata-renderer"><span class="deemphasize style-scope yt-formatted-string"> Location:   </span></yt-formatted-string>
            </td>
            <td class="style-scope ytd-channel-about-metadata-renderer">
              <yt-formatted-string class="style-scope ytd-channel-about-metadata-renderer">YourCountry</yt-formatted-string>
            </td>
          </tr>
        </tbody></table>
      </div>
Run Code Online (Sandbox Code Playgroud)

假设我需要获取“YourCountry”,我实际上如何获取此元素?

到目前为止我尝试过:

  const location …
Run Code Online (Sandbox Code Playgroud)

javascript css-selectors puppeteer apify

3
推荐指数
1
解决办法
6464
查看次数

错误[ERR_STREAM_WRITE_AFTER_END]:结束后写入[使用socket.io的npm请求]

在我的服务器端,我监听套接字服务器,在我自己的笔记本电脑中,我具有socket.io-client服务,每当我打开它们时,它们都在连接。

当其他人向我的服务器请求时,服务器通过套接字将该请求发送到我的笔记本电脑,然后我的笔记本电脑使用npm-request从本地主机获取数据,并将返回的数据返回给服务器,然后服务器将信息显示给客户端。

这是我服务器端的错误:

/*

throw er; // Unhandled 'error' event
      ^

**Error [ERR_STREAM_WRITE_AFTER_END]: write after end**
    at write_ (_http_outgoing.js:572:17)
    at ServerResponse.write (_http_outgoing.js:567:10)
    at Socket.<anonymous> (/public_html/api/index.js:37:9)
    at Socket.emit (events.js:187:15)
    at /public_html/api/node_modules/socket.io/lib/socket.js:528:12
    at process._tickCallback (internal/process/next_tick.js:61:11)
Emitted 'error' event at:
    at writeAfterEndNT (_http_outgoing.js:634:7)
    at process._tickCallback (internal/process/next_tick.js:63:19)

    */
Run Code Online (Sandbox Code Playgroud)

服务器端代码:

/*

throw er; // Unhandled 'error' event
      ^

**Error [ERR_STREAM_WRITE_AFTER_END]: write after end**
    at write_ (_http_outgoing.js:572:17)
    at ServerResponse.write (_http_outgoing.js:567:10)
    at Socket.<anonymous> (/public_html/api/index.js:37:9)
    at Socket.emit (events.js:187:15)
    at /public_html/api/node_modules/socket.io/lib/socket.js:528:12
    at process._tickCallback (internal/process/next_tick.js:61:11)
Emitted 'error' event at:
    at …
Run Code Online (Sandbox Code Playgroud)

javascript request node.js socket.io npm-request

2
推荐指数
1
解决办法
6552
查看次数

我选择哪一种无头浏览?

我们在前几天使用 phantomjs 用服务器端王子工具生成 pdf。现在我们喜欢把无头浏览器从 phantomjs 换成另一个。

我研究了哪个快速渲染 phantomjs 和 puppeteer。在我的情况下,报告应用程序生成 PDF,只有我使用 puppeteer 和 phantomjs 对其进行测试。phantomjs 与 puppeteer 相比,可以快速处理 HTML。

然后我学习了 google-chrome-headless 选项来生成 PDF。它看起来像一个 Chrome 浏览器 GUI 应用程序的内置模块。我正在使用 nodejs 应用程序。我在命令行中使用以下命令

chrome --headless --disable-gpu --print-to-pdf <src_url>
Run Code Online (Sandbox Code Playgroud)

我注意到 --disable-gpu 选项,其他工具没有。

  • 此选项与其他两个无头浏览器工具(phantomjs、puppeteer)有何不同?
  • 我可以使用哪个工具生成 pdf?

pdf-generation node.js phantomjs google-chrome-headless puppeteer

2
推荐指数
1
解决办法
3031
查看次数