【问题标题】:Puppeteer - Proper way to loop through multiple URLsPuppeteer - 循环遍历多个 URL 的正确方法
【发布时间】:2018-07-13 14:47:30
【问题描述】:

我想遍历一个包含 URL 的数组并将一个元素推入另一个数组。

这是我使用的代码:

for (var i=0; i < links.length ; i++){
    await page.goto(links[i], { timeout: 0, waitUntil: ['domcontentloaded'] });
    await page.waitFor(20000); 

    var values = await page.evaluate(
        () => [...document.querySelectorAll('.XYZ')]
        .map(element => element.getAttribute('src'))
        ); //get the elements location
        media.push(values); // push to array
    );
    console.log(media);
}

此代码有效。但是,请注意第三行是await page.waitFor(20000);

我正在使用它来等待页面已加载。 如果我省略这一行,有时,名为values 的变量是undefined

我尝试了其他时间延迟值,它越低,未定义的可能性就越大。

在不浪费不必要的时间和大延迟的情况下循环遍历数组的正确方法是什么?

由于我在page.goto() 方法中使用waitUntil: ['domcontentloaded'],所以这个过程不应该是自动的吗?

【问题讨论】:

  • 你应该调用 .waitFor 来加载页面。这就是为什么您在页面评估前使用 await 关键字的原因。我使用 puppeteer,从来没有遇到过这个问题。我怀疑错误在其他地方。
  • domcontentloaded 上显示的元素不明显。
  • 您对导致这种行为的原因或我应该怎么做有什么建议吗?
  • 考虑到您正在使用evaluate 方法从UI 中检索类名为XYZ 的所有元素,为什么不使用page.waitForSelector() 让puppeteer 等待使用该类的最后一个加载元素在 UI 中加载?通过这样做,您将知道您感兴趣的所有元素都将在您的 evaluate 方法被触发之前加载。这将比要求它每次等待硬编码的 20 秒更有效。您希望始终避免使用硬编码的睡眠调用。
  • @ AJC24 天哪,这太明显了。我觉得很愚蠢,因为我已经使用了 waitForSelector()。请回答,以便我投票并选择它作为接受的答案,以便您获得声誉(似乎人们非常关心这个网站上的代表)

标签: javascript node.js puppeteer


【解决方案1】:

考虑到您正在使用评估方法从 UI 中检索所有类名为 XYZ 的元素,为什么不使用 page.waitForSelector() 让 puppeteer 等待使用该类的最后一个加载元素在 UI 中加载?

通过这样做,您将知道您感兴趣的所有元素都将在触发评估方法之前加载。

这比要求它每次硬编码等待 20 秒要高效得多。您希望在自动化过程中始终避免使用硬编码的等待调用。

【讨论】:

    猜你喜欢
    • 2013-12-12
    • 1970-01-01
    • 2016-08-09
    • 1970-01-01
    • 2020-12-18
    • 1970-01-01
    • 2023-03-16
    • 2017-05-13
    • 1970-01-01
    相关资源
    最近更新 更多