4

今天第一次尝试Zombie.js,我无法访问通过 javascript 填充 DOM 元素的页面(特别是 Backbone.js 应用程序)。作为一个简单的示例,我访问了Backbone.js Todo 应用程序并手动添加了一些项目。然后我尝试#todo-list使用 Zombie 抓取元素中的 html,但它返回为空。我已经设置browser.runScripts = true好了,所以不应该一切都准备好让僵尸查询吗?

看源码,里面的HTML确实是空的。Zombie.js 甚至可以做到这一点吗?还是我需要像这里所做的那样使用 Jasmine 之类的东西?

我在下面包含了示例代码,以及我得到的响应。

var zombie = require('zombie'),
vows = require('vows'),
assert = require('assert');

var baseUrl = 'http://documentcloud.github.com/backbone/examples/todos/index.html';

vows.describe('Zombie Tests on a Backbone App').addBatch({
'Navigate to Todo List' : {
  topic: function () {
    browser = new zombie.Browser({ debug: true });
    browser.runScripts = true;
    browser.on('error',function (err){console.log(err.stack)});
    browser.visit(baseUrl, this.callback);
  },
  'Can see todo list' : function (err,browser,status) {
    console.log('todo-list inner:' + browser.querySelector("#todo-list").innerHTML);
    // actual tests would go here
  }
},
}).export(module);

以及运行的输出vows

> vows test/todo-test.js --spec

♢ Zombie Tests on a Backbone App

Zombie: GET http://documentcloud.github.com/backbone/examples/todos/index.html
Zombie: GET http://documentcloud.github.com/backbone/examples/todos/index.html => 200
Zombie: GET http://documentcloud.github.com/backbone/test/vendor/json2.js
Zombie: GET http://documentcloud.github.com/backbone/test/vendor/jquery-1.5.js
Zombie: GET http://documentcloud.github.com/backbone/test/vendor/underscore-1.1.6.js
Zombie: GET http://documentcloud.github.com/backbone/backbone.js
Zombie: GET http://documentcloud.github.com/backbone/examples/backbone-localstorage.js
Zombie: GET http://documentcloud.github.com/backbone/examples/todos/todos.js
Zombie: GET http://documentcloud.github.com/backbone/examples/backbone-localstorage.js => 200
Zombie: GET http://documentcloud.github.com/backbone/test/vendor/json2.js => 200
Zombie: GET http://documentcloud.github.com/backbone/test/vendor/underscore-1.1.6.js => 200
Zombie: GET http://documentcloud.github.com/backbone/backbone.js => 200
Zombie: GET http://documentcloud.github.com/backbone/examples/todos/todos.js => 200
Zombie: GET http://documentcloud.github.com/backbone/test/vendor/jquery-1.5.js => 200
Zombie: Firing timeout 1, delay: 1
todolist inner:
  Navigate to Todo List
    ✓ Can see todo list

✓ OK » 1 honored (3.824s)
4

2 回答 2

1

如果您使用该browser.html方法,那么您的示例就可以工作——我认为问题来自没有方法的browser对象querySelector(尽管它确实有一个queryandqueryAll方法)。

这是修改后的工作片段:

'Can see todo list' : function (err, browser, status) {
  var list = browser.html('#todo-list');
  console.log('todo-list inner: ' + list);
  // actual tests would go here
}
于 2012-01-03T22:15:11.270 回答
0

我认为访问方法回调太早了。尝试等待“完成”事件,例如browser.on('done', this.callback).

于 2011-09-27T11:11:57.960 回答