【问题标题】:JSCover with PhantomJS - TypeError: 'null' is not an object带有 PhantomJS 的 JSCover - TypeError:'null' 不是对象
【发布时间】:2013-09-25 06:28:41
【问题描述】:

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

后续步骤:

1) 运行 JSCover 服务器:

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

2) 使用 JSCover 运行 PhantomJS 运行器: *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(评估''document.body.querySelector('.description').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] 网页 - 评估 JavaScript "(function() { return (function () { jscoverage_report('幻影'); })(); })()" 2013-09-19T16:36:07 [DEBUG] 网页 - 评估 JavaScript 结果 QVariant(, ) 2013-09-19T16:36:07 [DEBUG] 网络 - 资源请求错误:5(“操作已取消”) URL:localhost8080/<app_home>/lib/backbone/1.0.0/backbone.js?cb=0.5381254460662603

【问题讨论】:

  • 你使用 Jasmine 的 HtmlReporter 还是其他的?我相信您会看到该错误,因为该页面不包含由 HtmlReporter 创建的标记。
  • htmlreporter 和当前的 jasmine 有同样的问题。使用 karma-jasmine 的 karma 测试很好,但是 jasmine 记者在运行测试之前不会等待窗口加载。我在其中一个描述块中有一个 document.body.appendChild。我正在测试 DOM。

标签: jasmine phantomjs jscoverage


【解决方案1】:

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

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

【讨论】:

  • 非常好的脚本,虽然我发现了一个错误:for(var j = 0; j
  • 谢谢,如果你想继续做公关,我会接受的。但我现在没有使用它,因为我现在使用其他测试运行器,比如 karma。
【解决方案2】:

当我尝试使用 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) 到 解决这个问题。

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 我使用与 run-jasmine.js 相同的设置,在团队城市之外运行测试工作正常。在团队城市内跑步时,我从构建日志中得到以下信息。 E:\APPS\TeamCity\buildAgent\work\7e813246cff2b28\jQuery\src\Jobs.Web.UnitTests\S‌​pecRunner.html [15:10:50][Step 4/4] 在目录:E:\APPS\TeamCity \buildAgent\work\7e813246cff2b28 [15:11:05][Step 4/4] 'waitFor()' 在 12006 毫秒内完成。 [15:11:05][Step 4/4] Process exited with code 0 我尝试增加等待时间但没有帮助
    猜你喜欢
    • 2015-06-20
    • 1970-01-01
    • 2017-01-24
    • 2013-02-23
    • 2021-05-08
    • 2021-11-02
    • 2019-10-18
    • 2016-08-18
    • 1970-01-01
    相关资源
    最近更新 更多