selenium-webdriver 2.53.4 → 3.8.0

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 (152) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGES +363 -10
  3. data/LICENSE +1 -1
  4. data/README.md +2 -3
  5. data/lib/selenium-webdriver.rb +0 -2
  6. data/lib/selenium/server.rb +69 -70
  7. data/lib/selenium/webdriver.rb +32 -23
  8. data/lib/selenium/webdriver/atoms.rb +18 -0
  9. data/lib/selenium/webdriver/atoms/getAttribute.js +8 -0
  10. data/lib/selenium/webdriver/chrome.rb +8 -6
  11. data/lib/selenium/webdriver/chrome/driver.rb +112 -0
  12. data/lib/selenium/webdriver/chrome/options.rb +168 -0
  13. data/lib/selenium/webdriver/chrome/profile.rb +17 -17
  14. data/lib/selenium/webdriver/chrome/service.rb +22 -89
  15. data/lib/selenium/webdriver/common.rb +13 -6
  16. data/lib/selenium/webdriver/common/action_builder.rb +49 -57
  17. data/lib/selenium/webdriver/common/alert.rb +5 -15
  18. data/lib/selenium/webdriver/common/bridge_helper.rb +10 -17
  19. data/lib/selenium/webdriver/common/driver.rb +53 -68
  20. data/lib/selenium/webdriver/common/driver_extensions/{has_input_devices.rb → has_addons.rb} +13 -23
  21. data/lib/selenium/webdriver/common/driver_extensions/has_location.rb +4 -8
  22. data/lib/selenium/webdriver/common/driver_extensions/has_network_connection.rb +4 -7
  23. data/lib/selenium/webdriver/common/driver_extensions/has_remote_status.rb +0 -4
  24. data/lib/selenium/webdriver/common/driver_extensions/has_session_id.rb +0 -4
  25. data/lib/selenium/webdriver/common/driver_extensions/has_touch_screen.rb +1 -5
  26. data/lib/selenium/webdriver/common/driver_extensions/has_web_storage.rb +0 -5
  27. data/lib/selenium/webdriver/common/driver_extensions/rotatable.rb +4 -9
  28. data/lib/selenium/webdriver/common/driver_extensions/takes_screenshot.rb +7 -7
  29. data/lib/selenium/webdriver/common/driver_extensions/uploads_files.rb +2 -7
  30. data/lib/selenium/webdriver/common/element.rb +57 -39
  31. data/lib/selenium/webdriver/common/error.rb +204 -106
  32. data/lib/selenium/webdriver/common/file_reaper.rb +3 -11
  33. data/lib/selenium/webdriver/common/html5/local_storage.rb +6 -10
  34. data/lib/selenium/webdriver/common/html5/session_storage.rb +6 -10
  35. data/lib/selenium/webdriver/common/html5/shared_web_storage.rb +7 -18
  36. data/lib/selenium/webdriver/{safari/options.rb → common/interactions/input_device.rb} +20 -31
  37. data/lib/selenium/webdriver/common/interactions/interaction.rb +50 -0
  38. data/lib/selenium/webdriver/{safari/browser.rb → common/interactions/interactions.rb} +16 -15
  39. data/lib/selenium/webdriver/common/interactions/key_actions.rb +143 -0
  40. data/lib/selenium/webdriver/common/interactions/key_input.rb +62 -0
  41. data/lib/selenium/webdriver/{android.rb → common/interactions/none_input.rb} +11 -6
  42. data/lib/selenium/webdriver/common/interactions/pointer_actions.rb +353 -0
  43. data/lib/selenium/webdriver/common/interactions/pointer_input.rb +132 -0
  44. data/lib/selenium/webdriver/common/keyboard.rb +7 -14
  45. data/lib/selenium/webdriver/common/keys.rb +99 -82
  46. data/lib/selenium/webdriver/common/log_entry.rb +3 -6
  47. data/lib/selenium/webdriver/common/logger.rb +140 -0
  48. data/lib/selenium/webdriver/common/logs.rb +2 -6
  49. data/lib/selenium/webdriver/common/mouse.rb +9 -14
  50. data/lib/selenium/webdriver/common/navigation.rb +2 -6
  51. data/lib/selenium/webdriver/common/options.rb +20 -23
  52. data/lib/selenium/webdriver/common/platform.rb +70 -97
  53. data/lib/selenium/webdriver/common/port_prober.rb +3 -4
  54. data/lib/selenium/webdriver/common/profile_helper.rb +6 -11
  55. data/lib/selenium/webdriver/common/proxy.rb +58 -72
  56. data/lib/selenium/webdriver/common/search_context.rb +22 -29
  57. data/lib/selenium/webdriver/common/service.rb +161 -0
  58. data/lib/selenium/webdriver/common/socket_lock.rb +6 -14
  59. data/lib/selenium/webdriver/common/socket_poller.rb +5 -12
  60. data/lib/selenium/webdriver/common/target_locator.rb +11 -15
  61. data/lib/selenium/webdriver/common/timeouts.rb +4 -8
  62. data/lib/selenium/webdriver/common/touch_action_builder.rb +2 -6
  63. data/lib/selenium/webdriver/common/touch_screen.rb +19 -23
  64. data/lib/selenium/webdriver/common/w3c_action_builder.rb +209 -0
  65. data/lib/selenium/webdriver/{phantomjs.rb → common/w3c_options.rb} +16 -14
  66. data/lib/selenium/webdriver/common/wait.rb +6 -13
  67. data/lib/selenium/webdriver/common/window.rb +48 -17
  68. data/lib/selenium/webdriver/common/zipper.rb +6 -10
  69. data/lib/selenium/webdriver/edge.rb +5 -12
  70. data/lib/selenium/webdriver/edge/bridge.rb +32 -63
  71. data/lib/selenium/webdriver/edge/driver.rb +73 -0
  72. data/lib/selenium/webdriver/edge/service.rb +18 -87
  73. data/lib/selenium/webdriver/firefox.rb +20 -11
  74. data/lib/selenium/webdriver/firefox/binary.rb +40 -56
  75. data/lib/selenium/webdriver/firefox/driver.rb +48 -0
  76. data/lib/selenium/webdriver/firefox/extension.rb +18 -8
  77. data/lib/selenium/webdriver/firefox/extension/prefs.json +3 -11
  78. data/lib/selenium/webdriver/firefox/extension/webdriver.xpi +0 -0
  79. data/lib/selenium/webdriver/firefox/launcher.rb +13 -22
  80. data/lib/selenium/webdriver/firefox/legacy/driver.rb +79 -0
  81. data/lib/selenium/webdriver/{iphone.rb → firefox/marionette/bridge.rb} +25 -6
  82. data/lib/selenium/webdriver/firefox/marionette/driver.rb +96 -0
  83. data/lib/selenium/webdriver/firefox/options.rb +149 -0
  84. data/lib/selenium/webdriver/firefox/profile.rb +46 -46
  85. data/lib/selenium/webdriver/firefox/profiles_ini.rb +8 -18
  86. data/lib/selenium/webdriver/firefox/service.rb +23 -83
  87. data/lib/selenium/webdriver/firefox/util.rb +0 -4
  88. data/lib/selenium/webdriver/ie.rb +4 -8
  89. data/lib/selenium/webdriver/ie/driver.rb +90 -0
  90. data/lib/selenium/webdriver/ie/options.rb +136 -0
  91. data/lib/selenium/webdriver/ie/service.rb +58 -0
  92. data/lib/selenium/webdriver/remote.rb +8 -16
  93. data/lib/selenium/webdriver/remote/bridge.rb +96 -565
  94. data/lib/selenium/webdriver/remote/capabilities.rb +76 -94
  95. data/lib/selenium/webdriver/remote/driver.rb +49 -0
  96. data/lib/selenium/webdriver/remote/http/common.rb +22 -20
  97. data/lib/selenium/webdriver/remote/http/curb.rb +9 -12
  98. data/lib/selenium/webdriver/remote/http/default.rb +54 -41
  99. data/lib/selenium/webdriver/remote/http/persistent.rb +9 -8
  100. data/lib/selenium/webdriver/remote/oss/bridge.rb +586 -0
  101. data/lib/selenium/webdriver/remote/oss/commands.rb +221 -0
  102. data/lib/selenium/webdriver/remote/response.rb +39 -27
  103. data/lib/selenium/webdriver/remote/server_error.rb +1 -5
  104. data/lib/selenium/webdriver/remote/w3c/bridge.rb +573 -0
  105. data/lib/selenium/webdriver/remote/w3c/capabilities.rb +290 -0
  106. data/lib/selenium/webdriver/remote/w3c/commands.rb +148 -0
  107. data/lib/selenium/webdriver/safari.rb +20 -29
  108. data/lib/selenium/webdriver/{firefox/w3c_bridge.rb → safari/driver.rb} +21 -30
  109. data/lib/selenium/webdriver/safari/service.rb +57 -0
  110. data/lib/selenium/webdriver/support.rb +1 -2
  111. data/lib/selenium/webdriver/support/abstract_event_listener.rb +17 -4
  112. data/lib/selenium/webdriver/support/block_event_listener.rb +1 -5
  113. data/lib/selenium/webdriver/support/color.rb +57 -42
  114. data/lib/selenium/webdriver/support/escaper.rb +41 -0
  115. data/lib/selenium/webdriver/support/event_firing_bridge.rb +36 -40
  116. data/lib/selenium/webdriver/support/select.rb +33 -86
  117. data/selenium-webdriver.gemspec +22 -25
  118. metadata +254 -261
  119. data/lib/selenium-client.rb +0 -21
  120. data/lib/selenium/client.rb +0 -57
  121. data/lib/selenium/client/base.rb +0 -151
  122. data/lib/selenium/client/driver.rb +0 -29
  123. data/lib/selenium/client/errors.rb +0 -28
  124. data/lib/selenium/client/extensions.rb +0 -132
  125. data/lib/selenium/client/idiomatic.rb +0 -507
  126. data/lib/selenium/client/javascript_expression_builder.rb +0 -135
  127. data/lib/selenium/client/javascript_frameworks/jquery.rb +0 -32
  128. data/lib/selenium/client/javascript_frameworks/prototype.rb +0 -32
  129. data/lib/selenium/client/legacy_driver.rb +0 -1722
  130. data/lib/selenium/client/protocol.rb +0 -123
  131. data/lib/selenium/client/selenium_helper.rb +0 -49
  132. data/lib/selenium/rake/server_task.rb +0 -176
  133. data/lib/selenium/webdriver/android/bridge.rb +0 -68
  134. data/lib/selenium/webdriver/chrome/bridge.rb +0 -139
  135. data/lib/selenium/webdriver/common/core_ext/base64.rb +0 -28
  136. data/lib/selenium/webdriver/common/core_ext/dir.rb +0 -61
  137. data/lib/selenium/webdriver/common/html5/location.rb +0 -19
  138. data/lib/selenium/webdriver/common/w3c_error.rb +0 -194
  139. data/lib/selenium/webdriver/edge/legacy_support.rb +0 -117
  140. data/lib/selenium/webdriver/firefox/bridge.rb +0 -89
  141. data/lib/selenium/webdriver/ie/bridge.rb +0 -88
  142. data/lib/selenium/webdriver/ie/server.rb +0 -133
  143. data/lib/selenium/webdriver/iphone/bridge.rb +0 -64
  144. data/lib/selenium/webdriver/phantomjs/bridge.rb +0 -78
  145. data/lib/selenium/webdriver/phantomjs/service.rb +0 -130
  146. data/lib/selenium/webdriver/remote/commands.rb +0 -211
  147. data/lib/selenium/webdriver/remote/w3c_bridge.rb +0 -668
  148. data/lib/selenium/webdriver/remote/w3c_capabilities.rb +0 -236
  149. data/lib/selenium/webdriver/remote/w3c_commands.rb +0 -132
  150. data/lib/selenium/webdriver/safari/bridge.rb +0 -135
  151. data/lib/selenium/webdriver/safari/resources/client.js +0 -7255
  152. data/lib/selenium/webdriver/safari/server.rb +0 -187
