run_from_console.casper.js 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  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):not(.pending)').length; });
  34. res_json.num_skipped = this.evaluate(function () { return document.querySelectorAll('li.test.pending').length; });
  35. res_json.duration = this.evaluate(function() { return document.querySelector('li.duration em').textContent; });
  36. res_json.suites = this.evaluate(function() {
  37. var traverse_node = function(elem) {
  38. var res;
  39. if (elem.classList.contains('suite')) {
  40. res = {
  41. type: 'suite',
  42. name: elem.querySelector('h1').textContent,
  43. has_subfailures: elem.querySelectorAll('li.test.fail').length > 0,
  44. };
  45. var child_elems = elem.querySelector('ul').children;
  46. res.children = Array.prototype.map.call(child_elems, traverse_node);
  47. return res;
  48. }
  49. else {
  50. var h2_content = elem.querySelector('h2').childNodes;
  51. res = {
  52. type: 'test',
  53. text: h2_content[0].textContent,
  54. };
  55. if (elem.classList.contains('pass')) {
  56. res.pass = true;
  57. if (elem.classList.contains('pending')) {
  58. res.slow = false;
  59. res.skipped = true;
  60. }
  61. else {
  62. res.slow = !elem.classList.contains('fast');
  63. res.skipped = false;
  64. res.duration = h2_content[1].textContent;
  65. }
  66. }
  67. else {
  68. res.error = elem.querySelector('pre.error').textContent;
  69. }
  70. return res;
  71. }
  72. };
  73. var top_suites = document.querySelectorAll('#mocha-report > li.suite');
  74. return Array.prototype.map.call(top_suites, traverse_node);
  75. });
  76. res_json.replay = this.evaluate(function() { return document.querySelector('a.replay').textContent; });
  77. this.emit('test_ready', res_json);
  78. }]);
  79. });
  80. spooky.run();
  81. });
  82. return spooky;
  83. };
  84. module.exports = {
  85. provide_emitter: provide_emitter,
  86. name: 'SpookyJS (CapserJS on PhantomJS)'
  87. };