刚刚通过抓取健身网站进行了测试。@ewwink、@0fnt 和 @caram 提供了最完整的答案。
仅仅因为一个 DOM 元素是可见的并不意味着它的内容已经被完全填充。
今天,我跑了:
await page.waitForSelector("table#some-table", {visible:true})
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>Data</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>Data</td></tr></table>