@@ -1,5 +1,3 @@
1
- # encoding: utf-8
2
- #
3
1
  # Licensed to the Software Freedom Conservancy (SFC) under one
4
2
  # or more contributor license agreements. See the NOTICE file
5
3
  # distributed with this work for additional information
@@ -23,15 +21,15 @@ module Selenium
23
21
  class Profile
24
22
  include ProfileHelper
25
23
 
26
- VALID_PREFERENCE_TYPES = [TrueClass, FalseClass, Integer, Float, String]
24
+ VALID_PREFERENCE_TYPES = [TrueClass, FalseClass, Integer, Float, String].freeze
27
25
  WEBDRIVER_EXTENSION_PATH = File.expand_path("#{WebDriver.root}/selenium/webdriver/firefox/extension/webdriver.xpi")
28
26
  WEBDRIVER_PREFS = {
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
- }
27
+ native_events: 'webdriver_enable_native_events',
28
+ untrusted_certs: 'webdriver_accept_untrusted_certs',
29
+ untrusted_issuer: 'webdriver_assume_untrusted_issuer',
30
+ port: 'webdriver_firefox_port',
31
+ log_file: 'webdriver.log.file'
32
+ }.freeze
35
33
 
36
34
  attr_reader :name, :log_file
37
35
  attr_writer :secure_ssl, :native_events, :load_no_focus_lib
