我正在使用Puppeteer自动化一些网络冲浪。因此,给定一个单词列表,我想对该单词进行Google搜索,随机选择一个搜索结果,打开结果页面并滚动到底部。然后对下一个单词做同样的事情。
到目前为止我所拥有的:
'use strict';
const puppeteer = require('puppeteer');
(async () => {
try {
const browser = await puppeteer.launch({
headless: false,
args: ['--no-sandbox', '--disable-setuid-sandbox']
});
let pages = await browser.pages();
const page = pages[0];
var words = ['Aardvark', 'Apple'];
for (let index = 0; index < words.length; ++index) {
await page.goto('https://google.com');
await page.click('[name=q]');
await page.keyboard.type(`What is ${words[index]}`);
await page.keyboard.press('Enter');
await page.waitForSelector('h3.LC20lb', { timeout: 10000 });
await page.evaluate(() => {
let elements = document.querySelectorAll('h3.LC20lb');
let randomIndex = Math.floor(Math.random() * elements.length) + 1;
elements[randomIndex].click();
}).then(() => {
page.once('load', () => {
autoScroll(page);
page.waitFor(3000);
});
});
}
} catch (e) {
console.log(e);
}
})();
async function autoScroll(page) {
await page.evaluate(async () => {
await new Promise((resolve, reject) => {
var totalHeight = 0;
var distance = 400;
var timer = setInterval(() => {
var scrollHeight = document.body.scrollHeight;
window.scrollBy(0, distance);
totalHeight += distance;
if (totalHeight >= scrollHeight) {
clearInterval(timer);
resolve();
}
}, 100);
});
});
}
这样可以使导航正常,但不会为第一个单词选择随机搜索结果,而只为第二个单词选择随机搜索结果。因此,在这种情况下,步骤如下:
1.打开Google
2.搜索“什么是土豚”
3.按Enter
4.打开Google
5.搜索“什么是苹果”
6.按Enter
7.选择随机搜索结果
8.等待页面加载
9.滚动到底部
如何使以下步骤有效?
1.打开Google
2.搜索“什么是土豚”
3.按Enter
7.选择随机搜索结果
8.等待页面加载
9.滚动到底部
4.打开Google
5.搜索“什么是苹果”
6.按Enter
7.选择随机搜索结果
8.等待页面加载
9.滚动到底部
答案 0 :(得分:2)
似乎then()
没有返回承诺,它是用undefined
值解析的,不等待其内容功能。另外,似乎您在随机索引计算中遇到了一个错误(代码可能返回太多的elements.length
数字。)
尝试一下:
for (let index = 0; index < words.length; ++index) {
await page.goto('https://google.com');
await page.click('[name=q]');
await page.keyboard.type(`What is ${words[index]}`);
await page.keyboard.press('Enter');
await page.waitForSelector('h3.LC20lb', { timeout: 10000 });
await Promise.all([
page.evaluate(() => {
let elements = document.querySelectorAll('h3.LC20lb');
let randomIndex = Math.floor(Math.random() * elements.length);
elements[randomIndex].click();
}),
page.waitForNavigation(),
]);
await autoScroll(page);
await page.waitFor(3000);
}