selenium-webdriver 2.45.0 → 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 (172) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGES +795 -3
  3. data/Gemfile +2 -0
  4. data/{COPYING → LICENSE} +1 -3
  5. data/README.md +13 -9
  6. data/lib/selenium/server.rb +93 -71
  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/atoms.rb +37 -0
  10. data/lib/selenium/webdriver/chrome/bridge.rb +47 -99
  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 +40 -20
  14. data/lib/selenium/webdriver/chrome/service.rb +46 -62
  15. data/lib/selenium/webdriver/chrome.rb +34 -6
  16. data/lib/selenium/webdriver/common/action_builder.rb +69 -56
  17. data/lib/selenium/webdriver/common/alert.rb +25 -8
  18. data/lib/selenium/webdriver/common/bridge_helper.rb +35 -20
  19. data/lib/selenium/webdriver/common/driver.rb +90 -63
  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_debugger.rb +42 -0
  23. data/lib/selenium/webdriver/common/driver_extensions/has_location.rb +26 -11
  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 +58 -0
  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 +23 -6
  28. data/lib/selenium/webdriver/common/driver_extensions/has_session_id.rb +19 -2
  29. data/lib/selenium/webdriver/common/driver_extensions/has_touch_screen.rb +24 -7
  30. data/lib/selenium/webdriver/common/driver_extensions/has_web_storage.rb +19 -3
  31. data/lib/selenium/webdriver/common/driver_extensions/rotatable.rb +23 -7
  32. data/lib/selenium/webdriver/common/driver_extensions/takes_screenshot.rb +26 -5
  33. data/lib/selenium/webdriver/common/driver_extensions/uploads_files.rb +20 -6
  34. data/lib/selenium/webdriver/common/element.rb +79 -37
  35. data/lib/selenium/webdriver/common/error.rb +282 -106
  36. data/lib/selenium/webdriver/common/file_reaper.rb +23 -12
  37. data/lib/selenium/webdriver/common/html5/local_storage.rb +29 -12
  38. data/lib/selenium/webdriver/common/html5/session_storage.rb +29 -12
  39. data/lib/selenium/webdriver/common/html5/shared_web_storage.rb +29 -18
  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/common/interactions/interactions.rb +43 -0
  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/common/interactions/none_input.rb +36 -0
  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 +27 -12
  49. data/lib/selenium/webdriver/common/keys.rb +118 -81
  50. data/lib/selenium/webdriver/common/log_entry.rb +27 -8
  51. data/lib/selenium/webdriver/common/logger.rb +115 -0
  52. data/lib/selenium/webdriver/common/logs.rb +24 -7
  53. data/lib/selenium/webdriver/common/manager.rb +177 -0
  54. data/lib/selenium/webdriver/common/mouse.rb +29 -12
  55. data/lib/selenium/webdriver/common/navigation.rb +21 -4
  56. data/lib/selenium/webdriver/common/options.rb +43 -126
  57. data/lib/selenium/webdriver/common/platform.rb +101 -97
  58. data/lib/selenium/webdriver/common/port_prober.rb +24 -17
  59. data/lib/selenium/webdriver/common/profile_helper.rb +27 -11
  60. data/lib/selenium/webdriver/common/proxy.rb +86 -73
  61. data/lib/selenium/webdriver/common/search_context.rb +49 -33
  62. data/lib/selenium/webdriver/common/service.rb +219 -0
  63. data/lib/selenium/webdriver/common/socket_lock.rb +82 -0
  64. data/lib/selenium/webdriver/common/socket_poller.rb +47 -26
  65. data/lib/selenium/webdriver/common/target_locator.rb +35 -14
  66. data/lib/selenium/webdriver/common/timeouts.rb +23 -6
  67. data/lib/selenium/webdriver/common/touch_action_builder.rb +25 -11
  68. data/lib/selenium/webdriver/common/touch_screen.rb +42 -24
  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 +34 -14
  72. data/lib/selenium/webdriver/common/window.rb +75 -16
  73. data/lib/selenium/webdriver/common/zipper.rb +26 -11
  74. data/lib/selenium/webdriver/common.rb +40 -7
  75. data/lib/selenium/webdriver/edge/bridge.rb +76 -0
  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 +52 -0
  79. data/lib/selenium/webdriver/edge.rb +44 -0
  80. data/lib/selenium/webdriver/firefox/binary.rb +70 -48
  81. data/lib/selenium/webdriver/firefox/driver.rb +50 -0
  82. data/lib/selenium/webdriver/firefox/extension/prefs.json +14 -13
  83. data/lib/selenium/webdriver/firefox/extension/webdriver.xpi +0 -0
  84. data/lib/selenium/webdriver/firefox/extension.rb +50 -19
  85. data/lib/selenium/webdriver/firefox/launcher.rb +33 -28
  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 +66 -48
  91. data/lib/selenium/webdriver/firefox/profiles_ini.rb +28 -16
  92. data/lib/selenium/webdriver/firefox/service.rb +52 -0
  93. data/lib/selenium/webdriver/firefox/util.rb +19 -2
  94. data/lib/selenium/webdriver/firefox.rb +46 -10
  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 +32 -10
  99. data/lib/selenium/webdriver/remote/bridge.rb +117 -572
  100. data/lib/selenium/webdriver/remote/capabilities.rb +116 -99
  101. data/lib/selenium/webdriver/remote/driver.rb +51 -0
  102. data/lib/selenium/webdriver/remote/http/common.rb +54 -23
  103. data/lib/selenium/webdriver/remote/http/curb.rb +30 -12
  104. data/lib/selenium/webdriver/remote/http/default.rb +85 -42
  105. data/lib/selenium/webdriver/remote/http/persistent.rb +29 -7
  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 +68 -30
  109. data/lib/selenium/webdriver/remote/server_error.rb +22 -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 +27 -13
  114. data/lib/selenium/webdriver/safari/bridge.rb +38 -107
  115. data/lib/selenium/webdriver/safari/driver.rb +68 -0
  116. data/lib/selenium/webdriver/safari/options.rb +56 -75
  117. data/lib/selenium/webdriver/safari/service.rb +38 -0
  118. data/lib/selenium/webdriver/safari.rb +49 -31
  119. data/lib/selenium/webdriver/support/abstract_event_listener.rb +40 -6
  120. data/lib/selenium/webdriver/support/block_event_listener.rb +24 -7
  121. data/lib/selenium/webdriver/support/color.rb +82 -46
  122. data/lib/selenium/webdriver/support/escaper.rb +43 -0
  123. data/lib/selenium/webdriver/support/event_firing_bridge.rb +56 -39
  124. data/lib/selenium/webdriver/support/select.rb +66 -89
  125. data/lib/selenium/webdriver/support.rb +20 -0
  126. data/lib/selenium/webdriver/version.rb +24 -0
  127. data/lib/selenium/webdriver.rb +55 -25
  128. data/lib/selenium-webdriver.rb +19 -0
  129. data/selenium-webdriver.gemspec +42 -29
  130. metadata +331 -260
  131. data/Gemfile.lock +0 -48
  132. data/lib/selenium/client/base.rb +0 -132
  133. data/lib/selenium/client/driver.rb +0 -10
  134. data/lib/selenium/client/errors.rb +0 -9
  135. data/lib/selenium/client/extensions.rb +0 -118
  136. data/lib/selenium/client/idiomatic.rb +0 -488
  137. data/lib/selenium/client/javascript_expression_builder.rb +0 -116
  138. data/lib/selenium/client/javascript_frameworks/jquery.rb +0 -13
  139. data/lib/selenium/client/javascript_frameworks/prototype.rb +0 -13
  140. data/lib/selenium/client/legacy_driver.rb +0 -1720
  141. data/lib/selenium/client/protocol.rb +0 -104
  142. data/lib/selenium/client/selenium_helper.rb +0 -34
  143. data/lib/selenium/client.rb +0 -38
  144. data/lib/selenium/rake/server_task.rb +0 -157
  145. data/lib/selenium/webdriver/android/bridge.rb +0 -49
  146. data/lib/selenium/webdriver/android.rb +0 -9
  147. data/lib/selenium/webdriver/common/core_ext/base64.rb +0 -9
  148. data/lib/selenium/webdriver/common/core_ext/dir.rb +0 -42
  149. data/lib/selenium/webdriver/common/core_ext/string.rb +0 -5
  150. data/lib/selenium/webdriver/common/driver_extensions/has_browser_connection.rb +0 -17
  151. data/lib/selenium/webdriver/common/driver_extensions/has_input_devices.rb +0 -39
  152. data/lib/selenium/webdriver/common/html5/location.rb +0 -0
  153. data/lib/selenium/webdriver/common/json_helper.rb +0 -34
  154. data/lib/selenium/webdriver/firefox/bridge.rb +0 -70
  155. data/lib/selenium/webdriver/firefox/socket_lock.rb +0 -61
  156. data/lib/selenium/webdriver/ie/bridge.rb +0 -69
  157. data/lib/selenium/webdriver/ie/server.rb +0 -90
  158. data/lib/selenium/webdriver/iphone/bridge.rb +0 -45
  159. data/lib/selenium/webdriver/iphone.rb +0 -9
  160. data/lib/selenium/webdriver/opera/bridge.rb +0 -112
  161. data/lib/selenium/webdriver/opera/service.rb +0 -49
  162. data/lib/selenium/webdriver/opera.rb +0 -24
  163. data/lib/selenium/webdriver/phantomjs/bridge.rb +0 -59
  164. data/lib/selenium/webdriver/phantomjs/service.rb +0 -90
  165. data/lib/selenium/webdriver/phantomjs.rb +0 -22
  166. data/lib/selenium/webdriver/remote/commands.rb +0 -192
  167. data/lib/selenium/webdriver/safari/browser.rb +0 -20
  168. data/lib/selenium/webdriver/safari/extensions.rb +0 -170
  169. data/lib/selenium/webdriver/safari/resources/SafariDriver.safariextz +0 -0
  170. data/lib/selenium/webdriver/safari/resources/client.js +0 -6903
  171. data/lib/selenium/webdriver/safari/server.rb +0 -145
  172. data/lib/selenium-client.rb +0 -2