@@ -42,7 +40,9 @@ module Selenium
42
40
  end
43
41
 
44
42
  def from_name(name)
45
- ini[name]
43
+ profile = ini[name]
44
+ return profile if profile
45
+ raise Error::WebDriverError, "unable to find profile named: #{name.inspect}"
46
46
  end
47
47
 
48
48
  def default_preferences
@@ -78,18 +78,19 @@ module Selenium
78
78
  @additional_prefs = {}
79
79
  else
80
80
  # TODO: clean this up
81
- @native_events = model_prefs.delete(WEBDRIVER_PREFS[:native_events]) == "true"
82
- @secure_ssl = model_prefs.delete(WEBDRIVER_PREFS[:untrusted_certs]) != "true"
83
- @untrusted_issuer = model_prefs.delete(WEBDRIVER_PREFS[:untrusted_issuer]) == "true"
84
- @load_no_focus_lib = model_prefs.delete(WEBDRIVER_PREFS[:load_no_focus_lib]) == "true" # not stored in profile atm, so will always be false.
81
+ @native_events = model_prefs.delete(WEBDRIVER_PREFS[:native_events]) == 'true'
82
+ @secure_ssl = model_prefs.delete(WEBDRIVER_PREFS[:untrusted_certs]) != 'true'
83
+ @untrusted_issuer = model_prefs.delete(WEBDRIVER_PREFS[:untrusted_issuer]) == 'true'
84
+ # not stored in profile atm, so will always be false.
85
+ @load_no_focus_lib = model_prefs.delete(WEBDRIVER_PREFS[:load_no_focus_lib]) == 'true'
85
86
  @additional_prefs = model_prefs
