casperjs 1.0.0.RC1

Sign up to get free protection for your applications and to get access to all the features.
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>