JSCover с PhantomJS - TypeError: 'null' не является объектом
Когда я пытаюсь запустить JSCover с PhantomJS, я вижу ниже ERROR:
Последовали шаги:
1) Запустите сервер JSCover:
java -jar ~/JSCover/target/dist/JSCover-all.jar -ws --report-dir=report
2) Запустите бегунок PhantomJS с помощью JSCover:*phantomjs --debug=true ~/JSCover/src/test/javascript/lib/PhantomJS/run-jscover-jasmine.js
localhost8080/<app>/module/framework/test/SpecRunner.html
TypeError: 'null' is not an object
(Evaluating''document.body.querySelector(". Описание '). InnerText')`
phantomjs://webpage.evaluate():3
phantomjs://webpage.evaluate():22
phantomjs://webpage.evaluate():22
2013-09-19T16:36:07 [DEBUG] WebPage - evaluateJavaScript result QVariant(, )
2013-09-19T16: 36: 07 [DEBUG] WebPage --valuJavaScript "(function() { return (function () {
jscoverage_report('phantom');
})(); })()"
2013-09-19T16:36:07 [DEBUG] WebPage - оценивать результат JavaScript QVariant(,)
2013-09-19T16:36:07 [DEBUG] Сеть - ошибка запроса ресурса: 5 ( "Операция отменена") URL: localhost8080/<app_home>/lib/backbone/1.0.0/backbone.js?cb=0.5381254460662603
3 ответа
Это была проблема, с которой я столкнулся вчера. Оказывается, что примерный скрипт не работает для более новых версий, поэтому я создал новый Phantom Script, который работает для Jasmine 2.X, и исправляет его. Вы можете найти рабочий скрипт здесь, в моем репозитории:
Вы загружаете свои тесты асинхронно? Я использую requirejs для модульного JavaScript. Он также используется для загрузки спецификаций теста:
<script data-main='SpecRunner' src='/test/scripts/libs/require.js'></script>
При использовании JSCover, run-jscover-jasmine.js
Сценарий не учитывает это асинхронное поведение, поэтому узлы DOM, на которые есть ссылка в запросе, не существуют (пока). Я изменил скрипт, чтобы задержать вызов waitFor на 1 секунду:
page.open(system.args[1], function(status){
if (status !== "success") {
console.log("Unable to access network");
phantom.exit();
} else {
// Added 1s delay here
window.setTimeout(function() {
waitFor(function(){
return page.evaluate(function(){
return document.body.querySelector('.symbolSummary .pending') === null
});
}, function(){
var exitCode = page.evaluate(function(){
console.log('');
console.log(document.body.querySelector('.description').innerText);
var list = document.body.querySelectorAll('.results > #details > .specDetail.failed');
if (list && list.length > 0) {
console.log('');
console.log(list.length + ' test(s) FAILED:');
for (i = 0; i < list.length; ++i) {
var el = list[i],
desc = el.querySelector('.description'),
msg = el.querySelector('.resultMessage.fail');
console.log('');
console.log(desc.innerText);
console.log(msg.innerText);
console.log('');
}
return 1;
} else {
console.log(document.body.querySelector('.alert > .passingAlert.bar').innerText);
return 0;
}
});
page.evaluate(function(){
jscoverage_report('phantom');
});
phantom.exit(exitCode);
});
}, 1000);
}
});
В зависимости от количества загруженного кода может потребоваться увеличить задержку.
Я столкнулся с той же проблемой, когда пытался запустить Jasmine с PhantomJS. Я понял, что последняя версия Jasmine-html.js (jasmine-2.0.0-rc2) не идет вместе с run-jasmine.js PhantomJS (phantomjs-1.9.2-windows).
В jasmine-2.0.0-rc2-версии Jasmine-html.js класс.description недоступен, если пройдены все тесты. Этот класс 'description' создается, только если какой-либо тест не пройден.
Таким образом, когда я запускаю фантомы со всеми пройденными тестами, я получаю сообщение об ошибке выше. Я изменил run-jasmine.js для адаптации к Jasmine-html.js (jasmine-2.0.0-rc2), чтобы решить эту проблему.