86
87
  end
87
88
 
88
- @extensions = {}
89
+ @extensions = {}
89
90
  end
90
91
 
91
92
  def layout_on_disk
92
- profile_dir = @model ? create_tmp_copy(@model) : Dir.mktmpdir("webdriver-profile")
93
+ profile_dir = @model ? create_tmp_copy(@model) : Dir.mktmpdir('webdriver-profile')
93
94
  FileReaper << profile_dir
94
95
 
95
96
  install_extensions(profile_dir)
@@ -100,7 +101,6 @@ module Selenium
100
101
  profile_dir
101
102
  end
102
103
 
103
-
104
104
  #
105
105
  # Set a preference for this particular profile.
106
106
  #
@@ -109,11 +109,11 @@ module Selenium
109
109
  #
110
110
 
111
111
  def []=(key, value)
112
- unless VALID_PREFERENCE_TYPES.any? { |e| value.kind_of? e }
112
+ unless VALID_PREFERENCE_TYPES.any? { |e| value.is_a? e }
113
113
  raise TypeError, "expected one of #{VALID_PREFERENCE_TYPES.inspect}, got #{value.inspect}:#{value.class}"
114
114
  end
115
115
 
116
- if value.kind_of?(String) && Util.stringified?(value)
116
+ if value.is_a?(String) && Util.stringified?(value)
117
117
  raise ArgumentError, "preference values must be plain strings: #{key.inspect} => #{value.inspect}"
