【问题标题】:Execution Context has been Destroyed Puppeteer执行上下文已被销毁 Puppeteer
【发布时间】:2020-10-27 16:50:06
【问题描述】:

“很可能是由于页面导航”

我尝试使用的页面具有以下行为。要获得我想要的内容,我必须单击一个按钮。但是在单击该按钮时,我想要的内容会加载到新选项卡上。我当前所在的标签导航到一个无用的广告。当我尝试对“page”(page.eval,page.url())做任何事情时,它给了我上面的错误(实际的浏览器给出了一个关于页面已被永久移动的错误)。

如何让 puppeteer 跟随新标签而不是卡在旧标签上?

我尝试使用 puppeteer newPage 和 goto 创建一个单独的第三个选项卡,这有点用,但是会遇到其他问题。我正在寻找一种不同的方式。

编辑:

我按照下面的答案做了这个:

    const [newPage, oldPage] = await Promise.all([getNewPage(), getOldPage()]);

    console.log("new page", newPage.url());
    console.log("old page", oldPage.url());

    function getOldPage() {
      return new Promise((resolve) => {
        page.evaluate(function () {
          let element = document.querySelector("button[class*=OfferCta__]");
          element.click();
        });
        resolve(page);
      });
    }
    function getNewPage() {
      return new Promise((resolve) => {
        browser.on("targetcreated", checkNewTarget);

        function checkNewTarget(target) {
          if (target.type() === "page") {
            browser.off("targetcreated", checkNewTarget);
            resolve(target.page());
          }
        }
      });
    }

没有用。我得到了这个控制台:

3:17:40 PM web.1 |  new page https://www.nike.com/register?cid=4942550&cp=usns_aff_nike__PID_2210202_WhaleShark+Media%3A+RetailMeNot.com&cjevent=3a020cab18a211eb830d00030a1c0e0c
3:17:40 PM web.1 |  old page chrome-error://chromewebdata/

所以当 Promise 检查我需要的旧网址时,它已经出错了。

编辑: 事实证明,当我试图阻止第三方脚本时,我阻止了导航请求。这导致我的按钮按下失败。

【问题讨论】:

    标签: javascript node.js web-scraping automation puppeteer


    【解决方案1】:

    可能是这样的:

      const [newPage] = await Promise.all([
        getNewPage(),
        page.click(selector),
      ]);
    
      // ...
    
      function getNewPage() {
        return new Promise((resolve) => {
          browser.on('targetcreated', checkNewTarget);
    
          function checkNewTarget(target) {
            if (target.type() === 'page') {
              browser.off('targetcreated', checkNewTarget);
              resolve(target.page());
            }
          }
        });
      }
    

    【讨论】:

    • 我已经在其他情况下尝试过此操作,但有时会在新页面之前创建其他类型的目标(例如类型为“其他”),因此这是一项安全检查。跨度>
    猜你喜欢
    • 1970-01-01
    • 2020-06-23
    • 2016-06-14
    • 1970-01-01
    • 2014-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多