selenium-webdriver 2.53.3 → 3.142.7

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 (162) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGES +665 -8
  3. data/Gemfile +2 -0
  4. data/LICENSE +1 -1
  5. data/README.md +2 -3
  6. data/lib/selenium/server.rb +76 -73
  7. data/lib/selenium/webdriver/atoms/getAttribute.js +7 -0
  8. data/lib/selenium/webdriver/atoms/isDisplayed.js +102 -0
  9. data/lib/selenium/webdriver/{phantomjs.rb → atoms.rb} +10 -14
  10. data/lib/selenium/webdriver/chrome/bridge.rb +30 -101
  11. data/lib/selenium/webdriver/chrome/driver.rb +127 -0
  12. data/lib/selenium/webdriver/chrome/options.rb +190 -0
  13. data/lib/selenium/webdriver/chrome/profile.rb +21 -20
  14. data/lib/selenium/webdriver/chrome/service.rb +26 -93
  15. data/lib/selenium/webdriver/chrome.rb +15 -6
  16. data/lib/selenium/webdriver/common/action_builder.rb +52 -58
  17. data/lib/selenium/webdriver/common/alert.rb +7 -15
  18. data/lib/selenium/webdriver/common/bridge_helper.rb +18 -22
  19. data/lib/selenium/webdriver/common/driver.rb +72 -72
  20. data/lib/selenium/webdriver/common/driver_extensions/downloads_files.rb +45 -0
  21. data/lib/selenium/webdriver/common/driver_extensions/has_addons.rb +50 -0
  22. data/lib/selenium/webdriver/common/driver_extensions/{has_input_devices.rb → has_debugger.rb} +11 -27
  23. data/lib/selenium/webdriver/common/driver_extensions/has_location.rb +6 -10
  24. data/lib/selenium/webdriver/common/driver_extensions/has_network_conditions.rb +51 -0
  25. data/lib/selenium/webdriver/common/driver_extensions/has_network_connection.rb +7 -8
  26. data/lib/selenium/webdriver/common/driver_extensions/has_permissions.rb +51 -0
  27. data/lib/selenium/webdriver/common/driver_extensions/has_remote_status.rb +2 -4
  28. data/lib/selenium/webdriver/common/driver_extensions/has_session_id.rb +2 -4
  29. data/lib/selenium/webdriver/common/driver_extensions/has_touch_screen.rb +3 -5
  30. data/lib/selenium/webdriver/common/driver_extensions/has_web_storage.rb +2 -5
  31. data/lib/selenium/webdriver/common/driver_extensions/rotatable.rb +6 -9
  32. data/lib/selenium/webdriver/common/driver_extensions/takes_screenshot.rb +9 -7
  33. data/lib/selenium/webdriver/common/driver_extensions/uploads_files.rb +3 -8
  34. data/lib/selenium/webdriver/common/element.rb +59 -39
  35. data/lib/selenium/webdriver/common/error.rb +259 -104
  36. data/lib/selenium/webdriver/common/file_reaper.rb +6 -14
  37. data/lib/selenium/webdriver/common/html5/local_storage.rb +8 -10
  38. data/lib/selenium/webdriver/common/html5/session_storage.rb +8 -10
  39. data/lib/selenium/webdriver/common/html5/shared_web_storage.rb +8 -16
  40. data/lib/selenium/webdriver/common/interactions/input_device.rb +54 -0
  41. data/lib/selenium/webdriver/common/interactions/interaction.rb +53 -0
  42. data/lib/selenium/webdriver/{safari/browser.rb → common/interactions/interactions.rb} +17 -14
  43. data/lib/selenium/webdriver/common/interactions/key_actions.rb +145 -0
  44. data/lib/selenium/webdriver/common/interactions/key_input.rb +66 -0
  45. data/lib/selenium/webdriver/{android.rb → common/interactions/none_input.rb} +14 -6
  46. data/lib/selenium/webdriver/common/interactions/pointer_actions.rb +363 -0
  47. data/lib/selenium/webdriver/common/interactions/pointer_input.rb +139 -0
  48. data/lib/selenium/webdriver/common/keyboard.rb +10 -14
  49. data/lib/selenium/webdriver/common/keys.rb +102 -82
  50. data/lib/selenium/webdriver/common/log_entry.rb +7 -8
  51. data/lib/selenium/webdriver/common/logger.rb +115 -0
  52. data/lib/selenium/webdriver/common/logs.rb +4 -6
  53. data/lib/selenium/webdriver/common/manager.rb +177 -0
  54. data/lib/selenium/webdriver/common/mouse.rb +12 -14
  55. data/lib/selenium/webdriver/common/navigation.rb +4 -6
  56. data/lib/selenium/webdriver/common/options.rb +26 -127
  57. data/lib/selenium/webdriver/common/platform.rb +75 -101
  58. data/lib/selenium/webdriver/common/port_prober.rb +7 -19
  59. data/lib/selenium/webdriver/common/profile_helper.rb +8 -11
  60. data/lib/selenium/webdriver/common/proxy.rb +68 -74
  61. data/lib/selenium/webdriver/common/search_context.rb +28 -37
  62. data/lib/selenium/webdriver/common/service.rb +219 -0
  63. data/lib/selenium/webdriver/common/socket_lock.rb +15 -16
  64. data/lib/selenium/webdriver/common/socket_poller.rb +30 -28
  65. data/lib/selenium/webdriver/common/target_locator.rb +16 -18
  66. data/lib/selenium/webdriver/common/timeouts.rb +6 -8
  67. data/lib/selenium/webdriver/common/touch_action_builder.rb +5 -10
  68. data/lib/selenium/webdriver/common/touch_screen.rb +22 -23
  69. data/lib/selenium/webdriver/common/w3c_action_builder.rb +212 -0
  70. data/lib/selenium/webdriver/common/w3c_manager.rb +45 -0
  71. data/lib/selenium/webdriver/common/wait.rb +17 -16
  72. data/lib/selenium/webdriver/common/window.rb +50 -17
  73. data/lib/selenium/webdriver/common/zipper.rb +9 -13
  74. data/lib/selenium/webdriver/common.rb +21 -7
  75. data/lib/selenium/webdriver/edge/bridge.rb +34 -63
  76. data/lib/selenium/webdriver/edge/driver.rb +66 -0
  77. data/lib/selenium/webdriver/edge/options.rb +80 -0
  78. data/lib/selenium/webdriver/edge/service.rb +23 -95
  79. data/lib/selenium/webdriver/edge.rb +13 -13
  80. data/lib/selenium/webdriver/firefox/binary.rb +45 -60
  81. data/lib/selenium/webdriver/firefox/driver.rb +50 -0
  82. data/lib/selenium/webdriver/firefox/extension/prefs.json +3 -12
  83. data/lib/selenium/webdriver/firefox/extension/webdriver.xpi +0 -0
  84. data/lib/selenium/webdriver/firefox/extension.rb +20 -10
  85. data/lib/selenium/webdriver/firefox/launcher.rb +16 -22
  86. data/lib/selenium/webdriver/firefox/legacy/driver.rb +83 -0
  87. data/lib/selenium/webdriver/firefox/marionette/bridge.rb +49 -0
  88. data/lib/selenium/webdriver/firefox/marionette/driver.rb +90 -0
  89. data/lib/selenium/webdriver/firefox/options.rb +162 -0
  90. data/lib/selenium/webdriver/firefox/profile.rb +47 -48
  91. data/lib/selenium/webdriver/firefox/profiles_ini.rb +11 -18
  92. data/lib/selenium/webdriver/firefox/service.rb +24 -95
  93. data/lib/selenium/webdriver/firefox/util.rb +2 -4
  94. data/lib/selenium/webdriver/firefox.rb +27 -12
  95. data/lib/selenium/webdriver/ie/driver.rb +85 -0
  96. data/lib/selenium/webdriver/ie/options.rb +138 -0
  97. data/lib/selenium/webdriver/ie/service.rb +54 -0
  98. data/lib/selenium/webdriver/ie.rb +12 -10
  99. data/lib/selenium/webdriver/remote/bridge.rb +100 -564
  100. data/lib/selenium/webdriver/remote/capabilities.rb +98 -100
  101. data/lib/selenium/webdriver/remote/driver.rb +51 -0
  102. data/lib/selenium/webdriver/remote/http/common.rb +34 -22
  103. data/lib/selenium/webdriver/remote/http/curb.rb +13 -14
  104. data/lib/selenium/webdriver/remote/http/default.rb +62 -43
  105. data/lib/selenium/webdriver/remote/http/persistent.rb +12 -9
  106. data/lib/selenium/webdriver/remote/oss/bridge.rb +594 -0
  107. data/lib/selenium/webdriver/remote/oss/commands.rb +223 -0
  108. data/lib/selenium/webdriver/remote/response.rb +48 -28
  109. data/lib/selenium/webdriver/remote/server_error.rb +3 -5
  110. data/lib/selenium/webdriver/remote/w3c/bridge.rb +605 -0
  111. data/lib/selenium/webdriver/remote/w3c/capabilities.rb +310 -0
  112. data/lib/selenium/webdriver/remote/w3c/commands.rb +157 -0
  113. data/lib/selenium/webdriver/remote.rb +10 -16
  114. data/lib/selenium/webdriver/safari/bridge.rb +17 -101
  115. data/lib/selenium/webdriver/{firefox/w3c_bridge.rb → safari/driver.rb} +27 -25
  116. data/lib/selenium/webdriver/safari/options.rb +29 -31
  117. data/lib/selenium/webdriver/safari/service.rb +38 -0
  118. data/lib/selenium/webdriver/safari.rb +27 -27
  119. data/lib/selenium/webdriver/support/abstract_event_listener.rb +19 -4
  120. data/lib/selenium/webdriver/support/block_event_listener.rb +3 -5
  121. data/lib/selenium/webdriver/support/color.rb +60 -43
  122. data/lib/selenium/webdriver/support/escaper.rb +43 -0
  123. data/lib/selenium/webdriver/support/event_firing_bridge.rb +39 -41
  124. data/lib/selenium/webdriver/support/select.rb +45 -97
  125. data/lib/selenium/webdriver/support.rb +3 -2
  126. data/lib/selenium/webdriver/{iphone.rb → version.rb} +3 -7
  127. data/lib/selenium/webdriver.rb +36 -23
  128. data/lib/selenium-webdriver.rb +2 -2
  129. data/selenium-webdriver.gemspec +42 -29
  130. metadata +331 -262
  131. data/lib/selenium/client/base.rb +0 -151
  132. data/lib/selenium/client/driver.rb +0 -29
  133. data/lib/selenium/client/errors.rb +0 -28
  134. data/lib/selenium/client/extensions.rb +0 -132
  135. data/lib/selenium/client/idiomatic.rb +0 -507
  136. data/lib/selenium/client/javascript_expression_builder.rb +0 -135
  137. data/lib/selenium/client/javascript_frameworks/jquery.rb +0 -32
  138. data/lib/selenium/client/javascript_frameworks/prototype.rb +0 -32
  139. data/lib/selenium/client/legacy_driver.rb +0 -1722
  140. data/lib/selenium/client/protocol.rb +0 -123
  141. data/lib/selenium/client/selenium_helper.rb +0 -49
  142. data/lib/selenium/client.rb +0 -57
  143. data/lib/selenium/rake/server_task.rb +0 -176
  144. data/lib/selenium/webdriver/android/bridge.rb +0 -68
  145. data/lib/selenium/webdriver/common/core_ext/base64.rb +0 -28
  146. data/lib/selenium/webdriver/common/core_ext/dir.rb +0 -61
  147. data/lib/selenium/webdriver/common/html5/location.rb +0 -19
  148. data/lib/selenium/webdriver/common/w3c_error.rb +0 -194
  149. data/lib/selenium/webdriver/edge/legacy_support.rb +0 -117
  150. data/lib/selenium/webdriver/firefox/bridge.rb +0 -89
  151. data/lib/selenium/webdriver/ie/bridge.rb +0 -88
  152. data/lib/selenium/webdriver/ie/server.rb +0 -133
  153. data/lib/selenium/webdriver/iphone/bridge.rb +0 -64
  154. data/lib/selenium/webdriver/phantomjs/bridge.rb +0 -78
  155. data/lib/selenium/webdriver/phantomjs/service.rb +0 -130
  156. data/lib/selenium/webdriver/remote/commands.rb +0 -211
  157. data/lib/selenium/webdriver/remote/w3c_bridge.rb +0 -668
  158. data/lib/selenium/webdriver/remote/w3c_capabilities.rb +0 -236
  159. data/lib/selenium/webdriver/remote/w3c_commands.rb +0 -132
  160. data/lib/selenium/webdriver/safari/resources/client.js +0 -7255
  161. data/lib/selenium/webdriver/safari/server.rb +0 -187
  162. data/lib/selenium-client.rb +0 -21
