首頁 >web前端 >js教程 >為什麼在 Puppeteer 中查詢元素時 `page.evaluate()` 回傳空物件?

為什麼在 Puppeteer 中查詢元素時 `page.evaluate()` 回傳空物件?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-11-16 04:33:03306瀏覽

Why Does `page.evaluate()` Return Empty Objects When Querying Elements in Puppeteer?

Puppeteer: page.evaluate querySelectorAll 困境

在Puppeteer 中使用page.evaluate() 函數時,部分使用者遇到了以下問題接收到一個空物件數組。這種令人費解的行為源自於需要從評估函數中傳回可序列化的值。

考慮以下Puppeteer 程式碼,其中的目標是從流行的社交新聞聚合網站Reddit 中提取標題元素:

const browser = await puppeteer.launch();

const page = await browser.newPage();
await page.goto('https://reddit.com/');

let list = await page.evaluate(() => {
  return Promise.resolve(Array.from(document.querySelectorAll('.title')));
});

console.log(JSON.stringify(list))

await browser.close();

執行後,此程式碼可能會傳回一組與問題描述中提到的類似的空物件。原因在於,雖然 DOM 元素不能直接序列化為 JSON,但 Puppeteer 仍會嘗試將它們字串化。

要解決此問題,程式碼需要從元素中提取所需的值並傳回它們採用 JSON 可序列化格式。在這種情況下,標題元素的 href 屬性會保存實際的標題連結。要取得這些,可以修改程式碼如下:

let links = await this.page.evaluate((sel) => {
        let elements = Array.from(document.querySelectorAll(sel));
        let links = elements.map(element => {
            return element.href
        })
        return links;
    }, sel);

以上是為什麼在 Puppeteer 中查詢元素時 `page.evaluate()` 回傳空物件?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn