我正在使用Puppeteer来自动化一些网上冲浪。所以给定一个单词列表,我想用这个词做一个谷歌搜索,随机选择一个搜索结果,打开结果的页面并滚动到底部。然后对下一个单词执行相同的操作。
到目前为止,我得到了什么:
'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.打开谷歌
2.搜索"什么是土豚">
3.按回车
键 4。打开谷歌
5.搜索"什么是苹果">
6.按回车
键 7。选择随机搜索结果
8.等待页面加载
9。滚动到底部
如何使以下步骤正常工作?
1. 打开谷歌
2.搜索"什么是土豚">
3.按回车
键 7。选择随机搜索结果
8.等待页面加载
9。滚动到底部
4。打开谷歌
5.搜索"什么是苹果">
6.按回车
键 7。选择随机搜索结果
8.等待页面加载
9。滚动到底部
似乎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);
}