@@ -0,0 +1,310 @@
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 Remote
23
+ module W3C
24
+
25
+ #
26
+ # Specification of the desired and/or actual capabilities of the browser that the
27
+ # server is being asked to create.
28
+ #
29
+ # @api private
30
+ #
31
+
32
+ class Capabilities
33
+
34
+ EXTENSION_CAPABILITY_PATTERN = /\A[\w-]+:.*\z/.freeze
35
+
36
+ KNOWN = [
37
+ :browser_name,
38
+ :browser_version,
39
+ :platform_name,
40
+ :accept_insecure_certs,
41
+ :page_load_strategy,
42
+ :proxy,
43
+ :set_window_rect,
44
+ :timeouts,
45
+ :unhandled_prompt_behavior,
46
+ :strict_file_interactability,
47
+
48
+ # remote-specific
49
+ :remote_session_id,
50
+
51
+ # TODO: (alex) deprecate in favor of Firefox::Options?
52
+ :accessibility_checks,
53
+ :device,
54
+
55
+ # TODO: (alex) deprecate compatibility with OSS-capabilities
56
+ :implicit_timeout,
57
+ :page_load_timeout,
58
+ :script_timeout
59
+ ].freeze
60
+
61
+ KNOWN.each do |key|
62
+ define_method key do
63
+ @capabilities.fetch(key)
64
+ end
65
+
66
+ next if key == :proxy
67
+
68
+ define_method "#{key}=" do |value|
69
+ case key
70
+ when :accessibility_checks
71
+ WebDriver.logger.deprecate(":accessibility_checks capability")
72
+ when :device
73
+ WebDriver.logger.deprecate(":device capability")
74
+ end
75
+ @capabilities[key] = value
76
+ end
77
+ end
78
+
79
+ #
80
+ # Backward compatibility
81
+ #
82
+
83
+ alias_method :version, :browser_version
84
+ alias_method :version=, :browser_version=
85
+ alias_method :platform, :platform_name
86
+ alias_method :platform=, :platform_name=
87
+
88
+ #
89
+ # Convenience methods for the common choices.
90
+ #
91
+
92
+ class << self
93
+ def edge(opts = {})
94
+ WebDriver.logger.deprecate('Selenium::WebDriver::Remote::W3C::Capabilities.edge',
95
+ 'Selenium::WebDriver::Remote::Capabilities.edge')
96
+ Remote::Capabilities.edge(opts)
97
+ end
98
+
99
+ def firefox(opts = {})
100
+ WebDriver.logger.deprecate('Selenium::WebDriver::Remote::W3C::Capabilities.firefox',
101
+ 'Selenium::WebDriver::Remote::Capabilities.firefox')
102
+ Remote::Capabilities.firefox(opts)
103
+ end
104
+
105
+ alias_method :ff, :firefox
106
+
107
+ #
108
+ # @api private
109
+ #
110
+
111
+ def json_create(data)
112
+ data = data.dup
113
+
114
+ caps = new
115
+ caps.browser_name = data.delete('browserName')
116
+ caps.browser_version = data.delete('browserVersion')
117
+ caps.platform_name = data.delete('platformName')
118
+ caps.accept_insecure_certs = data.delete('acceptInsecureCerts') if data.key?('acceptInsecureCerts')
119
+ caps.page_load_strategy = data.delete('pageLoadStrategy')
120
+ timeouts = data.delete('timeouts')
121
+ caps.implicit_timeout = timeouts['implicit'] if timeouts
122
+ caps.page_load_timeout = timeouts['pageLoad'] if timeouts
123
+ caps.script_timeout = timeouts['script'] if timeouts
124
+
125
+ proxy = data.delete('proxy')
126
+ caps.proxy = Proxy.json_create(proxy) unless proxy.nil? || proxy.empty?
127
+
128
+ # Remote Server Specific
129
+ caps[:remote_session_id] = data.delete('webdriver.remote.sessionid')
130
+
131
+ # Marionette Specific
132
+ caps[:accessibility_checks] = data.delete('moz:accessibilityChecks')
133
+ caps[:profile] = data.delete('moz:profile')
134
+ caps[:rotatable] = data.delete('rotatable')
135
+ caps[:device] = data.delete('device')
136
+
137
+ # any remaining pairs will be added as is, with no conversion
138
+ caps.merge!(data)
139
+
140
+ caps
141
+ end
142
+
143
+ #
144
+ # Creates W3C compliant capabilities from OSS ones.
145
+ # @param oss_capabilities [Hash, Remote::Capabilities]
146
+ #
147
+
148
+ def from_oss(oss_capabilities) # rubocop:disable Metrics/MethodLength
149
+ w3c_capabilities = new
150
+
151
+ # TODO: (alex) make capabilities enumerable?
152
+ oss_capabilities = oss_capabilities.__send__(:capabilities) unless oss_capabilities.is_a?(Hash)
153
+ oss_capabilities.each do |name, value|
154
+ next if value.nil?
155
+ next if value.is_a?(String) && value.empty?
156
+
157
+ capability_name = name.to_s
158
+
159
+ snake_cased_capability_names = KNOWN.map(&:to_s)
160
+ camel_cased_capability_names = snake_cased_capability_names.map(&w3c_capabilities.method(:camel_case))
161
+
162
+ next unless snake_cased_capability_names.include?(capability_name) ||
163
+ camel_cased_capability_names.include?(capability_name) ||
164
+ capability_name.match(EXTENSION_CAPABILITY_PATTERN)
165
+
166
+ w3c_capabilities[name] = value
167
+ end
168
+
169
+ # User can pass :firefox_options or :firefox_profile.
170
+ #
171
+ # TODO: (alex) Refactor this whole method into converter class.
172
+ firefox_options = oss_capabilities['firefoxOptions'] || oss_capabilities['firefox_options'] || oss_capabilities[:firefox_options]
173
+ firefox_profile = oss_capabilities['firefox_profile'] || oss_capabilities[:firefox_profile]
174
+ firefox_binary = oss_capabilities['firefox_binary'] || oss_capabilities[:firefox_binary]
175
+
176
+ if firefox_options
177
+ WebDriver.logger.deprecate(':firefox_options capabilitiy', 'Selenium::WebDriver::Firefox::Options')
178
+ end
179
+
180
+ if firefox_profile
181
+ WebDriver.logger.deprecate(':firefox_profile capabilitiy', 'Selenium::WebDriver::Firefox::Options#profile')
182
+ end
183
+
184
+ if firefox_binary
185
+ WebDriver.logger.deprecate(':firefox_binary capabilitiy', 'Selenium::WebDriver::Firefox::Options#binary')
186
+ end
187
+
188
+ if firefox_profile && firefox_options
189
+ second_profile = firefox_options['profile'] || firefox_options[:profile]
190
+ if second_profile && firefox_profile != second_profile
191
+ raise Error::WebDriverError, 'You cannot pass 2 different Firefox profiles'
192
+ end
193
+ end
194
+
195
+ if firefox_options || firefox_profile || firefox_binary
196
+ options = WebDriver::Firefox::Options.new(firefox_options || {})
197
+ options.binary = firefox_binary if firefox_binary
198
+ options.profile = firefox_profile if firefox_profile
199
+ w3c_capabilities.merge!(options.as_json)
200
+ end
201
+
202
+ w3c_capabilities
203
+ end
204
+ end
205
+
206
+ #
207
+ # @param [Hash] opts
208
+ # @option :browser_name [String] required browser name
209
+ # @option :browser_version [String] required browser version number
210
+ # @option :platform_name [Symbol] one of :any, :win, :mac, or :x
211
+ # @option :accept_insecure_certs [Boolean] does the driver accept insecure SSL certifications?
212
+ # @option :proxy [Selenium::WebDriver::Proxy, Hash] proxy configuration
213
+ #
214
+ # @api public
215
+ #
216
+
217
+ def initialize(opts = {})
218
+ @capabilities = opts
219
+ self.proxy = opts.delete(:proxy)
220
+ end
221
+
222
+ #
223
+ # Allows setting arbitrary capabilities.
224
+ #
225
+
226
+ def []=(key, value)
227
+ @capabilities[key] = value
228
+ end
229
+
230
+ def [](key)
231
+ @capabilities[key]
232
+ end
233
+
234
+ def merge!(other)
235
+ if other.respond_to?(:capabilities, true) && other.capabilities.is_a?(Hash)
236
+ @capabilities.merge! other.capabilities
237
+ elsif other.is_a? Hash
238
+ @capabilities.merge! other
239
+ else
240
+ raise ArgumentError, 'argument should be a Hash or implement #capabilities'
241
+ end
242
+ end
243
+
244
+ def proxy=(proxy)
245
+ case proxy
246
+ when Hash
247
+ @capabilities[:proxy] = Proxy.new(proxy)
248
+ when Proxy, nil
249
+ @capabilities[:proxy] = proxy
250
+ else
251
+ raise TypeError, "expected Hash or #{Proxy.name}, got #{proxy.inspect}:#{proxy.class}"
252
+ end
253
+ end
254
+
255
+ #
256
+ # @api private
257
+ #
258
+
259
+ def as_json(*)
260
+ hash = {}
261
+
262
+ @capabilities.each do |key, value|
263
+ case key
264
+ when :platform
265
+ hash['platform'] = value.to_s.upcase
266
+ when :proxy
267
+ if value
268
+ hash['proxy'] = value.as_json
269
+ hash['proxy']['proxyType'] &&= hash['proxy']['proxyType'].downcase
270
+ hash['proxy']['noProxy'] = hash['proxy']['noProxy'].split(', ') if hash['proxy']['noProxy'].is_a?(String)
271
+ end
272
+ when String, :firefox_binary
273
+ hash[key.to_s] = value
274
+ when Symbol
275
+ hash[camel_case(key.to_s)] = value
276
+ else
277
+ raise TypeError, "expected String or Symbol, got #{key.inspect}:#{key.class} / #{value.inspect}"
278
+ end
279
+ end
280
+
281
+ hash
282
+ end
283
+
284
+ def to_json(*)
285
+ JSON.generate as_json
286
+ end
287
+
288
+ def ==(other)
289
+ return false unless other.is_a? self.class
290
+
291
+ as_json == other.as_json
292
+ end
293
+
294
+ alias_method :eql?, :==
295
+
296
+ protected
297
+
298
+ attr_reader :capabilities
299
+
300
+ private
301
+
302
+ def camel_case(str)
303
+ str.gsub(/_([a-z])/) { Regexp.last_match(1).upcase }
304
+ end
305
+
306
+ end # Capabilities
307
+ end # W3c
308
+ end # Remote
309
+ end # WebDriver
310
+ end # Selenium
@@ -0,0 +1,157 @@
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 Remote
23
+ module W3C
24
+
25
+ #
26
+ # http://www.w3.org/TR/2015/WD-webdriver-20150918/#list-of-endpoints
27
+ # @api private
28
+ #
29
+
30
+ class Bridge
31
+ COMMANDS = {
32
+
33
+ #
34
+ # session handling
35
+ #
36
+
37
+ new_session: [:post, 'session'],
38
+ delete_session: [:delete, 'session/:session_id'],
39
+
40
+ #
41
+ # basic driver
42
+ #
43
+
44
+ get: [:post, 'session/:session_id/url'],
45
+ get_current_url: [:get, 'session/:session_id/url'],
46
+ back: [:post, 'session/:session_id/back'],
47
+ forward: [:post, 'session/:session_id/forward'],
48
+ refresh: [:post, 'session/:session_id/refresh'],
49
+ get_title: [:get, 'session/:session_id/title'],
50
+
51
+ #
52
+ # window and Frame handling
53
+ #
54
+
55
+ get_window_handle: [:get, 'session/:session_id/window'],
56
+ new_window: [:post, 'session/:session_id/window/new'],
57
+ close_window: [:delete, 'session/:session_id/window'],
58
+ switch_to_window: [:post, 'session/:session_id/window'],
59
+ get_window_handles: [:get, 'session/:session_id/window/handles'],
60
+ fullscreen_window: [:post, 'session/:session_id/window/fullscreen'],
61
+ minimize_window: [:post, 'session/:session_id/window/minimize'],
62
+ maximize_window: [:post, 'session/:session_id/window/maximize'],
63
+ set_window_size: [:post, 'session/:session_id/window/size'],
64
+ get_window_size: [:get, 'session/:session_id/window/size'],
65
+ set_window_position: [:post, 'session/:session_id/window/position'],
66
+ get_window_position: [:get, 'session/:session_id/window/position'],
67
+ set_window_rect: [:post, 'session/:session_id/window/rect'],
68
+ get_window_rect: [:get, 'session/:session_id/window/rect'],
69
+ switch_to_frame: [:post, 'session/:session_id/frame'],
70
+ switch_to_parent_frame: [:post, 'session/:session_id/frame/parent'],
71
+
72
+ #
73
+ # element
74
+ #
75
+
76
+ find_element: [:post, 'session/:session_id/element'],
77
+ find_elements: [:post, 'session/:session_id/elements'],
78
+ find_child_element: [:post, 'session/:session_id/element/:id/element'],
79
+ find_child_elements: [:post, 'session/:session_id/element/:id/elements'],
80
+ get_active_element: [:get, 'session/:session_id/element/active'],
81
+ is_element_selected: [:get, 'session/:session_id/element/:id/selected'],
82
+ get_element_attribute: [:get, 'session/:session_id/element/:id/attribute/:name'],
83
+ get_element_property: [:get, 'session/:session_id/element/:id/property/:name'],
84
+ get_element_css_value: [:get, 'session/:session_id/element/:id/css/:property_name'],
85
+ get_element_text: [:get, 'session/:session_id/element/:id/text'],
86
+ get_element_tag_name: [:get, 'session/:session_id/element/:id/name'],
87
+ get_element_rect: [:get, 'session/:session_id/element/:id/rect'],
88
+ is_element_enabled: [:get, 'session/:session_id/element/:id/enabled'],
89
+
90
+ #
91
+ # document handling
92
+ #
93
+
94
+ get_page_source: [:get, 'session/:session_id/source'],
95
+ execute_script: [:post, 'session/:session_id/execute/sync'],
96
+ execute_async_script: [:post, 'session/:session_id/execute/async'],
97
+
98
+ #
99
+ # cookies
100
+ #
101
+
102
+ get_all_cookies: [:get, 'session/:session_id/cookie'],
103
+ get_cookie: [:get, 'session/:session_id/cookie/:name'],
104
+ add_cookie: [:post, 'session/:session_id/cookie'],
105
+ delete_cookie: [:delete, 'session/:session_id/cookie/:name'],
106
+ delete_all_cookies: [:delete, 'session/:session_id/cookie'],
107
+
108
+ #
109
+ # timeouts
110
+ #
111
+
112
+ set_timeout: [:post, 'session/:session_id/timeouts'],
113
+
114
+ #
115
+ # actions
116
+ #
117
+
118
+ actions: [:post, 'session/:session_id/actions'],
119
+ release_actions: [:delete, 'session/:session_id/actions'],
120
+
121
+ #
122
+ # Element Operations
123
+ #
124
+
125
+ element_click: [:post, 'session/:session_id/element/:id/click'],
126
+ element_tap: [:post, 'session/:session_id/element/:id/tap'],
127
+ element_clear: [:post, 'session/:session_id/element/:id/clear'],
128
+ element_send_keys: [:post, 'session/:session_id/element/:id/value'],
129
+
130
+ #
131
+ # alerts
132
+ #
133
+
134
+ dismiss_alert: [:post, 'session/:session_id/alert/dismiss'],
135
+ accept_alert: [:post, 'session/:session_id/alert/accept'],
136
+ get_alert_text: [:get, 'session/:session_id/alert/text'],
137
+ send_alert_text: [:post, 'session/:session_id/alert/text'],
138
+
139
+ #
140
+ # screenshot
141
+ #
142
+
143
+ take_screenshot: [:get, 'session/:session_id/screenshot'],
144
+ take_element_screenshot: [:get, 'session/:session_id/element/:id/screenshot'],
145
+
146
+ #
147
+ # server extensions
148
+ #
149
+
150
+ upload_file: [:post, 'session/:session_id/se/file']
151
+ }.freeze
152
+
153
+ end # Bridge
154
+ end # W3C
155
+ end # Remote
156
+ end # WebDriver
157
+ end # Selenium
@@ -1,5 +1,5 @@
1
- # encoding: utf-8
2
- #
1
+ # frozen_string_literal: true
2
+
3
3
  # Licensed to the Software Freedom Conservancy (SFC) under one
