2 回答

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