selenium-webdriver 4.0.0.beta1 → 4.0.0.beta2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/selenium/{webdriver/edge/bridge.rb → devtools.rb} +8 -15
- data/lib/selenium/webdriver/atoms/findElements.js +77 -78
- data/lib/selenium/webdriver/atoms/getAttribute.js +64 -68
- data/lib/selenium/webdriver/atoms/isDisplayed.js +27 -27
- data/lib/selenium/webdriver/atoms/mutationListener.js +17 -0
- data/lib/selenium/webdriver/chrome.rb +1 -1
- data/lib/selenium/webdriver/chrome/driver.rb +12 -18
- data/lib/selenium/webdriver/chrome/service.rb +3 -1
- data/lib/selenium/webdriver/common.rb +1 -0
- data/lib/selenium/webdriver/common/driver.rb +20 -3
- data/lib/selenium/webdriver/common/driver_extensions/has_devtools.rb +23 -1
- data/lib/selenium/webdriver/common/driver_extensions/has_network_connection.rb +4 -2
- data/lib/selenium/webdriver/common/driver_extensions/has_network_interception.rb +67 -0
- data/lib/selenium/webdriver/common/element.rb +41 -12
- data/lib/selenium/webdriver/common/interactions/interaction.rb +4 -1
- data/lib/selenium/webdriver/common/logger.rb +5 -2
- data/lib/selenium/webdriver/common/options.rb +42 -8
- data/lib/selenium/webdriver/common/proxy.rb +4 -1
- data/lib/selenium/webdriver/common/search_context.rb +4 -1
- data/lib/selenium/webdriver/common/service.rb +1 -0
- data/lib/selenium/webdriver/devtools.rb +34 -25
- data/lib/selenium/webdriver/devtools/{v87/console.rb → request.rb} +32 -34
- data/lib/selenium/webdriver/edge.rb +1 -1
- data/lib/selenium/webdriver/edge/driver.rb +2 -6
- data/lib/selenium/webdriver/firefox.rb +5 -1
- data/lib/selenium/webdriver/firefox/driver.rb +8 -15
- data/lib/selenium/webdriver/ie/driver.rb +1 -1
- data/lib/selenium/webdriver/ie/service.rb +3 -1
- data/lib/selenium/webdriver/remote/bridge.rb +24 -3
- data/lib/selenium/webdriver/remote/capabilities.rb +25 -15
- data/lib/selenium/webdriver/remote/driver.rb +6 -1
- data/lib/selenium/webdriver/remote/http/common.rb +0 -5
- data/lib/selenium/webdriver/remote/http/default.rb +5 -3
- data/lib/selenium/webdriver/safari.rb +1 -1
- data/lib/selenium/webdriver/safari/driver.rb +3 -7
- data/lib/selenium/webdriver/support/guards.rb +95 -0
- data/lib/selenium/webdriver/support/guards/guard.rb +89 -0
- data/lib/selenium/webdriver/{devtools/v87/system_info.rb → support/guards/guard_condition.rb} +24 -24
- data/lib/selenium/webdriver/support/select.rb +2 -2
- data/lib/selenium/webdriver/version.rb +1 -1
- metadata +15 -197
- data/CHANGES +0 -1825
- data/Gemfile +0 -4
- data/LICENSE +0 -202
- data/README.md +0 -34
- data/lib/selenium/webdriver/chrome/bridge.rb +0 -66
- data/lib/selenium/webdriver/devtools/v85/accessibility.rb +0 -64
- data/lib/selenium/webdriver/devtools/v85/animation.rb +0 -100
- data/lib/selenium/webdriver/devtools/v85/application_cache.rb +0 -66
- data/lib/selenium/webdriver/devtools/v85/audits.rb +0 -63
- data/lib/selenium/webdriver/devtools/v85/background_service.rb +0 -69
- data/lib/selenium/webdriver/devtools/v85/browser.rb +0 -125
- data/lib/selenium/webdriver/devtools/v85/cache_storage.rb +0 -75
- data/lib/selenium/webdriver/devtools/v85/cast.rb +0 -72
- data/lib/selenium/webdriver/devtools/v85/console.rb +0 -59
- data/lib/selenium/webdriver/devtools/v85/css.rb +0 -167
- data/lib/selenium/webdriver/devtools/v85/database.rb +0 -66
- data/lib/selenium/webdriver/devtools/v85/debugger.rb +0 -231
- data/lib/selenium/webdriver/devtools/v85/device_orientation.rb +0 -55
- data/lib/selenium/webdriver/devtools/v85/dom.rb +0 -322
- data/lib/selenium/webdriver/devtools/v85/dom_debugger.rb +0 -95
- data/lib/selenium/webdriver/devtools/v85/dom_snapshot.rb +0 -67
- data/lib/selenium/webdriver/devtools/v85/dom_storage.rb +0 -81
- data/lib/selenium/webdriver/devtools/v85/emulation.rb +0 -182
- data/lib/selenium/webdriver/devtools/v85/fetch.rb +0 -99
- data/lib/selenium/webdriver/devtools/v85/headless_experimental.rb +0 -63
- data/lib/selenium/webdriver/devtools/v85/heap_profiler.rb +0 -109
- data/lib/selenium/webdriver/devtools/v85/indexed_db.rb +0 -102
- data/lib/selenium/webdriver/devtools/v85/input.rb +0 -143
- data/lib/selenium/webdriver/devtools/v85/inspector.rb +0 -57
- data/lib/selenium/webdriver/devtools/v85/io.rb +0 -61
- data/lib/selenium/webdriver/devtools/v85/layer_tree.rb +0 -97
- data/lib/selenium/webdriver/devtools/v85/log.rb +0 -68
- data/lib/selenium/webdriver/devtools/v85/media.rb +0 -59
- data/lib/selenium/webdriver/devtools/v85/memory.rb +0 -88
- data/lib/selenium/webdriver/devtools/v85/network.rb +0 -230
- data/lib/selenium/webdriver/devtools/v85/overlay.rb +0 -160
- data/lib/selenium/webdriver/devtools/v85/page.rb +0 -376
- data/lib/selenium/webdriver/devtools/v85/performance.rb +0 -65
- data/lib/selenium/webdriver/devtools/v85/profiler.rb +0 -113
- data/lib/selenium/webdriver/devtools/v85/runtime.rb +0 -196
- data/lib/selenium/webdriver/devtools/v85/schema.rb +0 -48
- data/lib/selenium/webdriver/devtools/v85/security.rb +0 -73
- data/lib/selenium/webdriver/devtools/v85/service_worker.rb +0 -118
- data/lib/selenium/webdriver/devtools/v85/storage.rb +0 -97
- data/lib/selenium/webdriver/devtools/v85/system_info.rb +0 -52
- data/lib/selenium/webdriver/devtools/v85/target.rb +0 -145
- data/lib/selenium/webdriver/devtools/v85/tethering.rb +0 -57
- data/lib/selenium/webdriver/devtools/v85/tracing.rb +0 -78
- data/lib/selenium/webdriver/devtools/v85/web_audio.rb +0 -72
- data/lib/selenium/webdriver/devtools/v85/web_authn.rb +0 -96
- data/lib/selenium/webdriver/devtools/v86/accessibility.rb +0 -64
- data/lib/selenium/webdriver/devtools/v86/animation.rb +0 -100
- data/lib/selenium/webdriver/devtools/v86/application_cache.rb +0 -66
- data/lib/selenium/webdriver/devtools/v86/audits.rb +0 -63
- data/lib/selenium/webdriver/devtools/v86/background_service.rb +0 -69
- data/lib/selenium/webdriver/devtools/v86/browser.rb +0 -125
- data/lib/selenium/webdriver/devtools/v86/cache_storage.rb +0 -75
- data/lib/selenium/webdriver/devtools/v86/cast.rb +0 -72
- data/lib/selenium/webdriver/devtools/v86/console.rb +0 -59
- data/lib/selenium/webdriver/devtools/v86/css.rb +0 -181
- data/lib/selenium/webdriver/devtools/v86/database.rb +0 -66
- data/lib/selenium/webdriver/devtools/v86/debugger.rb +0 -233
- data/lib/selenium/webdriver/devtools/v86/device_orientation.rb +0 -55
- data/lib/selenium/webdriver/devtools/v86/dom.rb +0 -329
- data/lib/selenium/webdriver/devtools/v86/dom_debugger.rb +0 -95
- data/lib/selenium/webdriver/devtools/v86/dom_snapshot.rb +0 -67
- data/lib/selenium/webdriver/devtools/v86/dom_storage.rb +0 -81
- data/lib/selenium/webdriver/devtools/v86/emulation.rb +0 -193
- data/lib/selenium/webdriver/devtools/v86/fetch.rb +0 -99
- data/lib/selenium/webdriver/devtools/v86/headless_experimental.rb +0 -63
- data/lib/selenium/webdriver/devtools/v86/heap_profiler.rb +0 -109
- data/lib/selenium/webdriver/devtools/v86/indexed_db.rb +0 -102
- data/lib/selenium/webdriver/devtools/v86/input.rb +0 -143
- data/lib/selenium/webdriver/devtools/v86/inspector.rb +0 -57
- data/lib/selenium/webdriver/devtools/v86/io.rb +0 -61
- data/lib/selenium/webdriver/devtools/v86/layer_tree.rb +0 -97
- data/lib/selenium/webdriver/devtools/v86/log.rb +0 -68
- data/lib/selenium/webdriver/devtools/v86/media.rb +0 -59
- data/lib/selenium/webdriver/devtools/v86/memory.rb +0 -88
- data/lib/selenium/webdriver/devtools/v86/network.rb +0 -235
- data/lib/selenium/webdriver/devtools/v86/overlay.rb +0 -183
- data/lib/selenium/webdriver/devtools/v86/page.rb +0 -376
- data/lib/selenium/webdriver/devtools/v86/performance.rb +0 -65
- data/lib/selenium/webdriver/devtools/v86/profiler.rb +0 -113
- data/lib/selenium/webdriver/devtools/v86/runtime.rb +0 -196
- data/lib/selenium/webdriver/devtools/v86/schema.rb +0 -48
- data/lib/selenium/webdriver/devtools/v86/security.rb +0 -73
- data/lib/selenium/webdriver/devtools/v86/service_worker.rb +0 -118
- data/lib/selenium/webdriver/devtools/v86/storage.rb +0 -97
- data/lib/selenium/webdriver/devtools/v86/system_info.rb +0 -52
- data/lib/selenium/webdriver/devtools/v86/target.rb +0 -145
- data/lib/selenium/webdriver/devtools/v86/tethering.rb +0 -57
- data/lib/selenium/webdriver/devtools/v86/tracing.rb +0 -78
- data/lib/selenium/webdriver/devtools/v86/web_audio.rb +0 -72
- data/lib/selenium/webdriver/devtools/v86/web_authn.rb +0 -102
- data/lib/selenium/webdriver/devtools/v87/accessibility.rb +0 -73
- data/lib/selenium/webdriver/devtools/v87/animation.rb +0 -100
- data/lib/selenium/webdriver/devtools/v87/application_cache.rb +0 -66
- data/lib/selenium/webdriver/devtools/v87/audits.rb +0 -63
- data/lib/selenium/webdriver/devtools/v87/background_service.rb +0 -69
- data/lib/selenium/webdriver/devtools/v87/browser.rb +0 -125
- data/lib/selenium/webdriver/devtools/v87/cache_storage.rb +0 -75
- data/lib/selenium/webdriver/devtools/v87/cast.rb +0 -72
- data/lib/selenium/webdriver/devtools/v87/css.rb +0 -181
- data/lib/selenium/webdriver/devtools/v87/database.rb +0 -66
- data/lib/selenium/webdriver/devtools/v87/debugger.rb +0 -233
- data/lib/selenium/webdriver/devtools/v87/device_orientation.rb +0 -55
- data/lib/selenium/webdriver/devtools/v87/dom.rb +0 -329
- data/lib/selenium/webdriver/devtools/v87/dom_debugger.rb +0 -95
- data/lib/selenium/webdriver/devtools/v87/dom_snapshot.rb +0 -67
- data/lib/selenium/webdriver/devtools/v87/dom_storage.rb +0 -81
- data/lib/selenium/webdriver/devtools/v87/emulation.rb +0 -193
- data/lib/selenium/webdriver/devtools/v87/fetch.rb +0 -99
- data/lib/selenium/webdriver/devtools/v87/headless_experimental.rb +0 -63
- data/lib/selenium/webdriver/devtools/v87/heap_profiler.rb +0 -109
- data/lib/selenium/webdriver/devtools/v87/indexed_db.rb +0 -102
- data/lib/selenium/webdriver/devtools/v87/input.rb +0 -143
- data/lib/selenium/webdriver/devtools/v87/inspector.rb +0 -57
- data/lib/selenium/webdriver/devtools/v87/io.rb +0 -61
- data/lib/selenium/webdriver/devtools/v87/layer_tree.rb +0 -97
- data/lib/selenium/webdriver/devtools/v87/log.rb +0 -68
- data/lib/selenium/webdriver/devtools/v87/media.rb +0 -59
- data/lib/selenium/webdriver/devtools/v87/memory.rb +0 -88
- data/lib/selenium/webdriver/devtools/v87/network.rb +0 -247
- data/lib/selenium/webdriver/devtools/v87/overlay.rb +0 -183
- data/lib/selenium/webdriver/devtools/v87/page.rb +0 -376
- data/lib/selenium/webdriver/devtools/v87/performance.rb +0 -65
- data/lib/selenium/webdriver/devtools/v87/profiler.rb +0 -125
- data/lib/selenium/webdriver/devtools/v87/runtime.rb +0 -196
- data/lib/selenium/webdriver/devtools/v87/schema.rb +0 -48
- data/lib/selenium/webdriver/devtools/v87/security.rb +0 -73
- data/lib/selenium/webdriver/devtools/v87/service_worker.rb +0 -118
- data/lib/selenium/webdriver/devtools/v87/storage.rb +0 -97
- data/lib/selenium/webdriver/devtools/v87/target.rb +0 -145
- data/lib/selenium/webdriver/devtools/v87/tethering.rb +0 -57
- data/lib/selenium/webdriver/devtools/v87/tracing.rb +0 -78
- data/lib/selenium/webdriver/devtools/v87/web_audio.rb +0 -72
- data/lib/selenium/webdriver/devtools/v87/web_authn.rb +0 -102
- data/lib/selenium/webdriver/devtools/v88/accessibility.rb +0 -73
- data/lib/selenium/webdriver/devtools/v88/animation.rb +0 -100
- data/lib/selenium/webdriver/devtools/v88/application_cache.rb +0 -66
- data/lib/selenium/webdriver/devtools/v88/audits.rb +0 -63
- data/lib/selenium/webdriver/devtools/v88/background_service.rb +0 -69
- data/lib/selenium/webdriver/devtools/v88/browser.rb +0 -130
- data/lib/selenium/webdriver/devtools/v88/cache_storage.rb +0 -75
- data/lib/selenium/webdriver/devtools/v88/cast.rb +0 -72
- data/lib/selenium/webdriver/devtools/v88/console.rb +0 -59
- data/lib/selenium/webdriver/devtools/v88/css.rb +0 -181
- data/lib/selenium/webdriver/devtools/v88/database.rb +0 -66
- data/lib/selenium/webdriver/devtools/v88/debugger.rb +0 -233
- data/lib/selenium/webdriver/devtools/v88/device_orientation.rb +0 -55
- data/lib/selenium/webdriver/devtools/v88/dom.rb +0 -329
- data/lib/selenium/webdriver/devtools/v88/dom_debugger.rb +0 -95
- data/lib/selenium/webdriver/devtools/v88/dom_snapshot.rb +0 -67
- data/lib/selenium/webdriver/devtools/v88/dom_storage.rb +0 -81
- data/lib/selenium/webdriver/devtools/v88/emulation.rb +0 -198
- data/lib/selenium/webdriver/devtools/v88/fetch.rb +0 -99
- data/lib/selenium/webdriver/devtools/v88/headless_experimental.rb +0 -63
- data/lib/selenium/webdriver/devtools/v88/heap_profiler.rb +0 -109
- data/lib/selenium/webdriver/devtools/v88/indexed_db.rb +0 -102
- data/lib/selenium/webdriver/devtools/v88/input.rb +0 -148
- data/lib/selenium/webdriver/devtools/v88/inspector.rb +0 -57
- data/lib/selenium/webdriver/devtools/v88/io.rb +0 -61
- data/lib/selenium/webdriver/devtools/v88/layer_tree.rb +0 -97
- data/lib/selenium/webdriver/devtools/v88/log.rb +0 -68
- data/lib/selenium/webdriver/devtools/v88/media.rb +0 -59
- data/lib/selenium/webdriver/devtools/v88/memory.rb +0 -88
- data/lib/selenium/webdriver/devtools/v88/network.rb +0 -247
- data/lib/selenium/webdriver/devtools/v88/overlay.rb +0 -183
- data/lib/selenium/webdriver/devtools/v88/page.rb +0 -376
- data/lib/selenium/webdriver/devtools/v88/performance.rb +0 -65
- data/lib/selenium/webdriver/devtools/v88/profiler.rb +0 -125
- data/lib/selenium/webdriver/devtools/v88/runtime.rb +0 -197
- data/lib/selenium/webdriver/devtools/v88/schema.rb +0 -48
- data/lib/selenium/webdriver/devtools/v88/security.rb +0 -73
- data/lib/selenium/webdriver/devtools/v88/service_worker.rb +0 -118
- data/lib/selenium/webdriver/devtools/v88/storage.rb +0 -103
- data/lib/selenium/webdriver/devtools/v88/system_info.rb +0 -52
- data/lib/selenium/webdriver/devtools/v88/target.rb +0 -145
- data/lib/selenium/webdriver/devtools/v88/tethering.rb +0 -57
- data/lib/selenium/webdriver/devtools/v88/tracing.rb +0 -79
- data/lib/selenium/webdriver/devtools/v88/web_audio.rb +0 -72
- data/lib/selenium/webdriver/devtools/v88/web_authn.rb +0 -102
- data/lib/selenium/webdriver/firefox/bridge.rb +0 -47
- data/lib/selenium/webdriver/safari/bridge.rb +0 -51
- data/selenium-webdriver.gemspec +0 -50
- data/selenium_server_deploy.jar +0 -0
@@ -93,7 +93,10 @@ module Selenium
|
|
93
93
|
when 1
|
94
94
|
arg = args.first
|
95
95
|
|
96
|
-
|
96
|
+
unless arg.respond_to?(:shift)
|
97
|
+
raise ArgumentError,
|
98
|
+
"expected #{arg.inspect}:#{arg.class} to respond to #shift"
|
99
|
+
end
|
97
100
|
|
98
101
|
# this will be a single-entry hash, so use #shift over #first or #[]
|
99
102
|
arr = arg.dup.shift
|
@@ -23,19 +23,16 @@ module Selenium
|
|
23
23
|
autoload :ConsoleEvent, 'selenium/webdriver/devtools/console_event'
|
24
24
|
autoload :ExceptionEvent, 'selenium/webdriver/devtools/exception_event'
|
25
25
|
autoload :MutationEvent, 'selenium/webdriver/devtools/mutation_event'
|
26
|
+
autoload :Request, 'selenium/webdriver/devtools/request'
|
26
27
|
|
27
|
-
|
28
|
-
|
29
|
-
def initialize(url:, version:)
|
28
|
+
def initialize(url:)
|
30
29
|
@messages = []
|
31
|
-
@
|
30
|
+
@session_id = nil
|
31
|
+
@url = url
|
32
32
|
|
33
|
-
load_devtools_version(version)
|
34
33
|
process_handshake
|
35
34
|
attach_socket_listener
|
36
|
-
|
37
|
-
target.attach_to_target(target_id: page_target['id'])
|
38
|
-
target.set_auto_attach(auto_attach: true, wait_for_debugger_on_start: false)
|
35
|
+
start_session
|
39
36
|
end
|
40
37
|
|
41
38
|
def callbacks
|
@@ -44,7 +41,9 @@ module Selenium
|
|
44
41
|
|
45
42
|
def send_cmd(method, **params)
|
46
43
|
id = next_id
|
47
|
-
data =
|
44
|
+
data = {id: id, method: method, params: params.reject { |_, v| v.nil? }}
|
45
|
+
data[:sessionId] = @session_id if @session_id
|
46
|
+
data = JSON.generate(data)
|
48
47
|
WebDriver.logger.debug "DevTools -> #{data}"
|
49
48
|
|
50
49
|
out_frame = WebSocket::Frame::Outgoing::Client.new(version: ws.version, data: data, type: 'text')
|
@@ -59,16 +58,26 @@ module Selenium
|
|
59
58
|
message
|
60
59
|
end
|
61
60
|
|
62
|
-
|
61
|
+
def method_missing(method, *_args)
|
62
|
+
desired_class = "Selenium::DevTools::V#{Selenium::DevTools.version}::#{method.capitalize}"
|
63
|
+
return unless Object.const_defined?(desired_class)
|
63
64
|
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
require f
|
65
|
+
self.class.class_eval do
|
66
|
+
define_method(method) do
|
67
|
+
Object.const_get(desired_class).new(self)
|
68
|
+
end
|
69
69
|
end
|
70
|
+
|
71
|
+
send(method)
|
72
|
+
end
|
73
|
+
|
74
|
+
def respond_to_missing?(method, *_args)
|
75
|
+
desired_class = "Selenium::DevTools::V#{Selenium::DevTools.version}::#{method.capitalize}"
|
76
|
+
Object.const_defined?(desired_class)
|
70
77
|
end
|
71
78
|
|
79
|
+
private
|
80
|
+
|
72
81
|
def process_handshake
|
73
82
|
socket.print(ws.to_s)
|
74
83
|
ws << socket.readpartial(1024)
|
@@ -89,7 +98,8 @@ module Selenium
|
|
89
98
|
next unless message['method']
|
90
99
|
|
91
100
|
callbacks[message['method']].each do |callback|
|
92
|
-
|
101
|
+
params = message['params'] # take in current thread!
|
102
|
+
Thread.new { callback.call(params) }
|
93
103
|
end
|
94
104
|
end
|
95
105
|
end
|
@@ -97,6 +107,13 @@ module Selenium
|
|
97
107
|
socket_listener.abort_on_exception = true
|
98
108
|
end
|
99
109
|
|
110
|
+
def start_session
|
111
|
+
targets = target.get_targets.dig('result', 'targetInfos')
|
112
|
+
page_target = targets.find { |target| target['type'] == 'page' }
|
113
|
+
session = target.attach_to_target(target_id: page_target['targetId'], flatten: true)
|
114
|
+
@session_id = session.dig('result', 'sessionId')
|
115
|
+
end
|
116
|
+
|
100
117
|
def incoming_frame
|
101
118
|
@incoming_frame ||= WebSocket::Frame::Incoming::Client.new(version: ws.version)
|
102
119
|
end
|
@@ -110,15 +127,7 @@ module Selenium
|
|
110
127
|
end
|
111
128
|
|
112
129
|
def ws
|
113
|
-
@ws ||= WebSocket::Handshake::Client.new(url:
|
114
|
-
end
|
115
|
-
|
116
|
-
def page_target
|
117
|
-
@page_target ||= begin
|
118
|
-
response = Net::HTTP.get(@uri.hostname, '/json/list', @uri.port)
|
119
|
-
targets = JSON.parse(response)
|
120
|
-
targets.find { |target| target['type'] == 'page' }
|
121
|
-
end
|
130
|
+
@ws ||= WebSocket::Handshake::Client.new(url: @url)
|
122
131
|
end
|
123
132
|
|
124
133
|
def next_id
|
@@ -17,43 +17,41 @@
|
|
17
17
|
# specific language governing permissions and limitations
|
18
18
|
# under the License.
|
19
19
|
|
20
|
-
# This file is automatically generated. Any changes will be lost!
|
21
20
|
module Selenium
|
22
21
|
module WebDriver
|
23
22
|
class DevTools
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
end # Console
|
23
|
+
class Request
|
24
|
+
|
25
|
+
attr_reader :url, :method, :headers
|
26
|
+
|
27
|
+
def initialize(devtools:, id:, url:, method:, headers:)
|
28
|
+
@devtools = devtools
|
29
|
+
@id = id
|
30
|
+
@url = url
|
31
|
+
@method = method
|
32
|
+
@headers = headers
|
33
|
+
end
|
34
|
+
|
35
|
+
def continue
|
36
|
+
@devtools.fetch.continue_request(request_id: @id)
|
37
|
+
end
|
38
|
+
|
39
|
+
def respond(code: 200, headers: {}, body: '')
|
40
|
+
@devtools.fetch.fulfill_request(
|
41
|
+
request_id: @id,
|
42
|
+
body: Base64.strict_encode64(body),
|
43
|
+
response_code: code,
|
44
|
+
response_headers: headers.map do |k, v|
|
45
|
+
{name: k, value: v}
|
46
|
+
end
|
47
|
+
)
|
48
|
+
end
|
49
|
+
|
50
|
+
def inspect
|
51
|
+
%(#<#{self.class.name} @method="#{method}" @url="#{url}")
|
52
|
+
end
|
53
|
+
|
54
|
+
end # Request
|
57
55
|
end # DevTools
|
58
56
|
end # WebDriver
|
59
57
|
end # Selenium
|
@@ -22,7 +22,7 @@ require 'net/http'
|
|
22
22
|
module Selenium
|
23
23
|
module WebDriver
|
24
24
|
module Edge
|
25
|
-
autoload :
|
25
|
+
autoload :Features, 'selenium/webdriver/edge/features'
|
26
26
|
autoload :Driver, 'selenium/webdriver/edge/driver'
|
27
27
|
autoload :Profile, 'selenium/webdriver/edge/profile'
|
28
28
|
autoload :Options, 'selenium/webdriver/edge/options'
|
@@ -33,14 +33,10 @@ module Selenium
|
|
33
33
|
:edge
|
34
34
|
end
|
35
35
|
|
36
|
-
def bridge_class
|
37
|
-
Bridge
|
38
|
-
end
|
39
|
-
|
40
36
|
private
|
41
37
|
|
42
|
-
def
|
43
|
-
capabilities['ms:edgeOptions']['debuggerAddress']
|
38
|
+
def devtools_address
|
39
|
+
"http://#{capabilities['ms:edgeOptions']['debuggerAddress']}"
|
44
40
|
end
|
45
41
|
end # Driver
|
46
42
|
end # Edge
|
@@ -27,7 +27,7 @@ module Selenium
|
|
27
27
|
autoload :Extension, 'selenium/webdriver/firefox/extension'
|
28
28
|
autoload :ProfilesIni, 'selenium/webdriver/firefox/profiles_ini'
|
29
29
|
autoload :Profile, 'selenium/webdriver/firefox/profile'
|
30
|
-
autoload :
|
30
|
+
autoload :Features, 'selenium/webdriver/firefox/features'
|
31
31
|
autoload :Driver, 'selenium/webdriver/firefox/driver'
|
32
32
|
autoload :Options, 'selenium/webdriver/firefox/options'
|
33
33
|
autoload :Service, 'selenium/webdriver/firefox/service'
|
@@ -38,6 +38,10 @@ module Selenium
|
|
38
38
|
DEFAULT_ASSUME_UNTRUSTED_ISSUER = true
|
39
39
|
DEFAULT_LOAD_NO_FOCUS_LIB = false
|
40
40
|
|
41
|
+
# Mozilla Automation Team asked to only support 85
|
42
|
+
# until WebDriver Bidi is available.
|
43
|
+
DEVTOOLS_VERSION = 85
|
44
|
+
|
41
45
|
def self.driver_path=(path)
|
42
46
|
WebDriver.logger.deprecate 'Selenium::WebDriver::Firefox#driver_path=',
|
43
47
|
'Selenium::WebDriver::Firefox::Service#driver_path=',
|
@@ -27,28 +27,21 @@ module Selenium
|
|
27
27
|
#
|
28
28
|
|
29
29
|
class Driver < WebDriver::Driver
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
30
|
+
EXTENSIONS = [DriverExtensions::HasAddons,
|
31
|
+
DriverExtensions::HasDevTools,
|
32
|
+
DriverExtensions::HasLogEvents,
|
33
|
+
DriverExtensions::HasNetworkInterception,
|
34
|
+
DriverExtensions::HasWebStorage,
|
35
|
+
DriverExtensions::PrintsPage].freeze
|
35
36
|
|
36
37
|
def browser
|
37
38
|
:firefox
|
38
39
|
end
|
39
40
|
|
40
|
-
def bridge_class
|
41
|
-
Bridge
|
42
|
-
end
|
43
|
-
|
44
41
|
private
|
45
42
|
|
46
|
-
def
|
47
|
-
|
48
|
-
end
|
49
|
-
|
50
|
-
def debugger_address
|
51
|
-
capabilities['moz:debuggerAddress']
|
43
|
+
def devtools_address
|
44
|
+
"http://#{capabilities['moz:debuggerAddress']}"
|
52
45
|
end
|
53
46
|
end # Driver
|
54
47
|
end # Firefox
|
@@ -38,7 +38,9 @@ module Selenium
|
|
38
38
|
driver_opts = driver_opts.dup
|
39
39
|
driver_args << "--log-level=#{driver_opts[:log_level].to_s.upcase}" if driver_opts.key?(:log_level)
|
40
40
|
driver_args << "--log-file=#{driver_opts[:log_file]}" if driver_opts.key?(:log_file)
|
41
|
-
|
41
|
+
if driver_opts.key?(:implementation)
|
42
|
+
driver_args << "--implementation=#{driver_opts[:implementation].to_s.upcase}"
|
43
|
+
end
|
42
44
|
driver_args << "--host=#{driver_opts[:host]}" if driver_opts.key?(:host)
|
43
45
|
driver_args << "--extract_path=#{driver_opts[:extract_path]}" if driver_opts.key?(:extract_path)
|
44
46
|
driver_args << "--silent" if driver_opts[:silent] == true
|
@@ -57,6 +57,17 @@ module Selenium
|
|
57
57
|
raise Error::WebDriverError, 'no sessionId in returned payload' unless @session_id
|
58
58
|
|
59
59
|
@capabilities = Capabilities.json_create(capabilities)
|
60
|
+
|
61
|
+
case @capabilities[:browser_name]
|
62
|
+
when 'chrome'
|
63
|
+
extend(WebDriver::Chrome::Features)
|
64
|
+
when 'firefox'
|
65
|
+
extend(WebDriver::Firefox::Features)
|
66
|
+
when 'msedge'
|
67
|
+
extend(WebDriver::Edge::Features)
|
68
|
+
when 'Safari', 'Safari Technology Preview'
|
69
|
+
extend(WebDriver::Safari::Features)
|
70
|
+
end
|
60
71
|
end
|
61
72
|
|
62
73
|
#
|
@@ -70,7 +81,7 @@ module Selenium
|
|
70
81
|
def browser
|
71
82
|
@browser ||= begin
|
72
83
|
name = @capabilities.browser_name
|
73
|
-
name ? name.tr(' ', '_').to_sym : 'unknown'
|
84
|
+
name ? name.tr(' ', '_').downcase.to_sym : 'unknown'
|
74
85
|
end
|
75
86
|
end
|
76
87
|
|
@@ -207,7 +218,10 @@ module Selenium
|
|
207
218
|
end
|
208
219
|
|
209
220
|
def window_size(handle = :current)
|
210
|
-
|
221
|
+
unless handle == :current
|
222
|
+
raise Error::UnsupportedOperationError,
|
223
|
+
'Switch to desired window before getting its size'
|
224
|
+
end
|
211
225
|
|
212
226
|
data = execute :get_window_rect
|
213
227
|
Dimension.new data['width'], data['height']
|
@@ -218,7 +232,10 @@ module Selenium
|
|
218
232
|
end
|
219
233
|
|
220
234
|
def maximize_window(handle = :current)
|
221
|
-
|
235
|
+
unless handle == :current
|
236
|
+
raise Error::UnsupportedOperationError,
|
237
|
+
'Switch to desired window before changing its size'
|
238
|
+
end
|
222
239
|
|
223
240
|
execute :maximize_window
|
224
241
|
end
|
@@ -433,6 +450,10 @@ module Selenium
|
|
433
450
|
execute_atom :getAttribute, element, name
|
434
451
|
end
|
435
452
|
|
453
|
+
def element_dom_attribute(element, name)
|
454
|
+
execute :get_element_attribute, id: element.ref, name: name
|
455
|
+
end
|
456
|
+
|
436
457
|
def element_property(element, name)
|
437
458
|
execute :get_element_property, id: element.ref, name: name
|
438
459
|
end
|
@@ -86,6 +86,7 @@ module Selenium
|
|
86
86
|
browser_name: 'MicrosoftEdge'
|
87
87
|
}.merge(opts))
|
88
88
|
end
|
89
|
+
alias_method :microsoftedge, :edge
|
89
90
|
|
90
91
|
def firefox(opts = {})
|
91
92
|
opts[:browser_version] = opts.delete(:version) if opts.key?(:version)
|
@@ -128,11 +129,10 @@ module Selenium
|
|
128
129
|
data = data.dup
|
129
130
|
|
130
131
|
caps = new
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
caps.page_load_strategy = data.delete('pageLoadStrategy') if data.key?('pageLoadStrategy')
|
132
|
+
(KNOWN - %i[timeouts proxy]).each do |cap|
|
133
|
+
data_value = camel_case(cap)
|
134
|
+
caps[cap] = data.delete(data_value) if data.key?(data_value)
|
135
|
+
end
|
136
136
|
|
137
137
|
process_timeouts(caps, data.delete('timeouts'))
|
138
138
|
|
@@ -142,7 +142,9 @@ module Selenium
|
|
142
142
|
end
|
143
143
|
|
144
144
|
# Remote Server Specific
|
145
|
-
|
145
|
+
if data.key?('webdriver.remote.sessionid')
|
146
|
+
caps[:remote_session_id] = data.delete('webdriver.remote.sessionid')
|
147
|
+
end
|
146
148
|
|
147
149
|
# any remaining pairs will be added as is, with no conversion
|
148
150
|
caps.merge!(data)
|
@@ -150,6 +152,10 @@ module Selenium
|
|
150
152
|
caps
|
151
153
|
end
|
152
154
|
|
155
|
+
def camel_case(str_or_sym)
|
156
|
+
str_or_sym.to_s.gsub(/_([a-z])/) { Regexp.last_match(1).upcase }
|
157
|
+
end
|
158
|
+
|
153
159
|
private
|
154
160
|
|
155
161
|
def process_timeouts(caps, timeouts)
|
@@ -222,15 +228,15 @@ module Selenium
|
|
222
228
|
when :platform
|
223
229
|
hash['platform'] = value.to_s.upcase
|
224
230
|
when :proxy
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
231
|
+
next unless value
|
232
|
+
|
233
|
+
process_proxy(hash, value)
|
234
|
+
when :unhandled_prompt_behavior
|
235
|
+
hash['unhandledPromptBehavior'] = value.is_a?(Symbol) ? value.to_s.tr('_', ' ') : value
|
230
236
|
when String
|
231
237
|
hash[key.to_s] = value
|
232
238
|
when Symbol
|
233
|
-
hash[camel_case(key
|
239
|
+
hash[self.class.camel_case(key)] = value
|
234
240
|
else
|
235
241
|
raise TypeError, "expected String or Symbol, got #{key.inspect}:#{key.class} / #{value.inspect}"
|
236
242
|
end
|
@@ -257,10 +263,14 @@ module Selenium
|
|
257
263
|
|
258
264
|
private
|
259
265
|
|
260
|
-
def
|
261
|
-
|
262
|
-
|
266
|
+
def process_proxy(hash, value)
|
267
|
+
hash['proxy'] = value.as_json
|
268
|
+
hash['proxy']['proxyType'] &&= hash['proxy']['proxyType'].downcase
|
263
269
|
|
270
|
+
return unless hash['proxy']['noProxy'].is_a?(String)
|
271
|
+
|
272
|
+
hash['proxy']['noProxy'] = hash['proxy']['noProxy'].split(', ')
|
273
|
+
end
|
264
274
|
end # Capabilities
|
265
275
|
end # Remote
|
266
276
|
end # WebDriver
|