selenium-webdriver 4.0.0.beta1 → 4.0.0.beta2

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.
Files changed (229) hide show
  1. checksums.yaml +4 -4
  2. data/lib/selenium/{webdriver/edge/bridge.rb → devtools.rb} +8 -15
  3. data/lib/selenium/webdriver/atoms/findElements.js +77 -78
  4. data/lib/selenium/webdriver/atoms/getAttribute.js +64 -68
  5. data/lib/selenium/webdriver/atoms/isDisplayed.js +27 -27
  6. data/lib/selenium/webdriver/atoms/mutationListener.js +17 -0
  7. data/lib/selenium/webdriver/chrome.rb +1 -1
  8. data/lib/selenium/webdriver/chrome/driver.rb +12 -18
  9. data/lib/selenium/webdriver/chrome/service.rb +3 -1
  10. data/lib/selenium/webdriver/common.rb +1 -0
  11. data/lib/selenium/webdriver/common/driver.rb +20 -3
  12. data/lib/selenium/webdriver/common/driver_extensions/has_devtools.rb +23 -1
  13. data/lib/selenium/webdriver/common/driver_extensions/has_network_connection.rb +4 -2
  14. data/lib/selenium/webdriver/common/driver_extensions/has_network_interception.rb +67 -0
  15. data/lib/selenium/webdriver/common/element.rb +41 -12
  16. data/lib/selenium/webdriver/common/interactions/interaction.rb +4 -1
  17. data/lib/selenium/webdriver/common/logger.rb +5 -2
  18. data/lib/selenium/webdriver/common/options.rb +42 -8
  19. data/lib/selenium/webdriver/common/proxy.rb +4 -1
  20. data/lib/selenium/webdriver/common/search_context.rb +4 -1
  21. data/lib/selenium/webdriver/common/service.rb +1 -0
  22. data/lib/selenium/webdriver/devtools.rb +34 -25
  23. data/lib/selenium/webdriver/devtools/{v87/console.rb → request.rb} +32 -34
  24. data/lib/selenium/webdriver/edge.rb +1 -1
  25. data/lib/selenium/webdriver/edge/driver.rb +2 -6
  26. data/lib/selenium/webdriver/firefox.rb +5 -1
  27. data/lib/selenium/webdriver/firefox/driver.rb +8 -15
  28. data/lib/selenium/webdriver/ie/driver.rb +1 -1
  29. data/lib/selenium/webdriver/ie/service.rb +3 -1
  30. data/lib/selenium/webdriver/remote/bridge.rb +24 -3
  31. data/lib/selenium/webdriver/remote/capabilities.rb +25 -15
  32. data/lib/selenium/webdriver/remote/driver.rb +6 -1
  33. data/lib/selenium/webdriver/remote/http/common.rb +0 -5
  34. data/lib/selenium/webdriver/remote/http/default.rb +5 -3
  35. data/lib/selenium/webdriver/safari.rb +1 -1
  36. data/lib/selenium/webdriver/safari/driver.rb +3 -7
  37. data/lib/selenium/webdriver/support/guards.rb +95 -0
  38. data/lib/selenium/webdriver/support/guards/guard.rb +89 -0
  39. data/lib/selenium/webdriver/{devtools/v87/system_info.rb → support/guards/guard_condition.rb} +24 -24
  40. data/lib/selenium/webdriver/support/select.rb +2 -2
  41. data/lib/selenium/webdriver/version.rb +1 -1
  42. metadata +15 -197
  43. data/CHANGES +0 -1825
  44. data/Gemfile +0 -4
  45. data/LICENSE +0 -202
  46. data/README.md +0 -34
  47. data/lib/selenium/webdriver/chrome/bridge.rb +0 -66
  48. data/lib/selenium/webdriver/devtools/v85/accessibility.rb +0 -64
  49. data/lib/selenium/webdriver/devtools/v85/animation.rb +0 -100
  50. data/lib/selenium/webdriver/devtools/v85/application_cache.rb +0 -66
  51. data/lib/selenium/webdriver/devtools/v85/audits.rb +0 -63
  52. data/lib/selenium/webdriver/devtools/v85/background_service.rb +0 -69
  53. data/lib/selenium/webdriver/devtools/v85/browser.rb +0 -125
  54. data/lib/selenium/webdriver/devtools/v85/cache_storage.rb +0 -75
  55. data/lib/selenium/webdriver/devtools/v85/cast.rb +0 -72
  56. data/lib/selenium/webdriver/devtools/v85/console.rb +0 -59
  57. data/lib/selenium/webdriver/devtools/v85/css.rb +0 -167
  58. data/lib/selenium/webdriver/devtools/v85/database.rb +0 -66
  59. data/lib/selenium/webdriver/devtools/v85/debugger.rb +0 -231
  60. data/lib/selenium/webdriver/devtools/v85/device_orientation.rb +0 -55
  61. data/lib/selenium/webdriver/devtools/v85/dom.rb +0 -322
  62. data/lib/selenium/webdriver/devtools/v85/dom_debugger.rb +0 -95
  63. data/lib/selenium/webdriver/devtools/v85/dom_snapshot.rb +0 -67
  64. data/lib/selenium/webdriver/devtools/v85/dom_storage.rb +0 -81
  65. data/lib/selenium/webdriver/devtools/v85/emulation.rb +0 -182
  66. data/lib/selenium/webdriver/devtools/v85/fetch.rb +0 -99
  67. data/lib/selenium/webdriver/devtools/v85/headless_experimental.rb +0 -63
  68. data/lib/selenium/webdriver/devtools/v85/heap_profiler.rb +0 -109
  69. data/lib/selenium/webdriver/devtools/v85/indexed_db.rb +0 -102
  70. data/lib/selenium/webdriver/devtools/v85/input.rb +0 -143
  71. data/lib/selenium/webdriver/devtools/v85/inspector.rb +0 -57
  72. data/lib/selenium/webdriver/devtools/v85/io.rb +0 -61
  73. data/lib/selenium/webdriver/devtools/v85/layer_tree.rb +0 -97
  74. data/lib/selenium/webdriver/devtools/v85/log.rb +0 -68
  75. data/lib/selenium/webdriver/devtools/v85/media.rb +0 -59
  76. data/lib/selenium/webdriver/devtools/v85/memory.rb +0 -88
  77. data/lib/selenium/webdriver/devtools/v85/network.rb +0 -230
  78. data/lib/selenium/webdriver/devtools/v85/overlay.rb +0 -160
  79. data/lib/selenium/webdriver/devtools/v85/page.rb +0 -376
  80. data/lib/selenium/webdriver/devtools/v85/performance.rb +0 -65
  81. data/lib/selenium/webdriver/devtools/v85/profiler.rb +0 -113
  82. data/lib/selenium/webdriver/devtools/v85/runtime.rb +0 -196
  83. data/lib/selenium/webdriver/devtools/v85/schema.rb +0 -48
  84. data/lib/selenium/webdriver/devtools/v85/security.rb +0 -73
  85. data/lib/selenium/webdriver/devtools/v85/service_worker.rb +0 -118
  86. data/lib/selenium/webdriver/devtools/v85/storage.rb +0 -97
  87. data/lib/selenium/webdriver/devtools/v85/system_info.rb +0 -52
  88. data/lib/selenium/webdriver/devtools/v85/target.rb +0 -145
  89. data/lib/selenium/webdriver/devtools/v85/tethering.rb +0 -57
  90. data/lib/selenium/webdriver/devtools/v85/tracing.rb +0 -78
  91. data/lib/selenium/webdriver/devtools/v85/web_audio.rb +0 -72
  92. data/lib/selenium/webdriver/devtools/v85/web_authn.rb +0 -96
  93. data/lib/selenium/webdriver/devtools/v86/accessibility.rb +0 -64
  94. data/lib/selenium/webdriver/devtools/v86/animation.rb +0 -100
  95. data/lib/selenium/webdriver/devtools/v86/application_cache.rb +0 -66
  96. data/lib/selenium/webdriver/devtools/v86/audits.rb +0 -63
  97. data/lib/selenium/webdriver/devtools/v86/background_service.rb +0 -69
  98. data/lib/selenium/webdriver/devtools/v86/browser.rb +0 -125
  99. data/lib/selenium/webdriver/devtools/v86/cache_storage.rb +0 -75
  100. data/lib/selenium/webdriver/devtools/v86/cast.rb +0 -72
  101. data/lib/selenium/webdriver/devtools/v86/console.rb +0 -59
  102. data/lib/selenium/webdriver/devtools/v86/css.rb +0 -181
  103. data/lib/selenium/webdriver/devtools/v86/database.rb +0 -66
  104. data/lib/selenium/webdriver/devtools/v86/debugger.rb +0 -233
  105. data/lib/selenium/webdriver/devtools/v86/device_orientation.rb +0 -55
  106. data/lib/selenium/webdriver/devtools/v86/dom.rb +0 -329
  107. data/lib/selenium/webdriver/devtools/v86/dom_debugger.rb +0 -95
  108. data/lib/selenium/webdriver/devtools/v86/dom_snapshot.rb +0 -67
  109. data/lib/selenium/webdriver/devtools/v86/dom_storage.rb +0 -81
  110. data/lib/selenium/webdriver/devtools/v86/emulation.rb +0 -193
  111. data/lib/selenium/webdriver/devtools/v86/fetch.rb +0 -99
  112. data/lib/selenium/webdriver/devtools/v86/headless_experimental.rb +0 -63
  113. data/lib/selenium/webdriver/devtools/v86/heap_profiler.rb +0 -109
  114. data/lib/selenium/webdriver/devtools/v86/indexed_db.rb +0 -102
  115. data/lib/selenium/webdriver/devtools/v86/input.rb +0 -143
  116. data/lib/selenium/webdriver/devtools/v86/inspector.rb +0 -57
  117. data/lib/selenium/webdriver/devtools/v86/io.rb +0 -61
  118. data/lib/selenium/webdriver/devtools/v86/layer_tree.rb +0 -97
  119. data/lib/selenium/webdriver/devtools/v86/log.rb +0 -68
  120. data/lib/selenium/webdriver/devtools/v86/media.rb +0 -59
  121. data/lib/selenium/webdriver/devtools/v86/memory.rb +0 -88
  122. data/lib/selenium/webdriver/devtools/v86/network.rb +0 -235
  123. data/lib/selenium/webdriver/devtools/v86/overlay.rb +0 -183
  124. data/lib/selenium/webdriver/devtools/v86/page.rb +0 -376
  125. data/lib/selenium/webdriver/devtools/v86/performance.rb +0 -65
  126. data/lib/selenium/webdriver/devtools/v86/profiler.rb +0 -113
  127. data/lib/selenium/webdriver/devtools/v86/runtime.rb +0 -196
  128. data/lib/selenium/webdriver/devtools/v86/schema.rb +0 -48
  129. data/lib/selenium/webdriver/devtools/v86/security.rb +0 -73
  130. data/lib/selenium/webdriver/devtools/v86/service_worker.rb +0 -118
  131. data/lib/selenium/webdriver/devtools/v86/storage.rb +0 -97
  132. data/lib/selenium/webdriver/devtools/v86/system_info.rb +0 -52
  133. data/lib/selenium/webdriver/devtools/v86/target.rb +0 -145
  134. data/lib/selenium/webdriver/devtools/v86/tethering.rb +0 -57
  135. data/lib/selenium/webdriver/devtools/v86/tracing.rb +0 -78
  136. data/lib/selenium/webdriver/devtools/v86/web_audio.rb +0 -72
  137. data/lib/selenium/webdriver/devtools/v86/web_authn.rb +0 -102
  138. data/lib/selenium/webdriver/devtools/v87/accessibility.rb +0 -73
  139. data/lib/selenium/webdriver/devtools/v87/animation.rb +0 -100
  140. data/lib/selenium/webdriver/devtools/v87/application_cache.rb +0 -66
  141. data/lib/selenium/webdriver/devtools/v87/audits.rb +0 -63
  142. data/lib/selenium/webdriver/devtools/v87/background_service.rb +0 -69
  143. data/lib/selenium/webdriver/devtools/v87/browser.rb +0 -125
  144. data/lib/selenium/webdriver/devtools/v87/cache_storage.rb +0 -75
  145. data/lib/selenium/webdriver/devtools/v87/cast.rb +0 -72
  146. data/lib/selenium/webdriver/devtools/v87/css.rb +0 -181
  147. data/lib/selenium/webdriver/devtools/v87/database.rb +0 -66
  148. data/lib/selenium/webdriver/devtools/v87/debugger.rb +0 -233
  149. data/lib/selenium/webdriver/devtools/v87/device_orientation.rb +0 -55
  150. data/lib/selenium/webdriver/devtools/v87/dom.rb +0 -329
  151. data/lib/selenium/webdriver/devtools/v87/dom_debugger.rb +0 -95
  152. data/lib/selenium/webdriver/devtools/v87/dom_snapshot.rb +0 -67
  153. data/lib/selenium/webdriver/devtools/v87/dom_storage.rb +0 -81
  154. data/lib/selenium/webdriver/devtools/v87/emulation.rb +0 -193
  155. data/lib/selenium/webdriver/devtools/v87/fetch.rb +0 -99
  156. data/lib/selenium/webdriver/devtools/v87/headless_experimental.rb +0 -63
  157. data/lib/selenium/webdriver/devtools/v87/heap_profiler.rb +0 -109
  158. data/lib/selenium/webdriver/devtools/v87/indexed_db.rb +0 -102
  159. data/lib/selenium/webdriver/devtools/v87/input.rb +0 -143
  160. data/lib/selenium/webdriver/devtools/v87/inspector.rb +0 -57
  161. data/lib/selenium/webdriver/devtools/v87/io.rb +0 -61
  162. data/lib/selenium/webdriver/devtools/v87/layer_tree.rb +0 -97
  163. data/lib/selenium/webdriver/devtools/v87/log.rb +0 -68
  164. data/lib/selenium/webdriver/devtools/v87/media.rb +0 -59
  165. data/lib/selenium/webdriver/devtools/v87/memory.rb +0 -88
  166. data/lib/selenium/webdriver/devtools/v87/network.rb +0 -247
  167. data/lib/selenium/webdriver/devtools/v87/overlay.rb +0 -183
  168. data/lib/selenium/webdriver/devtools/v87/page.rb +0 -376
  169. data/lib/selenium/webdriver/devtools/v87/performance.rb +0 -65
  170. data/lib/selenium/webdriver/devtools/v87/profiler.rb +0 -125
  171. data/lib/selenium/webdriver/devtools/v87/runtime.rb +0 -196
  172. data/lib/selenium/webdriver/devtools/v87/schema.rb +0 -48
  173. data/lib/selenium/webdriver/devtools/v87/security.rb +0 -73
  174. data/lib/selenium/webdriver/devtools/v87/service_worker.rb +0 -118
  175. data/lib/selenium/webdriver/devtools/v87/storage.rb +0 -97
  176. data/lib/selenium/webdriver/devtools/v87/target.rb +0 -145
  177. data/lib/selenium/webdriver/devtools/v87/tethering.rb +0 -57
  178. data/lib/selenium/webdriver/devtools/v87/tracing.rb +0 -78
  179. data/lib/selenium/webdriver/devtools/v87/web_audio.rb +0 -72
  180. data/lib/selenium/webdriver/devtools/v87/web_authn.rb +0 -102
  181. data/lib/selenium/webdriver/devtools/v88/accessibility.rb +0 -73
  182. data/lib/selenium/webdriver/devtools/v88/animation.rb +0 -100
  183. data/lib/selenium/webdriver/devtools/v88/application_cache.rb +0 -66
  184. data/lib/selenium/webdriver/devtools/v88/audits.rb +0 -63
  185. data/lib/selenium/webdriver/devtools/v88/background_service.rb +0 -69
  186. data/lib/selenium/webdriver/devtools/v88/browser.rb +0 -130
  187. data/lib/selenium/webdriver/devtools/v88/cache_storage.rb +0 -75
  188. data/lib/selenium/webdriver/devtools/v88/cast.rb +0 -72
  189. data/lib/selenium/webdriver/devtools/v88/console.rb +0 -59
  190. data/lib/selenium/webdriver/devtools/v88/css.rb +0 -181
  191. data/lib/selenium/webdriver/devtools/v88/database.rb +0 -66
  192. data/lib/selenium/webdriver/devtools/v88/debugger.rb +0 -233
  193. data/lib/selenium/webdriver/devtools/v88/device_orientation.rb +0 -55
  194. data/lib/selenium/webdriver/devtools/v88/dom.rb +0 -329
  195. data/lib/selenium/webdriver/devtools/v88/dom_debugger.rb +0 -95
  196. data/lib/selenium/webdriver/devtools/v88/dom_snapshot.rb +0 -67
  197. data/lib/selenium/webdriver/devtools/v88/dom_storage.rb +0 -81
  198. data/lib/selenium/webdriver/devtools/v88/emulation.rb +0 -198
  199. data/lib/selenium/webdriver/devtools/v88/fetch.rb +0 -99
  200. data/lib/selenium/webdriver/devtools/v88/headless_experimental.rb +0 -63
  201. data/lib/selenium/webdriver/devtools/v88/heap_profiler.rb +0 -109
  202. data/lib/selenium/webdriver/devtools/v88/indexed_db.rb +0 -102
  203. data/lib/selenium/webdriver/devtools/v88/input.rb +0 -148
  204. data/lib/selenium/webdriver/devtools/v88/inspector.rb +0 -57
  205. data/lib/selenium/webdriver/devtools/v88/io.rb +0 -61
  206. data/lib/selenium/webdriver/devtools/v88/layer_tree.rb +0 -97
  207. data/lib/selenium/webdriver/devtools/v88/log.rb +0 -68
  208. data/lib/selenium/webdriver/devtools/v88/media.rb +0 -59
  209. data/lib/selenium/webdriver/devtools/v88/memory.rb +0 -88
  210. data/lib/selenium/webdriver/devtools/v88/network.rb +0 -247
  211. data/lib/selenium/webdriver/devtools/v88/overlay.rb +0 -183
  212. data/lib/selenium/webdriver/devtools/v88/page.rb +0 -376
  213. data/lib/selenium/webdriver/devtools/v88/performance.rb +0 -65
  214. data/lib/selenium/webdriver/devtools/v88/profiler.rb +0 -125
  215. data/lib/selenium/webdriver/devtools/v88/runtime.rb +0 -197
  216. data/lib/selenium/webdriver/devtools/v88/schema.rb +0 -48
  217. data/lib/selenium/webdriver/devtools/v88/security.rb +0 -73
  218. data/lib/selenium/webdriver/devtools/v88/service_worker.rb +0 -118
  219. data/lib/selenium/webdriver/devtools/v88/storage.rb +0 -103
  220. data/lib/selenium/webdriver/devtools/v88/system_info.rb +0 -52
  221. data/lib/selenium/webdriver/devtools/v88/target.rb +0 -145
  222. data/lib/selenium/webdriver/devtools/v88/tethering.rb +0 -57
  223. data/lib/selenium/webdriver/devtools/v88/tracing.rb +0 -79
  224. data/lib/selenium/webdriver/devtools/v88/web_audio.rb +0 -72
  225. data/lib/selenium/webdriver/devtools/v88/web_authn.rb +0 -102
  226. data/lib/selenium/webdriver/firefox/bridge.rb +0 -47
  227. data/lib/selenium/webdriver/safari/bridge.rb +0 -51
  228. data/selenium-webdriver.gemspec +0 -50
  229. 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
