casperjs 1.0.0.RC1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (125) hide show
  1. data/CHANGELOG.md +179 -0
  2. data/LICENSE.md +19 -0
  3. data/README.md +30 -0
  4. data/bin/bootstrap.js +292 -0
  5. data/bin/usage.txt +10 -0
  6. data/casperjs.gemspec +21 -0
  7. data/modules/casper.js +1679 -0
  8. data/modules/cli.js +138 -0
  9. data/modules/clientutils.js +595 -0
  10. data/modules/colorizer.js +129 -0
  11. data/modules/events.js +247 -0
  12. data/modules/injector.js +93 -0
  13. data/modules/mouse.js +110 -0
  14. data/modules/querystring.js +187 -0
  15. data/modules/tester.js +807 -0
  16. data/modules/utils.js +429 -0
  17. data/modules/vendors/coffee-script.js +8 -0
  18. data/modules/xunit.js +123 -0
  19. data/package.json +35 -0
  20. data/rubybin/casperjs +57 -0
  21. data/samples/bbcshots.coffee +64 -0
  22. data/samples/bbcshots.js +80 -0
  23. data/samples/cliplay.coffee +19 -0
  24. data/samples/cliplay.js +21 -0
  25. data/samples/customevents.coffee +11 -0
  26. data/samples/customevents.js +13 -0
  27. data/samples/customlogging.coffee +33 -0
  28. data/samples/customlogging.js +42 -0
  29. data/samples/download.coffee +10 -0
  30. data/samples/download.js +11 -0
  31. data/samples/dynamic.coffee +60 -0
  32. data/samples/dynamic.js +65 -0
  33. data/samples/each.coffee +14 -0
  34. data/samples/each.js +17 -0
  35. data/samples/events.coffee +34 -0
  36. data/samples/events.js +41 -0
  37. data/samples/extends.coffee +29 -0
  38. data/samples/extends.js +37 -0
  39. data/samples/googlelinks.coffee +27 -0
  40. data/samples/googlelinks.js +33 -0
  41. data/samples/googlematch.coffee +47 -0
  42. data/samples/googlematch.js +65 -0
  43. data/samples/googlepagination.coffee +40 -0
  44. data/samples/googlepagination.js +51 -0
  45. data/samples/googletesting.coffee +17 -0
  46. data/samples/googletesting.js +23 -0
  47. data/samples/logcolor.coffee +10 -0
  48. data/samples/logcolor.js +11 -0
  49. data/samples/metaextract.coffee +23 -0
  50. data/samples/metaextract.js +29 -0
  51. data/samples/multirun.coffee +37 -0
  52. data/samples/multirun.js +56 -0
  53. data/samples/screenshot.coffee +28 -0
  54. data/samples/screenshot.js +33 -0
  55. data/samples/statushandlers.coffee +15 -0
  56. data/samples/statushandlers.js +19 -0
  57. data/samples/steptimeout.coffee +37 -0
  58. data/samples/steptimeout.js +45 -0
  59. data/samples/timeout.coffee +39 -0
  60. data/samples/timeout.js +47 -0
  61. data/tests/run.js +76 -0
  62. data/tests/site/alert.html +10 -0
  63. data/tests/site/click.html +40 -0
  64. data/tests/site/confirm.html +12 -0
  65. data/tests/site/elementattribute.html +6 -0
  66. data/tests/site/error.html +10 -0
  67. data/tests/site/form.html +26 -0
  68. data/tests/site/global.html +9 -0
  69. data/tests/site/images/phantom.png +0 -0
  70. data/tests/site/index.html +17 -0
  71. data/tests/site/mouse-events.html +47 -0
  72. data/tests/site/multiple-forms.html +16 -0
  73. data/tests/site/page1.html +8 -0
  74. data/tests/site/page2.html +8 -0
  75. data/tests/site/page3.html +8 -0
  76. data/tests/site/prompt.html +12 -0
  77. data/tests/site/resources.html +16 -0
  78. data/tests/site/result.html +11 -0
  79. data/tests/site/test.html +10 -0
  80. data/tests/site/visible.html +17 -0
  81. data/tests/site/waitFor.html +22 -0
  82. data/tests/suites/casper/agent.js +24 -0
  83. data/tests/suites/casper/capture.js +31 -0
  84. data/tests/suites/casper/click.js +61 -0
  85. data/tests/suites/casper/confirm.js +21 -0
  86. data/tests/suites/casper/elementattribute.js +8 -0
  87. data/tests/suites/casper/encode.js +20 -0
  88. data/tests/suites/casper/evaluate.js +27 -0
  89. data/tests/suites/casper/events.js +38 -0
  90. data/tests/suites/casper/exists.js +9 -0
  91. data/tests/suites/casper/fetchtext.js +9 -0
  92. data/tests/suites/casper/flow.coffee +38 -0
  93. data/tests/suites/casper/formfill.js +69 -0
  94. data/tests/suites/casper/global.js +9 -0
  95. data/tests/suites/casper/history.js +21 -0
  96. data/tests/suites/casper/hooks.js +41 -0
  97. data/tests/suites/casper/logging.js +38 -0
  98. data/tests/suites/casper/mouseevents.js +27 -0
  99. data/tests/suites/casper/onerror.js +19 -0
  100. data/tests/suites/casper/open.js +73 -0
  101. data/tests/suites/casper/prompt.js +17 -0
  102. data/tests/suites/casper/resources.coffee +24 -0
  103. data/tests/suites/casper/start.js +15 -0
  104. data/tests/suites/casper/steps.js +32 -0
  105. data/tests/suites/casper/viewport.js +11 -0
  106. data/tests/suites/casper/visible.js +17 -0
  107. data/tests/suites/casper/wait.js +27 -0
  108. data/tests/suites/casper/xpath.js +32 -0
  109. data/tests/suites/cli.js +125 -0
  110. data/tests/suites/clientutils.js +84 -0
  111. data/tests/suites/coffee.coffee +19 -0
  112. data/tests/suites/fs.js +36 -0
  113. data/tests/suites/http_status.js +28 -0
  114. data/tests/suites/injector.js +64 -0
  115. data/tests/suites/tester.js +121 -0
  116. data/tests/suites/utils.js +209 -0
  117. data/tests/suites/xunit.js +16 -0
  118. data/tests/testdir/01_a/abc.js +0 -0
  119. data/tests/testdir/01_a/def.js +0 -0
  120. data/tests/testdir/02_b/abc.js +0 -0
  121. data/tests/testdir/03_a.js +0 -0
  122. data/tests/testdir/03_b.js +0 -0
  123. data/tests/testdir/04/01_init.js +0 -0
  124. data/tests/testdir/04/02_do.js +0 -0
  125. metadata +192 -0
