Как заставить кукловода ждать окончания XMLHttpRequest и т. д., и получить готовую версию DOM? - PullRequest
0 голосов
/ 01 октября 2018

У меня сейчас есть веб-страница, которая динамически загружает некоторые элементы через 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 через кукловода.(Таким образом, вопрос касается кукловода.)

1 Ответ

0 голосов
/ 03 октября 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...