4
4
  # or more contributor license agreements. See the NOTICE file
5
5
  # distributed with this work for additional information
@@ -19,23 +19,17 @@
19
19
 
20
20
  require 'uri'
21
21
 
22
- require 'selenium/webdriver/remote/capabilities'
23
- require 'selenium/webdriver/remote/w3c_capabilities'
24
22
  require 'selenium/webdriver/remote/bridge'
25
- require 'selenium/webdriver/remote/w3c_bridge'
26
- require 'selenium/webdriver/remote/server_error'
23
+ require 'selenium/webdriver/remote/driver'
27
24
  require 'selenium/webdriver/remote/response'
28
- require 'selenium/webdriver/remote/commands'
29
- require 'selenium/webdriver/remote/w3c_commands'
25
+ require 'selenium/webdriver/remote/server_error'
30
26
  require 'selenium/webdriver/remote/http/common'
31
27
  require 'selenium/webdriver/remote/http/default'
32
28
 
33
- module Selenium
34
- module WebDriver
35
-
36
- # @api private
37
- module Remote
29
+ require 'selenium/webdriver/remote/capabilities'
30
+ require 'selenium/webdriver/remote/oss/bridge'
31
+ require 'selenium/webdriver/remote/oss/commands'
38
32
 
39
- end # Remote
40
- end # WebDriver
41
- end # Selenium
33
+ require 'selenium/webdriver/remote/w3c/bridge'
34
+ require 'selenium/webdriver/remote/w3c/capabilities'
35
+ require 'selenium/webdriver/remote/w3c/commands'
@@ -1,5 +1,5 @@
1
- # encoding: utf-8
2
- #
1
+ # frozen_string_literal: true
2
+
3
3
  # Licensed to the Software Freedom Conservancy (SFC) under one
