【问题标题】:Puppeteer waitForSelector is not working inside loopPuppeteer waitForSelector 在循环内不起作用
【发布时间】:2020-05-19 17:09:22
【问题描述】:

我的任务是提交不同数据的表单。所以,我正在使用 puppeteer 和 for of 循环。

代码示例:

const puppeteer = require('puppeteer')
const data = require('data.json') // ~30 products

(async () => {
  try {
    const browser = await puppeteer.launch({
      headless: false,
      ignoreHTTPSErrors: true,
      defaultViewport: null,
    });

   const page2 = await browser.newPage();
   await page2.goTo('mywebsite', {waitUntil: 'domcontentloaded'} )

    for (let product of data) {

      // Waiting for some selector, after that do something with it
      await page2.waitForSelector("#someSelector", { visible: true });
      await page2.type("#someSelector", product.someData);


         //
    //... A lot of code that similar to above is here

        //


      // Go back after all things done
      await page2.waitFor(2000);
      await page2.waitForSelector('[title="home"]', { visible: true });
      await page2.click('[title="home"]', { clickCount: 1 });


      counter++;

      console.log(
        `===========================================================================${counter}`
      );


    }
  } catch (err) {
    throw new Error(err);
  }
})();

问题是这行得通,但并不总是行得通,例如,一个循环可以工作15次,然后脱落或经历一个完整的循环没有失败。

错误总是一样的:

UnhandledPromiseRejectionWarning:错误:TimeoutError:等待选择器“#someSelector”失败:超过超时 30000 毫秒

但是,如果我检查页面,那么一切都在那里,元素在页面上,但 puppeteer 看不到它们。我该如何解决这个问题?

【问题讨论】:

    标签: node.js async-await puppeteer


    【解决方案1】:

    我目前的解决方案是重试功能:

    const chalk = require("chalk");
    const util = require("util");
    
    const delay = util.promisify(setTimeout);
    
    async function retry(fn, retryDelay = 200, numRetries = 5) {
      for (let i = 0; i < numRetries; i++) {
        try {
          return await fn();
        } catch (err) {
          console.log(
            "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$"
          );
    
          console.log(chalk.yellow(err));
          if (i === numRetries - 1) throw err;
          await delay(retryDelay);
          retryDelay = retryDelay * 2;
        }
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2022-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-15
      • 1970-01-01
      • 2018-03-19
      • 1970-01-01
      相关资源
      最近更新 更多