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.jslocalhost8080/<app>/module/framework/test/SpecRunner.html

TypeError: 'null' is not an object(Evaluating''document.body.querySelector(". Описание '). InnerText')`

phantomjs://webpage.evaluate():3phantomjs://webpage.evaluate():22phantomjs://webpage.evaluate():222013-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, и исправляет его. Вы можете найти рабочий скрипт здесь, в моем репозитории:

https://github.com/tkaplan/PhantomJS-Jasmine

Вы загружаете свои тесты асинхронно? Я использую 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), чтобы решить эту проблему.

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