cuprite 0.12 → 0.15.1

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.
@@ -9,13 +9,15 @@ module Capybara
9
9
 
10
10
  def initialize(response)
11
11
  @response = response
12
+ super()
12
13
  end
13
14
  end
14
15
 
15
16
  class InvalidSelector < ClientError
16
17
  def initialize(response, method, selector)
17
18
  super(response)
18
- @method, @selector = method, selector
19
+ @method = method
20
+ @selector = selector
19
21
  end
20
22
 
21
23
  def message
@@ -28,14 +30,13 @@ module Capybara
28
30
 
29
31
  def initialize(*)
30
32
  super
31
- data = /\A\w+: (\w+), (.+?), ([\d\.-]+), ([\d\.-]+)/.match(@response)
33
+ data = /\A\w+: (\w+), (.+?), ([\d.-]+), ([\d.-]+)/.match(@response)
32
34
  @name, @selector = data.values_at(1, 2)
33
35
  @position = data.values_at(3, 4).map(&:to_f)
34
36
  end
35
37
 
36
-
37
38
  def message
38
- "Firing a #{name} at coordinates [#{position.join(", ")}] failed. Cuprite detected " \
39
+ "Firing a #{name} at coordinates [#{position.join(', ')}] failed. Cuprite detected " \
39
40
  "another element with CSS selector \"#{selector}\" at this position. " \
40
41
  "It may be overlapping the element you are trying to interact with. " \
41
42
  "If you don't care about overlapping elements, try using node.trigger(\"#{name}\")."
@@ -52,10 +53,10 @@ module Capybara
52
53
 
53
54
  def message
54
55
  "The element you are trying to interact with is either not part of the DOM, or is " \
55
- "not currently visible on the page (perhaps display: none is set). " \
56
- "It is possible the element has been replaced by another element and you meant to interact with " \
57
- "the new element. If so you need to do a new find in order to get a reference to the " \
58
- "new element."
56
+ "not currently visible on the page (perhaps display: none is set). " \
57
+ "It is possible the element has been replaced by another element and you meant to interact with " \
58
+ "the new element. If so you need to do a new find in order to get a reference to the " \
59
+ "new element."
59
60
  end
60
61
  end
61
62
  end
