apparition 0.4.0 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +23 -0
- data/lib/capybara/apparition/browser.rb +1 -1
- data/lib/capybara/apparition/browser/cookie.rb +1 -1
- data/lib/capybara/apparition/browser/page_manager.rb +7 -1
- data/lib/capybara/apparition/dev_tools_protocol/session.rb +1 -1
- data/lib/capybara/apparition/driver.rb +2 -2
- data/lib/capybara/apparition/driver/chrome_client.rb +2 -2
- data/lib/capybara/apparition/driver/launcher.rb +3 -3
- data/lib/capybara/apparition/node.rb +16 -10
- data/lib/capybara/apparition/node/drag.rb +39 -25
- data/lib/capybara/apparition/page.rb +7 -7
- data/lib/capybara/apparition/page/keyboard.rb +1 -0
- data/lib/capybara/apparition/page/mouse.rb +4 -4
- data/lib/capybara/apparition/version.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fbed62503718fca5fe4664a248445c8b222073b352e2afd1422eeb85cf7bbf40
|
4
|
+
data.tar.gz: 508d1a1883ccc043b26a617ce84bbfb30ed1a72eee407965b10a50a12e2a3a6d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 90fccfe118998a00935b4ff9c6637747a73ea917927e15db3bc29b6a02aa9ecd763bde7d8f65043b377e33c7357ff8fbe38f8064970e7e79de5aeac37bb6bcf2
|
7
|
+
data.tar.gz: 3e2220019a00bd43c8125c7ab6d75f6fb7b8b4430e57e28fe22dea73012b2b8c61fea655e1a455cb1dfa49d55cafadbf09ffc80621f1e43745c0791add88a5e1
|
data/README.md
CHANGED
@@ -82,6 +82,29 @@ same as for `save_screenshot`.
|
|
82
82
|
Sometimes its desirable to click a very specific area of the screen. You can accomplish this with
|
83
83
|
`page.driver.click(x, y)`, where x and y are the screen coordinates.
|
84
84
|
|
85
|
+
### Remote debugging (not yet implemented) ###
|
86
|
+
|
87
|
+
If you use the `:inspector => true` option (see below), remote debugging
|
88
|
+
will be enabled.
|
89
|
+
|
90
|
+
When this option is enabled, you can insert `page.driver.debug` into
|
91
|
+
your tests to pause the test and launch a browser which gives you the
|
92
|
+
WebKit inspector to view your test run with.
|
93
|
+
|
94
|
+
You can register this debugger driver with a different name and set it
|
95
|
+
as the current javascript driver. By example, in your helper file:
|
96
|
+
|
97
|
+
```ruby
|
98
|
+
Capybara.register_driver :apparition_debug do |app|
|
99
|
+
Capybara::Apparition::Driver.new(app, :inspector => true)
|
100
|
+
end
|
101
|
+
# Capybara.javascript_driver = :apparition
|
102
|
+
Capybara.javascript_driver = :apparition_debug
|
103
|
+
```
|
104
|
+
|
105
|
+
[Read more
|
106
|
+
here](https://www.jonathanleighton.com/articles/2012/poltergeist-0-6-0/)
|
107
|
+
|
85
108
|
### Manipulating request headers ###
|
86
109
|
|
87
110
|
You can manipulate HTTP request headers with these methods:
|
@@ -19,7 +19,7 @@ module Capybara::Apparition
|
|
19
19
|
def set_cookie(cookie)
|
20
20
|
cookie[:expires] = cookie[:expires].to_i if cookie[:expires]
|
21
21
|
|
22
|
-
current_page.command('Network.setCookie', cookie)
|
22
|
+
current_page.command('Network.setCookie', **cookie)
|
23
23
|
end
|
24
24
|
|
25
25
|
def remove_cookie(name)
|
@@ -67,7 +67,13 @@ module Capybara::Apparition
|
|
67
67
|
end
|
68
68
|
|
69
69
|
sessions.each do |(target_id, session)|
|
70
|
-
new_page = Page.create(
|
70
|
+
new_page = Page.create(
|
71
|
+
@browser,
|
72
|
+
session,
|
73
|
+
target_id,
|
74
|
+
opener.browser_context_id,
|
75
|
+
**page_options
|
76
|
+
).inherit(opener)
|
71
77
|
@pages[target_id] = new_page
|
72
78
|
end
|
73
79
|
end
|
@@ -216,7 +216,7 @@ module Capybara::Apparition
|
|
216
216
|
end
|
217
217
|
|
218
218
|
def add_header(name, value, options = {})
|
219
|
-
browser.add_header({ name => value }, { permanent: true }.merge(options))
|
219
|
+
browser.add_header({ name => value }, **{ permanent: true }.merge(options))
|
220
220
|
end
|
221
221
|
alias_method :header, :add_header
|
222
222
|
|
@@ -295,7 +295,7 @@ module Capybara::Apparition
|
|
295
295
|
begin
|
296
296
|
input = read.read_nonblock(80) # clear out the read buffer
|
297
297
|
puts unless input&.end_with?("\n")
|
298
|
-
rescue EOFError, IO::WaitReadable # rubocop:disable Lint/
|
298
|
+
rescue EOFError, IO::WaitReadable # rubocop:disable Lint/SuppressedException
|
299
299
|
# Ignore problems reading from STDIN.
|
300
300
|
end
|
301
301
|
end
|
@@ -208,7 +208,7 @@ module Capybara::Apparition
|
|
208
208
|
puts "Calling handler for #{event_name}" if ENV['DEBUG'] == 'V'
|
209
209
|
# TODO: Update this to use transform_keys when we dump Ruby 2.4
|
210
210
|
# handler.call(event['params'].transform_keys(&method(:snake_sym)))
|
211
|
-
handler.call(event['params'].each_with_object({}) { |(k, v), hash| hash[snake_sym(k)] = v })
|
211
|
+
handler.call(**event['params'].each_with_object({}) { |(k, v), hash| hash[snake_sym(k)] = v })
|
212
212
|
end
|
213
213
|
end
|
214
214
|
|
@@ -226,7 +226,7 @@ module Capybara::Apparition
|
|
226
226
|
@listener = Thread.new do
|
227
227
|
begin
|
228
228
|
listen
|
229
|
-
rescue EOFError # rubocop:disable Lint/
|
229
|
+
rescue EOFError # rubocop:disable Lint/SuppressedException
|
230
230
|
end
|
231
231
|
end
|
232
232
|
# @listener.abort_on_exception = true
|
@@ -7,8 +7,8 @@ module Capybara::Apparition
|
|
7
7
|
class Launcher
|
8
8
|
KILL_TIMEOUT = 5
|
9
9
|
|
10
|
-
def self.start(*args)
|
11
|
-
new(*args).tap(&:start)
|
10
|
+
def self.start(*args, **options)
|
11
|
+
new(*args, **options).tap(&:start)
|
12
12
|
end
|
13
13
|
|
14
14
|
def self.process_killer(pid)
|
@@ -29,7 +29,7 @@ module Capybara::Apparition
|
|
29
29
|
break
|
30
30
|
end
|
31
31
|
end
|
32
|
-
rescue Errno::ESRCH, Errno::ECHILD # rubocop:disable Lint/
|
32
|
+
rescue Errno::ESRCH, Errno::ECHILD # rubocop:disable Lint/SuppressedException
|
33
33
|
end
|
34
34
|
end
|
35
35
|
end
|
@@ -132,8 +132,10 @@ module Capybara::Apparition
|
|
132
132
|
set_datetime_local(value)
|
133
133
|
when 'color'
|
134
134
|
set_color(value)
|
135
|
+
when 'range'
|
136
|
+
set_range(value)
|
135
137
|
else
|
136
|
-
set_text(value.to_s, { delay: 0 }.merge(options))
|
138
|
+
set_text(value.to_s, **{ delay: 0 }.merge(options))
|
137
139
|
end
|
138
140
|
elsif tag_name == 'textarea'
|
139
141
|
set_text(value.to_s)
|
@@ -172,12 +174,12 @@ module Capybara::Apparition
|
|
172
174
|
pos = visible_center(allow_scroll: false)
|
173
175
|
return true if pos.nil?
|
174
176
|
|
175
|
-
hit_node = @page.element_from_point(pos)
|
177
|
+
hit_node = @page.element_from_point(**pos)
|
176
178
|
return true if hit_node.nil?
|
177
179
|
|
178
180
|
begin
|
179
181
|
return evaluate_on('el => !this.contains(el)', objectId: hit_node['objectId'])
|
180
|
-
rescue WrongWorld # rubocop:disable Lint/
|
182
|
+
rescue WrongWorld # rubocop:disable Lint/SuppressedException
|
181
183
|
end
|
182
184
|
|
183
185
|
true
|
@@ -196,22 +198,22 @@ module Capybara::Apparition
|
|
196
198
|
end
|
197
199
|
|
198
200
|
def click(keys = [], button: 'left', count: 1, **options)
|
199
|
-
pos = element_click_pos(options)
|
201
|
+
pos = element_click_pos(**options)
|
200
202
|
raise ::Capybara::Apparition::MouseEventImpossible.new(self, 'args' => ['click']) if pos.nil?
|
201
203
|
|
202
|
-
test = mouse_event_test(pos)
|
204
|
+
test = mouse_event_test(**pos)
|
203
205
|
raise ::Capybara::Apparition::MouseEventImpossible.new(self, 'args' => ['click']) if test.nil?
|
204
206
|
|
205
207
|
unless options[:x] && options[:y]
|
206
208
|
raise ::Capybara::Apparition::MouseEventFailed.new(self, 'args' => ['click', test.selector, pos]) unless test.success
|
207
209
|
end
|
208
210
|
|
209
|
-
@page.mouse.click_at
|
211
|
+
@page.mouse.click_at(**pos.merge(button: button, count: count, modifiers: keys))
|
210
212
|
if ENV['DEBUG']
|
211
213
|
begin
|
212
|
-
new_pos = element_click_pos(options)
|
214
|
+
new_pos = element_click_pos(**options)
|
213
215
|
puts "Element moved from #{pos} to #{new_pos}" unless pos == new_pos
|
214
|
-
rescue WrongWorld # rubocop:disable Lint/
|
216
|
+
rescue WrongWorld # rubocop:disable Lint/SuppressedException
|
215
217
|
end
|
216
218
|
end
|
217
219
|
# Wait a short time to see if click triggers page load
|
@@ -231,7 +233,7 @@ module Capybara::Apparition
|
|
231
233
|
pos = visible_center
|
232
234
|
raise ::Capybara::Apparition::MouseEventImpossible.new(self, 'args' => ['hover']) if pos.nil?
|
233
235
|
|
234
|
-
@page.mouse.move_to(pos)
|
236
|
+
@page.mouse.move_to(**pos)
|
235
237
|
end
|
236
238
|
|
237
239
|
EVENTS = {
|
@@ -534,6 +536,10 @@ module Capybara::Apparition
|
|
534
536
|
update_value_js(value.to_s)
|
535
537
|
end
|
536
538
|
|
539
|
+
def set_range(value)
|
540
|
+
update_value_js(value.to_s)
|
541
|
+
end
|
542
|
+
|
537
543
|
def update_value_js(value)
|
538
544
|
evaluate_on(<<~JS, value: value)
|
539
545
|
value => {
|
@@ -759,7 +765,7 @@ module Capybara::Apparition
|
|
759
765
|
# if an area element, check visibility of relevant image
|
760
766
|
VISIBLE_JS = <<~JS
|
761
767
|
function(){
|
762
|
-
el = this;
|
768
|
+
let el = this;
|
763
769
|
if (el.tagName == 'AREA'){
|
764
770
|
const map_name = document.evaluate('./ancestor::map/@name', el, null, XPathResult.STRING_TYPE, null).stringValue;
|
765
771
|
el = document.querySelector(`img[usemap='#${map_name}']`);
|
@@ -2,26 +2,30 @@
|
|
2
2
|
|
3
3
|
module Capybara::Apparition
|
4
4
|
module Drag
|
5
|
-
def drag_to(other, delay: 0.1, html5: nil)
|
5
|
+
def drag_to(other, delay: 0.1, html5: nil, drop_modifiers: [])
|
6
|
+
drop_modifiers = Array(drop_modifiers)
|
7
|
+
|
6
8
|
driver.execute_script MOUSEDOWN_TRACKER
|
7
9
|
scroll_if_needed
|
8
10
|
m = @page.mouse
|
9
|
-
m.move_to(visible_center)
|
11
|
+
m.move_to(**visible_center)
|
10
12
|
sleep delay
|
11
13
|
m.down
|
12
14
|
html5 = !driver.evaluate_script(LEGACY_DRAG_CHECK, self) if html5.nil?
|
13
15
|
if html5
|
14
|
-
driver.execute_script HTML5_DRAG_DROP_SCRIPT, self, other, delay
|
15
|
-
m.up(other.visible_center)
|
16
|
+
driver.execute_script HTML5_DRAG_DROP_SCRIPT, self, other, delay, drop_modifiers
|
17
|
+
m.up(**other.visible_center)
|
16
18
|
else
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
19
|
+
@page.keyboard.with_keys(drop_modifiers) do
|
20
|
+
begin
|
21
|
+
other.scroll_if_needed
|
22
|
+
sleep delay
|
23
|
+
m.move_to(**other.visible_center)
|
24
|
+
sleep delay
|
25
|
+
ensure
|
26
|
+
m.up
|
27
|
+
sleep delay
|
28
|
+
end
|
25
29
|
end
|
26
30
|
end
|
27
31
|
end
|
@@ -31,11 +35,11 @@ module Capybara::Apparition
|
|
31
35
|
raise ::Capybara::Apparition::MouseEventImpossible.new(self, 'args' => ['hover']) if pos.nil?
|
32
36
|
|
33
37
|
other_pos = { x: pos[:x] + x, y: pos[:y] + y }
|
34
|
-
raise ::Capybara::Apparition::MouseEventFailed.new(self, 'args' => ['drag', test['selector'], pos]) unless mouse_event_test?(pos)
|
38
|
+
raise ::Capybara::Apparition::MouseEventFailed.new(self, 'args' => ['drag', test['selector'], pos]) unless mouse_event_test?(**pos)
|
35
39
|
|
36
|
-
@page.mouse.move_to(pos).down
|
40
|
+
@page.mouse.move_to(**pos).down
|
37
41
|
sleep delay
|
38
|
-
@page.mouse.move_to(other_pos)
|
42
|
+
@page.mouse.move_to(**other_pos)
|
39
43
|
sleep delay
|
40
44
|
@page.mouse.up
|
41
45
|
end
|
@@ -125,9 +129,15 @@ module Capybara::Apparition
|
|
125
129
|
JS
|
126
130
|
|
127
131
|
HTML5_DRAG_DROP_SCRIPT = <<~JS
|
128
|
-
|
129
|
-
|
130
|
-
|
132
|
+
let source = arguments[0];
|
133
|
+
const target = arguments[1];
|
134
|
+
const step_delay = arguments[2] * 1000;
|
135
|
+
const drop_modifiers = arguments[3];
|
136
|
+
const key_aliases = {
|
137
|
+
'cmd': 'meta',
|
138
|
+
'command': 'meta',
|
139
|
+
'control': 'ctrl',
|
140
|
+
};
|
131
141
|
|
132
142
|
function rectCenter(rect){
|
133
143
|
return new DOMPoint(
|
@@ -181,6 +191,9 @@ module Capybara::Apparition
|
|
181
191
|
let targetRect = target.getBoundingClientRect(),
|
182
192
|
sourceCenter = rectCenter(source.getBoundingClientRect());
|
183
193
|
|
194
|
+
drop_modifiers.map(key => key_aliases[key] || key)
|
195
|
+
.forEach(key => opts[key + 'Key'] = true);
|
196
|
+
|
184
197
|
// fire 2 dragover events to simulate dragging with a direction
|
185
198
|
let entryPoint = pointOnRect(sourceCenter, targetRect);
|
186
199
|
let dragOverOpts = Object.assign({clientX: entryPoint.x, clientY: entryPoint.y}, opts);
|
@@ -196,26 +209,27 @@ module Capybara::Apparition
|
|
196
209
|
dragOverOpts = Object.assign({clientX: targetCenter.x, clientY: targetCenter.y}, opts);
|
197
210
|
dragOverEvent = new DragEvent('dragover', dragOverOpts);
|
198
211
|
target.dispatchEvent(dragOverEvent);
|
199
|
-
setTimeout(resolve, step_delay, dragOverEvent.defaultPrevented);
|
212
|
+
setTimeout(resolve, step_delay, { drop: dragOverEvent.defaultPrevented, opts: dragOverOpts});
|
200
213
|
})
|
201
214
|
}
|
202
215
|
|
203
|
-
function dragLeave(drop) {
|
216
|
+
function dragLeave({ drop, opts: dragOverOpts }) {
|
204
217
|
return new Promise( resolve => {
|
205
|
-
var
|
218
|
+
var dragLeaveOptions = { ...opts, ...dragOverOpts };
|
219
|
+
var dragLeaveEvent = new DragEvent('dragleave', dragLeaveOptions);
|
206
220
|
target.dispatchEvent(dragLeaveEvent);
|
207
221
|
if (drop) {
|
208
|
-
var dropEvent = new DragEvent('drop',
|
222
|
+
var dropEvent = new DragEvent('drop', dragLeaveOptions);
|
209
223
|
target.dispatchEvent(dropEvent);
|
210
224
|
}
|
211
|
-
var dragEndEvent = new DragEvent('dragend',
|
225
|
+
var dragEndEvent = new DragEvent('dragend', dragLeaveOptions);
|
212
226
|
source.dispatchEvent(dragEndEvent);
|
213
227
|
setTimeout(resolve, step_delay);
|
214
228
|
})
|
215
229
|
}
|
216
230
|
|
217
|
-
|
218
|
-
|
231
|
+
const dt = new DataTransfer();
|
232
|
+
const opts = { cancelable: true, bubbles: true, dataTransfer: dt };
|
219
233
|
|
220
234
|
while (source && !source.draggable) {
|
221
235
|
source = source.parentElement;
|
@@ -22,7 +22,7 @@ module Capybara::Apparition
|
|
22
22
|
# Provides a lot of info - but huge overhead
|
23
23
|
# session.command 'Page.setLifecycleEventsEnabled', enabled: true
|
24
24
|
|
25
|
-
page = Page.new(browser, session, id, browser_context_id, options)
|
25
|
+
page = Page.new(browser, session, id, browser_context_id, **options)
|
26
26
|
|
27
27
|
session.async_commands 'Network.enable', 'Runtime.enable', 'Security.enable', 'DOM.enable'
|
28
28
|
session.async_command 'Security.setIgnoreCertificateErrors', ignore: !!ignore_https_errors
|
@@ -150,7 +150,7 @@ module Capybara::Apparition
|
|
150
150
|
params[:paperWidth] = @browser.paper_size[:width].to_f
|
151
151
|
params[:paperHeight] = @browser.paper_size[:height].to_f
|
152
152
|
end
|
153
|
-
command('Page.printToPDF', params)
|
153
|
+
command('Page.printToPDF', **params)
|
154
154
|
else
|
155
155
|
clip_options = if options[:selector]
|
156
156
|
pos = evaluate("document.querySelector('#{options.delete(:selector)}').getBoundingClientRect().toJSON();")
|
@@ -165,7 +165,7 @@ module Capybara::Apparition
|
|
165
165
|
JS
|
166
166
|
end
|
167
167
|
options[:clip] = { x: 0, y: 0, scale: scale }.merge(clip_options)
|
168
|
-
command('Page.captureScreenshot', options)
|
168
|
+
command('Page.captureScreenshot', **options)
|
169
169
|
end['data']
|
170
170
|
end
|
171
171
|
|
@@ -284,7 +284,7 @@ module Capybara::Apparition
|
|
284
284
|
@status_code = 0
|
285
285
|
navigate_opts = { url: url, transitionType: 'reload' }
|
286
286
|
navigate_opts[:referrer] = extra_headers['Referer'] if extra_headers['Referer']
|
287
|
-
response = command('Page.navigate', navigate_opts)
|
287
|
+
response = command('Page.navigate', **navigate_opts)
|
288
288
|
raise StatusFailError, 'args' => [url, response['errorText']] if response['errorText']
|
289
289
|
|
290
290
|
main_frame.loading(response['loaderId'])
|
@@ -335,7 +335,7 @@ module Capybara::Apparition
|
|
335
335
|
}
|
336
336
|
metrics[:screenWidth], metrics[:screenHeight] = *screen if screen
|
337
337
|
|
338
|
-
command('Emulation.setDeviceMetricsOverride', metrics)
|
338
|
+
command('Emulation.setDeviceMetricsOverride', **metrics)
|
339
339
|
end
|
340
340
|
|
341
341
|
def fullscreen
|
@@ -366,7 +366,7 @@ module Capybara::Apparition
|
|
366
366
|
end
|
367
367
|
|
368
368
|
def async_command(name, **params)
|
369
|
-
@browser.command_for_session(@session.session_id, name, params).discard_result
|
369
|
+
@browser.command_for_session(@session.session_id, name, **params).discard_result
|
370
370
|
end
|
371
371
|
|
372
372
|
def extra_headers
|
@@ -386,7 +386,7 @@ module Capybara::Apparition
|
|
386
386
|
if page
|
387
387
|
self.url_whitelist = page.url_whitelist.dup
|
388
388
|
self.url_blacklist = page.url_blacklist.dup
|
389
|
-
set_viewport(page.viewport_size) if page.viewport_size
|
389
|
+
set_viewport(**page.viewport_size) if page.viewport_size
|
390
390
|
end
|
391
391
|
self
|
392
392
|
end
|
@@ -330,6 +330,7 @@ module Capybara::Apparition
|
|
330
330
|
'z': { 'keyCode': 90, 'code': 'KeyZ', 'shiftKey': 'Z', 'key': 'z' },
|
331
331
|
'meta': { 'keyCode': 91, 'key': 'Meta', 'code': 'MetaLeft' },
|
332
332
|
'command': { 'keyCode': 91, 'key': 'Meta', 'code': 'MetaLeft' },
|
333
|
+
'cmd': { 'keyCode': 91, 'key': 'Meta', 'code': 'MetaLeft' },
|
333
334
|
'*': { 'keyCode': 106, 'key': '*', 'code': 'NumpadMultiply', 'location': 3 },
|
334
335
|
'+': { 'keyCode': 107, 'key': '+', 'code': 'NumpadAdd', 'location': 3 },
|
335
336
|
'-': { 'keyCode': 109, 'key': '-', 'code': 'NumpadSubtract', 'location': 3 },
|
@@ -14,8 +14,8 @@ module Capybara::Apparition
|
|
14
14
|
count.times do |num|
|
15
15
|
@keyboard.with_keys(modifiers) do
|
16
16
|
mouse_params = { x: x, y: y, button: button, count: num + 1 }
|
17
|
-
down
|
18
|
-
up
|
17
|
+
down(**mouse_params)
|
18
|
+
up(**mouse_params)
|
19
19
|
end
|
20
20
|
end
|
21
21
|
self
|
@@ -29,7 +29,7 @@ module Capybara::Apparition
|
|
29
29
|
|
30
30
|
def down(button: 'left', **options)
|
31
31
|
options = @current_pos.merge(button: button).merge(options)
|
32
|
-
mouse_event('mousePressed', options)
|
32
|
+
mouse_event('mousePressed', **options)
|
33
33
|
@current_buttons |= BUTTONS[button.to_sym]
|
34
34
|
self
|
35
35
|
end
|
@@ -37,7 +37,7 @@ module Capybara::Apparition
|
|
37
37
|
def up(button: 'left', **options)
|
38
38
|
options = @current_pos.merge(button: button).merge(options)
|
39
39
|
@current_buttons &= ~BUTTONS[button.to_sym]
|
40
|
-
mouse_event('mouseReleased', options)
|
40
|
+
mouse_event('mouseReleased', **options)
|
41
41
|
self
|
42
42
|
end
|
43
43
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: apparition
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Thomas Walpole
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-01-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: capybara
|
@@ -291,7 +291,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
291
291
|
- !ruby/object:Gem::Version
|
292
292
|
version: '0'
|
293
293
|
requirements: []
|
294
|
-
rubygems_version: 3.
|
294
|
+
rubygems_version: 3.1.2
|
295
295
|
signing_key:
|
296
296
|
specification_version: 4
|
297
297
|
summary: Chrome driver using CDP for Capybara
|