Ответ 1
Это известная проблема, но я нашел обходной путь:
- Загрузите страницу в iframe любого размера, который вам нравится.
- Отобразить скриншот, привязанный к прямоугольнику iframe.
В этом репозитории есть код: https://github.com/jbeuckm/Splasher
Должен ли выход из этого PhantomJS script быть 240x320 пикселей? Я получаю большой размер по умолчанию. clipRect(), казалось бы, отображает правильный размер изображения, но мне нужен отзывчивый контент страницы, чтобы отобразить фактический размер окна браузера.
var page = require('webpage').create();
page.viewportSize = { width: 240, height: 320 };
page.open('http://cnn.com', function (status) {
if (status !== 'success') {
console.log('Unable to load the address!');
} else {
window.setTimeout(function () {
page.render('default.png');
phantom.exit();
}, 200);
}
});
Это известная проблема, но я нашел обходной путь:
В этом репозитории есть код: https://github.com/jbeuckm/Splasher
Это работает!! Найден фрагмент на странице github issue. Он заставляет элемент body отображать страницу viewportSize:
var width = 1024;
var height = 768;
var webpage = require('webpage');
page = webpage.create();
page.viewportSize = {width: width, height: height};
page.open('http://harness.io', function(status) {
console.log(status);
page.evaluate(function(w, h) {
document.body.style.width = w + "px";
document.body.style.height = h + "px";
}, width, height);
page.clipRect = {top: 0, left: 0, width: width, height: height};
page.render('/tmp/test.png');
phantom.exit();
});
Это, похоже, работает в двоичном формате Mac для 1.9.7:
page.set('viewportSize', {width: 320, height: 480});
В CasperJS я рассмотрел эту проблему, использовал вышеупомянутый метод и, в конечном счете, нашел, что это было необязательно (по крайней мере для меня, в CasperJS), когда я установил одиночные параметры видового экрана через casper.viewport()
.
Я разместил свою версию ниже, чтобы вы могли увидеть, как она может работать со многими URL-адресами сразу.
// Requires node.js and casperjs (npm install casperjs)
var casper = require('casper').create();
var root_dir = 'screenshots/';
var links = [];
var root = 'http://localhost:8001/';
var DEBUG = false;
var opts = {top: 0, left: 0, 'width': 1280, 'height': 1024};
function getHrefs() {
// Taken wholesale from casperjs
// http://docs.casperjs.org/en/latest/quickstart.html
var links = document.querySelectorAll('.days li > a');
return Array.prototype.map.call(links, function(e) {
return e.getAttribute('href');
});
}
function captureLinks(links) {
casper.echo('= SCREEN CAPTURING LINKS ====');
casper.each(links, function(self, link) {
var filename = root_dir + link.replace('/index.html', '') + '.png';
casper.echo('Capturing... ' + filename);
// Relevant code...
this.viewport(opts.width, opts.height);
self.thenOpen(root + link, function() {
// slight delay for external libraries and init loading
this.wait(500, function(){
this.capture(filename, opts);
});
});
});
}
casper.start(root, function() {
links = links.concat(this.evaluate(getHrefs));
this.echo('= GETTING LINKS ====');
if(DEBUG) this.echo(links.join('\n'));
captureLinks(links);
});
casper.run();