4
4
  # or more contributor license agreements. See the NOTICE file
5
5
  # distributed with this work for additional information
@@ -20,113 +20,29 @@
20
20
  module Selenium
21
21
  module WebDriver
22
22
  module Safari
23
+ module Bridge
23
24
 
24
- class Bridge < Remote::Bridge
25
- COMMAND_TIMEOUT = 60
26
-
27
- def initialize(opts = {})
28
- command_timeout = Integer(opts[:timeout] || COMMAND_TIMEOUT)
29
- safari_options = opts.delete(:options) || Safari::Options.new(opts)
30
- capabilities = merge_capabilities(opts, safari_options)
31
-
32
- @command_id ||= 0
33
-
34
- # TODO: handle safari_opts['cleanSession']
35
- @server = Server.new(safari_options.port, command_timeout)
36
- @server.start
37
-
38
- @safari = Browser.new
39
- @safari.start(prepare_connect_file)
40
-
41
- @server.wait_for_connection
42
-
43
- super(desired_capabilities: capabilities)
44
- end
45
-
46
- def quit
47
- super
48
-
49
- @server.stop
50
- @safari.stop
51
- end
52
-
53
- def driver_extensions
54
- [
55
- DriverExtensions::TakesScreenshot,
56
- DriverExtensions::HasInputDevices
57
- ]
58
- end
59
-
60
- private
25
+ # https://developer.apple.com/library/content/documentation/NetworkingInternetWeb/Conceptual/WebDriverEndpointDoc/Commands/Commands.html
26
+ COMMANDS = {
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
+ }.freeze
61
31
 
