提问人:Rodney Deransburg 提问时间:7/9/2023 更新时间:7/9/2023 访问量:48
Puppeteer JS page.eval 不会在 MutationObserver 中触发
Puppeteer JS page.eval won't trigger within MutationObserver
问:
目前,每当在pokernow上进行新投注时,我都会尝试打印以模拟玩家的投注大小。
我的代码能够在代码首次运行时抓取大厅中的玩家并提取他们当前的投注金额。但是,我试图识别玩家何时进行新赌注并将其打印到控制台。使用 MutationObserver,我可以识别特定玩家的 div 标签何时更改,但我无法重新评估该 div 标签以抓取他们当前的赌注。
如何在 MutationObserver 中运行页面评估?
我的代码执行这一行 “printMe(playerNumber + ”yum“);” ,但没有命中下一个 printMe 语句。
如果我颠倒顺序并先执行 page.eval 然后 printMe(newStuff),printMe(playerNumber + “yum”) 永远不会打印到控制台。
const puppeteer = require("puppeteer");
const playerMap = {};
async function run() {
const browser = await puppeteer.launch({
defaultViewport: false,
headless: true,
//saves cookies for saving captcha
});
const page = await browser.newPage();
await page.goto("https://www.pokernow.club/games/pgl4O2TEDE9Tge9k2ltFDj7Fa");
await page.exposeFunction("printMe", (lul) => console.log(lul));
await page.exposeFunction("getPlayerNumber", (playerTagClassName) => {
console.log(`playerTagClassName is ${playerTagClassName}`);
const classNameTokens = playerTagClassName.split(" ");
return Promise.resolve(classNameTokens[1]);
});
await page.evaluate(async () => {
const playerTags = document.querySelectorAll(".seats .table-player");
for (const playerTag of playerTags) {
if (!playerTag.className.includes("table-player-seat")) {
const playerNumber = await getPlayerNumber(playerTag.className);
const observer = new MutationObserver(async (mutations) => {
for (const mutation of mutations) {
if (mutation.type == "childList" || mutation.type == "subtree") {
printMe(playerNumber + "yum");
const newStuff = await page.evaluate(() => {
return Promise.resolve("test");
});
printMe(newStuff);
}
}
});
observer.observe(playerTag, { childList: true, subtree: true });
}
}
});
}
run();
我尝试在 exposedFunction 中调用页面 eval,类似于 printMe 的功能,但这也没有奏效。
答: 暂无答案
评论
page
是一个节点的东西。Puppeteer 不会在浏览器中运行,而是从一个完全独立的进程自动执行浏览器。块中的任何内容都必须是 100% 的浏览器代码,因此不允许在那里调用 Puppeteer。Puppeteer 提供了一个方便的抽象,因此您通常不需要费心滚动自己的 .eval
waitForFunction
MutationObserver