等到page.click返回true

时间:2019-01-20 21:54:58

标签: node.js web-scraping puppeteer

我要抓取一个网站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)')

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

1 个答案:

答案 0 :(得分:0)

尝试指定您希望元素显示为

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

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

更多详细信息

  • 当您将waitFor与选择器一起使用时,您正在see the docs之下使用waitForSelector
  • waitForSelector有一系列选项(see the docs
  • 文档说,
  • 其中一个选项是visible
  

等待元素出现在DOM中并可见,即不具有display: nonevisibility: hidden CSS属性。默认为false



最后但并非最不重要的一点:@FeliFong向您询问了有关您的问题的更多信息,因为您没有提供有关此问题的足够信息。你可以

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

[更新] 我已将问题解决在您提供给我的存储库中,并在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次)
  • 然后继续 首次点击后,您的脚本会快速运行