[英]How to access global variables in puppeteer
在這個示例代碼中,當它讀取數組contactList
和j
時,它說兩者都沒有定義,這是怎么回事?
const { join } = require('path');
const puppeteer = require('puppeteer');
(async () => {
// 1. Launch the browser
const browser = await puppeteer.launch({
"args": [
'--remote-debugging-port=9222'
],
"defaultViewport": {
"height": 1080,
"width": 1920
},
"headless": false
});
// 2. Open a new page
const page = await browser.newPage();
// 3. Navigate to URL
await page.goto('https://');
await new Promise(r => setTimeout(r, 10000));
console.log('Ready');
var contactList = ['cesar','gab','777','81411579','34353'];
var fLen = contactList.length;
var j = 0;
for (i = 0; i < fLen; i++) {
await page.evaluate(() => {
function searchContact(contact_name = "") {
//search = document.querySelector('#side > div._1Ra05 > div > label > div > div._1awRl.copyable-text.selectable-text');
search = document.querySelector('#side > div._1Ra05 > div > label > div > div._1awRl.copyable-text.selectable-text');
}
j++;
searchContact(contactList[j]);
}
}
看看page.evaluate(pageFunction[,...args])
的 Puppeteer 文檔。 它指出:
pageFunction <function|string> Function在頁面上下文中被評估
注意(我的粗體)“在頁面上下文中評估”。 變量j
和contactList
在頁面的上下文中不存在。
然而,值得慶幸的是,Puppeteer 有一種從頁面上下文調用服務器端代碼的方法page.exposeFunction(name, puppeteerFunction)
該方法在頁面的 window object 上添加了一個名為 function 的名稱。 調用時,function 執行 node.js 中的 puppeteerFunction 並返回 Promise 解析為 puppeteerFunction 的返回值。
對於您的用例,它看起來類似於以下內容:
const puppeteer = require('puppeteer');
(async function()
{
const browser = await puppeteer.launch({
headless: false,
args: [
"--no-sandbox", // I needed these args for it to run on my machine, you probably don't need them.
"--disable-setuid-sandbox"
]
});
const page = await browser.newPage();
const contacts = ["Charlie", "Carl", "Dennis", "Conrad"];
await page.exposeFunction("getContacts", function()
{
return contacts;
});
await page.exposeFunction("addContact", function(contact)
{
contacts.push(contact);
});
await page.evaluate(async function()
{
await addContact("Henry");
await addContact("Olav");
const contacts = await getContacts();
contacts.forEach(function(contact)
{
const div = document.createElement("div");
div.innerHTML = contact;
document.body.appendChild(div);
});
});
console.log("Contacts after evaluating page function: ", contacts.join(", "));
})()
請注意,這是一個玩具示例,盡管它是一個完整且可運行的示例。 您應該能夠從中找出 rest。 您在 OP 中的示例中發布的代碼沒有多大意義(即無休止的遞歸 function searchContact()
),因此您只需要根據您的用例進行調整。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.