У меня сейчас есть веб-страница, которая динамически загружает некоторые элементы через 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в виде строки, после окончания загрузки.Я пытался использовать Хром 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()
(я в основном вырезал это из учебника кукловода.)
Увы, приведенный выше скрипт возвращает мне DOM после некоторой обработки JavaScriptбыло сделано, но не после того, как XMLHttpRequest
s закончили загрузку и их соответствующие HTML-коды были вставлены в основную DOM.
Есть ли какой-то способ заставить кукловода ждать, пока JavaScript действительно завершит вращение, прежде чем сохранятьрендеринг html и закрытие?
====
В сторону: мне повезло с методами сериализации, обсуждаемыми в этом вопросе , но поскольку я использую кукловод дляВ остальном было бы неплохо, если бы я мог выполнять эту часть сериализации DOM через кукловода.(Таким образом, вопрос касается кукловода.)