- raise ArgumentError, "expected #{arg.inspect}:#{arg.class} to respond to #shift" unless arg.respond_to?(:shift)
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
@@ -44,6 +44,7 @@ module Selenium
44
44
  def edge(**opts)
45
45
  Edge::Service.new(**opts)
46
46
  end
47
+ alias_method :microsoftedge, :edge
47
48
 
48
49
  def safari(**opts)
49
50
  Safari::Service.new(**opts)
@@ -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
- SUPPORTED_VERSIONS = [85, 86, 87, 88].freeze
28
-
29
- def initialize(url:, version:)
28
+ def initialize(url:)
30
29
  @messages = []
31
- @uri = URI("http://#{url}")
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 = JSON.generate(id: id, method: method, params: params.reject { |_, v| v.nil? })
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
- private
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
- def load_devtools_version(version)
65
- closest_version = SUPPORTED_VERSIONS.min_by { |v| (version - v).abs }
66
- WebDriver.logger.info("Loading DevTools::V#{closest_version} for #{version}.")
67
- Dir["#{__dir__}/devtools/v#{closest_version}/*"].sort.each do |f|
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
- Thread.new { callback.call(message['params']) }
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: page_target['webSocketDebuggerUrl'])
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
- def console
25
- @console ||= V87::Console.new(self)
26
- end
27
-
28
- module V87
29
- class Console
30
- EVENTS = {
31
- message_added: 'messageAdded'
32
- }.freeze
33
-
34
- def initialize(devtools)
35
- @devtools = devtools
36
- end
37
-
38
- def on(event, &block)
39
- event = EVENTS[event] if event.is_a?(Symbol)
40
- @devtools.callbacks["Console.#{event}"] << block
41
- end
42
-
43
- def clear_messages
44
- @devtools.send_cmd('Console.clearMessages')
45
- end
46
-
47
- def disable
48
- @devtools.send_cmd('Console.disable')
49
- end
50
-
51
- def enable
52
- @devtools.send_cmd('Console.enable')
53
- end
54
-
55
- end # V87
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 :Bridge, 'selenium/webdriver/edge/bridge'
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 debugger_address
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 :Bridge, 'selenium/webdriver/firefox/bridge'
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
- include DriverExtensions::HasAddons
31
- include DriverExtensions::HasDevTools
32
- include DriverExtensions::HasLogEvents
33
- include DriverExtensions::HasWebStorage
34
- include DriverExtensions::PrintsPage
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 devtools_version
47
- 85
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
@@ -28,7 +28,7 @@ module Selenium
28
28
  #
