我刚刚通过抓取一个健身网站测试了这个。@ewwink、@0fnt和@caram提供了最完整的答案。
仅仅因为一个DOM元素可见,并不意味着它的内容已经完全填充。
今天,我运行了:
await page.waitForSelector("table
const data = await page.$eval("table#some-table",(el)=>el.outerHTML)
console.log(data)
因为表格DOM还没有完全由运行时填充,所以收到了以下错误。您可以看到outerHTML为空。
user@env:$ <table id="some-table"></table>
添加1秒的暂停后,问题得到了解决,这是可以预料的。
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
await page.waitForSelector("table#some-table", {visible:true})
await sleep(1000)
const data = await page.$eval("table#some-table",(el)=>el.outerHTML)
console.log(data)
user@env:$ <table id="some-table"><tr><td>数据</td></tr></table>
但是,@ewwink的答案更加优雅(没有人为超时):
await page.waitForSelector("table#some-table", {visible:true})
await page.waitForFunction("document.querySelector('table#sched-records').clientHeight != 0")
const data = await page.$eval("table#some-table",(el)=>el.outerHTML)
console.log(data)
user@env:$ <table id="some-table"><tr><td>数据</td></tr></table>