selenium-webdriver 4.0.0.alpha1 → 4.0.0.alpha6
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.
- checksums.yaml +5 -5
- data/CHANGES +139 -1
- data/LICENSE +1 -1
- data/lib/selenium/server.rb +3 -3
- data/lib/selenium/webdriver.rb +11 -7
- data/lib/selenium/webdriver/atoms/findElements.js +122 -0
- data/lib/selenium/webdriver/atoms/getAttribute.js +84 -7
- data/lib/selenium/webdriver/atoms/isDisplayed.js +75 -77
- data/lib/selenium/webdriver/chrome.rb +10 -9
- data/lib/selenium/webdriver/chrome/bridge.rb +20 -4
- data/lib/selenium/webdriver/chrome/driver.rb +3 -52
- data/lib/selenium/webdriver/chrome/options.rb +97 -57
- data/lib/selenium/webdriver/chrome/profile.rb +2 -2
- data/lib/selenium/webdriver/chrome/service.rb +0 -4
- data/lib/selenium/webdriver/common.rb +3 -0
- data/lib/selenium/webdriver/common/driver.rb +76 -17
- data/lib/selenium/webdriver/common/driver_extensions/{has_touch_screen.rb → has_devtools.rb} +10 -8
- data/lib/selenium/webdriver/common/driver_extensions/takes_screenshot.rb +2 -1
- data/lib/selenium/webdriver/common/logger.rb +48 -16
- data/lib/selenium/webdriver/common/manager.rb +5 -0
- data/lib/selenium/webdriver/common/options.rb +60 -121
- data/lib/selenium/webdriver/common/platform.rb +3 -0
- data/lib/selenium/webdriver/common/port_prober.rb +4 -6
- data/lib/selenium/webdriver/common/profile_helper.rb +10 -2
- data/lib/selenium/webdriver/common/proxy.rb +0 -0
- data/lib/selenium/webdriver/common/search_context.rb +3 -2
- data/lib/selenium/webdriver/common/service.rb +30 -113
- data/lib/selenium/webdriver/common/service_manager.rb +151 -0
- data/lib/selenium/webdriver/common/socket_lock.rb +2 -2
- data/lib/selenium/webdriver/common/wait.rb +1 -1
- data/lib/selenium/webdriver/devtools.rb +118 -0
- data/lib/selenium/webdriver/devtools/accessibility.rb +62 -0
- data/lib/selenium/webdriver/devtools/animation.rb +98 -0
- data/lib/selenium/webdriver/devtools/application_cache.rb +64 -0
- data/lib/selenium/webdriver/devtools/audits.rb +61 -0
- data/lib/selenium/webdriver/devtools/background_service.rb +67 -0
- data/lib/selenium/webdriver/devtools/browser.rb +123 -0
- data/lib/selenium/webdriver/devtools/cache_storage.rb +73 -0
- data/lib/selenium/webdriver/devtools/cast.rb +70 -0
- data/lib/selenium/webdriver/devtools/console.rb +57 -0
- data/lib/selenium/webdriver/devtools/css.rb +165 -0
- data/lib/selenium/webdriver/devtools/database.rb +64 -0
- data/lib/selenium/webdriver/devtools/debugger.rb +229 -0
- data/lib/selenium/webdriver/devtools/device_orientation.rb +53 -0
- data/lib/selenium/webdriver/devtools/dom.rb +320 -0
- data/lib/selenium/webdriver/devtools/domdebugger.rb +93 -0
- data/lib/selenium/webdriver/devtools/domsnapshot.rb +65 -0
- data/lib/selenium/webdriver/devtools/domstorage.rb +79 -0
- data/lib/selenium/webdriver/devtools/emulation.rb +180 -0
- data/lib/selenium/webdriver/devtools/fetch.rb +97 -0
- data/lib/selenium/webdriver/devtools/headless_experimental.rb +61 -0
- data/lib/selenium/webdriver/devtools/heap_profiler.rb +107 -0
- data/lib/selenium/webdriver/devtools/indexed_db.rb +100 -0
- data/lib/selenium/webdriver/devtools/input.rb +140 -0
- data/lib/selenium/webdriver/devtools/inspector.rb +55 -0
- data/lib/selenium/webdriver/devtools/io.rb +59 -0
- data/lib/selenium/webdriver/devtools/layer_tree.rb +95 -0
- data/lib/selenium/webdriver/devtools/log.rb +66 -0
- data/lib/selenium/webdriver/devtools/media.rb +57 -0
- data/lib/selenium/webdriver/devtools/memory.rb +86 -0
- data/lib/selenium/webdriver/devtools/network.rb +228 -0
- data/lib/selenium/webdriver/devtools/overlay.rb +157 -0
- data/lib/selenium/webdriver/devtools/page.rb +374 -0
- data/lib/selenium/webdriver/devtools/performance.rb +63 -0
- data/lib/selenium/webdriver/devtools/profiler.rb +111 -0
- data/lib/selenium/webdriver/devtools/runtime.rb +193 -0
- data/lib/selenium/webdriver/devtools/schema.rb +46 -0
- data/lib/selenium/webdriver/devtools/security.rb +71 -0
- data/lib/selenium/webdriver/devtools/service_worker.rb +116 -0
- data/lib/selenium/webdriver/devtools/storage.rb +95 -0
- data/lib/selenium/webdriver/devtools/system_info.rb +50 -0
- data/lib/selenium/webdriver/devtools/target.rb +141 -0
- data/lib/selenium/webdriver/devtools/tethering.rb +55 -0
- data/lib/selenium/webdriver/devtools/tracing.rb +76 -0
- data/lib/selenium/webdriver/devtools/web_audio.rb +70 -0
- data/lib/selenium/webdriver/devtools/web_authn.rb +94 -0
- data/lib/selenium/webdriver/edge.rb +29 -9
- data/lib/selenium/webdriver/{firefox/util.rb → edge_chrome/bridge.rb} +11 -20
- data/lib/selenium/webdriver/{common/w3c_options.rb → edge_chrome/driver.rb} +14 -17
- data/lib/selenium/webdriver/edge_chrome/options.rb +36 -0
- data/lib/selenium/webdriver/edge_chrome/profile.rb +33 -0
- data/lib/selenium/webdriver/edge_chrome/service.rb +36 -0
- data/lib/selenium/webdriver/{common/w3c_manager.rb → edge_html/driver.rb} +11 -17
- data/lib/selenium/webdriver/{edge → edge_html}/options.rb +26 -22
- data/lib/selenium/webdriver/{edge → edge_html}/service.rb +2 -6
- data/lib/selenium/webdriver/firefox.rb +18 -15
- data/lib/selenium/webdriver/firefox/bridge.rb +1 -1
- data/lib/selenium/webdriver/firefox/driver.rb +2 -30
- data/lib/selenium/webdriver/firefox/extension.rb +8 -0
- data/lib/selenium/webdriver/firefox/options.rb +47 -52
- data/lib/selenium/webdriver/firefox/profile.rb +7 -78
- data/lib/selenium/webdriver/firefox/service.rb +0 -4
- data/lib/selenium/webdriver/ie.rb +8 -7
- data/lib/selenium/webdriver/ie/driver.rb +0 -32
- data/lib/selenium/webdriver/ie/options.rb +10 -33
- data/lib/selenium/webdriver/ie/service.rb +5 -9
- data/lib/selenium/webdriver/remote.rb +16 -10
- data/lib/selenium/webdriver/remote/bridge.rb +34 -42
- data/lib/selenium/webdriver/remote/capabilities.rb +22 -6
- data/lib/selenium/webdriver/remote/driver.rb +6 -12
- data/lib/selenium/webdriver/remote/http/default.rb +9 -4
- data/lib/selenium/webdriver/remote/http/persistent.rb +5 -6
- data/lib/selenium/webdriver/safari.rb +9 -8
- data/lib/selenium/webdriver/safari/bridge.rb +4 -4
- data/lib/selenium/webdriver/safari/driver.rb +3 -29
- data/lib/selenium/webdriver/safari/options.rb +18 -19
- data/lib/selenium/webdriver/safari/service.rb +0 -4
- data/lib/selenium/webdriver/support.rb +1 -0
- data/lib/selenium/webdriver/support/cdp_client_generator.rb +77 -0
- data/lib/selenium/webdriver/support/color.rb +2 -2
- data/lib/selenium/webdriver/support/event_firing_bridge.rb +1 -1
- data/lib/selenium/webdriver/support/relative_locator.rb +51 -0
- data/lib/selenium/webdriver/version.rb +1 -1
- data/selenium-webdriver.gemspec +5 -4
- metadata +81 -42
- data/lib/selenium/webdriver/common/bridge_helper.rb +0 -82
- data/lib/selenium/webdriver/common/keyboard.rb +0 -70
- data/lib/selenium/webdriver/common/mouse.rb +0 -89
- data/lib/selenium/webdriver/common/touch_action_builder.rb +0 -78
- data/lib/selenium/webdriver/common/touch_screen.rb +0 -123
- data/lib/selenium/webdriver/common/w3c_action_builder.rb +0 -212
- data/lib/selenium/webdriver/edge/bridge.rb +0 -76
- data/lib/selenium/webdriver/edge/driver.rb +0 -70
- data/lib/selenium/webdriver/firefox/binary.rb +0 -110
- data/lib/selenium/webdriver/firefox/extension/prefs.json +0 -69
- data/lib/selenium/webdriver/firefox/extension/webdriver.xpi +0 -0
- data/lib/selenium/webdriver/firefox/launcher.rb +0 -111
- data/lib/selenium/webdriver/firefox/legacy/driver.rb +0 -83
- data/lib/selenium/webdriver/firefox/marionette/bridge.rb +0 -49
- data/lib/selenium/webdriver/firefox/marionette/driver.rb +0 -90
- data/lib/selenium/webdriver/firefox/native/linux/amd64/x_ignore_nofocus.so +0 -0
- data/lib/selenium/webdriver/firefox/native/linux/x86/x_ignore_nofocus.so +0 -0
- data/lib/selenium/webdriver/remote/oss/bridge.rb +0 -594
- data/lib/selenium/webdriver/remote/oss/commands.rb +0 -223
- data/lib/selenium/webdriver/remote/w3c/bridge.rb +0 -605
- data/lib/selenium/webdriver/remote/w3c/capabilities.rb +0 -310
- data/lib/selenium/webdriver/remote/w3c/commands.rb +0 -157
|
@@ -59,10 +59,15 @@ module Selenium
|
|
|
59
59
|
http.open_timeout = open_timeout
|
|
60
60
|
http.read_timeout = read_timeout if read_timeout
|
|
61
61
|
|
|
62
|
-
http
|
|
62
|
+
start(http)
|
|
63
|
+
http
|
|
63
64
|
end
|
|
64
65
|
end
|
|
65
66
|
|
|
67
|
+
def start(http)
|
|
68
|
+
http.start
|
|
69
|
+
end
|
|
70
|
+
|
|
66
71
|
MAX_RETRIES = 3
|
|
67
72
|
|
|
68
73
|
def request(verb, url, headers, payload, redirects = 0)
|
|
@@ -84,15 +89,15 @@ module Selenium
|
|
|
84
89
|
retries += 1
|
|
85
90
|
sleep 2
|
|
86
91
|
retry
|
|
87
|
-
rescue Errno::EADDRNOTAVAIL =>
|
|
92
|
+
rescue Errno::EADDRNOTAVAIL => e
|
|
88
93
|
# a retry is sometimes needed when the port becomes temporarily unavailable
|
|
89
94
|
raise if retries >= MAX_RETRIES
|
|
90
95
|
|
|
91
96
|
retries += 1
|
|
92
97
|
sleep 2
|
|
93
98
|
retry
|
|
94
|
-
rescue Errno::ECONNREFUSED =>
|
|
95
|
-
raise
|
|
99
|
+
rescue Errno::ECONNREFUSED => e
|
|
100
|
+
raise e.class, "using proxy: #{proxy.http}" if use_proxy?
|
|
96
101
|
|
|
97
102
|
raise
|
|
98
103
|
end
|
|
@@ -31,6 +31,10 @@ module Selenium
|
|
|
31
31
|
|
|
32
32
|
private
|
|
33
33
|
|
|
34
|
+
def start(*)
|
|
35
|
+
# no need to explicitly start connection
|
|
36
|
+
end
|
|
37
|
+
|
|
34
38
|
def new_http_client
|
|
35
39
|
proxy = nil
|
|
36
40
|
|
|
@@ -42,12 +46,7 @@ module Selenium
|
|
|
42
46
|
proxy = URI.parse(url)
|
|
43
47
|
end
|
|
44
48
|
|
|
45
|
-
|
|
46
|
-
Net::HTTP::Persistent.new name: 'webdriver', proxy: proxy
|
|
47
|
-
else
|
|
48
|
-
WebDriver.logger.warn 'Support for this version of net-http-persistent is deprecated. Please upgrade.'
|
|
49
|
-
Net::HTTP::Persistent.new 'webdriver', proxy
|
|
50
|
-
end
|
|
49
|
+
Net::HTTP::Persistent.new name: 'webdriver', proxy: proxy
|
|
51
50
|
end
|
|
52
51
|
|
|
53
52
|
def response_for(request)
|
|
@@ -17,13 +17,14 @@
|
|
|
17
17
|
# specific language governing permissions and limitations
|
|
18
18
|
# under the License.
|
|
19
19
|
|
|
20
|
-
require 'selenium/webdriver/safari/bridge'
|
|
21
|
-
require 'selenium/webdriver/safari/driver'
|
|
22
|
-
require 'selenium/webdriver/safari/options'
|
|
23
|
-
|
|
24
20
|
module Selenium
|
|
25
21
|
module WebDriver
|
|
26
22
|
module Safari
|
|
23
|
+
autoload :Bridge, 'selenium/webdriver/safari/bridge'
|
|
24
|
+
autoload :Driver, 'selenium/webdriver/safari/driver'
|
|
25
|
+
autoload :Options, 'selenium/webdriver/safari/options'
|
|
26
|
+
autoload :Service, 'selenium/webdriver/safari/service'
|
|
27
|
+
|
|
27
28
|
class << self
|
|
28
29
|
def technology_preview
|
|
29
30
|
"/Applications/Safari\ Technology\ Preview.app/Contents/MacOS/safaridriver"
|
|
@@ -48,18 +49,18 @@ module Selenium
|
|
|
48
49
|
|
|
49
50
|
def driver_path=(path)
|
|
50
51
|
WebDriver.logger.deprecate 'Selenium::WebDriver::Safari#driver_path=',
|
|
51
|
-
'Selenium::WebDriver::Safari::Service#driver_path='
|
|
52
|
+
'Selenium::WebDriver::Safari::Service#driver_path=',
|
|
53
|
+
id: :driver_path
|
|
52
54
|
Selenium::WebDriver::Safari::Service.driver_path = path
|
|
53
55
|
end
|
|
54
56
|
|
|
55
57
|
def driver_path
|
|
56
58
|
WebDriver.logger.deprecate 'Selenium::WebDriver::Safari#driver_path',
|
|
57
|
-
'Selenium::WebDriver::Safari::Service#driver_path'
|
|
59
|
+
'Selenium::WebDriver::Safari::Service#driver_path',
|
|
60
|
+
id: :driver_path
|
|
58
61
|
Selenium::WebDriver::Safari::Service.driver_path
|
|
59
62
|
end
|
|
60
63
|
end
|
|
61
64
|
end # Safari
|
|
62
65
|
end # WebDriver
|
|
63
66
|
end # Selenium
|
|
64
|
-
|
|
65
|
-
require 'selenium/webdriver/safari/service'
|
|
@@ -20,13 +20,13 @@
|
|
|
20
20
|
module Selenium
|
|
21
21
|
module WebDriver
|
|
22
22
|
module Safari
|
|
23
|
-
|
|
23
|
+
class Bridge < WebDriver::Remote::Bridge
|
|
24
24
|
|
|
25
25
|
# https://developer.apple.com/library/content/documentation/NetworkingInternetWeb/Conceptual/WebDriverEndpointDoc/Commands/Commands.html
|
|
26
26
|
COMMANDS = {
|
|
27
|
-
get_permissions: [:get, '
|
|
28
|
-
set_permissions: [:post, '
|
|
29
|
-
attach_debugger: [:post, '
|
|
27
|
+
get_permissions: [:get, 'session/:session_id/apple/permissions'],
|
|
28
|
+
set_permissions: [:post, 'session/:session_id/apple/permissions'],
|
|
29
|
+
attach_debugger: [:post, 'session/:session_id/apple/attach_debugger']
|
|
30
30
|
}.freeze
|
|
31
31
|
|
|
32
32
|
def commands(command)
|
|
@@ -29,42 +29,16 @@ module Selenium
|
|
|
29
29
|
class Driver < WebDriver::Driver
|
|
30
30
|
include DriverExtensions::HasDebugger
|
|
31
31
|
include DriverExtensions::HasPermissions
|
|
32
|
+
include DriverExtensions::HasWebStorage
|
|
32
33
|
include DriverExtensions::TakesScreenshot
|
|
33
34
|
|
|
34
|
-
def initialize(opts = {})
|
|
35
|
-
opts[:desired_capabilities] = create_capabilities(opts)
|
|
36
|
-
|
|
37
|
-
opts[:url] ||= service_url(opts)
|
|
38
|
-
|
|
39
|
-
listener = opts.delete(:listener)
|
|
40
|
-
desired_capabilities = opts.delete(:desired_capabilities)
|
|
41
|
-
|
|
42
|
-
@bridge = Remote::Bridge.new(opts)
|
|
43
|
-
@bridge.extend Bridge
|
|
44
|
-
@bridge.create_session(desired_capabilities)
|
|
45
|
-
|
|
46
|
-
super(@bridge, listener: listener)
|
|
47
|
-
end
|
|
48
|
-
|
|
49
35
|
def browser
|
|
50
36
|
:safari
|
|
51
37
|
end
|
|
52
38
|
|
|
53
|
-
def
|
|
54
|
-
|
|
55
|
-
ensure
|
|
56
|
-
@service&.stop
|
|
39
|
+
def bridge_class
|
|
40
|
+
Bridge
|
|
57
41
|
end
|
|
58
|
-
|
|
59
|
-
private
|
|
60
|
-
|
|
61
|
-
def create_capabilities(opts = {})
|
|
62
|
-
caps = opts.delete(:desired_capabilities) { Remote::Capabilities.safari }
|
|
63
|
-
options = opts.delete(:options) { Options.new }
|
|
64
|
-
caps.merge!(options.as_json)
|
|
65
|
-
caps
|
|
66
|
-
end
|
|
67
|
-
|
|
68
42
|
end # Driver
|
|
69
43
|
end # Safari
|
|
70
44
|
end # WebDriver
|
|
@@ -20,8 +20,23 @@
|
|
|
20
20
|
module Selenium
|
|
21
21
|
module WebDriver
|
|
22
22
|
module Safari
|
|
23
|
-
class Options
|
|
24
|
-
attr_accessor :
|
|
23
|
+
class Options < WebDriver::Options
|
|
24
|
+
attr_accessor :options
|
|
25
|
+
|
|
26
|
+
# @see https://developer.apple.com/documentation/webkit/about_webdriver_for_safari
|
|
27
|
+
CAPABILITIES = {automatic_inspection: 'safari:automaticInspection',
|
|
28
|
+
automatic_profiling: 'safari:automaticProfiling'}.freeze
|
|
29
|
+
BROWSER = 'safari'
|
|
30
|
+
|
|
31
|
+
CAPABILITIES.each_key do |key|
|
|
32
|
+
define_method key do
|
|
33
|
+
@options[key]
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
define_method "#{key}=" do |value|
|
|
37
|
+
@options[key] = value
|
|
38
|
+
end
|
|
39
|
+
end
|
|
25
40
|
|
|
26
41
|
#
|
|
27
42
|
# Create a new Options instance for W3C-capable versions of Safari.
|
|
@@ -34,25 +49,9 @@ module Selenium
|
|
|
34
49
|
# @option opts [Boolean] :automatic_inspection Preloads Web Inspector and JavaScript debugger. Default is false
|
|
35
50
|
# @option opts [Boolean] :automatic_profiling Preloads Web Inspector and starts a timeline recording. Default is false
|
|
36
51
|
#
|
|
37
|
-
# @see https://developer.apple.com/documentation/webkit/about_webdriver_for_safari
|
|
38
|
-
#
|
|
39
52
|
|
|
40
53
|
def initialize(**opts)
|
|
41
|
-
|
|
42
|
-
@automatic_profiling = opts.delete(:automatic_profiling) || false
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
#
|
|
46
|
-
# @api private
|
|
47
|
-
#
|
|
48
|
-
|
|
49
|
-
def as_json(*)
|
|
50
|
-
opts = {}
|
|
51
|
-
|
|
52
|
-
opts['safari:automaticInspection'] = true if @automatic_inspection
|
|
53
|
-
opts['safari:automaticProfiling'] = true if @automatic_profiling
|
|
54
|
-
|
|
55
|
-
opts
|
|
54
|
+
super
|
|
56
55
|
end
|
|
57
56
|
end # Options
|
|
58
57
|
end # Safari
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# Licensed to the Software Freedom Conservancy (SFC) under one
|
|
4
|
+
# or more contributor license agreements. See the NOTICE file
|
|
5
|
+
# distributed with this work for additional information
|
|
6
|
+
# regarding copyright ownership. The SFC licenses this file
|
|
7
|
+
# to you under the Apache License, Version 2.0 (the
|
|
8
|
+
# "License"); you may not use this file except in compliance
|
|
9
|
+
# with the License. You may obtain a copy of the License at
|
|
10
|
+
#
|
|
11
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
12
|
+
#
|
|
13
|
+
# Unless required by applicable law or agreed to in writing,
|
|
14
|
+
# software distributed under the License is distributed on an
|
|
15
|
+
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
16
|
+
# KIND, either express or implied. See the License for the
|
|
17
|
+
# specific language governing permissions and limitations
|
|
18
|
+
# under the License.
|
|
19
|
+
|
|
20
|
+
require 'erb'
|
|
21
|
+
require 'json'
|
|
22
|
+
|
|
23
|
+
module Selenium
|
|
24
|
+
module WebDriver
|
|
25
|
+
module Support
|
|
26
|
+
class CDPClientGenerator
|
|
27
|
+
DEVTOOLS_DIR = File.expand_path('../devtools', __dir__)
|
|
28
|
+
BROWSER_PROTOCOL_PATH = File.expand_path('cdp/browser_protocol.json', __dir__)
|
|
29
|
+
JS_PROTOCOL_PATH = File.expand_path('cdp/js_protocol.json', __dir__)
|
|
30
|
+
TEMPLATE_PATH = File.expand_path('cdp/domain.rb.erb', __dir__)
|
|
31
|
+
|
|
32
|
+
RESERVED_KEYWORDS = %w[end].freeze
|
|
33
|
+
|
|
34
|
+
def initialize
|
|
35
|
+
@browser_protocol = JSON.parse(File.read(BROWSER_PROTOCOL_PATH), symbolize_names: true)
|
|
36
|
+
@js_protocol = JSON.parse(File.read(JS_PROTOCOL_PATH), symbolize_names: true)
|
|
37
|
+
@template = ERB.new(File.read(TEMPLATE_PATH))
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def call
|
|
41
|
+
@browser_protocol[:domains].each(&method(:process_domain))
|
|
42
|
+
@js_protocol[:domains].each(&method(:process_domain))
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def process_domain(domain)
|
|
46
|
+
result = @template.result_with_hash(domain: domain, h: self)
|
|
47
|
+
filename = File.join(DEVTOOLS_DIR, "#{snake_case(domain[:domain])}.rb")
|
|
48
|
+
File.write(filename, remove_empty_lines(result))
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def snake_case(string)
|
|
52
|
+
name = string.gsub(/([a-z])([A-Z])/, '\1_\2').downcase
|
|
53
|
+
# Certain CDP parameters conflict with Ruby keywords
|
|
54
|
+
# so we prefix the name with underscore.
|
|
55
|
+
name = "_#{name}" if RESERVED_KEYWORDS.include?(name)
|
|
56
|
+
|
|
57
|
+
name
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def kwargs(parameters)
|
|
61
|
+
parameters = parameters.map do |parameter|
|
|
62
|
+
if parameter[:optional]
|
|
63
|
+
"#{snake_case(parameter[:name])}: nil"
|
|
64
|
+
else
|
|
65
|
+
"#{snake_case(parameter[:name])}:"
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
parameters.join(', ')
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def remove_empty_lines(string)
|
|
72
|
+
string.split("\n").reject { |l| l =~ /^\s+$/ }.join("\n")
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
end
|
|
@@ -72,7 +72,7 @@ module Selenium
|
|
|
72
72
|
end
|
|
73
73
|
end
|
|
74
74
|
|
|
75
|
-
def self.from_hsl(h, s, l, a) # rubocop:disable Naming/
|
|
75
|
+
def self.from_hsl(h, s, l, a) # rubocop:disable Naming/MethodParameterName
|
|
76
76
|
h = Float(h) / 360
|
|
77
77
|
s = Float(s) / 100
|
|
78
78
|
l = Float(l) / 100
|
|
@@ -138,7 +138,7 @@ module Selenium
|
|
|
138
138
|
end
|
|
139
139
|
|
|
140
140
|
def hex
|
|
141
|
-
format '
|
|
141
|
+
format '#%<red>02x%<green>02x%<blue>02x', red: red, green: green, blue: blue
|
|
142
142
|
end
|
|
143
143
|
end # Color
|
|
144
144
|
end # Support
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# Licensed to the Software Freedom Conservancy (SFC) under one
|
|
4
|
+
# or more contributor license agreements. See the NOTICE file
|
|
5
|
+
# distributed with this work for additional information
|
|
6
|
+
# regarding copyright ownership. The SFC licenses this file
|
|
7
|
+
# to you under the Apache License, Version 2.0 (the
|
|
8
|
+
# "License"); you may not use this file except in compliance
|
|
9
|
+
# with the License. You may obtain a copy of the License at
|
|
10
|
+
#
|
|
11
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
12
|
+
#
|
|
13
|
+
# Unless required by applicable law or agreed to in writing,
|
|
14
|
+
# software distributed under the License is distributed on an
|
|
15
|
+
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
16
|
+
# KIND, either express or implied. See the License for the
|
|
17
|
+
# specific language governing permissions and limitations
|
|
18
|
+
# under the License.
|
|
19
|
+
|
|
20
|
+
module Selenium
|
|
21
|
+
module WebDriver
|
|
22
|
+
module Support
|
|
23
|
+
|
|
24
|
+
#
|
|
25
|
+
# @api private
|
|
26
|
+
#
|
|
27
|
+
|
|
28
|
+
class RelativeLocator
|
|
29
|
+
KEYS = %w[above below left right near distance].freeze
|
|
30
|
+
|
|
31
|
+
def initialize(locator)
|
|
32
|
+
@filters, @root = locator.partition { |how, _| KEYS.include?(how) }.map(&:to_h)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def as_json
|
|
36
|
+
{
|
|
37
|
+
relative: {
|
|
38
|
+
root: @root,
|
|
39
|
+
filters: @filters.map do |kind, filter|
|
|
40
|
+
{
|
|
41
|
+
kind: kind,
|
|
42
|
+
args: [filter]
|
|
43
|
+
}
|
|
44
|
+
end
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
data/selenium-webdriver.gemspec
CHANGED
|
@@ -26,20 +26,21 @@ Gem::Specification.new do |s|
|
|
|
26
26
|
}
|
|
27
27
|
|
|
28
28
|
s.required_rubygems_version = Gem::Requirement.new('> 1.3.1') if s.respond_to? :required_rubygems_version=
|
|
29
|
-
s.required_ruby_version = Gem::Requirement.new('>= 2.
|
|
29
|
+
s.required_ruby_version = Gem::Requirement.new('>= 2.5')
|
|
30
30
|
|
|
31
31
|
s.files = Dir[root + '/**/*'].reject { |e| e =~ /ruby\.iml|build\.desc/ }.map { |e| e.sub(root + '/', '') }
|
|
32
32
|
s.require_paths = ['lib']
|
|
33
33
|
|
|
34
|
-
s.add_runtime_dependency 'childprocess', ['>= 0.5', '<
|
|
35
|
-
s.add_runtime_dependency 'rubyzip', ['
|
|
34
|
+
s.add_runtime_dependency 'childprocess', ['>= 0.5', '< 4.0']
|
|
35
|
+
s.add_runtime_dependency 'rubyzip', ['>= 1.2.2']
|
|
36
|
+
s.add_runtime_dependency 'websocket', ['~> 1.0']
|
|
36
37
|
|
|
37
38
|
# childprocess requires ffi on windows but doesn't declare it in its dependencies
|
|
38
39
|
s.add_development_dependency 'ffi'
|
|
39
40
|
s.add_development_dependency 'rack', ['~> 2.0']
|
|
40
41
|
s.add_development_dependency 'rake'
|
|
41
42
|
s.add_development_dependency 'rspec', ['~> 3.0']
|
|
42
|
-
s.add_development_dependency 'rubocop', ['~> 0.
|
|
43
|
+
s.add_development_dependency 'rubocop', ['~> 0.84.0']
|
|
43
44
|
s.add_development_dependency 'rubocop-performance'
|
|
44
45
|
s.add_development_dependency 'rubocop-rspec'
|
|
45
46
|
s.add_development_dependency 'webmock', ['~> 3.5']
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: selenium-webdriver
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 4.0.0.
|
|
4
|
+
version: 4.0.0.alpha6
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Alex Rodionov
|
|
@@ -10,7 +10,7 @@ authors:
|
|
|
10
10
|
autorequire:
|
|
11
11
|
bindir: bin
|
|
12
12
|
cert_chain: []
|
|
13
|
-
date:
|
|
13
|
+
date: 2020-05-28 00:00:00.000000000 Z
|
|
14
14
|
dependencies:
|
|
15
15
|
- !ruby/object:Gem::Dependency
|
|
16
16
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -20,7 +20,7 @@ dependencies:
|
|
|
20
20
|
version: '0.5'
|
|
21
21
|
- - "<"
|
|
22
22
|
- !ruby/object:Gem::Version
|
|
23
|
-
version: '
|
|
23
|
+
version: '4.0'
|
|
24
24
|
name: childprocess
|
|
25
25
|
prerelease: false
|
|
26
26
|
type: :runtime
|
|
@@ -31,13 +31,10 @@ dependencies:
|
|
|
31
31
|
version: '0.5'
|
|
32
32
|
- - "<"
|
|
33
33
|
- !ruby/object:Gem::Version
|
|
34
|
-
version: '
|
|
34
|
+
version: '4.0'
|
|
35
35
|
- !ruby/object:Gem::Dependency
|
|
36
36
|
requirement: !ruby/object:Gem::Requirement
|
|
37
37
|
requirements:
|
|
38
|
-
- - "~>"
|
|
39
|
-
- !ruby/object:Gem::Version
|
|
40
|
-
version: '1.2'
|
|
41
38
|
- - ">="
|
|
42
39
|
- !ruby/object:Gem::Version
|
|
43
40
|
version: 1.2.2
|
|
@@ -46,12 +43,23 @@ dependencies:
|
|
|
46
43
|
type: :runtime
|
|
47
44
|
version_requirements: !ruby/object:Gem::Requirement
|
|
48
45
|
requirements:
|
|
49
|
-
- - "~>"
|
|
50
|
-
- !ruby/object:Gem::Version
|
|
51
|
-
version: '1.2'
|
|
52
46
|
- - ">="
|
|
53
47
|
- !ruby/object:Gem::Version
|
|
54
48
|
version: 1.2.2
|
|
49
|
+
- !ruby/object:Gem::Dependency
|
|
50
|
+
requirement: !ruby/object:Gem::Requirement
|
|
51
|
+
requirements:
|
|
52
|
+
- - "~>"
|
|
53
|
+
- !ruby/object:Gem::Version
|
|
54
|
+
version: '1.0'
|
|
55
|
+
name: websocket
|
|
56
|
+
prerelease: false
|
|
57
|
+
type: :runtime
|
|
58
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
59
|
+
requirements:
|
|
60
|
+
- - "~>"
|
|
61
|
+
- !ruby/object:Gem::Version
|
|
62
|
+
version: '1.0'
|
|
55
63
|
- !ruby/object:Gem::Dependency
|
|
56
64
|
requirement: !ruby/object:Gem::Requirement
|
|
57
65
|
requirements:
|
|
@@ -113,7 +121,7 @@ dependencies:
|
|
|
113
121
|
requirements:
|
|
114
122
|
- - "~>"
|
|
115
123
|
- !ruby/object:Gem::Version
|
|
116
|
-
version: 0.
|
|
124
|
+
version: 0.84.0
|
|
117
125
|
name: rubocop
|
|
118
126
|
prerelease: false
|
|
119
127
|
type: :development
|
|
@@ -121,7 +129,7 @@ dependencies:
|
|
|
121
129
|
requirements:
|
|
122
130
|
- - "~>"
|
|
123
131
|
- !ruby/object:Gem::Version
|
|
124
|
-
version: 0.
|
|
132
|
+
version: 0.84.0
|
|
125
133
|
- !ruby/object:Gem::Dependency
|
|
126
134
|
requirement: !ruby/object:Gem::Requirement
|
|
127
135
|
requirements:
|
|
@@ -197,6 +205,7 @@ files:
|
|
|
197
205
|
- lib/selenium/server.rb
|
|
198
206
|
- lib/selenium/webdriver.rb
|
|
199
207
|
- lib/selenium/webdriver/atoms.rb
|
|
208
|
+
- lib/selenium/webdriver/atoms/findElements.js
|
|
200
209
|
- lib/selenium/webdriver/atoms/getAttribute.js
|
|
201
210
|
- lib/selenium/webdriver/atoms/isDisplayed.js
|
|
202
211
|
- lib/selenium/webdriver/chrome.rb
|
|
@@ -208,18 +217,17 @@ files:
|
|
|
208
217
|
- lib/selenium/webdriver/common.rb
|
|
209
218
|
- lib/selenium/webdriver/common/action_builder.rb
|
|
210
219
|
- lib/selenium/webdriver/common/alert.rb
|
|
211
|
-
- lib/selenium/webdriver/common/bridge_helper.rb
|
|
212
220
|
- lib/selenium/webdriver/common/driver.rb
|
|
213
221
|
- lib/selenium/webdriver/common/driver_extensions/downloads_files.rb
|
|
214
222
|
- lib/selenium/webdriver/common/driver_extensions/has_addons.rb
|
|
215
223
|
- lib/selenium/webdriver/common/driver_extensions/has_debugger.rb
|
|
224
|
+
- lib/selenium/webdriver/common/driver_extensions/has_devtools.rb
|
|
216
225
|
- lib/selenium/webdriver/common/driver_extensions/has_location.rb
|
|
217
226
|
- lib/selenium/webdriver/common/driver_extensions/has_network_conditions.rb
|
|
218
227
|
- lib/selenium/webdriver/common/driver_extensions/has_network_connection.rb
|
|
219
228
|
- lib/selenium/webdriver/common/driver_extensions/has_permissions.rb
|
|
220
229
|
- lib/selenium/webdriver/common/driver_extensions/has_remote_status.rb
|
|
221
230
|
- lib/selenium/webdriver/common/driver_extensions/has_session_id.rb
|
|
222
|
-
- lib/selenium/webdriver/common/driver_extensions/has_touch_screen.rb
|
|
223
231
|
- lib/selenium/webdriver/common/driver_extensions/has_web_storage.rb
|
|
224
232
|
- lib/selenium/webdriver/common/driver_extensions/rotatable.rb
|
|
225
233
|
- lib/selenium/webdriver/common/driver_extensions/takes_screenshot.rb
|
|
@@ -238,13 +246,11 @@ files:
|
|
|
238
246
|
- lib/selenium/webdriver/common/interactions/none_input.rb
|
|
239
247
|
- lib/selenium/webdriver/common/interactions/pointer_actions.rb
|
|
240
248
|
- lib/selenium/webdriver/common/interactions/pointer_input.rb
|
|
241
|
-
- lib/selenium/webdriver/common/keyboard.rb
|
|
242
249
|
- lib/selenium/webdriver/common/keys.rb
|
|
243
250
|
- lib/selenium/webdriver/common/log_entry.rb
|
|
244
251
|
- lib/selenium/webdriver/common/logger.rb
|
|
245
252
|
- lib/selenium/webdriver/common/logs.rb
|
|
246
253
|
- lib/selenium/webdriver/common/manager.rb
|
|
247
|
-
- lib/selenium/webdriver/common/mouse.rb
|
|
248
254
|
- lib/selenium/webdriver/common/navigation.rb
|
|
249
255
|
- lib/selenium/webdriver/common/options.rb
|
|
250
256
|
- lib/selenium/webdriver/common/platform.rb
|
|
@@ -253,41 +259,77 @@ files:
|
|
|
253
259
|
- lib/selenium/webdriver/common/proxy.rb
|
|
254
260
|
- lib/selenium/webdriver/common/search_context.rb
|
|
255
261
|
- lib/selenium/webdriver/common/service.rb
|
|
262
|
+
- lib/selenium/webdriver/common/service_manager.rb
|
|
256
263
|
- lib/selenium/webdriver/common/socket_lock.rb
|
|
257
264
|
- lib/selenium/webdriver/common/socket_poller.rb
|
|
258
265
|
- lib/selenium/webdriver/common/target_locator.rb
|
|
259
266
|
- lib/selenium/webdriver/common/timeouts.rb
|
|
260
|
-
- lib/selenium/webdriver/common/touch_action_builder.rb
|
|
261
|
-
- lib/selenium/webdriver/common/touch_screen.rb
|
|
262
|
-
- lib/selenium/webdriver/common/w3c_action_builder.rb
|
|
263
|
-
- lib/selenium/webdriver/common/w3c_manager.rb
|
|
264
|
-
- lib/selenium/webdriver/common/w3c_options.rb
|
|
265
267
|
- lib/selenium/webdriver/common/wait.rb
|
|
266
268
|
- lib/selenium/webdriver/common/window.rb
|
|
267
269
|
- lib/selenium/webdriver/common/zipper.rb
|
|
270
|
+
- lib/selenium/webdriver/devtools.rb
|
|
271
|
+
- lib/selenium/webdriver/devtools/accessibility.rb
|
|
272
|
+
- lib/selenium/webdriver/devtools/animation.rb
|
|
273
|
+
- lib/selenium/webdriver/devtools/application_cache.rb
|
|
274
|
+
- lib/selenium/webdriver/devtools/audits.rb
|
|
275
|
+
- lib/selenium/webdriver/devtools/background_service.rb
|
|
276
|
+
- lib/selenium/webdriver/devtools/browser.rb
|
|
277
|
+
- lib/selenium/webdriver/devtools/cache_storage.rb
|
|
278
|
+
- lib/selenium/webdriver/devtools/cast.rb
|
|
279
|
+
- lib/selenium/webdriver/devtools/console.rb
|
|
280
|
+
- lib/selenium/webdriver/devtools/css.rb
|
|
281
|
+
- lib/selenium/webdriver/devtools/database.rb
|
|
282
|
+
- lib/selenium/webdriver/devtools/debugger.rb
|
|
283
|
+
- lib/selenium/webdriver/devtools/device_orientation.rb
|
|
284
|
+
- lib/selenium/webdriver/devtools/dom.rb
|
|
285
|
+
- lib/selenium/webdriver/devtools/domdebugger.rb
|
|
286
|
+
- lib/selenium/webdriver/devtools/domsnapshot.rb
|
|
287
|
+
- lib/selenium/webdriver/devtools/domstorage.rb
|
|
288
|
+
- lib/selenium/webdriver/devtools/emulation.rb
|
|
289
|
+
- lib/selenium/webdriver/devtools/fetch.rb
|
|
290
|
+
- lib/selenium/webdriver/devtools/headless_experimental.rb
|
|
291
|
+
- lib/selenium/webdriver/devtools/heap_profiler.rb
|
|
292
|
+
- lib/selenium/webdriver/devtools/indexed_db.rb
|
|
293
|
+
- lib/selenium/webdriver/devtools/input.rb
|
|
294
|
+
- lib/selenium/webdriver/devtools/inspector.rb
|
|
295
|
+
- lib/selenium/webdriver/devtools/io.rb
|
|
296
|
+
- lib/selenium/webdriver/devtools/layer_tree.rb
|
|
297
|
+
- lib/selenium/webdriver/devtools/log.rb
|
|
298
|
+
- lib/selenium/webdriver/devtools/media.rb
|
|
299
|
+
- lib/selenium/webdriver/devtools/memory.rb
|
|
300
|
+
- lib/selenium/webdriver/devtools/network.rb
|
|
301
|
+
- lib/selenium/webdriver/devtools/overlay.rb
|
|
302
|
+
- lib/selenium/webdriver/devtools/page.rb
|
|
303
|
+
- lib/selenium/webdriver/devtools/performance.rb
|
|
304
|
+
- lib/selenium/webdriver/devtools/profiler.rb
|
|
305
|
+
- lib/selenium/webdriver/devtools/runtime.rb
|
|
306
|
+
- lib/selenium/webdriver/devtools/schema.rb
|
|
307
|
+
- lib/selenium/webdriver/devtools/security.rb
|
|
308
|
+
- lib/selenium/webdriver/devtools/service_worker.rb
|
|
309
|
+
- lib/selenium/webdriver/devtools/storage.rb
|
|
310
|
+
- lib/selenium/webdriver/devtools/system_info.rb
|
|
311
|
+
- lib/selenium/webdriver/devtools/target.rb
|
|
312
|
+
- lib/selenium/webdriver/devtools/tethering.rb
|
|
313
|
+
- lib/selenium/webdriver/devtools/tracing.rb
|
|
314
|
+
- lib/selenium/webdriver/devtools/web_audio.rb
|
|
315
|
+
- lib/selenium/webdriver/devtools/web_authn.rb
|
|
268
316
|
- lib/selenium/webdriver/edge.rb
|
|
269
|
-
- lib/selenium/webdriver/
|
|
270
|
-
- lib/selenium/webdriver/
|
|
271
|
-
- lib/selenium/webdriver/
|
|
272
|
-
- lib/selenium/webdriver/
|
|
317
|
+
- lib/selenium/webdriver/edge_chrome/bridge.rb
|
|
318
|
+
- lib/selenium/webdriver/edge_chrome/driver.rb
|
|
319
|
+
- lib/selenium/webdriver/edge_chrome/options.rb
|
|
320
|
+
- lib/selenium/webdriver/edge_chrome/profile.rb
|
|
321
|
+
- lib/selenium/webdriver/edge_chrome/service.rb
|
|
322
|
+
- lib/selenium/webdriver/edge_html/driver.rb
|
|
323
|
+
- lib/selenium/webdriver/edge_html/options.rb
|
|
324
|
+
- lib/selenium/webdriver/edge_html/service.rb
|
|
273
325
|
- lib/selenium/webdriver/firefox.rb
|
|
274
|
-
- lib/selenium/webdriver/firefox/binary.rb
|
|
275
326
|
- lib/selenium/webdriver/firefox/bridge.rb
|
|
276
327
|
- lib/selenium/webdriver/firefox/driver.rb
|
|
277
328
|
- lib/selenium/webdriver/firefox/extension.rb
|
|
278
|
-
- lib/selenium/webdriver/firefox/extension/prefs.json
|
|
279
|
-
- lib/selenium/webdriver/firefox/extension/webdriver.xpi
|
|
280
|
-
- lib/selenium/webdriver/firefox/launcher.rb
|
|
281
|
-
- lib/selenium/webdriver/firefox/legacy/driver.rb
|
|
282
|
-
- lib/selenium/webdriver/firefox/marionette/bridge.rb
|
|
283
|
-
- lib/selenium/webdriver/firefox/marionette/driver.rb
|
|
284
|
-
- lib/selenium/webdriver/firefox/native/linux/amd64/x_ignore_nofocus.so
|
|
285
|
-
- lib/selenium/webdriver/firefox/native/linux/x86/x_ignore_nofocus.so
|
|
286
329
|
- lib/selenium/webdriver/firefox/options.rb
|
|
287
330
|
- lib/selenium/webdriver/firefox/profile.rb
|
|
288
331
|
- lib/selenium/webdriver/firefox/profiles_ini.rb
|
|
289
332
|
- lib/selenium/webdriver/firefox/service.rb
|
|
290
|
-
- lib/selenium/webdriver/firefox/util.rb
|
|
291
333
|
- lib/selenium/webdriver/ie.rb
|
|
292
334
|
- lib/selenium/webdriver/ie/driver.rb
|
|
293
335
|
- lib/selenium/webdriver/ie/options.rb
|
|
@@ -301,13 +343,8 @@ files:
|
|
|
301
343
|
- lib/selenium/webdriver/remote/http/curb.rb
|
|
302
344
|
- lib/selenium/webdriver/remote/http/default.rb
|
|
303
345
|
- lib/selenium/webdriver/remote/http/persistent.rb
|
|
304
|
-
- lib/selenium/webdriver/remote/oss/bridge.rb
|
|
305
|
-
- lib/selenium/webdriver/remote/oss/commands.rb
|
|
306
346
|
- lib/selenium/webdriver/remote/response.rb
|
|
307
347
|
- lib/selenium/webdriver/remote/server_error.rb
|
|
308
|
-
- lib/selenium/webdriver/remote/w3c/bridge.rb
|
|
309
|
-
- lib/selenium/webdriver/remote/w3c/capabilities.rb
|
|
310
|
-
- lib/selenium/webdriver/remote/w3c/commands.rb
|
|
311
348
|
- lib/selenium/webdriver/safari.rb
|
|
312
349
|
- lib/selenium/webdriver/safari/bridge.rb
|
|
313
350
|
- lib/selenium/webdriver/safari/driver.rb
|
|
@@ -316,9 +353,11 @@ files:
|
|
|
316
353
|
- lib/selenium/webdriver/support.rb
|
|
317
354
|
- lib/selenium/webdriver/support/abstract_event_listener.rb
|
|
318
355
|
- lib/selenium/webdriver/support/block_event_listener.rb
|
|
356
|
+
- lib/selenium/webdriver/support/cdp_client_generator.rb
|
|
319
357
|
- lib/selenium/webdriver/support/color.rb
|
|
320
358
|
- lib/selenium/webdriver/support/escaper.rb
|
|
321
359
|
- lib/selenium/webdriver/support/event_firing_bridge.rb
|
|
360
|
+
- lib/selenium/webdriver/support/relative_locator.rb
|
|
322
361
|
- lib/selenium/webdriver/support/select.rb
|
|
323
362
|
- lib/selenium/webdriver/version.rb
|
|
324
363
|
- selenium-webdriver.gemspec
|
|
@@ -336,7 +375,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
336
375
|
requirements:
|
|
337
376
|
- - ">="
|
|
338
377
|
- !ruby/object:Gem::Version
|
|
339
|
-
version: '2.
|
|
378
|
+
version: '2.5'
|
|
340
379
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
341
380
|
requirements:
|
|
342
381
|
- - ">"
|
|
@@ -344,7 +383,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
344
383
|
version: 1.3.1
|
|
345
384
|
requirements: []
|
|
346
385
|
rubyforge_project:
|
|
347
|
-
rubygems_version: 2.
|
|
386
|
+
rubygems_version: 2.7.9
|
|
348
387
|
signing_key:
|
|
349
388
|
specification_version: 4
|
|
350
389
|
summary: The next generation developer focused tool for automated testing of webapps
|