29
29
 
30
30
  class Driver < WebDriver::Driver
31
- include DriverExtensions::HasWebStorage
31
+ EXTENSIONS = [DriverExtensions::HasWebStorage].freeze
32
32
 
33
33
  def browser
34
34
  :internet_explorer
@@ -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
- driver_args << "--implementation=#{driver_opts[:implementation].to_s.upcase}" if driver_opts.key?(:implementation)
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
- raise Error::UnsupportedOperationError, 'Switch to desired window before getting its size' unless handle == :current
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
- raise Error::UnsupportedOperationError, 'Switch to desired window before changing its size' unless handle == :current
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
- caps.browser_name = data.delete('browserName') if data.key?('browserName')
132
- caps.browser_version = data.delete('browserVersion') if data.key?('browserVersion')
133
- caps.platform_name = data.delete('platformName') if data.key?('platformName')
134
- caps.accept_insecure_certs = data.delete('acceptInsecureCerts') if data.key?('acceptInsecureCerts')
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
- caps[:remote_session_id] = data.delete('webdriver.remote.sessionid') if data.key?('webdriver.remote.sessionid')
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
- if value
226
- hash['proxy'] = value.as_json
227
- hash['proxy']['proxyType'] &&= hash['proxy']['proxyType'].downcase
228
- hash['proxy']['noProxy'] = hash['proxy']['noProxy'].split(', ') if hash['proxy']['noProxy'].is_a?(String)
229
- end
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.to_s)] = value
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 camel_case(str)
261
- str.gsub(/_([a-z])/) { Regexp.last_match(1).upcase }
262
- end
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