你好,我是木偶游戏的新手,现在已经有一个星期的问题了, 我只想在Google上搜索“英特尔”一词后单击搜索结果:
我的源代码:
const puppeteer = require('puppeteer');
async function search() {
const browser = await puppeteer.launch({executablePath: 'C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome',
headless: false});
const page = await browser.newPage();
await page.setViewport({ width: 1600, height: 1040 })
await page.goto('https://google.com');
await page.type('input.gLFyf.gsfi', 'Intel');
page.keyboard.press('Enter');
await page.waitForSelector('a');
await navigationPromise
var selectorString = '.yuRUbf > a > .LC20lb';
var selector = await page.$(selectorString);
if (selector!=null) {
var element = selector.asElement();
await element.click();
}
await browser.close();
}
search();
我认为问题出在这里
var selectorString = '.yuRUbf > a > .LC20lb';
答案 0 :(得分:-1)
这种方法走在正确的轨道上,但似乎相当脆弱。首选尽可能通用的 CSS 选择器,以帮助容忍 DOM 结构的更新。
在您的代码中,navigationPromise
未定义;更喜欢 page.waitForNavigation
在这里响应由 Enter 键触发的导航。
await page.waitForSelector('a');
似乎太弱了,无法实现很多目标,因为大多数页面上都已经有锚点,所以谓词将是微不足道的。
您点击的方法可以简单地page.click(selector)
,如下所示:
const puppeteer = require("puppeteer");
let browser;
(async () => {
const searchQuery = "intel";
browser = await puppeteer.launch();
const [page] = await browser.pages();
await page.goto("https://www.google.com/");
await page.waitForSelector('input[aria-label="Search"]', {visible: true});
await page.type('input[aria-label="Search"]', searchQuery);
await Promise.all([
page.waitForNavigation(),
page.keyboard.press("Enter"),
]);
await page.waitForSelector(".LC20lb", {visible: true});
await Promise.all([
page.waitForNavigation({waitUntil: "domcontentloaded"}),
page.click(".LC20lb"),
]);
console.log(await page.title()); // => Intel | Data Center Solutions, IoT, and PC Innovation
})()
.catch(err => console.error(err))
.finally(async () => await browser.close())
;
另见: