PhantomJS: получение отображаемых размеров страницы

При использовании PhantomJS для захвата экрана, где большая часть содержимого страницы добавляется или во время загрузки через JavaScript, я сталкиваюсь с проблемой. Вызов render() создает правильное изображение, отображая полный контент страницы, но при оценке document.body.clientHeight возвращается небольшое значение, которое предположительно является высотой страницы перед добавлением содержимого.

Как я могу получить высоту/ширину изображения, как это делает PhantomJS? Я не думаю, что это вопрос времени, я попытался заменить порядок вещей или установить длительные задержки, чтобы обеспечить полную загрузку.

var wp = require('webpage');

var page = wp.create();

page.viewportSize = { width: 1024, height: 768};

page.open(url, function (status) {

    if (status === 'success') {

        var f = "rendered.png";

        //Produces an image with height 4073px
        page.render(f);

        //height is only 150
        var height = page.evaluate(function() { return document.body.offsetHeight }),
            width = page.evaluate(function() { return document.body.offsetWidth });
            console.log(height,width);

    }

});

Ответ 1

Попробуйте использовать обратный вызов page.onLoadFinished:

var wp = require('webpage');

var page = wp.create();

page.viewportSize = { width: 1024, height: 768};

page.open(url);

page.onLoadFinished = function() {
    var f = "rendered.png";

    //Produces an image with height 4073px
    page.render(f);

    //height is only 150
    var height = page.evaluate(function() { return document.body.offsetHeight }),
        width = page.evaluate(function() { return document.body.offsetWidth });
    console.log(height,width);
};

Это должно вернуть правильную высоту и ширину после того, как содержимое страницы закончит загрузку. Я думаю, что разница в том, что page.onLoadFinished ожидает, что весь контент завершит загрузку, а не только для ответа 200 OK, который эквивалентен статусу success.