@@ -1,18 +1,37 @@
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
+
1
20
  module Selenium
2
21
  module WebDriver
3
22
  module Firefox
4
23
  class Profile
5
24
  include ProfileHelper
6
25
 
7
- VALID_PREFERENCE_TYPES = [TrueClass, FalseClass, Integer, Float, String]
26
+ VALID_PREFERENCE_TYPES = [TrueClass, FalseClass, Integer, Float, String].freeze
8
27
  WEBDRIVER_EXTENSION_PATH = File.expand_path("#{WebDriver.root}/selenium/webdriver/firefox/extension/webdriver.xpi")
9
28
  WEBDRIVER_PREFS = {
10
- :native_events => 'webdriver_enable_native_events',
11
- :untrusted_certs => 'webdriver_accept_untrusted_certs',
12
- :untrusted_issuer => 'webdriver_assume_untrusted_issuer',
13
- :port => 'webdriver_firefox_port',
14
- :log_file => 'webdriver.log.file'
15
- }
29
+ native_events: 'webdriver_enable_native_events',
30
+ untrusted_certs: 'webdriver_accept_untrusted_certs',
31
+ untrusted_issuer: 'webdriver_assume_untrusted_issuer',
32
+ port: 'webdriver_firefox_port',
33
+ log_file: 'webdriver.log.file'
34
+ }.freeze
16
35
 
