为什么这个网站上的 Puppeteer 点击功能不起作用?
我的目的是使用 Puppeteer 单击“开始测验”按钮。 选择器 -> “#start-quiz”
我在 puppeteer 中执行操作并尝试单击此锚点(“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 **
我发现了一些警告
顺便说一句,我发现警告发生在点击之前,但错误发生在点击之后
好的,所以实际上问题不在于 MIDI WebAudio 系统尚未加载。我插入了下面的代码并确保网站停止加载,但仍然出现相同的错误。
await page.waitFor(10000);
这意味着 MIDI WebAudio 系统在 Puppeteer 的点击方面存在问题,我真的不明白为什么它不能与 Puppeteer 的点击一起使用。
您可以通过附加处理程序(如
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)
并且它发生在 操纵者点击选择器 时,因此它会停止进一步的导航。
我知道如果我亲自浏览该页面,就不会发生这种情况,但这应该可以帮助您开始找出根本原因。