Adding support for the full range of mouse events
Showing
3 changed files
with
42 additions
and
15 deletions
... | @@ -252,22 +252,36 @@ Casper.prototype.clear = function clear() { | ... | @@ -252,22 +252,36 @@ Casper.prototype.clear = function clear() { |
252 | * @return Boolean | 252 | * @return Boolean |
253 | */ | 253 | */ |
254 | Casper.prototype.click = function click(selector) { | 254 | Casper.prototype.click = function click(selector) { |
255 | this.log("Click on selector: " + selector, "debug"); | 255 | return this.mouseEvent('click', selector); |
256 | if (arguments.length > 1) { | 256 | }; |
257 | this.emit("deprecated", "The click() method does not process the fallbackToHref argument since 0.6"); | 257 | |
258 | } | 258 | /** |
259 | * Emulates an event on the element from the provided selector using the mouse | ||
260 | * pointer, if possible. | ||
261 | * | ||
262 | * In case of success, `true` is returned, `false` otherwise. | ||
263 | * | ||
264 | * @param String type Type of event to emulate | ||
265 | * @param String selector A DOM CSS3 compatible selector | ||
266 | * @return Boolean | ||
267 | */ | ||
268 | Casper.prototype.mouseEvent = function mouseEvent(type, selector) { | ||
269 | this.log("Mouse event '" + type + "' on selector: " + selector, "debug"); | ||
259 | if (!this.exists(selector)) { | 270 | if (!this.exists(selector)) { |
260 | throw new CasperError("Cannot click on unexistent selector: " + selector); | 271 | throw new CasperError("Cannot dispath an event on nonexistent selector: " + selector); |
261 | } | 272 | } |
262 | var clicked = this.evaluate(function(selector) { | 273 | var eventSuccess = this.evaluate(function(type, selector) { |
263 | return __utils__.click(selector); | 274 | return __utils__.mouseEvent(type, selector); |
264 | }, { selector: selector }); | 275 | }, { |
265 | if (!clicked) { | 276 | type: type, |
277 | selector: selector | ||
278 | }); | ||
279 | if (!eventSuccess) { | ||
266 | // fallback onto native QtWebKit mouse events | 280 | // fallback onto native QtWebKit mouse events |
267 | try { | 281 | try { |
268 | this.mouse.click(selector); | 282 | this.mouse.processEvent(type, selector); |
269 | } catch (e) { | 283 | } catch (e) { |
270 | this.log(f("Error while trying to click on selector %s: %s", selector, e), "error"); | 284 | this.log(f("Error while trying to emulate event %s on selector %s: %s", type, selector, e), "error"); |
271 | return false; | 285 | return false; |
272 | } | 286 | } |
273 | } | 287 | } | ... | ... |
... | @@ -49,25 +49,36 @@ | ... | @@ -49,25 +49,36 @@ |
49 | ); | 49 | ); |
50 | 50 | ||
51 | /** | 51 | /** |
52 | * Clicks on the DOM element behind the provided selector. | 52 | * Dispatches a mouse event to the DOM element behind the provided selector. |
53 | * | 53 | * |
54 | * @param String type Type of event to dispatch | ||
54 | * @param String selector A CSS3 selector to the element to click | 55 | * @param String selector A CSS3 selector to the element to click |
55 | * @return Boolean | 56 | * @return Boolean |
56 | */ | 57 | */ |
57 | this.click = function(selector) { | 58 | this.mouseEvent = function(type, selector) { |
58 | var elem = this.findOne(selector); | 59 | var elem = this.findOne(selector); |
59 | if (!elem) { | 60 | if (!elem) { |
60 | this.log("click(): Couldn't find any element matching '" + selector + "' selector", "error"); | 61 | this.log("mouseEvent(): Couldn't find any element matching '" + selector + "' selector", "error"); |
61 | return false; | 62 | return false; |
62 | } | 63 | } |
63 | var evt = document.createEvent("MouseEvents"); | 64 | var evt = document.createEvent("MouseEvents"); |
64 | evt.initMouseEvent("click", true, true, window, 1, 1, 1, 1, 1, false, false, false, false, 0, elem); | 65 | evt.initMouseEvent(type, 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 | // dispatchEvent return value is false if at least one of the event |
66 | // handlers which handled this event called preventDefault | 67 | // handlers which handled this event called preventDefault |
67 | return elem.dispatchEvent(evt); | 68 | return elem.dispatchEvent(evt); |
68 | }; | 69 | }; |
69 | 70 | ||
70 | /** | 71 | /** |
72 | * Clicks on the DOM element behind the provided selector. | ||
73 | * | ||
74 | * @param String selector A CSS3 selector to the element to click | ||
75 | * @return Boolean | ||
76 | */ | ||
77 | this.click = function(selector) { | ||
78 | return this.mouseEvent('click', selector); | ||
79 | }; | ||
80 | |||
81 | /** | ||
71 | * Decodes a base64 encoded string. Succeeds where window.atob() fails. | 82 | * Decodes a base64 encoded string. Succeeds where window.atob() fails. |
72 | * | 83 | * |
73 | * @param String str The base64 encoded contents | 84 | * @param String str The base64 encoded contents | ... | ... |
... | @@ -78,6 +78,8 @@ var Mouse = function(casper) { | ... | @@ -78,6 +78,8 @@ var Mouse = function(casper) { |
78 | throw new CasperError('Mouse.processEvent(): Too many arguments'); | 78 | throw new CasperError('Mouse.processEvent(): Too many arguments'); |
79 | } | 79 | } |
80 | } | 80 | } |
81 | |||
82 | this.processEvent = processEvent; | ||
81 | 83 | ||
82 | this.click = function click() { | 84 | this.click = function click() { |
83 | processEvent('click', arguments); | 85 | processEvent('click', arguments); | ... | ... |
-
Please register or sign in to post a comment