17
36
  attr_reader :name, :log_file
18
37
  attr_writer :secure_ssl, :native_events, :load_no_focus_lib
@@ -23,11 +42,14 @@ module Selenium
23
42
  end
24
43
 
25
44
  def from_name(name)
26
- ini[name]
45
+ profile = ini[name]
46
+ return profile if profile
47
+
48
+ raise Error::WebDriverError, "unable to find profile named: #{name.inspect}"
27
49
  end
28
50
 
29
51
  def default_preferences
30
- @default_preferences ||= WebDriver.json_load(
52
+ @default_preferences ||= JSON.parse(
31
53
  File.read(File.expand_path("#{WebDriver.root}/selenium/webdriver/firefox/extension/prefs.json"))
32
54
  ).freeze
33
55
  end
@@ -59,18 +81,19 @@ module Selenium
59
81
  @additional_prefs = {}
60
82
  else
61
83
  # TODO: clean this up
62
- @native_events = model_prefs.delete(WEBDRIVER_PREFS[:native_events]) == "true"
63
- @secure_ssl = model_prefs.delete(WEBDRIVER_PREFS[:untrusted_certs]) != "true"
64
- @untrusted_issuer = model_prefs.delete(WEBDRIVER_PREFS[:untrusted_issuer]) == "true"
65
- @load_no_focus_lib = model_prefs.delete(WEBDRIVER_PREFS[:load_no_focus_lib]) == "true" # not stored in profile atm, so will always be false.
84
+ @native_events = model_prefs.delete(WEBDRIVER_PREFS[:native_events]) == 'true'
85
+ @secure_ssl = model_prefs.delete(WEBDRIVER_PREFS[:untrusted_certs]) != 'true'
86
+ @untrusted_issuer = model_prefs.delete(WEBDRIVER_PREFS[:untrusted_issuer]) == 'true'
87
+ # not stored in profile atm, so will always be false.
88
+ @load_no_focus_lib = model_prefs.delete(WEBDRIVER_PREFS[:load_no_focus_lib]) == 'true'
66
89
  @additional_prefs = model_prefs
67
90
  end
68
91
 
69
- @extensions = {}
92
+ @extensions = {}
70
93
  end
71
94
 
72
95
  def layout_on_disk
73
- profile_dir = @model ? create_tmp_copy(@model) : Dir.mktmpdir("webdriver-profile")
96
+ profile_dir = @model ? create_tmp_copy(@model) : Dir.mktmpdir('webdriver-profile')
74
97
  FileReaper << profile_dir
75
98
 
76
99
  install_extensions(profile_dir)
@@ -81,7 +104,6 @@ module Selenium
81
104
  profile_dir
82
105
  end
83
106
 
84
-
85
107
  #
86
108
  # Set a preference for this particular profile.
87
109
  #
@@ -90,11 +112,11 @@ module Selenium
90
112
  #
91
113
 
92
114
  def []=(key, value)
93
- unless VALID_PREFERENCE_TYPES.any? { |e| value.kind_of? e }
115
+ unless VALID_PREFERENCE_TYPES.any? { |e| value.is_a? e }
94
116
  raise TypeError, "expected one of #{VALID_PREFERENCE_TYPES.inspect}, got #{value.inspect}:#{value.class}"
95
117
  end
96
118
 
97
- if value.kind_of?(String) && Util.stringified?(value)
119
+ if value.is_a?(String) && Util.stringified?(value)
98
120
  raise ArgumentError, "preference values must be plain strings: #{key.inspect} => #{value.inspect}"
99
121
  end
100
122
 
@@ -111,9 +133,9 @@ module Selenium
111
133
  end
112
134
 
113
135
  def add_webdriver_extension
114
- unless @extensions.has_key?(:webdriver)
115
- add_extension(WEBDRIVER_EXTENSION_PATH, :webdriver)
116
- end
136
+ return if @extensions.key?(:webdriver)
137
+
138
+ add_extension(WEBDRIVER_EXTENSION_PATH, :webdriver)
117
139
  end
118
140
 
119
141
  #
@@ -145,24 +167,18 @@ module Selenium
145
167
  end
146
168
 
147
169
  def proxy=(proxy)
148
- unless proxy.kind_of? Proxy
149
- raise TypeError, "expected #{Proxy.name}, got #{proxy.inspect}:#{proxy.class}"
150
- end
170
+ raise TypeError, "expected #{Proxy.name}, got #{proxy.inspect}:#{proxy.class}" unless proxy.is_a? Proxy
151
171
 
152
172
  case proxy.type
153
173
  when :manual
154
174
  self['network.proxy.type'] = 1
155
175
 
156
- set_manual_proxy_preference "ftp", proxy.ftp
157
- set_manual_proxy_preference "http", proxy.http
158
- set_manual_proxy_preference "ssl", proxy.ssl
159
- set_manual_proxy_preference "socks", proxy.socks
176
+ set_manual_proxy_preference 'ftp', proxy.ftp
177
+ set_manual_proxy_preference 'http', proxy.http
178
+ set_manual_proxy_preference 'ssl', proxy.ssl
179
+ set_manual_proxy_preference 'socks', proxy.socks
160
180
 
161
- if proxy.no_proxy
162
- self["network.proxy.no_proxies_on"] = proxy.no_proxy
163
- else
164
- self["network.proxy.no_proxies_on"] = ""
165
- end
181
+ self['network.proxy.no_proxies_on'] = proxy.no_proxy || ''
166
182
  when :pac
167
183
  self['network.proxy.type'] = 2
168
184
  self['network.proxy.autoconfig_url'] = proxy.pac
@@ -171,8 +187,10 @@ module Selenium
171
187
  else
172
188
  raise ArgumentError, "unsupported proxy type #{proxy.type}"
173
189
  end
190
+ end
174
191
 
175
- proxy
192
+ def encoded
193
+ Zipper.zip(layout_on_disk)
176
194
  end
177
195
 
178
196
  private
@@ -180,17 +198,17 @@ module Selenium
180
198
  def set_manual_proxy_preference(key, value)
181
199
  return unless value
182
200
 
183
- host, port = value.to_s.split(":", 2)
201
+ host, port = value.to_s.split(':', 2)
184
202
 
185
203
  self["network.proxy.#{key}"] = host
186
204
  self["network.proxy.#{key}_port"] = Integer(port) if port
187
205
  end
188
206
 
189
207
  def install_extensions(directory)
190
- destination = File.join(directory, "extensions")
208
+ destination = File.join(directory, 'extensions')
191
209
 
192
210
  @extensions.each do |name, extension|
193
- p :extension => name if $DEBUG
211
+ WebDriver.logger.debug({extenstion: name}.inspect)
194
212
  extension.write_to(destination)
195
213
  end
196
214
  end
@@ -202,7 +220,7 @@ module Selenium
202
220
  end
203
221
 
204
222
  def delete_extensions_cache(directory)
205
- FileUtils.rm_f File.join(directory, "extensions.cache")
223
+ FileUtils.rm_f File.join(directory, 'extensions.cache')
206
224
  end
207
225
 
208
226
  def delete_lock_files(directory)
@@ -228,7 +246,7 @@ module Selenium
228
246
  prefs[WEBDRIVER_PREFS[:untrusted_issuer]] = assume_untrusted_certificate_issuer?
229
247
 
230
248
  # If the user sets the home page, we should also start up there
231
- prefs["startup.homepage_welcome_url"] = prefs["browser.startup.homepage"]
249
+ prefs['startup.homepage_welcome_url'] = prefs['browser.startup.homepage']
232
250
 
233
251
  write_prefs prefs, path
234
252
  end
@@ -238,25 +256,25 @@ module Selenium
238
256
  return prefs unless File.exist?(path)
239
257
 
240
258
  File.read(path).split("\n").each do |line|
241
- if line =~ /user_pref\("([^"]+)"\s*,\s*(.+?)\);/
242
- key, value = $1.strip, $2.strip
259
+ next unless line =~ /user_pref\("([^"]+)"\s*,\s*(.+?)\);/
243
260
 
