【问题标题】:how to force puppeteer to wait for XMLHttpRequests to end, etc, and get finished version of DOM?如何强制 puppeteer 等待 XMLHttpRequests 结束等,并获得 DOM 的完成版本?
【发布时间】:2018-10-03 16:11:00
【问题描述】:

我目前有一个通过XMLHttpRequest 动态加载一些元素的网页。这是其中的 javascript 部分的样子:

function loadHtmlSnippet(filename, callback) {
    var xmlHttp = new XMLHttpRequest();

    xmlHttp.onreadystatechange = function() {
        if (xmlHttp.readyState == 4) {
            parser = new DOMParser()
            minidoc = parser.parseFromString(xmlHttp.responseText, "text/html")
            minibody = minidoc.getElementsByTagName('body')[0]
            callback(minibody)
        }
    };

    xmlHttp.open("GET", 'http://localhost:3000/' + filename, true);
    xmlHttp.send(null);
}

这是通过拨打电话来使用的......

loadHtmlSnippet('my_extra_html_piece.html', my_appropriate_callback)

...其中my_appropriate_callback 是一个将my_extra_html_piece.html DOM 插入到主页DOM 中某个适当位置的函数。

到目前为止一切顺利,它有效!

接下来,在所有加载结束后,我想以字符串的形式获得完成的 DOM。我一直在尝试为此使用 Chromium puppeteer。这是我的 puppeteer node.js 脚本:

const express = require('express')
const puppeteer = require('puppeteer')

url = process.argv[2]

async function ssr(url) {
    const browser = await puppeteer.launch({
        headless: true
    });
    const page = await browser.newPage();
    await page.goto(url, {
        waitUntil: 'networkidle0'
    });
    html = await page.content();
    await browser.close();
    return html;
}

async function start() {
    html = await ssr(url)
    console.log(html)
}

start()

(我基本上是从木偶教程中剪切粘贴的。)

唉,在完成一些 javascript 处理之后,上面的脚本返回给我 DOM,但在 XMLHttpRequests 完成加载并将它们各自的 HTML 插入到主 DOM 之后没有。

有没有办法强制 puppeteer 在保存渲染的 html 并关闭之前等待 javascript 真正完成旋转?

====

除此之外:我对this question 中讨论的序列化方法有一些运气,但是当我将 puppeteer 用于其他事情时,如果我也可以通过 puppeteer 完成这部分 DOM 序列化,那就太好了。 (所以这个问题是特定于 puppeteer 的。)

【问题讨论】:

  • 你可以使用page.waitForResponse
  • 谢谢,好像是这样。 (文档有点粗糙,尽管下面提到的page.waitForNavigation 有更好的文档,用于类似的选项。)在某些方面page.waitForRequest 可能更有用:我可以安装一个虚拟的 XMLHttpRequest,它只触发 javascript当 it 决定一切都完成后,puppeteer 将等待! (问题是response 之后可能会进行一些更多的页面处理,我不想迷路。)
  • page.waitForRequest start 当您请求启动并获得Request obj 时,您需要访问方法request.response() 以获取Response obj,您可以在其中使用@ 获取字符串987654338@,很好,但是使用page.waitForResponse,您将直接获得Response obj ...也许您不需要Request obj
  • waitForResponse 不起作用?

标签: javascript dom puppeteer


【解决方案1】:

等待 page.waitForNavigation({ waitUntil: 'domcontentloaded' });

【讨论】:

  • 我认为@kip 建议的page.waitForResponse(甚至page.waitForRequest,正如我在上面的评论中提到的)可能更合适,但我会接受你的回答,因为你只有 23 名声望:)
猜你喜欢
  • 2021-10-29
  • 2019-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-30
  • 2021-09-14
  • 2018-08-03
相关资源
最近更新 更多