为什么在使用Bootstrap时,zombie.js浏览器会返回空的HTML?

我正在尝试使用Mocha和Zombie来testing我的Node.js / Express.js应用程序。 我可以通过简单的testing,但只要将Twitter Bootstrap的脚本标记添加到我的视图中,浏览器对象就会返回空的HTML。

这是我的testing代码:

process.env.NODE_ENV = 'test'; var app = require('../app'); var assert = require('assert'); var Browser = require('zombie'); describe('home page', function() { before(function() { this.server = app.listen(3000); this.browser = new Browser({site: 'http://localhost:3000', debug : true}); }); it('should show welcome', function(done) { var browser = this.browser; browser .visit("/") .then(function() { console.log(browser.html()); }) .fail(function(error) { console.log("Error: ", error); }) .then(done); }); after(function(done) { this.server.close(done); }); }); 

视图代码(我的layout.jade文件):

 doctype 5 html head title= title link(rel='stylesheet', href='/stylesheets/style.css') script(src='/javascripts/jquery-2.0.3.min.js') script(src='/javascripts/bootstrap.min.js') body .navbar.navbar-inverse.navbar-fixed-top .container .navbar-header button.navbar-toggle(type='button', data-toggle='collapse', data-target='.navbar-collapse') span.icon-bar span.icon-bar span.icon-bar a.navbar-brand(href='/') Contact Database .collapse.navbar-collapse ul.nav.navbar-nav li.active a(href='/') Home li.active a(href='/contacts') Contacts block content 

如果我删除脚本标记,HTML将按预期logging到控制台。 否则,我会返回空的HTML。

debugging输出:

 home page ◦ should show welcome: Zombie: Opened window http://localhost:3000/ GET / 200 283ms - 1018b Zombie: GET http://localhost:3000/ => 200 Zombie: Loaded document http://localhost:3000/ GET /javascripts/bootstrap.min.js 200 4ms - 27.08kb Zombie: GET http://localhost:3000/javascripts/jquery-2.0.3.min.js => 200 Zombie: GET http://localhost:3000/javascripts/bootstrap.min.js => 200 GET /javascripts/jquery-2.0.3.min.js 200 41ms - 81.65kb <html></html> Zombie: Event loop is empty ✓ should show welcome (414ms) 

看起来问题可能与时间有关。 文档被加载,然后加载Javascript文件。 我想知道如果僵尸正在执行我的callback函数之前的JavaScript加载,因此在这一点上的DOM是空的。 有任何想法吗?

更新:

这是通过下面的wprl的build议解决的。

以下是添加了一个等待函数后的testing:

 it('should show welcome', function(done) { // Wait until page is loaded function pageLoaded(window) { return window.document.querySelector(".container"); } var browser = this.browser; browser.visit("/"); browser.wait(pageLoaded, function() { console.log(browser.html()); }); done(); }); 

我现在不得不重写我的testing逻辑,但是让它工作的关键是等待function。

这听起来像时间可能是一个问题。 另一方面,僵尸是好的,只有在使用访问JavaScript的事件停止后,才能给你控制。

一个好的策略是使用browser.wait 。在进行testing之前,等待某个DOM元素出现。 这样你知道,例如Bootstrap已经加载并显示元素#widget-view

可能还想调整maxWait / waitFor

至less可以排除时间问题。