backport of b6f060d5 to require branch - refs #32 - ClientUtils.click() handles <…
…a href='javascript:'> links
Showing
4 changed files
with
67 additions
and
8 deletions
... | @@ -232,7 +232,7 @@ Casper.prototype = { | ... | @@ -232,7 +232,7 @@ Casper.prototype = { |
232 | */ | 232 | */ |
233 | click: function(selector, fallbackToHref) { | 233 | click: function(selector, fallbackToHref) { |
234 | fallbackToHref = utils.isType(fallbackToHref, "undefined") ? true : !!fallbackToHref; | 234 | fallbackToHref = utils.isType(fallbackToHref, "undefined") ? true : !!fallbackToHref; |
235 | this.log("click on selector: " + selector, "debug"); | 235 | this.log("Click on selector: " + selector, "debug"); |
236 | return this.evaluate(function(selector, fallbackToHref) { | 236 | return this.evaluate(function(selector, fallbackToHref) { |
237 | return __utils__.click(selector, fallbackToHref); | 237 | return __utils__.click(selector, fallbackToHref); |
238 | }, { | 238 | }, { |
... | @@ -533,14 +533,18 @@ Casper.prototype = { | ... | @@ -533,14 +533,18 @@ Casper.prototype = { |
533 | try { | 533 | try { |
534 | result.value = JSON.stringify(window[name]); | 534 | result.value = JSON.stringify(window[name]); |
535 | } catch (e) { | 535 | } catch (e) { |
536 | result.error = 'Unable to JSON encode window.' + name + ': ' + e; | 536 | var message = 'Unable to JSON encode window.' + name + ': ' + e; |
537 | __utils__.log(message, "error"); | ||
538 | result.error = message; | ||
537 | } | 539 | } |
538 | return result; | 540 | return result; |
539 | }, {'name': name}); | 541 | }, {'name': name}); |
540 | if (result.error) { | 542 | if ('error' in result) { |
541 | throw result.error; | 543 | throw new Error(result.error); |
542 | } else { | 544 | } else if (isType(result.value, "string")) { |
543 | return JSON.parse(result.value); | 545 | return JSON.parse(result.value); |
546 | } else { | ||
547 | return undefined; | ||
544 | } | 548 | } |
545 | }, | 549 | }, |
546 | 550 | ... | ... |
... | @@ -57,15 +57,29 @@ | ... | @@ -57,15 +57,29 @@ |
57 | fallbackToHref = typeof fallbackToHref === "undefined" ? true : !!fallbackToHref; | 57 | fallbackToHref = typeof fallbackToHref === "undefined" ? true : !!fallbackToHref; |
58 | var elem = this.findOne(selector); | 58 | var elem = this.findOne(selector); |
59 | if (!elem) { | 59 | if (!elem) { |
60 | this.log("click(): Couldn't find any element matching '" + selector + "' selector"); | ||
60 | return false; | 61 | return false; |
61 | } | 62 | } |
62 | var evt = document.createEvent("MouseEvents"); | 63 | var evt = document.createEvent("MouseEvents"); |
63 | evt.initMouseEvent("click", true, true, window, 1, 1, 1, 1, 1, false, false, false, false, 0, elem); | 64 | evt.initMouseEvent("click", true, true, window, 1, 1, 1, 1, 1, false, false, false, false, 0, elem); |
65 | // dispatchEvent return value is false if at least one of the event | ||
66 | // handlers which handled this event called preventDefault | ||
64 | if (elem.dispatchEvent(evt)) { | 67 | if (elem.dispatchEvent(evt)) { |
65 | return true; | 68 | return true; |
66 | } | 69 | } |
67 | if (fallbackToHref && elem.hasAttribute('href')) { | 70 | if (fallbackToHref && elem.hasAttribute('href')) { |
68 | document.location = elem.getAttribute('href'); | 71 | var hrefValue = elem.getAttribute('href'); |
72 | var hrefJavascriptMatch = hrefValue.match(/^\s?javascript\s?:(.*)/i); | ||
73 | if (hrefJavascriptMatch) { | ||
74 | try { | ||
75 | eval(hrefJavascriptMatch[1]); | ||
76 | } catch (e) { | ||
77 | this.log("click(): Unable to evaluate href javascript contents: " + e, "error"); | ||
78 | return false; | ||
79 | } | ||
80 | } else { | ||
81 | document.location = hrefValue; | ||
82 | } | ||
69 | return true; | 83 | return true; |
70 | } | 84 | } |
71 | return false; | 85 | return false; | ... | ... |
tests/site/clik.html
0 → 100644
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="page1.html">test4</a> | ||
12 | <script> | ||
13 | (function(window) { | ||
14 | window.results = { | ||
15 | test1: false, | ||
16 | test2: false, | ||
17 | test3: false, | ||
18 | test4: false | ||
19 | }; | ||
20 | document.querySelector('#test4').onclick = function(event) { | ||
21 | results.test4 = true; | ||
22 | event.preventDefault(); | ||
23 | }; | ||
24 | })(window); | ||
25 | </script> | ||
26 | </body> | ||
27 | </html> |
1 | (function(t) { | 1 | (function(t) { |
2 | t.comment('Casper.click()'); | ||
3 | |||
4 | casper.start('tests/site/index.html', function(self) { | 2 | casper.start('tests/site/index.html', function(self) { |
5 | self.click('a[href="test.html"]'); | 3 | self.click('a[href="test.html"]'); |
6 | }); | 4 | }); |
7 | 5 | ||
8 | casper.then(function(self) { | 6 | casper.then(function(self) { |
7 | t.comment('Casper.click()'); | ||
9 | t.assertTitle('CasperJS test target', 'Casper.click() can click on a link'); | 8 | t.assertTitle('CasperJS test target', 'Casper.click() can click on a link'); |
10 | }).thenClick('a', function(self) { | 9 | }).thenClick('a', function(self) { |
10 | t.comment('Casper.thenClick()'); | ||
11 | t.assertTitle('CasperJS test form', 'Casper.thenClick() can click on a link'); | 11 | t.assertTitle('CasperJS test form', 'Casper.thenClick() can click on a link'); |
12 | }); | 12 | }); |
13 | 13 | ||
14 | // onclick variants tests | ||
15 | casper.thenOpen('tests/site/click.html', function(self) { | ||
16 | t.comment('CasperUtils.click()'); | ||
17 | self.test.assert(self.click('#test1'), 'CasperUtils.click() can click an `href="javascript:` link'); | ||
18 | self.test.assert(self.click('#test2'), 'CasperUtils.click() can click an `href="#"` link'); | ||
19 | self.test.assert(!self.click('#test3'), 'CasperUtils.click() can click an `onclick=".*; return false"` link'); | ||
20 | self.test.assert(!self.click('#test4'), 'CasperUtils.click() can click an unobstrusive js handled link'); | ||
21 | var results = self.getGlobal('results'); | ||
22 | self.test.assert(results.test1, 'CasperUtils.click() has clicked an `href="javascript:` link'); | ||
23 | self.test.assert(results.test2, 'CasperUtils.click() has clicked an `href="#"` link'); | ||
24 | self.test.assert(results.test3, 'CasperUtils.click() has clicked an `onclick=".*; return false"` link'); | ||
25 | self.test.assert(results.test4, 'CasperUtils.click() has clicked an unobstrusive js handled link'); | ||
26 | }); | ||
27 | |||
14 | casper.run(function(self) { | 28 | casper.run(function(self) { |
15 | t.done(); | 29 | t.done(); |
16 | }); | 30 | }); | ... | ... |
-
Please register or sign in to post a comment