使用Puppeteer在第一个Google搜索结果中单击一个元素

时间:2020-10-21 19:33:27

标签: javascript html puppeteer

你好,我是木偶游戏的新手,现在已经有一个星期的问题了, 我只想在Google上搜索“英特尔”一词后单击搜索结果:

enter image description here

我的源代码:

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';

1 个答案:

答案 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())
;

另见: