【问题标题】:puppeteer can't get page source after using evaluate()puppeteer 使用 evaluate() 后无法获取页面源
【发布时间】:2020-04-01 02:05:23
【问题描述】:

我正在使用 puppeteer 与网站交互,使用 evaluate() 函数来操作页面前端(即点击某些项目等...),点击工作正常,但我无法返回页面源之后点击使用评估。

我在下面这个简化的脚本中重新创建了错误,它加载了 google.com,点击了“我觉得很幸运”,然后应该返回加载页面的页面源:

const puppeteer = require('puppeteer');

async function main() {
    const browser = await puppeteer.launch({
        headless: false,
        args: ['--no-sandbox']
    });

    const page = await browser.newPage();
    await page.goto('https://www.google.com/', {waitUntil: 'networkidle2'});

    response = await page.evaluate(() => {
            document.getElementsByClassName('RNmpXc')[1].click()
        });

    await page.waitForNavigation({waitUntil: 'load'});

    console.log(response.text());

}

main();

我收到以下错误:

TypeError: Cannot read property 'text' of undefined

更新新代码遵循使用 page.content() 的建议

const puppeteer = require('puppeteer');

async function main() {
    const browser = await puppeteer.launch({
        headless: false,
        args: ['--no-sandbox']
    });

    const page = await browser.newPage();
    await page.goto('https://www.google.com/', {waitUntil: 'networkidle2'});

    await page.evaluate(() => {
            document.getElementsByClassName('RNmpXc')[1].click()
        });

    const source = await page.content()
    console.log(source);

}

main();

我现在收到以下错误:

Error: Execution context was destroyed, most likely because of a navigation.

我的问题是:使用evaluate() 方法操作网页后,如何使用.text() 方法返回页面源代码?

非常感谢所有建议/见解/建议。

【问题讨论】:

    标签: javascript puppeteer


    【解决方案1】:

    由于您在 javascript 修改后要求页面源,我假设您需要 DOM 而不是原始 HTML 内容。您的 evaluate 函数不会返回任何导致未定义响应的内容。你可以使用

    const source = await page.evaluate(() => new XMLSerializer().serializeToString(document.doctype) + document.documentElement.outerHTML);
    

    const source = await page.content();
    

    【讨论】:

    • 您好,感谢您的意见,我已经尝试将您的建议集成到我的代码中,但我仍然面临以下错误“错误:执行上下文被破坏,很可能是因为导航。”看看我已经更新了我的问题以反映我的代码中的更改。哦,序列化也返回相同的错误。感谢您的帮助。
    • @mikemeyers 使用waitForNavigation点击后需要等待导航然后获取内容
    • 是的,谢谢,我刚刚在搜索官方 puppeteer github 时发现了这一点。我现在面临的问题是并非所有来源都被退回。这意味着,使用 page.content() 或序列化,CSS 是不完整的,并且 javascript 在返回的页面源上不起作用。你还有什么办法可以解决这个问题吗?
    • @mikemeyers 你能详细说明一下吗? page.content 不会下载网站及其内容,它会返回 DOM。
    • 当然,当我检索 page.content 时,DOM 似乎不完整或者可能已损坏。我尝试在浏览器中重新渲染检索到的 page.content,但渲染页面的 JS 不起作用。我要感谢你的宝贵时间,你真的很有帮助。
    猜你喜欢
    • 2017-05-07
    • 2018-11-04
    • 1970-01-01
    • 1970-01-01
    • 2019-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多