118
118
  end
119
119
 
@@ -130,9 +130,8 @@ module Selenium
130
130
  end
131
131
 
132
132
  def add_webdriver_extension
133
- unless @extensions.has_key?(:webdriver)
134
- add_extension(WEBDRIVER_EXTENSION_PATH, :webdriver)
135
- end
133
+ return if @extensions.key?(:webdriver)
134
+ add_extension(WEBDRIVER_EXTENSION_PATH, :webdriver)
136
135
  end
137
136
 
138
137
  #
@@ -164,7 +163,7 @@ module Selenium
164
163
  end
165
164
 
166
165
  def proxy=(proxy)
167
- unless proxy.kind_of? Proxy
166
+ unless proxy.is_a? Proxy
168
167
  raise TypeError, "expected #{Proxy.name}, got #{proxy.inspect}:#{proxy.class}"
169
168
  end
170
169
 
@@ -172,16 +171,16 @@ module Selenium
172
171
  when :manual
173
172
  self['network.proxy.type'] = 1
174
173
 
175
- set_manual_proxy_preference "ftp", proxy.ftp
176
- set_manual_proxy_preference "http", proxy.http
177
- set_manual_proxy_preference "ssl", proxy.ssl
178
- set_manual_proxy_preference "socks", proxy.socks
174
+ set_manual_proxy_preference 'ftp', proxy.ftp
175
+ set_manual_proxy_preference 'http', proxy.http
176
+ set_manual_proxy_preference 'ssl', proxy.ssl
177
+ set_manual_proxy_preference 'socks', proxy.socks
179
178
 
180
- if proxy.no_proxy
181
- self["network.proxy.no_proxies_on"] = proxy.no_proxy
182
- else
183
- self["network.proxy.no_proxies_on"] = ""
184
- end
179
+ self['network.proxy.no_proxies_on'] = if proxy.no_proxy
180
+ proxy.no_proxy
181
+ else
182
+ ''
183
+ end
185
184
  when :pac
186
185
  self['network.proxy.type'] = 2
187
186
  self['network.proxy.autoconfig_url'] = proxy.pac
@@ -190,8 +189,10 @@ module Selenium
190
189
  else
191
190
  raise ArgumentError, "unsupported proxy type #{proxy.type}"
192
191
  end
192
+ end
193
193
 
194
- proxy
194
+ def encoded
195
+ Zipper.zip(layout_on_disk)
195
196
  end
196
197
 
197
198
  private
@@ -199,17 +200,17 @@ module Selenium
199
200
  def set_manual_proxy_preference(key, value)
200
201
  return unless value
201
202
 
202
- host, port = value.to_s.split(":", 2)
203
+ host, port = value.to_s.split(':', 2)
203
204
 
204
205
  self["network.proxy.#{key}"] = host
205
206
  self["network.proxy.#{key}_port"] = Integer(port) if port
206
207
  end
207
208
 
