Относительный объектный путь к данным не работает в PhantomJS

У меня есть скрипт PhantomJS, который просматривает папки в моей файловой системе и делает скриншоты HTML-страниц.

Из-за размера окна и множества проблем, описанных здесь, я решил поместить HTML-файл в объект ширины и высоты по своему выбору, а затем сделать его снимок экрана.

Если я создаю основной HTML-файл с объектом с относительным URL-адресом данных и открываю его в своем браузере, он отлично работает.

Вот краткий обзор моей файловой структуры.

.
├── dist
|   ├── page_one
|       └── page_one.html
|   └── page_two
|       └── page_two.html
└── tools
    └── screenshot.js

Код ниже, сохраняется в файле, который я называю screenshot.js. Я хочу иметь возможность запустить это через PhantomJS. По сути, он читает разделенную запятыми строку каталогов (например, page_one,page_two), переходит на эти страницы, делает снимок экрана и переходит на следующую. Но, несмотря на то, что сгенерированный HTML-файл совпадает с созданным ранее тестовым файлом, снимки экрана всегда остаются пустыми.

Если я заменю относительный URL-адрес данных на абсолютный путь, сценарий будет работать отлично, но, очевидно, его не очень многократно использовать, если путь к файлу нужно менять для каждого проекта.

Я пытался использовать ряд ../ до относительного URL-адреса данных, но это все еще не работает.

var args = require('system').args,
    resourceWait  = 300,
    maxRenderWait = 10000,
    filesbefore   = "page_one,page_twoK",
    files         = filesbefore.split(','),
    mode          = 'iframe',
    page          = require('webpage').create(),
    count         = 0,
    forcedRenderTimeout,
    renderTimeout;

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

function doRender() {
    page.render(filename);
    next();
}

page.onResourceRequested = function (req) {
    count += 1;
    clearTimeout(renderTimeout);
};

page.onResourceReceived = function (res) {
    if (!res.stage || res.stage === 'end') {
        count -= 1;
        if (count === 0) {
            clearTimeout(forcedRenderTimeout);
            renderTimeout = setTimeout(doRender, resourceWait);
        }
    }
};

page.onConsoleMessage = function (msg) {
    console.log("from page: " + msg);
};

function evaluateJsWithArgs(func) {
    var args = [].slice.call(arguments, 1);
    var fn = "function() { return (" + func.toString() + ").apply(this, " + JSON.stringify(args) + "); }";
    return page.evaluate(fn);
};

function next(error) {
    if(!error) {
        if (files.length == 0){
            phantom.exit();
        }else{
            takeScreenshot(files.pop());
        }
    }
}

function takeScreenshot(file){
    var url = 'dist/' + file + '/' + file + '.html';
    filename = file + '.png';
    page.open('about:blank', function (status) {
        if (status !== "success") {
            console.log('Unable to load url');
            phantom.exit();
        } else {
            page.includeJs(
                "https://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js",
                function() {
                    evaluateJsWithArgs(
                        function(url, w, h) {
                            console.log(url);
                            $('body')
                                .css({margin: 0, padding: 0})
                                .html('<object style="background: red;" data="../' + url + '" width="'+ w + '" height="' + h + '" id="screen-frame" />');

                                console.log($('body').html());
                        },
                        url,
                        page.viewportSize.width,
                        page.viewportSize.height
                    );
                }
            );

            forcedRenderTimeout = setTimeout(function () {
                doRender();
            }, maxRenderWait);
        }
    });
}

takeScreenshot(files.pop());

Пожалуйста, может кто-нибудь сказать мне, почему это не работает.

Заранее спасибо.

-

Примечание. Если вы хотите запустить это локально, создайте базовую файловую структуру, подобную моей, выше, загрузите PhantomJS, перейдите в корневой каталог проекта и запустите phantomjs tools/screenshot.js ,

-

РЕДАКТИРОВАТЬ После поиска я нашел этот Q & A. Насколько я понимаю, PhantomJS просто не может открывать локальные файлы при использовании относительного пути.

Абсолютный путь не подходит, так как он никогда не будет прежним.

Единственный другой вариант, который я могу найти в данный момент, - это поместить файлы на локальный сервер, а затем запустить скрипт с URL-адреса сервера.

0 ответов

Другие вопросы по тегам