Относительный объектный путь к данным не работает в 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-адреса сервера.