208
209
  def install_extensions(directory)
209
- destination = File.join(directory, "extensions")
210
+ destination = File.join(directory, 'extensions')
210
211
 
211
212
  @extensions.each do |name, extension|
212
- p :extension => name if $DEBUG
213
+ WebDriver.logger.debug({extenstion: name}.inspect)
213
214
  extension.write_to(destination)
214
215
  end
215
216
  end
@@ -221,7 +222,7 @@ module Selenium
221
222
  end
222
223
 
223
224
  def delete_extensions_cache(directory)
224
- FileUtils.rm_f File.join(directory, "extensions.cache")
225
+ FileUtils.rm_f File.join(directory, 'extensions.cache')
225
226
  end
226
227
 
227
228
  def delete_lock_files(directory)
@@ -247,7 +248,7 @@ module Selenium
247
248
  prefs[WEBDRIVER_PREFS[:untrusted_issuer]] = assume_untrusted_certificate_issuer?
248
249
 
249
250
  # If the user sets the home page, we should also start up there
250
- prefs["startup.homepage_welcome_url"] = prefs["browser.startup.homepage"]
251
+ prefs['startup.homepage_welcome_url'] = prefs['browser.startup.homepage']
251
252
 
252
253
  write_prefs prefs, path
253
254
  end
@@ -257,25 +258,24 @@ module Selenium
257
258
  return prefs unless File.exist?(path)
258
259
 
259
260
  File.read(path).split("\n").each do |line|
260
- if line =~ /user_pref\("([^"]+)"\s*,\s*(.+?)\);/
261
- key, value = $1.strip, $2.strip
261
+ next unless line =~ /user_pref\("([^"]+)"\s*,\s*(.+?)\);/
262
+ key = Regexp.last_match(1).strip
263
+ value = Regexp.last_match(2).strip
262
264
 
263
- # wrap the value in an array to make it a valid JSON string.
264
- prefs[key] = JSON.parse("[#{value}]").first
265
- end
265
+ # wrap the value in an array to make it a valid JSON string.
266
+ prefs[key] = JSON.parse("[#{value}]").first
266
267
  end
267
268
 
268
269
  prefs
269
270
  end
270
271
 
271
272
  def write_prefs(prefs, path)
