【问题标题】:UnhandledPromiseRejectionWarning: Error: Evaluation failedUnhandledPromiseRejectionWarning:错误:评估失败
【发布时间】:2020-04-21 03:33:27
【问题描述】:

我正在尝试使用 puppeteer 和 datalayer-puppeteer 库来自动化网站上的 GTM 容器测试。到目前为止,我已经编写了这个简单的代码:

const puppeteer = require('puppeteer');
const dataLayer = require('puppeteer-datalayer');

(async () => {

    // Automate here
    const browser = await puppeteer.launch();
    const page = await browser.newPage();
    const containerId = "GTM-5LDMPBF";



    await page.goto('https://www.example.com');
    await page.click('#header > nav > div.main-navigation > a');
    const dataLayerPuppeteer = new dataLayer(page, containerId);
    console.log(await dataLayerPuppeteer.history());


    await browser.close(); 
})();

问题是当我运行它时,出现以下错误:UnhandledPromiseRejectionWarning: E​​rror: Evaluation failed: dataLayer is not defined。 dataLayer 应该被定义并且可见。我应该以某种方式等待声明还是有其他方法可以解决这个问题?

【问题讨论】:

    标签: javascript asynchronous async-await puppeteer


    【解决方案1】:

    问题在于您正在单击主导航中的链接。如果您单击该链接,puppeteer 不会等待后续页面加载。这意味着您正在尝试在页面仍在加载时读取 dataLayer。 如果您删除链接单击进行测试,它可以工作:

    const puppeteer = require('puppeteer');
    const dataLayer = require('puppeteer-datalayer');
    
    (async () => {
    
        // Automate here
        const browser = await puppeteer.launch({headless: false});
        const page = await browser.newPage();
        const containerId = "GTM-5LDMPBF";
    
        await page.goto('https://www.ifortuna.sk');
        // await page.click('#header > nav > div.main-navigation > a');
    
        const dataLayerPuppeteer = new dataLayer(page, containerId);
        console.log(await dataLayerPuppeteer.history);
    
        await browser.close(); 
    })();
    

    另一个小问题:dataLayerPuppeteer.history 是一个 getter,所以它必须写成 dataLayerPuppeteer.history 而不是 dataLayerPuppeteer.history() (文档没有提到,我会补充一下;))

    【讨论】:

      【解决方案2】:

      我只是尝试在您的代码中添加一些 try-catch,也许它可以帮助您处理错误

         const puppeteer = require('puppeteer');
      const dataLayer = require('puppeteer-datalayer');
      
      (async () => {
          try {
          // Automate here
          const browser = await puppeteer.launch();
          const page = await browser.newPage();
          const containerId = "GTM-5LDMPBF";
      
      
      
          await page.goto('https://www.ifortuna.sk');
          await page.click('#header > nav > div.main-navigation > a');
          const dataLayerPuppeteer = new dataLayer(page, containerId);
          console.log(await dataLayerPuppeteer.history());
      
      
          await browser.close(); 
          }
          catch (e) {
              console.error(e);
          } finally {
              console.log('We do cleanup here');
          }
      })();
      

      【讨论】:

      • 还是不明白为什么会这样
      • 我试图实现你的代码,但我得到了另一个错误,也许它与你如何调用你的异步代码有关
      • 你是说图书馆的? @Ahmed Rebai
      • Yes Yes,检查你的nodejs版本或者安装的pckage版本
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-24
      相关资源
      最近更新 更多