PhantomJS это все плюшки WebKit из консоли с управлением на JS и поддержкой различных стандартов и технологий: DOM, CSS, JSON, Canvas и SVG.
Внутри несколько примеров использования
Запуск
Запустить скрипты с помощью PhantomJS очень просто:
phantomjs script.js [arguments]
Использование
Это самое простое приложение для PhantomJS
console.log('Hello, world!');
phantom.exit();
Возьмем пример посложнее. Данный скрипт покажет время загрузки страницы:
if (phantom.state.length === 0) {
if (phantom.args.length === 0) {
console.log('Usage: loadspeed.js <some URL>');
phantom.exit();
} else {
var address = phantom.args[0];
phantom.state = Date.now().toString();
console.log('Loading ' + address);
phantom.open(address);
}
} else {
var elapsed = Date.now() - new Date().setTime(phantom.state);
if (phantom.loadStatus === 'success') {
console.log('Page title is ' + document.title);
console.log('Loading time ' + elapsed + ' msec');
} else {
console.log('FAIL to load the address');
}
phantom.exit();
}
После запуска его
phantomjs loadspeed.js http://www.google.com
мы получим
Loading http://www.google.com
Page title is Google
Loading time 719 msec
Юнит-Тесты
Это, на мой взгляд самое полезное применение.
В качестве примера показана интеграция с QUnit
if (phantom.state.length === 0) {
if (phantom.args.length === 0 || phantom.args.length > 2) {
console.log('Usage: run-qunit.js URL');
phantom.exit();
} else {
phantom.state = 'run-qunit';
phantom.open(phantom.args[0]);
}
} else {
setInterval(function() {
var el = document.getElementById('qunit-testresult');
if (phantom.state !== 'finish') {
if (el && el.innerText.match('completed')) {
phantom.state = 'finish';
console.log(el.innerText);
try {
failed = el.getElementsByClassName('failed')[0].innerHTML;
} catch (e) {
}
phantom.exit((parseInt(failed, 10) > 0) ? 1 : 0);
}
}
}, 100);
}
В качестве результатов мы получим
Tests completed in 1486 milliseconds.
1267 tests of 1267 passed, 0 failed.
Рендеринг
Тоже полезная вещь. Кто-то может написать еще один сервис создания скриншотов страниц.
if (phantom.state.length === 0) {
if (phantom.args.length !== 2) {
console.log('Usage: rasterize.js URL filename');
phantom.exit();
} else {
var address = phantom.args[0];
phantom.state = 'rasterize';
phantom.viewportSize = { width: 600, height: 600 };
phantom.open(address);
}
} else {
var output = phantom.args[1];
phantom.sleep(200);
phantom.render(output);
phantom.exit();
}
Натравив его на http://raphaeljs.com/polar-clock.html
phantomjs rasterize.js http://raphaeljs.com/polar-clock.html clock.png
Получим
Или к примеру нужно получить pdf с версии для печати в википедии:
phantomjs rasterize.js "http://en.wikipedia.org/w/index.php?title=Jakarta&printable=yes" jakarta.pdf
что даст нам
(выглядит не очень из-за сильного зум-аута в FoxitPDF Reader)
Скачать бинарники для Windows и исходный код можно с google code
Ну и разумеется сайт проекта: http://www.phantomjs.org