272
- File.open(path, "w") { |file|
273
+ File.open(path, 'w') do |file|
273
274
  prefs.each do |key, value|
274
275
  file.puts %{user_pref("#{key}", #{value.to_json});}
275
276
  end
276
- }
277
+ end
277
278
  end
278
-
279
279
  end # Profile
280
280
  end # Firefox
281
281
  end # WebDriver
@@ -1,5 +1,3 @@
1
- # encoding: utf-8
2
- #
3
1
  # Licensed to the Software Freedom Conservancy (SFC) under one
4
2
  # or more contributor license agreements. See the NOTICE file
5
3
  # distributed with this work for additional information
@@ -20,12 +18,10 @@
20
18
  module Selenium
21
19
  module WebDriver
22
20
  module Firefox
23
-
24
21
  # @api private
25
22
  class ProfilesIni
26
-
27
23
  def initialize
28
- @ini_path = File.join(Util.app_data_path, "profiles.ini")
24
+ @ini_path = File.join(Util.app_data_path, 'profiles.ini')
29
25
  @profile_paths = {}
30
26
 
31
27
  parse if File.exist?(@ini_path)
@@ -52,29 +48,23 @@ module Selenium
52
48
  string.split("\n").each do |line|
53
49
  case line
54
50
  when /^\[Profile/
55
- if p = path_for(name, is_relative, path)
56
- @profile_paths[name] = p
57
- name, path = nil
58
- end
51
+ name, path = nil if path_for(name, is_relative, path)
59
52
  when /^Name=(.+)$/
60
- name = $1.strip
53
+ name = Regexp.last_match(1).strip
61
54
  when /^IsRelative=(.+)$/
62
- is_relative = $1.strip == "1"
55
+ is_relative = Regexp.last_match(1).strip == '1'
63
56
  when /^Path=(.+)$/
64
- path = $1.strip
57
+ path = Regexp.last_match(1).strip
58
+ p = path_for(name, is_relative, path)
59
+ @profile_paths[name] = p if p
65
60
  end
66
61
  end
67
-
68
- if p = path_for(name, is_relative, path)
69
- @profile_paths[name] = p
70
- end
71
62
  end
72
63
 
73
64
  def path_for(name, is_relative, path)
74
65
  return unless [name, path].any?
75
- path = is_relative ? File.join(Util.app_data_path, path) : path
66
+ is_relative ? File.join(Util.app_data_path, path) : path
76
67
  end
77
-
78
68
  end # ProfilesIni
79
69
  end # Firefox
80
70
  end # WebDriver
@@ -1,5 +1,3 @@
1
- # encoding: utf-8
2
- #
3
1
  # Licensed to the Software Freedom Conservancy (SFC) under one
4
2
  # or more contributor license agreements. See the NOTICE file
5
3
  # distributed with this work for additional information
@@ -20,104 +18,46 @@
20
18
  module Selenium
21
19
  module WebDriver
22
20
  module Firefox
23
-
24
21
  #
25
22
  # @api private
26
23
  #
27
- class Service
28
- START_TIMEOUT = 20
29
- SOCKET_LOCK_TIMEOUT = 45
30
- STOP_TIMEOUT = 5
31
- DEFAULT_PORT = 4444
32
- MISSING_TEXT = "Unable to find geckodriver. Please download the executable from https://github.com/mozilla/geckodriver/releases"
33
-
34
- def self.executable_path
35
- @executable_path ||= (
36
- path = Platform.find_binary("geckodriver*") || Platform.find_binary("wires*")
37
- path or raise Error::WebDriverError, MISSING_TEXT
38
- Platform.assert_executable path
39
-
40
- path
41
- )
42
- end
43
-
44
- def self.executable_path=(path)
45
- Platform.assert_executable path
46
- @executable_path = path
47
- end
48
-
49
- def self.default_service(*extra_args)
50
- new executable_path, DEFAULT_PORT, *extra_args
51
- end
52
-
53
- def initialize(executable_path, port, *extra_args)
54
- @executable_path = executable_path
55
- @host = Platform.localhost
56
- @port = Integer(port)
57
-
58
- raise Error::WebDriverError, "invalid port: #{@port}" if @port < 1
59
-
60
- @extra_args = extra_args
61
- end
62
24
 
63
- def start
64
- Platform.exit_hook { stop } # make sure we don't leave the server running
65
-
66
- socket_lock.locked do
67
- find_free_port
68
- start_process
69
- connect_until_stable
70
- end
71
- end
25
+ class Service < WebDriver::Service
26
+ DEFAULT_PORT = 4444
27
+ @executable = 'geckodriver*'.freeze
28
+ @missing_text = <<-ERROR.gsub(/\n +| {2,}/, ' ').freeze
29
+ Unable to find Mozilla geckodriver. Please download the server from
30
+ https://github.com/mozilla/geckodriver/releases and place it somewhere on your PATH.
31
+ More info at https://developer.mozilla.org/en-US/docs/Mozilla/QA/Marionette/WebDriver.
32
+ ERROR
72
33
 
73
34
  def stop
74
- return if @process.nil? || @process.exited?
75
-
76
- Net::HTTP.start(@host, @port) do |http|
77
- http.open_timeout = STOP_TIMEOUT / 2
78
- http.read_timeout = STOP_TIMEOUT / 2
79
-
80
- http.head("/shutdown")
81
- end
82
- ensure
83
35
  stop_process
84
36
  end
85
37
 
86
- def uri
87
- URI.parse "http://#{@host}:#{@port}"
88
- end
89
-
90
- def find_free_port
91
- @port = PortProber.above @port
92
- end
38
+ private
93
39
 
94
40
  def start_process
95
- server_command = [@executable_path, "--binary=#{Firefox::Binary.path}", "--webdriver-port=#{@port}", *@extra_args]
96
- @process = ChildProcess.build(*server_command)
97
-
98
- @process.io.inherit! if $DEBUG || Platform.os == :windows
41
+ @process = build_process(@executable_path,
42
+ "--binary=#{Firefox::Binary.path}",
43
+ "--port=#{@port}",
44
+ *@extra_args)
99
45
  @process.start
100
46
  end
101
47
 
102
- def stop_process
103
- @process.poll_for_exit STOP_TIMEOUT
104
- rescue ChildProcess::TimeoutError
105
- @process.stop STOP_TIMEOUT
106
- end
107
-
108
- def connect_until_stable
109
- @socket_poller = SocketPoller.new @host, @port, START_TIMEOUT
110
-
111
- unless @socket_poller.connected?
112
- raise Error::WebDriverError, "unable to connect to Mozilla geckodriver #{@host}:#{@port}"
113
- end
48
+ def cannot_connect_error_text
49
+ "unable to connect to Mozilla geckodriver #{@host}:#{@port}"
114
50
  end
115
51
 
116
- def socket_lock
117
- @socket_lock ||= SocketLock.new(@port - 1, SOCKET_LOCK_TIMEOUT)
52
+ def extract_service_args(driver_opts)
53
+ driver_args = super
54
+ driver_args << "--binary=#{driver_opts[:binary]}" if driver_opts.key?(:binary)
55
+ driver_args << "–-log=#{driver_opts[:log]}" if driver_opts.key?(:log)
56
+ driver_args << "–-marionette-port=#{driver_opts[:marionette_port]}" if driver_opts.key?(:marionette_port)
57
+ driver_args << "–-host=#{driver_opts[:host]}" if driver_opts.key?(:host)
58
+ driver_args
118
59
  end
119
-
120
60
  end # Service
121
61
  end # Firefox
122
62
  end # WebDriver
123
- end # Service
63
+ end # Selenium
@@ -1,5 +1,3 @@
1
- # encoding: utf-8
2
- #
3
1
  # Licensed to the Software Freedom Conservancy (SFC) under one
4
2
  # or more contributor license agreements. See the NOTICE file
5
3
  # distributed with this work for additional information
@@ -20,7 +18,6 @@
20
18
  module Selenium
21
19
  module WebDriver
22
20
  module Firefox
23
-
24
21
  # @api private
25
22
  module Util
26
23
  module_function
@@ -41,7 +38,6 @@ module Selenium
41
38
  def stringified?(str)
42
39
  str =~ /^".*"$/
43
40
  end
44
-
45
41
  end # Util
46
42
  end # Firefox
47
43
  end # WebDriver
@@ -1,5 +1,3 @@
1
- # encoding: utf-8
2
- #
3
1
  # Licensed to the Software Freedom Conservancy (SFC) under one
4
2
  # or more contributor license agreements. See the NOTICE file
5
3
  # distributed with this work for additional information
@@ -17,10 +15,12 @@
17
15
  # specific language governing permissions and limitations
18
16
  # under the License.
19
17
 
18
+ require 'selenium/webdriver/ie/driver'
19
+ require 'selenium/webdriver/ie/options'
20
+ require 'selenium/webdriver/ie/service'
21
+
20
22
  module Selenium
21
23
  module WebDriver
22
-
23
- # @api private
24
24
  module IE
25
25
  def self.driver_path=(path)
26
26
  Platform.assert_executable path
@@ -30,10 +30,6 @@ module Selenium
30
30
  def self.driver_path
31
31
  @driver_path ||= nil
32
32
  end
33
-
34
33
  end # IE
35
34
  end # WebDriver
36
35
  end # Selenium
37
-
38
- require 'selenium/webdriver/ie/server'
39
- require 'selenium/webdriver/ie/bridge'