为什么Puppeteer点击功能在此网站上不起作用?

时间:2020-04-06 12:45:03

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

我的目的是使用Puppeteer单击“开始测验”按钮。 选择器->“#start-quiz”

我当时正在做操纵伪装的事情,并尝试单击此锚点(“ a”)元素,根据我所做的分析,我确定该元素已附加了jquery事件侦听器。我似乎无法通过puppeteer单击该按钮,我已经尝试过page.evaluate以及评估函数的多种形式。所有这些似乎都不起作用。奇怪的是,如果我通过网站的javascript控制台运行它,那么它将起作用。

当我运行它时,它成功到达该站点,然后向下滚动到该按钮所在的位置,但是随后什么也没有发生。我不确定Puppeteer是否单击了该按钮,或者网站只是无法识别Puppeteer的点击。

锚元素的选择器是“#start-quiz”。

网站:https://tonesavvy.com/music-practice-exercise/19/chord-identification-game-treble/

const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch({headless: false});
  const page = await browser.newPage();
  await page.goto('https://tonesavvy.com/music-practice-exercise/19/chord-identification-game-treble/', {waitUntil: 'networkidle2'});

  const startButton = await page.$('#start-quiz');
  await startButton.click();

  /*await page.evaluate(_ => {
    // this will be executed within the page, that was loaded before
    document.querySelector("#start-quiz").click();
  });*/

  //await browser.close();
})();

我整天都在苦苦挣扎,感谢您的帮助:)

** 编辑1 **

因此,当我运行该程序时,我在网站的控制台中发现了一个错误。

base.736551cd2ce2.js:1265 Uncaught TypeError: Cannot read property 'resume' of undefined
    at HTMLAnchorElement.<anonymous> (base.736551cd2ce2.js:1265)
    at HTMLAnchorElement.dispatch (jquery.min.js:3)
    at HTMLAnchorElement.r.handle (jquery.min.js:3)

我还在下面的代码中找到了该代码,它是网站脚本的一部分,这是发生错误的那一行

$(".btn").click(function() {
    MIDI.WebAudio.getContext().resume();
});

我已经意识到它无法正常工作的原因是因为MIDI.WebAudio.getContext()是未定义的,因此正常访问此网站时不会发生这种情况。仅当Puppeteer控制浏览器时,才会发生此错误。这个错误使我相信Puppeteer在MIDI Web Audio系统加载之前就单击了按钮,但是由于我指定了“ {waitUntil:'networkidle2'}”,因此我不确定还要输入什么。

现在的问题变成了,有没有办法告诉Puppeteer等待MIDI WebAudio系统加载?

** 编辑2 **

我发现了一些警告

Warnings

顺便说一下,我发现警告是在单击之前发生的,但错误是在单击之后发生的

好的,实际上问题不是因为MIDI WebAudio系统尚未加载。我在下面插入了代码,并确保该站点停止加载,并且仍然出现相同的错误。

await page.waitFor(10000);

这意味着MIDI WebAudio系统在Puppeteer的喀嗒声中只是一个问题,我真的没有一个理论为什么它不能在Puppeteer的喀嗒声中起作用。

1 个答案:

答案 0 :(得分:1)

您可以通过附加处理程序(例如

)来调试页面本身中的错误
page.on('pageerror', (err) => {
  console.error(err);
});

在这种情况下,它显示:

TypeError: Cannot read property 'resume' of undefined
    at HTMLAnchorElement.<anonymous> (https://tonesavvy.com/static/js/drills/base.736551cd2ce2.js:1265:32)
    at HTMLAnchorElement.dispatch (https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js:3:7537)
    at HTMLAnchorElement.r.handle (https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js:3:5620)

当操纵up点击选择器时会发生这种情况,因此它将停止进一步的导航。

我知道如果我亲自浏览该页面也不会发生,但这应该可以让您开始找出根本原因。