首页 > 解决方案 > 等到 page.click 返回 true

问题描述

我正在抓取一个网站weather.com,我想点击一个 html 元素来获取数据并显示它,然后我抓取该数据。

但它并不总是对我有用,大多数时候点击不会发生,我在尝试抓取这些元素时遇到错误

await page.waitFor('#twc-scrollabe > table > tbody > tr:nth-child(1)')
await page.click('#twc-scrollabe > table > tbody > tr:nth-child(1)')

我应该怎么做才能确保点击发生?

标签: node.jsweb-scrapingpuppeteer

解决方案


尝试指定您希望元素可见

await page.waitFor('#twc-scrollabe > table > tbody > tr:nth-child(1)', { visible:true }) (你注意到这个{visible:true}选项了吗?)

因为该元素可能在页面中,但在waitFor找到它时不可点击。

更多细节

  • 当您使用在引擎盖下使用waitFor的选择器时(请参阅文档waitForSelector
  • waitForSelector有一系列选项(请参阅文档
  • 选项之一是visible,文档说

等待一个元素出现在 DOM 中并且可见,即没有display: nonevisibility: hiddenCSS 属性。默认为false.



最后但同样重要的是:@FeliFong 向您询问了有关您的问题的更多信息,因为您没有提供足够的信息。你可以

  • 指定您要从中获取的页面(如果它是公开的)
  • 否则,您可以创建一个 GitHub 存储库,从您的项目中删除所有内容,只留下您正在谈论的表格和 Puppeteer 脚本
  • 通常,当您进行回购时,您会自己发现问题(发生了很多次)
  • 如果您自己制作 repo 时不解决问题……没关系,我们就是为此而存在的,但是下载 repo、启动它、解决问题、向您发出拉取请求要容易得多然后回到这里给你一些解释。
    它对我们很有用,但主要是对你有用,因为我试图回复你......但我不知道我提供的解决方案是否适合你的需求......如果我有机会通过你的回购检查它,我会确定我已经解决了问题

[更新] 我在你提供给我的存储库上解决了这个问题,在 GitHub 上接受我的 PR。

我做了什么:我做了一些测试,但我不知道那个网站上的 Puppeteer 到底是什么“阻止”(或者,更好的是,停止等待)......但没关系,这是我的代码

let i = 0;
    let found = false;
    const maxRetries = 100;
    do {
        // waits for the element we need to click
        await page.waitForSelector('#twc-scrollabe > table > tbody > tr:nth-child(1)')
        // clicks it
        await page.click('#twc-scrollabe > table > tbody > tr:nth-child(1)')
        try {
            // waits for the content we need
            await page.waitForSelector('tr:nth-child(3) > td.sunrise > div > span:nth-child(2)', {timeout:1000});
            // if the content won't be showed the code doesn't go on and the next line won't be reached
            found = true;
        } catch(e) {}
    } while(!found || i > maxRetries) // the maxRetries variable is mere prudence
  • 等待我们需要点击的元素
  • 点击它
  • 等待显示详细内容(超时1000毫秒)
  • 如果它不会显示,只需重试(最多 100 次)
  • 然后在第一次单击后继续,您的脚本会快速进行

推荐阅读