@@ -41,7 +41,7 @@ class Cuprite {
41
41
  parents(node) {
42
42
  let nodes = [];
43
43
  let parent = node.parentNode;
44
- while (parent != document) {
44
+ while (parent != document && parent !== null) {
45
45
  nodes.push(parent);
46
46
  parent = parent.parentNode;
47
47
  }
@@ -84,7 +84,6 @@ class Cuprite {
84
84
  return true;
85
85
  }
86
86
 
87
-
88
87
  isDisabled(node) {
89
88
  let xpath = "parent::optgroup[@disabled] | \
90
89
  ancestor::select[@disabled] | \
@@ -97,7 +96,7 @@ class Cuprite {
97
96
  path(node) {
98
97
  let nodes = [node];
99
98
  let parent = node.parentNode;
100
- while (parent !== document) {
99
+ while (parent !== document && parent !== null) {
101
100
  nodes.unshift(parent);
102
101
  parent = parent.parentNode;
103
102
  }
@@ -151,7 +150,7 @@ class Cuprite {
151
150
  // call the following functions in order, if one returns false (preventDefault),
152
151
  // stop the call chain
153
152
  [
154
- () => this.keyupdowned(node, "keydown", keyCode),
153
+ () => this.keyupdowned(node, "keydown", char, keyCode),
155
154
  () => this.keypressed(node, false, false, false, false, char.charCodeAt(0), char.charCodeAt(0)),
156
155
  () => {
157
156
  this.setValue(node, node.value + char)
@@ -159,7 +158,7 @@ class Cuprite {
159
158
  }
160
159
  ].some(fn => fn())
161
160
 
162
- this.keyupdowned(node, "keyup", keyCode);
161
+ this.keyupdowned(node, "keyup", char, keyCode);
163
162
  }
164
163
  }
165
164
 
@@ -180,19 +179,22 @@ class Cuprite {
180
179
  }
181
180
 
182
181
  input(node) {
183
- let event = document.createEvent("HTMLEvents");
184
- event.initEvent("input", true, false);
182
+ let event = new InputEvent("input", { inputType: "insertText", bubbles: true, cancelable: false });
185
183
  node.dispatchEvent(event);
186
184
  }
187
185
 
188
186
  /**
189
187
  * @return {boolean} false when an event handler called preventDefault()
190
188
  */
191
- keyupdowned(node, eventName, keyCode) {
192
- let event = document.createEvent("UIEvents");
193
- event.initEvent(eventName, true, true);
194
- event.keyCode = keyCode;
195
- event.charCode = 0;
189
+ keyupdowned(node, eventName, char, keyCode) {
190
+ let event = new KeyboardEvent(
191
+ eventName, {
192
+ bubbles: true,
193
+ cancelable: true,
194
+ key: char,
195
+ keyCode: keyCode
196
+ }
197
+ );
196
198
  return !node.dispatchEvent(event);
197
199
  }
198
200
 
@@ -200,15 +202,18 @@ class Cuprite {
200
202
  * @return {boolean} false when an event handler called preventDefault()
201
203
  */
202
204
  keypressed(node, altKey, ctrlKey, shiftKey, metaKey, keyCode, charCode) {
203
- event = document.createEvent("UIEvents");
204
- event.initEvent("keypress", true, true);
205
- event.window = window;
206
- event.altKey = altKey;
207
- event.ctrlKey = ctrlKey;
208
- event.shiftKey = shiftKey;
209
- event.metaKey = metaKey;
210
- event.keyCode = keyCode;
211
- event.charCode = charCode;
205
+ let event = new KeyboardEvent(
206
+ "keypress", {
207
+ bubbles: true,
208
+ cancelable: true,
209
+ altKey: altKey,
210
+ ctrlKey: ctrlKey,
211
+ shiftKey: shiftKey,
212
+ metaKey: metaKey,
213
+ keyCode: keyCode,
214
+ charCode: charCode
215
+ }
216
+ );
212
217
  return !node.dispatchEvent(event);
213
218
  }
214
219
 
@@ -338,10 +343,24 @@ class Cuprite {
338
343
 
339
344
  _isInViewport(node) {
340
345
  let rect = node.getBoundingClientRect();
341
- return rect.top >= 0 &&
342
- rect.left >= 0 &&
343
- rect.bottom <= window.innerHeight &&
344
- rect.right <= window.innerWidth;
346
+
347
+ let inViewport = rect.top >= 0 &&
348
+ rect.left >= 0 &&
349
+ rect.bottom <= window.innerHeight &&
350
+ rect.right <= window.innerWidth;
351
+
352
+ if (inViewport) {
353
+ // check if obscured by another element
354
+ let x = rect.width/2;
355
+ let y = rect.height/2 ;
356
+
357
+ let px = rect.left + x,
358
+ py = rect.top + y,
359
+ e = document.elementFromPoint(px, py);
360
+ return node == e;
361
+ }
362
+
363
+ return false;
345
364
  }
346
365
 
347
366
  select(node, value) {
@@ -350,12 +369,13 @@ class Cuprite {
350
369
  } else if (value == false && !node.parentNode.multiple) {
351
370
  return false;
352
371
  } else {
353
- this.trigger(node.parentNode, "focus");
372
+ let parentNode = node.parentNode;
373
+ this.trigger(parentNode, "focus");
354
374
 
355
375
  node.selected = value;
356
376
  this.changed(node);
357
377
 
358
- this.trigger(node.parentNode, "blur");
378
+ this.trigger(parentNode, "blur");
359
379
  return true;
360
380
  }
361
381
  }