木偶评估功能

时间:2018-12-23 14:18:03

标签: javascript node.js puppeteer

我是pupetteer的新手,我试图通过一些示例来了解它的实际作用:

因此,在此示例中,我基本上想做的是提取YouTube视频的观看次数。我在Chrome控制台上写了一条js行,可以提取以下信息:

document.querySelector('#count > yt-view-count-renderer > span.view-count.style-scope.yt-view-count-renderer').innerText

哪个运作良好。但是,当我对伪造者代码进行相同操作时,他无法识别我查询的元素。

const puppeteer = require('puppeteer')

const getData = async () => {
  const browser = await puppeteer.launch()
  const page = await browser.newPage()

  await page.goto('https://www.youtube.com/watch?v=T5GSLc-i5Xo')
  
  await page.waitFor(1000)

  const result = await page.evaluate(() => {
    let views = document.querySelector('#count > yt-view-count-renderer > span.view-count.style-scope.yt-view-count-renderer').innerText
    return {views}
  })

  browser.close()
  return result
}

getData().then(value => {
  console.log(value)
})

我终于使用ytInitialData对象做到了。但是,我想了解我的第一个代码不起作用的原因。

谢谢

2 个答案:

答案 0 :(得分:1)

等待1000次似乎还不够。

尝试使用https://try-puppeteer.appspot.com/解决方案,您会看到。

但是,如果尝试以下解决方案,您将获得正确的结果

const browser = await puppeteer.launch();

const page = await browser.newPage();
await page.goto('https://www.youtube.com/watch?v=T5GSLc-i5Xo');

await page.waitForSelector('span.view-count');
const views = await page.evaluate(() => document.querySelector('span.view-count').textContent);
console.log('Number of views: ' + views);

await browser.close();

答案 1 :(得分:0)

请勿使用手工超时来等待页面加载,除非您正在测试页面是否只能在该时间量内。与selenium不同的是,有时您除了使用超时外别无选择,使用puppeteer时,您应该总是找到一些可以使用的await函数,而不用猜测“超时”。正如Milan Hlinák所回答的那样,查看页面HTML代码并找出一些可以等待的HTML标记,而不是使用超时。通常,请等待您测试所需的HTML元素才能正常工作。根据您的情况,米兰赫林克(MilanHlinák)已回答span.view-count

await page.waitForSelector('span.view-count');