javascript - 使用 Puppeteer 在第一个 Google 搜索结果上单击一个元素
问题描述
您好,我是 puppeteer 的新手,一周前就遇到了问题,我只想在 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';
解决方案
这种方法在正确的轨道上,但似乎相当脆弱。更喜欢尽可能通用的 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())
;
也可以看看:
推荐阅读
- php - 如何将用户购买的商品保存在数据库中并防止他再次购买
- angular - 错误:找不到带有路径的控件 - Angular formControlName 没有看到 {{form.value | json}} 显示
- c# - C# Invoke powershell "Get-Website" 总是返回空
- javascript - 如何使用 VANILLA JS 向嵌套的 Dom 元素添加类
- c# - 为什么在暂停游戏时它在加载主菜单场景时一直在屏幕上显示游戏的画布文本?
- javascript - 如何让 Jest 看到我为 MongoDB Stitch 编写的函数?
- java - 逐个字段获取数据并将其放入哈希表中,尝试获取列 3、4、5 并通过 CSV 文件将它们与百分位数配对
- c# - 如何在 Visual C# 中创建热键?
- flutter - 更改主题颜色
- spring-boot - 在 Thymeleaf 中使用表单创建 url