244
- # wrap the value in an array to make it a valid JSON string.
245
- prefs[key] = WebDriver.json_load("[#{value}]").first
246
- end
261
+ key = Regexp.last_match(1).strip
262
+ value = Regexp.last_match(2).strip
263
+
264
+ # wrap the value in an array to make it a valid JSON string.
265
+ prefs[key] = JSON.parse("[#{value}]").first
247
266
  end
248
267
 
249
268
  prefs
250
269
  end
251
270
 
252
271
  def write_prefs(prefs, path)
253
- File.open(path, "w") { |file|
272
+ File.open(path, 'w') do |file|
254
273
  prefs.each do |key, value|
255
- file.puts %{user_pref("#{key}", #{WebDriver.json_dump value});}
274
+ file.puts %{user_pref("#{key}", #{value.to_json});}
256
275
  end
257
- }
276
+ end
258
277
  end
259
-
260
278
  end # Profile
261
279
  end # Firefox
262
280
  end # WebDriver
@@ -1,12 +1,29 @@
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
+
1
20
  module Selenium
2
21
  module WebDriver
3
22
  module Firefox
4
-
5
23
  # @api private
6
24
  class ProfilesIni
7
-
8
25
  def initialize
9
- @ini_path = File.join(Util.app_data_path, "profiles.ini")
26
+ @ini_path = File.join(Util.app_data_path, 'profiles.ini')
10
27
  @profile_paths = {}
11
28
 
12
29
  parse if File.exist?(@ini_path)
@@ -33,29 +50,24 @@ module Selenium
33
50
  string.split("\n").each do |line|
34
51
  case line
35
52
  when /^\[Profile/
36
- if p = path_for(name, is_relative, path)
37
- @profile_paths[name] = p
38
- name, path = nil
39
- end
53
+ name, path = nil if path_for(name, is_relative, path)
40
54
  when /^Name=(.+)$/
41
- name = $1.strip
55
+ name = Regexp.last_match(1).strip
42
56
  when /^IsRelative=(.+)$/
43
- is_relative = $1.strip == "1"
57
+ is_relative = Regexp.last_match(1).strip == '1'
44
58
  when /^Path=(.+)$/
45
- path = $1.strip
59
+ path = Regexp.last_match(1).strip
60
+ p = path_for(name, is_relative, path)
61
+ @profile_paths[name] = p if p
46
62
  end
47
63
  end
48
-
49
- if p = path_for(name, is_relative, path)
50
- @profile_paths[name] = p
51
- end
52
64
  end
53
65
 
54
66
  def path_for(name, is_relative, path)
55
67
  return unless [name, path].any?
56
- path = is_relative ? File.join(Util.app_data_path, path) : path
57
- end
58
68
 
69
+ is_relative ? File.join(Util.app_data_path, path) : path
70
+ end
59
71
  end # ProfilesIni
60
72
  end # Firefox
61
73
  end # WebDriver
@@ -0,0 +1,52 @@
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 Firefox
23
+ #
24
+ # @api private
25
+ #
26
+
27
+ class Service < WebDriver::Service
28
+ @default_port = 4444
29
+ @executable = 'geckodriver'
30
+ @missing_text = <<~ERROR
31
+ Unable to find Mozilla geckodriver. Please download the server from
32
+ https://github.com/mozilla/geckodriver/releases and place it somewhere on your PATH.
33
+ More info at https://developer.mozilla.org/en-US/docs/Mozilla/QA/Marionette/WebDriver.
34
+ ERROR
35
+ @shutdown_supported = false
36
+
37
+ private
38
+
39
+ # Note: This processing is deprecated
40
+ def extract_service_args(driver_opts)
41
+ driver_args = super
42
+ driver_opts = driver_opts.dup
43
+ driver_args << "--binary=#{driver_opts[:binary]}" if driver_opts.key?(:binary)
44
+ driver_args << "--log=#{driver_opts[:log]}" if driver_opts.key?(:log)
45
+ driver_args << "--marionette-port=#{driver_opts[:marionette_port]}" if driver_opts.key?(:marionette_port)
46
+ driver_args << "--host=#{driver_opts[:host]}" if driver_opts.key?(:host)
47
+ driver_args
48
+ end
49
+ end # Service
50
+ end # Firefox
51
+ end # WebDriver
52
+ end # Selenium
@@ -1,7 +1,25 @@
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
+
1
20
  module Selenium
2
21
  module WebDriver
3
22
  module Firefox
4
-
5
23
  # @api private
6
24
  module Util
7
25
  module_function
@@ -22,7 +40,6 @@ module Selenium
22
40
  def stringified?(str)
23
41
  str =~ /^".*"$/
24
42
  end
25
-
26
43
  end # Util
27
44
  end # Firefox
28
45
  end # WebDriver
@@ -1,30 +1,66 @@
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
+
1
20
  require 'timeout'
2
21
  require 'socket'
3
22
  require 'rexml/document'
4
23
 
24
+ require 'selenium/webdriver/firefox/driver'
25
+
5
26
  require 'selenium/webdriver/firefox/util'
6
27
  require 'selenium/webdriver/firefox/extension'
7
- require 'selenium/webdriver/firefox/socket_lock'
8
28
  require 'selenium/webdriver/firefox/binary'
9
29
  require 'selenium/webdriver/firefox/profiles_ini'
10
30
  require 'selenium/webdriver/firefox/profile'
11
31
  require 'selenium/webdriver/firefox/launcher'
12
- require 'selenium/webdriver/firefox/bridge'
32
+ require 'selenium/webdriver/firefox/legacy/driver'
33
+
34
+ require 'selenium/webdriver/firefox/marionette/bridge'
35
+ require 'selenium/webdriver/firefox/marionette/driver'
36
+ require 'selenium/webdriver/firefox/options'
13
37
 
14
38
  module Selenium
15
39
  module WebDriver
16
40
  module Firefox
17
-
18
- DEFAULT_PORT = 7055
19
- DEFAULT_ENABLE_NATIVE_EVENTS = Platform.os == :windows
20
- DEFAULT_SECURE_SSL = false
41
+ DEFAULT_PORT = 7055
42
+ DEFAULT_ENABLE_NATIVE_EVENTS = Platform.os == :windows
43
+ DEFAULT_SECURE_SSL = false
21
44
  DEFAULT_ASSUME_UNTRUSTED_ISSUER = true
22
- DEFAULT_LOAD_NO_FOCUS_LIB = false
45
+ DEFAULT_LOAD_NO_FOCUS_LIB = false
46
+
47
+ def self.driver_path=(path)
48
+ WebDriver.logger.deprecate 'Selenium::WebDriver::Firefox#driver_path=',
49
+ 'Selenium::WebDriver::Firefox::Service#driver_path='
50
+ Selenium::WebDriver::Firefox::Service.driver_path = path
51
+ end
52
+
53
+ def self.driver_path
54
+ WebDriver.logger.deprecate 'Selenium::WebDriver::Firefox#driver_path',
55
+ 'Selenium::WebDriver::Firefox::Service#driver_path'
56
+ Selenium::WebDriver::Firefox::Service.driver_path
57
+ end
23
58
 
24
59
  def self.path=(path)
25
60
  Binary.path = path
26
61
  end
62
+ end # Firefox
63
+ end # WebDriver
64
+ end # Selenium
27
65
 
28
- end
29
- end
30
- end
66
+ require 'selenium/webdriver/firefox/service'
@@ -0,0 +1,85 @@
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 IE
23
+
24
+ #
25
+ # Driver implementation for Internet Explorer supporting
26
+ # both OSS and W3C dialects of JSON wire protocol.
27
+ # @api private
28
+ #
29
+
30
+ class Driver < WebDriver::Driver
31
+ include DriverExtensions::HasWebStorage
32
+ include DriverExtensions::TakesScreenshot
33
+
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
+ @bridge = Remote::Bridge.handshake(**opts)
41
+ super(@bridge, listener: listener)
42
+ end
43
+
44
+ def browser
45
+ :internet_explorer
46
+ end
47
+
48
+ def quit
49
+ super
50
+ ensure
51
+ @service&.stop
52
+ end
53
+
54
+ private
55
+
56
+ def create_capabilities(opts)
57
+ caps = opts.delete(:desired_capabilities) { Remote::Capabilities.internet_explorer }
58
+ options = opts.delete(:options) { Options.new }
59
+
60
+ if opts.delete(:introduce_flakiness_by_ignoring_security_domains)
61
+ WebDriver.logger.deprecate ':introduce_flakiness_by_ignoring_security_domains',
62
+ 'Selenium::WebDriver::IE::Options#ignore_protected_mode_settings='
63
+ options.ignore_protected_mode_settings = true
64
+ end
65
+
66
+ native_events = opts.delete(:native_events)
67
+ unless native_events.nil?
68
+ WebDriver.logger.deprecate ':native_events', 'Selenium::WebDriver::IE::Options#native_events='
69
+ options.native_events = native_events
70
+ end
71
+
72
+ # Backward compatibility with older IEDriverServer versions
73
+ caps[:ignore_protected_mode_settings] = options.ignore_protected_mode_settings
74
+ caps[:native_events] = options.native_events
75
+
76
+ options = options.as_json
77
+ caps.merge!(options) unless options.empty?
78
+
79
+ caps
80
+ end
81
+
82
+ end # Driver
83
+ end # IE
84
+ end # WebDriver
85
+ end # Selenium