2 回答
TA貢獻1804條經驗 獲得超2個贊
這里的問題是您傳遞給的函數page.evaluate是在瀏覽器上下文內(在瀏覽器頁面內)運行的。要將結果從瀏覽器上下文發送到 Node.js 環境,結果將被序列化。
請參閱文檔中的返回類型page.evaluate:
返回: Promise< Serializable > Promise,它解析為的返回值pageFunction
在Serializable這里意味著你的數據將通過傳遞給Node.js的環境JSON.stringify,并有自動解析為您服務。但是,此過程將刪除對象的任何不可序列化的屬性。這就是你最終得到許多空對象的原因。
在 puppeteer 中獲取元素句柄
要獲取頁面上元素的句柄,您需要使用page.$,它會創建一個對象(在您的 Node.js 環境中),該對象鏈接到瀏覽器上下文中的元素。這些句柄也可以傳遞給page.evaluate調用。要查詢多個元素,您可以使用函數page.$$。
代碼示例
這是一個示例,它首先查詢元素,然后將元素句柄傳遞給評估函數以讀取屬性。
const elementHandle = await page.$('a');
const result = await page.evaluate(el => el.href, elementHandle);
打字稿的使用
關于 TypeScript 的問題是,在這種情況下,TypeScript 無法正確預測類型。對于 TypeScript 編譯器來說,這看起來像一個普通的函數調用,而實際上,函數被發送到客戶端執行。因此,在這種情況下,您必須自己轉換類型,否則 Typescript 將僅假定any為參數類型:
const elementHandle = await page.$('a');
const result = await page.evaluate((el: { href: string }) => el.href, elementHandle);
添加回答
舉報