62
- def create_session(desired_capabilities)
63
- resp = raw_execute :newSession, {}, :desiredCapabilities => desired_capabilities
64
- Remote::Capabilities.json_create resp.fetch('value')
32
+ def commands(command)
33
+ COMMANDS[command] || super
65
34
  end
66
35
 
67
- def raw_execute(command, opts = {}, command_hash = nil)
68
- @command_id += 1
69
-
70
- params = {}
71
- opts.each do |key, value|
72
- params[camel_case(key.to_s)] = value
73
- end
74
-
75
- params.merge!(command_hash) if command_hash
76
-
77
- @server.send(
78
- :origin => "webdriver",
79
- :type => "command",
80
- :command => { :id => @command_id.to_s, :name => command, :parameters => params}
81
- )
82
-
83
- raw = @server.receive
84
- response = raw.fetch('response')
85
-
86
- status_code = response['status']
87
- if status_code != 0
88
- raise Error.for_code(status_code), response['value']['message']
89
- end
90
-
91
- if raw['id'].to_s != @command_id.to_s
92
- raise Error::WebDriverError, "response id does not match command id: #{raw['id']} != #{@command_id}"
93
- end
94
-
95
- response
36
+ def permissions
37
+ execute(:get_permissions)['permissions']
96
38
  end
