Puppeteer page.evaluate 未正确返回

Ric*_*ego 2 javascript puppeteer

我正在尝试使用以下代码从网页获取所有按钮元素:

const test = await page.evaluate(() => {
        return document.querySelectorAll("button")
})

console.log(test)
Run Code Online (Sandbox Code Playgroud)

当我记录测试变量时,它会生成“未定义”,而当我在 chrome 控制台上运行以下代码时:

document.querySelectorAll("button")
Run Code Online (Sandbox Code Playgroud)

它产生正确数量的元素。

t.n*_*ese 5

您需要HTMLElements在网站上下文中执行所有与 相关的操作(因此在回调中evaluate)。

evaluate当您离开网站的上下文时,您可以返回的内容非常有限evaluate

您返回的数据evaluate必须是可序列化的,DOM元素不能以有意义的方式序列化。

因此,您只能返回可使用JSON.stringify.

我的最终目标是检查所有按钮,直到找到具有特定内部文本的按钮,然后单击它。

那么您可能不想使用,使用或evaluate从站点上下文外部查询元素$$$

let buttons = await page.$$("button")
Run Code Online (Sandbox Code Playgroud)

要从中获取文本,ElementHandler您可以使用:

const text = await page.evaluate(element => element.textContent, buttons[0]);
Run Code Online (Sandbox Code Playgroud)

或者

const text = await (await buttons[0].getProperty('textContent')).jsonValue();
Run Code Online (Sandbox Code Playgroud)

Aclick可以通过以下方式执行:

await buttons[0].click()
Run Code Online (Sandbox Code Playgroud)