【发布时间】: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