我有以下节点js文件调用
evaluateOnNewDocument().
const StealthPlugin = require('puppeteer-extra-plugin-stealth')
puppeteer.use(StealthPlugin())
const fs = require('fs')
const preldpath = process.argv[2];
const url = process.argv[3];
const pdfpath = process.argv[4];
(async () => {
const browser = await puppeteer.launch({headless: 'new'});
const page = await browser.newPage();
const preloadFile = fs.readFileSync(preldpath, 'utf8');
await page.evaluateOnNewDocument(preloadFile);
await page.goto(url, {waitUntil: 'networkidle2'});
await page.pdf({path: pdfpath});
await browser.close();
})();
预加载文件如下所示。
Object.defineProperty(navigator, "languages", {
get: function() {
return ["fr-ca", "fr"];
};
});
我使用带有预加载javascript文件的nodejs脚本打开以下html文件,语言仍然保持默认并且没有更改为“fr-ca fr”。如何预加载 JavaScript 文件以使
navigator.languages
与默认值不同?
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Navigator Languages</title>
</head>
<body>
<h1>Your Preferred Languages:</h1>
<p id="language-output"></p>
<script>
const languageOutput = document.getElementById('language-output');
languageOutput.textContent = navigator.languages.join(', ');
</script>
</body>
</html>
根据评论,听起来您只是想让
evaluateOnNewDocument
工作,而不关心覆盖导航器语言。这不是最好的选择,因为无论 Puppeteer 如何,它似乎都不起作用,更不用说evaluateOnNewDocument
。这是一个没有它的最小示例:
const puppeteer = require("puppeteer"); // ^22.7.1
let browser;
(async () => {
const url = "https://www.example.com";
browser = await puppeteer.launch();
const [page] = await browser.pages();
await page.evaluateOnNewDocument("foo = 42");
await page.goto(url, {waitUntil: "domcontentloaded"});
console.log(await page.evaluate("foo"));
})()
.catch(err => console.error(err))
.finally(() => browser?.close());