【问题标题】:Puppeteer not working as expected when clicking button单击按钮时,Puppeteer 未按预期工作
【发布时间】:2020-09-01 10:33:44
【问题描述】:

我的问题是我需要将评论选择器设置为“所有 cmets”whit puppeteer 但是在 puppeteer 单击正确的按钮“所有 cmets”后 cmets 不呈现,评论部分就消失了,我将提供运行中的浏览器的代码和视频。

const $ = require('cheerio');
const puppeteer = require('puppeteer');
const url = 'https://www.facebook.com/pg/SamsungGlobal/posts/';







const main = async () => {
  const browser = await puppeteer.launch({
    headless: false,
    args: ['--no-sandbox', '--disable-setuid-sandbox']
  });
  const page = await browser.newPage();
  await page.setViewport({
    width: 1920,
    height: 1080
  });
  await page.goto(url, {
    waitUntil: 'networkidle2',
    timeout: 0
  });
  page.mouse.click(50, 540, {});
  for (var a = 0; a < 18; a++) {
    setTimeout(() => {}, 16);
    await page.keyboard.press('ArrowDown');
  }
  let bodyHTML = await page.evaluate(() => document.body.innerHTML);   
  var id = "#" + $("._427x ._4-u2.mbm._4mrt", bodyHTML).attr('id');      // selects id of first post
  try {
    var exp = await page.$(`${id} a._21q1`);   // clicks on "most relevant" from the first post 
    await exp.evaluate(exp => exp.click());
    await page.click('div[data-ordering="RANKED_UNFILTERED"]');    // selects "all the comments"
    var exp = await page.$(`${id} a._42ft`);         // should click on "more comments" but it doesn't load
    await exp.evaluate(exp => exp.click());
    await page.waitForSelector(`${id} a._5v47.fss`);       // wait for the "others" in facebook comments
    var exp = await page.$$(`${id} a._5v47.fss`);
    await exp.evaluate(exp => exp.click());
    await page.screenshot({
      path: "./srn4.png"
    });
    // var post = await page.$eval(id + " .userContentWrapper", el => el.innerHTML);
    // console.log("that's the  post " + post);
  } catch (e) {
    console.log(e);
  }
  setTimeout(async function() {
    await browser.close();     //close after some time
  }, 1500);
};


main(); 

这是完整执行过程的视频:https://youtu.be/jXpSOBfVskg 这是它点击菜单那一刻的慢动作:https://youtu.be/1OgfFNokxsA

【问题讨论】:

    标签: javascript node.js web-scraping web-crawler puppeteer


    【解决方案1】:
    page.mouse.click(50, 540, {});
    

    这不一定有效。你想点击什么?您需要使用 CSS 选择器来查找要点击的元素。

    此外,动态元素可能不会立即出现在页面中。您应该根据需要使用waitForSelector

    【讨论】:

    • 我确实在等待动态元素,正如您从 yt 所知,cmets 部分刚刚消失。
    • 你答案中的那一行是因为浏览器默认关注登录字段,单击该点允许使用向下箭头,因此允许 puppetree 使用键盘滚动
    【解决方案2】:

    您可以尝试使用选择器的变体:

    'use strict';
    
    const puppeteer = require('puppeteer');
    
    (async function main() {
      try {
        const browser = await puppeteer.launch({ headless: false });
        const [page] = await browser.pages();
    
        await page.goto('https://www.facebook.com/pg/SamsungGlobal/posts/');
    
        await page.waitForSelector('[data-ordering="RANKED_THREADED"]');
        await page.click('[data-ordering="RANKED_THREADED"]');
    
        await page.waitForSelector('[data-ordering="RANKED_UNFILTERED"]');
        await page.click('[data-ordering="RANKED_UNFILTERED"]');
      } catch (err) {
        console.error(err);
      }
    })();
    

    【讨论】:

    • 它一起解决了问题,并在点击之间添加了超时
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多