97
39
 
98
- def camel_case(str)
99
- parts = str.split('_')
100
- parts[1..-1].map { |e| e.capitalize! }
101
-
102
- parts.join
40
+ def permissions=(permissions)
41
+ execute :set_permissions, {}, {permissions: permissions}
103
42
  end
104
43
 
105
- def prepare_connect_file
106
- # TODO: use tempfile?
107
- path = File.join(Dir.tmpdir, "safaridriver-#{Time.now.usec}.html")
108
-
109
- File.open(path, 'w') do |io|
110
- io << "<!DOCTYPE html><script>window.location = '#{@server.uri}';</script>"
111
- end
112
-
113
- FileReaper << path
114
- path.gsub! "/", "\\" if Platform.windows?
115
-
116
- path
117
- end
118
-
119
- def merge_capabilities(opts, safari_options)
120
- caps = safari_options.to_capabilities
121
- other = opts[:desired_capabilities]
122
-
123
- if other
124
- other = opts[:desired_capabilities].as_json
125
- caps['safari.options'].merge!(other.delete('safari.options') || {})
126
- caps.merge!(other)
127
- end
128
-
129
- caps
44
+ def attach_debugger
45
+ execute :attach_debugger, {}, {}
130
46
  end
131
47
 
132
48
  end # Bridge