Запрос DOM приложения Backbone.js с помощью Zombie.js - PullRequest
4 голосов
/ 14 сентября 2011

Просто пробую Zombie.js сегодня впервые, и у меня возникают проблемы при посещении страницы, которая заполняет элементы DOM через JavaScript (в частности, приложение Backbone.js). В качестве быстрого примера я посетил приложение Todo Backbone.js и вручную добавил несколько элементов. Затем я попытался получить html в элементе #todo-list, используя Zombie, и он вернулся пустым. Я установил browser.runScripts = true, так не должно ли все быть готово для запроса Зомби?

Глядя на источник, внутренний HTML действительно пуст. Это возможно даже с Zombie.js? Или мне нужно использовать что-то вроде Жасмин, как сделано здесь ?

Ниже приведен пример кода вместе с полученным ответом.

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)

Ответы [ 2 ]

1 голос
/ 04 января 2012

Если вы используете метод browser.html, то ваш пример работает - я думаю, что проблема в том, что объект browser не имеет метода querySelector (у него есть query и queryAll метод , хотя).

Вот исправленный рабочий фрагмент:

'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
}
0 голосов
/ 27 сентября 2011

Я думаю, что метод посещений перезванивает слишком рано. Попробуйте дождаться события «Готово», например browser.on('done', this.callback).

...