@@ -0,0 +1,39 @@
1
+ ###
2
+ Just a silly game.
3
+
4
+ $ casperjs samples/timeout.js 500
5
+ Will google.com load in less than 500ms?
6
+ NOPE.
7
+
8
+ $ casperjs samples/timeout.js 1000
9
+ Will google.com load in less than 1000ms?
10
+ NOPE.
11
+
12
+ $ casperjs samples/timeout.js 1500
13
+ Will google.com load in less than 1500ms?
14
+ NOPE.
15
+
16
+ $ casperjs samples/timeout.js 2000
17
+ Will google.com load in less than 2000ms?
18
+ YES!
19
+ ###
20
+
21
+ casper = require("casper").create
22
+ onTimeout: ->
23
+ @echo "NOPE.", "RED_BAR"
24
+ @exit()
25
+
26
+ timeout = ~~casper.cli.get 0
27
+ if timeout < 1
28
+ casper
29
+ .echo("You must pass a valid timeout value")
30
+ .exit(1)
31
+
32
+ casper.echo "Will google.com load in less than #{timeout}ms?"
33
+ casper.options.timeout = timeout
34
+
35
+ casper.start "http://www.google.com/", ->
36
+ @echo "YES!", "GREEN_BAR"
37
+ @exit()
38
+
39
+ casper.run()
@@ -0,0 +1,47 @@
1
+ /*
2
+ * Just a silly game.
3
+ *
4
+ * $ casperjs samples/timeout.js 500
5
+ * Will google.com load in less than 500ms?
6
+ * NOPE.
7
+ *
8
+ * $ casperjs samples/timeout.js 1000
9
+ * Will google.com load in less than 1000ms?
10
+ * NOPE.
11
+ *
12
+ * $ casperjs samples/timeout.js 1500
13
+ * Will google.com load in less than 1500ms?
14
+ * NOPE.
15
+ *
16
+ * $ casperjs samples/timeout.js 2000
17
+ * Will google.com load in less than 2000ms?
18
+ * YES!
19
+ */
20
+
21
+ var casper = require("casper").create({
22
+ onTimeout: function() {
23
+ this
24
+ .echo("NOPE.", "RED_BAR")
25
+ .exit()
26
+ ;
27
+ }
28
+ });
29
+
30
+ var timeout = ~~casper.cli.get(0);
31
+
32
+ if (timeout < 1) {
33
+ casper
34
+ .echo("You must pass a valid timeout value")
35
+ .exit(1)
36
+ ;
37
+ }
38
+
39
+ casper.echo("Will google.com load in less than " + timeout + "ms?");
40
+ casper.options.timeout = timeout;
41
+
42
+ casper.start("http://www.google.com/", function() {
43
+ this.echo("YES!", "GREEN_BAR");
44
+ this.exit();
45
+ });
46
+
47
+ casper.run();
@@ -0,0 +1,76 @@
1
+ if (!phantom.casperLoaded) {
2
+ console.log('This script must be invoked using the casperjs executable');
3
+ phantom.exit(1);
4
+ }
5
+
6
+ var fs = require('fs');
7
+ var utils = require('utils');
8
+ var f = utils.format;
9
+ var includes = [];
10
+ var tests = [];
11
+ var casper = require('casper').create({
12
+ exitOnError: false
13
+ });
14
+
15
+ // local utils
16
+ function checkIncludeFile(include) {
17
+ var absInclude = fs.absolute(include.trim());
18
+ if (!fs.exists(absInclude)) {
19
+ casper.warn("%s file not found, can't be included", absInclude);
20
+ return;
21
+ }
22
+ if (!utils.isJsFile(absInclude)) {
23
+ casper.warn("%s is not a supported file type, can't be included", absInclude);
24
+ return;
25
+ }
26
+ if (fs.isDirectory(absInclude)) {
27
+ casper.warn("%s is a directory, can't be included", absInclude);
28
+ return;
29
+ }
30
+ if (tests.indexOf(include) > -1 || tests.indexOf(absInclude) > -1) {
31
+ casper.warn("%s is a test file, can't be included", absInclude);
32
+ return;
33
+ }
34
+ return absInclude;
35
+ }
36
+
37
+ // parse some options from cli
38
+ casper.options.verbose = casper.cli.get('direct') || false;
39
+ casper.options.logLevel = casper.cli.get('log-level') || "error";
40
+
41
+ // overriding Casper.open to prefix all test urls
42
+ casper.setFilter('open.location', function(location) {
43
+ if (!/^http/.test(location)) {
44
+ return f('file://%s/%s', fs.workingDirectory, location);
45
+ }
46
+ return location;
47
+ });
48
+
49
+ // test paths are passed as args
50
+ if (casper.cli.args.length) {
51
+ tests = casper.cli.args.filter(function(path) {
52
+ return fs.isFile(path) || fs.isDirectory(path);
53
+ });
54
+ } else {
55
+ casper.echo('No test path passed, exiting.', 'RED_BAR', 80);
56
+ casper.exit(1);
57
+ }
58
+
59
+ // includes handling
60
+ if (casper.cli.has('includes')) {
61
+ includes = casper.cli.get('includes').split(',').map(function(include) {
62
+ // we can't use filter() directly because of abspath transformation
63
+ return checkIncludeFile(include);
64
+ }).filter(function(include) {
65
+ return utils.isString(include);
66
+ });
67
+ casper.test.includes = utils.unique(includes);
68
+ }
69
+
70
+ // test suites completion listener
71
+ casper.test.on('tests.complete', function() {
72
+ this.renderResults(true, undefined, casper.cli.get('xunit') || undefined);
73
+ });
74
+
75
+ // run all the suites
76
+ casper.test.runSuites.apply(casper.test, tests);
@@ -0,0 +1,10 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
5
+ <title>CasperJS test alert</title>
6
+ </head>
7
+ <body>
8
+ <script>alert('plop')</script>
9
+ </body>
10
+ </html>
@@ -0,0 +1,40 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
5
+ <title>CasperJS test click</title>
6
+ </head>
7
+ <body>
8
+ <a id="test1" href="javascript:results.test1 = true;">test1</a>
9
+ <a id="test2" href="#" onclick="results.test2 = true;">test2</a>
10
+ <a id="test3" href="page1.html" onclick="results.test3 = true; return false">test3</a>
11
+ <a id="test4" href="http://www.google.com/">test4</a>
12
+ <script>
13
+ (function(window) {
14
+ window.results = {
15
+ test1: false,
16
+ test2: false,
17
+ test3: false,
18
+ test4: false,
19
+ testdown: [],
20
+ testup: [],
21
+ testmove: [],
22
+ testclick: []
23
+ };
24
+ document.querySelector('#test4').onclick = function(event) {
25
+ results.test4 = true;
26
+ event.preventDefault();
27
+ };
28
+ window.onmousedown = function(event) {
29
+ results.testdown = [event.x, event.y];
30
+ };
31
+ window.onmouseup = function(event) {
32
+ results.testup = [event.x, event.y];
33
+ };
34
+ window.onmousemove = function(event) {
35
+ results.testmove = [event.x, event.y];
36
+ };
37
+ })(window);
38
+ </script>
39
+ </body>
40
+ </html>
@@ -0,0 +1,12 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
5
+ <title>CasperJS test confirm</title>
6
+ </head>
7
+ <body>
8
+ <script>
9
+ var confirmed = confirm('are you sure?');
10
+ </script>
11
+ </body>
12
+ </html>
@@ -0,0 +1,6 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <body>
4
+ <div class="tester testo testme" data-stuff="beautiful string"></div>
5
+ </body>
6
+ </html>
@@ -0,0 +1,10 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
5
+ <title>CasperJS error test</title>
6
+ </head>
7
+ <body>
8
+ <script>plop(); // intentional error here</script>
9
+ </body>
10
+ </html>
@@ -0,0 +1,26 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
5
+ <title>CasperJS test form</title>
6
+ </head>
7
+ <body>
8
+ <form action="result.html" enctype="multipart/form-data">
9
+ <input type="text" name="email" placeholder="email">
10
+ <input type="password" name="password" placeholder="password">
11
+ <textarea name="content"></textarea>
12
+ <select name="topic">
13
+ <option>foo</option>
14
+ <option value="bar">baz</option>
15
+ </select>
16
+ <input type="checkbox" name="check">
17
+ <input type="radio" name="choice" value="yes">
18
+ <input type="radio" name="choice" value="no">
19
+ <input type="file" name="file">
20
+ <input type="checkbox" name="checklist[]" value="1">
21
+ <input type="checkbox" name="checklist[]" value="2">
22
+ <input type="checkbox" name="checklist[]" value="3">
23
+ <input type="submit" name="submit" value="submit">
24
+ </form>
25
+ </body>
26
+ </html>
@@ -0,0 +1,9 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <body>
4
+ <script type="text/javascript">
5
+ var myGlobal = 'awesome string';
6
+ var myUnencodableGlobal = document;
7
+ </script>
8
+ </body>
9
+ </html>
@@ -0,0 +1,17 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
5
+ <title>CasperJS test index</title>
6
+ </head>
7
+ <body>
8
+ <img src="images/phantom.png"/>
9
+ <a href="test.html">test</a>
10
+ <a href="form.html">form</a>
11
+ <ul>
12
+ <li>one</li>
13
+ <li>two</li>
14
+ <li>three</li>
15
+ </ul>
16
+ </body>
17
+ </html>
@@ -0,0 +1,47 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
5
+ <title>CasperJS test mouse events</title>
6
+ </head>
7
+ <body>
8
+ <a id="test1" href="#" onmousedown="results.test1 = true;">test</a>
9
+ <a id="test2" href="#">test</a>
10
+ <a id="test3" href="#" onmouseup="results.test3 = true;">test</a>
11
+ <a id="test4" href="#">test</a>
12
+ <a id="test5" href="#" onmouseover="results.test5 = true;">test</a>
13
+ <a id="test6" href="#">test</a>
14
+ <a id="test7" href="#" onmouseout="results.test7 = true;">test</a>
15
+ <a id="test8" href="#">test</a>
16
+ <script>
17
+ (function(window) {
18
+ window.results = {
19
+ test1: false,
20
+ test2: false,
21
+ test3: false,
22
+ test4: false,
23
+ test5: false,
24
+ test6: false,
25
+ test7: false,
26
+ test8: false
27
+ };
28
+ document.querySelector('#test2').onmousedown = function(event) {
29
+ results.test2 = true;
30
+ event.preventDefault();
31
+ };
32
+ document.querySelector('#test4').onmouseup = function(event) {
33
+ results.test4 = true;
34
+ event.preventDefault();
35
+ };
36
+ document.querySelector('#test6').onmouseover = function(event) {
37
+ results.test6 = true;
38
+ event.preventDefault();
39
+ };
40
+ document.querySelector('#test8').onmouseout = function(event) {
41
+ results.test8 = true;
42
+ event.preventDefault();
43
+ };
44
+ })(window);
45
+ </script>
46
+ </body>
47
+ </html>
@@ -0,0 +1,16 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>Multiple forms test</title>
5
+ </head>
6
+ <body>
7
+ <form name="f1">
8
+ <input type="hidden" name="f" value="f1">
9
+ <input type="text" name="yo">
10
+ </form>
11
+ <form name="f2">
12
+ <input type="hidden" name="f" value="f2">
13
+ <input type="text" name="yo">
14
+ </form>
15
+ </body>
16
+ </html>
@@ -0,0 +1,8 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
5
+ <title>CasperJS test page 1</title>
6
+ </head>
7
+ <body>Booh.</body>
8
+ </html>
@@ -0,0 +1,8 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
5
+ <title>CasperJS test page 2</title>
6
+ </head>
7
+ <body>Booh.</body>
8
+ </html>
@@ -0,0 +1,8 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
5
+ <title>CasperJS test page 1</title>
6
+ </head>
7
+ <body>Booh.</body>
8
+ </html>
@@ -0,0 +1,12 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
5
+ <title>CasperJS test prompt</title>
6
+ </head>
7
+ <body>
8
+ <script>
9
+ var name = prompt('what is your name?', 'Norris');
10
+ </script>
11
+ </body>
12
+ </html>
@@ -0,0 +1,16 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
5
+ <title>CasperJS test resource</title>
6
+ <script>
7
+ setTimeout(function () {
8
+ var path = "images/phantom.png?" + new Date();
9
+ document.querySelector("img").setAttribute("src", path);
10
+ }, 1000);
11
+ </script>
12
+ </head>
13
+ <body>
14
+ <img width="55" height="55" border="1">
15
+ </body>
16
+ </html>
@@ -0,0 +1,11 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
5
+ <title>CasperJS test form result</title>
6
+ </head>
7
+ <body>
8
+ <p>this is the result page</p>
9
+ <p><a href="index.html">Return back home</a></p>
10
+ </body>
11
+ </html>