run_from_console.casper.js 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. var Spooky = require('spooky');
  2. var path = require('path');
  3. var phantom_path = require('phantomjs').path;
  4. var casper_path = path.resolve(__dirname, 'node_modules/casperjs/bin/casperjs');
  5. process.env['PHANTOMJS_EXECUTABLE'] = phantom_path;
  6. var casper_opts = {
  7. child: {
  8. transport: 'http',
  9. command: casper_path
  10. },
  11. casper: {
  12. logLevel: 'debug',
  13. verbose: true
  14. }
  15. }
  16. var provide_emitter = function(file_paths) {
  17. var spooky = new Spooky(casper_opts, function(err) {
  18. if (err) {
  19. if (err.stack) console.warn(err.stack);
  20. else console.warn(err);
  21. return;
  22. }
  23. spooky.start('about:blank');
  24. file_paths.forEach(function(file_path, path_ind) {
  25. spooky.thenOpen('file://'+file_path);
  26. spooky.then([{ path_ind: path_ind }, function() {
  27. var res_json = {
  28. file_ind: path_ind
  29. }
  30. res_json.num_tests = this.evaluate(function() { return document.querySelectorAll('li.test').length });
  31. res_json.num_passes = this.evaluate(function() { return document.querySelectorAll('li.test.pass').length });
  32. res_json.num_fails = this.evaluate(function() { return document.querySelectorAll('li.test.fail').length });
  33. res_json.num_slow = this.evaluate(function() { return document.querySelectorAll('li.test.pass:not(.fast)').length });
  34. res_json.duration = this.evaluate(function() { return document.querySelector('li.duration em').textContent });
  35. res_json.suites = this.evaluate(function() {
  36. var traverse_node = function(elem) {
  37. if (elem.classList.contains('suite')) {
  38. var res = {
  39. type: 'suite',
  40. name: elem.querySelector('h1').textContent,
  41. has_subfailures: elem.querySelectorAll('li.test.fail').length > 0,
  42. }
  43. var child_elems = elem.querySelector('ul').children;
  44. res.children = Array.prototype.map.call(child_elems, traverse_node);
  45. return res;
  46. }
  47. else {
  48. var h2_content = elem.querySelector('h2').childNodes;
  49. var res = {
  50. type: 'test',
  51. text: h2_content[0].textContent,
  52. }
  53. if (elem.classList.contains('pass')) {
  54. res.pass = true;
  55. res.slow = !elem.classList.contains('fast');
  56. res.duration = h2_content[1].textContent;
  57. }
  58. else {
  59. res.error = elem.querySelector('pre.error').textContent;
  60. }
  61. return res;
  62. }
  63. }
  64. var top_suites = document.querySelectorAll('#mocha-report > li.suite');
  65. return Array.prototype.map.call(top_suites, traverse_node);
  66. });
  67. res_json.replay = this.evaluate(function() { return document.querySelector('a.replay').textContent });
  68. this.emit('test_ready', res_json);
  69. }]);
  70. });
  71. spooky.run();
  72. });
  73. return spooky;
  74. }
  75. module.exports = {
  76. provide_emitter: provide_emitter,
  77. name: 'SpookyJS (CapserJS on PhantomJS)'
  78. }