使用PhantomJS的JSCover - TypeError:'null'不是对象

时间:2013-09-20 00:25:36

标签: jasmine phantomjs jscoverage

当我尝试使用PhantomJS运行JSCover时,我在下面看到错误:

遵循的步骤:

1)运行JSCover服务器:

java -jar ~/JSCover/target/dist/JSCover-all.jar -ws --report-dir=report

2)使用JSCover运行PhantomJS runner: *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 - evaluateJavaScript“(function(){return(function(){                 jscoverage_report( '虚拟');             })(); })()” 2013-09-19T16:36:07 [DEBUG] WebPage - evaluateJavaScript结果QVariant(,) 2013-09-19T16:36:07 [DEBUG]网络 - 资源请求错误:5(“取消操作”)URL:localhost8080/<app_home>/lib/backbone/1.0.0/backbone.js?cb=0.5381254460662603

3 个答案:

答案 0 :(得分:1)

这是我昨天遇到的一个问题。事实证明,示例脚本不适用于较新版本,因此我构建了一个适用于Jasmine 2.X的新Phantom脚本,用于修复它。您可以在我的存储库中找到工作脚本:

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

答案 1 :(得分:0)

当我尝试使用PhantomJS运行Jasmine时遇到了同样的问题。 我意识到最新版本的Jasmine-html.js(jasmine-2.0.0-rc2) 与PhantomJS的run-jasmine.js(phantomjs-1.9.2-windows)不同。

在Jasmine-html.js的jasmine-2.0.0-rc2版本中, 如果所有测试都通过,则“.description”类不可用。 只有在任何测试失败时才会创建此“描述”类。

因此,当我运行所有测试通过的phantomjs时,我收到上面的错误消息。 我修改了run-jasmine.js以适应Jasmine-html.js(jasmine-2.0.0-rc2) 解决这个问题。

答案 2 :(得分:0)

您是否异步加载测试?我使用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);
    }
});

根据加载的代码量,您可能需要增加延迟。