selenium-webdriver 4.0.0.alpha2 → 4.0.0.alpha3

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 (42) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES +38 -0
  3. data/lib/selenium/server.rb +2 -2
  4. data/lib/selenium/webdriver.rb +9 -7
  5. data/lib/selenium/webdriver/chrome.rb +6 -7
  6. data/lib/selenium/webdriver/chrome/bridge.rb +21 -3
  7. data/lib/selenium/webdriver/chrome/driver.rb +3 -41
  8. data/lib/selenium/webdriver/chrome/options.rb +87 -52
  9. data/lib/selenium/webdriver/chrome/profile.rb +2 -2
  10. data/lib/selenium/webdriver/common.rb +1 -0
  11. data/lib/selenium/webdriver/common/driver.rb +7 -0
  12. data/lib/selenium/webdriver/common/options.rb +92 -0
  13. data/lib/selenium/webdriver/common/profile_helper.rb +10 -2
  14. data/lib/selenium/webdriver/common/service.rb +35 -11
  15. data/lib/selenium/webdriver/edge.rb +25 -7
  16. data/lib/selenium/webdriver/edge_chrome/bridge.rb +30 -0
  17. data/lib/selenium/webdriver/edge_chrome/driver.rb +38 -0
  18. data/lib/selenium/webdriver/edge_chrome/options.rb +34 -0
  19. data/lib/selenium/webdriver/edge_chrome/profile.rb +33 -0
  20. data/lib/selenium/webdriver/edge_chrome/service.rb +40 -0
  21. data/lib/selenium/webdriver/{edge → edge_html}/driver.rb +2 -19
  22. data/lib/selenium/webdriver/{edge → edge_html}/options.rb +26 -15
  23. data/lib/selenium/webdriver/{edge → edge_html}/service.rb +1 -1
  24. data/lib/selenium/webdriver/firefox.rb +9 -12
  25. data/lib/selenium/webdriver/firefox/binary.rb +2 -2
  26. data/lib/selenium/webdriver/firefox/driver.rb +3 -19
  27. data/lib/selenium/webdriver/firefox/extension.rb +8 -0
  28. data/lib/selenium/webdriver/firefox/options.rb +45 -48
  29. data/lib/selenium/webdriver/firefox/profile.rb +5 -3
  30. data/lib/selenium/webdriver/ie.rb +4 -5
  31. data/lib/selenium/webdriver/ie/driver.rb +3 -20
  32. data/lib/selenium/webdriver/ie/options.rb +9 -29
  33. data/lib/selenium/webdriver/remote.rb +16 -10
  34. data/lib/selenium/webdriver/remote/capabilities.rb +10 -0
  35. data/lib/selenium/webdriver/remote/http/default.rb +6 -1
  36. data/lib/selenium/webdriver/remote/http/persistent.rb +5 -6
  37. data/lib/selenium/webdriver/safari.rb +5 -6
  38. data/lib/selenium/webdriver/safari/bridge.rb +3 -3
  39. data/lib/selenium/webdriver/safari/driver.rb +4 -18
  40. data/lib/selenium/webdriver/safari/options.rb +18 -12
  41. data/lib/selenium/webdriver/version.rb +1 -1
  42. metadata +11 -5
@@ -19,7 +19,7 @@
19
19
 
20
20
  module Selenium
21
21
  module WebDriver
22
- module Edge
22
+ module EdgeHtml
23
23
 
24
24
  #
25
25
  # Driver implementation for Microsoft Edge.
@@ -31,7 +31,7 @@ module Selenium
31
31
  include DriverExtensions::TakesScreenshot
32
32
 
33
33
  def initialize(opts = {})
34
- opts[:desired_capabilities] = create_capabilities(opts)
34
+ opts[:desired_capabilities] ||= Remote::Capabilities.edge
35
35
 
36
36
  opts[:url] ||= service_url(opts)
37
37
 
@@ -47,23 +47,6 @@ module Selenium
47
47
  def browser
48
48
  :edge
49
49
  end
50
-
51
- def quit
52
- super
53
- ensure
54
- @service&.stop
55
- end
56
-
57
- private
58
-
59
- def create_capabilities(opts)
60
- caps = opts.delete(:desired_capabilities) { Remote::Capabilities.edge }
61
- options = opts.delete(:options) { Options.new }
62
- options = options.as_json
63
- caps.merge!(options) unless options.empty?
64
-
65
- caps
66
- end
67
50
  end # Driver
68
51
  end # Edge
69
52
  end # WebDriver
@@ -19,10 +19,22 @@
19
19
 
20
20
  module Selenium
21
21
  module WebDriver
22
- module Edge
23
- class Options
24
- attr_accessor :in_private, :start_page
25
- attr_reader :extension_paths
22
+ module EdgeHtml
23
+ class Options < WebDriver::Options
24
+ # see https://docs.microsoft.com/en-us/microsoft-edge/webdriver#capabilities
25
+ CAPABILITIES = {in_private: 'ms:inPrivate',
26
+ extension_paths: 'ms:extensionPaths',
27
+ start_page: 'ms:startPage'}.freeze
28
+
29
+ CAPABILITIES.each_key do |key|
30
+ define_method key do
31
+ @options[key]
32
+ end
33
+
34
+ define_method "#{key}=" do |value|
35
+ @options[key] = value
36
+ end
37
+ end
26
38
 
27
39
  #
28
40
  # Create a new Options instance for Edge.
@@ -40,9 +52,8 @@ module Selenium
40
52
  #
41
53
 
42
54
  def initialize(**opts)
43
- @in_private = opts.delete(:in_private) || false
44
- @extension_paths = opts.delete(:extension_paths) || []
45
- @start_page = opts.delete(:start_page)
55
+ super
56
+ @options[:extensions]&.each(&method(:validate_extension))
46
57
  end
47
58
 
48
59
  #
@@ -56,9 +67,9 @@ module Selenium
56
67
  #
57
68
 
58
69
  def add_extension_path(path)
59
- raise Error::WebDriverError, "could not find extension at #{path.inspect}" unless File.directory?(path)
60
-
61
- @extension_paths << path
70
+ validate_extension(path)
71
+ @options[:extension_paths] ||= []
72
+ @options[:extension_paths] << path
62
73
  end
63
74
 
64
75
  #
@@ -66,13 +77,13 @@ module Selenium
66
77
  #
67
78
 
68
79
  def as_json(*)
69
- opts = {}
80
+ generate_as_json(super)
81
+ end
70
82
 
71
- opts['ms:inPrivate'] = true if @in_private
72
- opts['ms:extensionPaths'] = @extension_paths if @extension_paths.any?
73
- opts['ms:startPage'] = @start_page if @start_page
83
+ private
74
84
 
75
- opts
85
+ def validate_extension(path)
86
+ raise Error::WebDriverError, "could not find extension at #{path.inspect}" unless File.directory?(path)
76
87
  end
77
88
  end # Options
78
89
  end # Edge
@@ -19,7 +19,7 @@
19
19
 
20
20
  module Selenium
21
21
  module WebDriver
22
- module Edge
22
+ module EdgeHtml
23
23
  #
24
24
  # @api private
25
25
  #
@@ -21,19 +21,18 @@ require 'timeout'
21
21
  require 'socket'
22
22
  require 'rexml/document'
23
23
 
24
- require 'selenium/webdriver/firefox/driver'
25
-
26
- require 'selenium/webdriver/firefox/extension'
27
- require 'selenium/webdriver/firefox/binary'
28
- require 'selenium/webdriver/firefox/profiles_ini'
29
- require 'selenium/webdriver/firefox/profile'
30
- require 'selenium/webdriver/firefox/bridge'
31
- require 'selenium/webdriver/firefox/driver'
32
- require 'selenium/webdriver/firefox/options'
33
-
34
24
  module Selenium
35
25
  module WebDriver
36
26
  module Firefox
27
+ autoload :Extension, 'selenium/webdriver/firefox/extension'
28
+ autoload :Binary, 'selenium/webdriver/firefox/binary'
29
+ autoload :ProfilesIni, 'selenium/webdriver/firefox/profiles_ini'
30
+ autoload :Profile, 'selenium/webdriver/firefox/profile'
31
+ autoload :Bridge, 'selenium/webdriver/firefox/bridge'
32
+ autoload :Driver, 'selenium/webdriver/firefox/driver'
33
+ autoload :Options, 'selenium/webdriver/firefox/options'
34
+ autoload :Service, 'selenium/webdriver/firefox/service'
35
+
37
36
  DEFAULT_PORT = 7055
38
37
  DEFAULT_ENABLE_NATIVE_EVENTS = Platform.os == :windows
39
38
  DEFAULT_SECURE_SSL = false
@@ -58,5 +57,3 @@ module Selenium
58
57
  end # Firefox
59
58
  end # WebDriver
60
59
  end # Selenium
61
-
62
- require 'selenium/webdriver/firefox/service'
@@ -53,8 +53,8 @@ module Selenium
53
53
  @path = Platform.cygwin_path(@path, windows: true) if Platform.cygwin?
54
54
 
55
55
  unless File.file?(@path.to_s)
56
- error = "Could not find Firefox binary (os=#{Platform.os}). "
57
- error << "Make sure Firefox is installed or set the path manually with #{self}.path="
56
+ error = "Could not find Firefox binary (os=#{Platform.os}). " \
57
+ "Make sure Firefox is installed or set the path manually with #{self}.path="
58
58
  raise Error::WebDriverError, error
59
59
  end
60
60
 
@@ -32,16 +32,17 @@ module Selenium
32
32
  include DriverExtensions::TakesScreenshot
33
33
 
34
34
  def initialize(opts = {})
35
- opts[:desired_capabilities] = create_capabilities(opts)
35
+ opts[:desired_capabilities] ||= Remote::Capabilities.firefox
36
36
 
37
37
  opts[:url] ||= service_url(opts)
38
38
 
39
39
  listener = opts.delete(:listener)
40
40
  desired_capabilities = opts.delete(:desired_capabilities)
41
+ options = opts.delete(:options)
41
42
 
42
43
  @bridge = Remote::Bridge.new(opts)
43
44
  @bridge.extend Bridge
44
- @bridge.create_session(desired_capabilities)
45
+ @bridge.create_session(desired_capabilities, options)
45
46
 
46
47
  super(@bridge, listener: listener)
47
48
  end
@@ -49,23 +50,6 @@ module Selenium
49
50
  def browser
50
51
  :firefox
51
52
  end
52
-
53
- def quit
54
- super
55
- ensure
56
- @service&.stop
57
- end
58
-
59
- private
60
-
61
- def create_capabilities(opts)
62
- caps = opts.delete(:desired_capabilities) { Remote::Capabilities.firefox }
63
- options = opts.delete(:options) { Options.new }
64
- options = options.as_json
65
- caps.merge!(options) unless options.empty?
66
-
67
- caps
68
- end
69
53
  end # Driver
70
54
  end # Firefox
71
55
  end # WebDriver
@@ -87,6 +87,14 @@ module Selenium
87
87
  return unless File.exist?(manifest_path)
88
88
 
89
89
  manifest = JSON.parse(File.read(manifest_path))
90
+ applications_gecko_id(manifest) || name_and_version(manifest)
91
+ end
92
+
93
+ def applications_gecko_id(manifest)
94
+ manifest.dig('applications', 'gecko', 'id')&.strip
95
+ end
96
+
97
+ def name_and_version(manifest)
90
98
  [manifest['name'].delete(' '), manifest['version']].join('@')
91
99
  end
92
100
  end # Extension
@@ -20,12 +20,26 @@
20
20
  module Selenium
21
21
  module WebDriver
22
22
  module Firefox
23
- class Options
24
- attr_reader :args, :prefs, :options, :profile
25
- attr_accessor :binary, :log_level
26
-
23
+ class Options < WebDriver::Options
27
24
  KEY = 'moz:firefoxOptions'
28
25
 
26
+ # see: https://firefox-source-docs.mozilla.org/testing/geckodriver/Capabilities.html
27
+ CAPABILITIES = {binary: 'binary',
28
+ args: 'args',
29
+ profile: 'profile',
30
+ log: 'log',
31
+ prefs: 'prefs'}.freeze
32
+
33
+ CAPABILITIES.each_key do |key|
34
+ define_method key do
35
+ @options[key]
36
+ end
37
+
38
+ define_method "#{key}=" do |value|
39
+ @options[key] = value
40
+ end
41
+ end
42
+
29
43
  #
30
44
  # Create a new Options instance, only for W3C-capable versions of Firefox.
31
45
  #
@@ -42,13 +56,11 @@ module Selenium
42
56
  # @option opts [Hash] :options A hash for raw options
43
57
  #
44
58
 
45
- def initialize(**opts)
46
- @args = Set.new(opts.delete(:args) || [])
47
- @binary = opts.delete(:binary)
48
- @profile = process_profile(opts.delete(:profile))
49
- @log_level = opts.delete(:log_level)
50
- @prefs = opts.delete(:prefs) || {}
51
- @options = opts.delete(:options) || {}
59
+ def initialize(log_level: nil, **opts)
60
+ super(opts)
61
+
62
+ @options[:log] ||= {level: log_level} if log_level
63
+ process_profile(@options[:profile]) if @options.key?(:profile)
52
64
  end
53
65
 
54
66
  #
@@ -62,22 +74,8 @@ module Selenium
62
74
  #
63
75
 
64
76
  def add_argument(arg)
65
- @args << arg
66
- end
67
-
68
- #
69
- # Add a new option not yet handled by these bindings.
70
- #
71
- # @example
72
- # options = Selenium::WebDriver::Firefox::Options.new
73
- # options.add_option(:foo, 'bar')
74
- #
75
- # @param [String, Symbol] name Name of the option
76
- # @param [Boolean, String, Integer] value Value of the option
77
- #
78
-
79
- def add_option(name, value)
80
- @options[name] = value
77
+ @options[:args] ||= []
78
+ @options[:args] << arg
81
79
  end
82
80
 
83
81
  #
@@ -92,7 +90,8 @@ module Selenium
92
90
  #
93
91
 
94
92
  def add_preference(name, value)
95
- prefs[name] = value
93
+ @options[:prefs] ||= {}
94
+ @options[:prefs][name] = value
96
95
  end
97
96
 
98
97
  #
@@ -122,8 +121,17 @@ module Selenium
122
121
  # @param [Profile, String] profile Profile to be used
123
122
  #
124
123
 
124
+ undef profile=
125
125
  def profile=(profile)
126
- @profile = process_profile(profile)
126
+ process_profile(profile)
127
+ end
128
+
129
+ def log_level
130
+ @options.dig(:log, :level)
131
+ end
132
+
133
+ def log_level=(level)
134
+ @options[:log] = {level: level}
127
135
  end
128
136
 
129
137
  #
@@ -131,30 +139,19 @@ module Selenium
131
139
  #
132
140
 
133
141
  def as_json(*)
134
- opts = @options
135
-
136
- opts[:profile] = @profile.encoded if @profile
137
- opts[:args] = @args.to_a if @args.any?
138
- opts[:binary] = @binary if @binary
139
- opts[:prefs] = @prefs unless @prefs.empty?
140
- opts[:log] = {level: @log_level} if @log_level
141
-
142
- {KEY => opts}
142
+ {KEY => generate_as_json(super)}
143
143
  end
144
144
 
145
145
  private
146
146
 
147
147
  def process_profile(profile)
148
- return unless profile
149
-
150
- case profile
151
- when Profile
152
- profile
153
- when String
154
- Profile.from_name(profile)
155
- else
156
- raise Error::WebDriverError, "don't know how to handle profile: #{profile.inspect}"
157
- end
148
+ @options[:profile] = if profile.nil?
149
+ nil
150
+ elsif profile.is_a? Profile
151
+ profile
152
+ else
153
+ Profile.from_name(profile)
154
+ end
158
155
  end
159
156
  end # Options
160
157
  end # Firefox
@@ -53,6 +53,10 @@ module Selenium
53
53
  File.read(File.expand_path("#{WebDriver.root}/selenium/webdriver/firefox/extension/prefs.json"))
54
54
  ).freeze
55
55
  end
56
+
57
+ def decoded(json)
58
+ JSON.parse(json)
59
+ end
56
60
  end
57
61
 
58
62
  #
@@ -178,9 +182,7 @@ module Selenium
178
182
  end
179
183
  end
180
184
 
181
- def encoded
182
- Zipper.zip(layout_on_disk)
183
- end
185
+ alias_method :as_json, :encoded
184
186
 
185
187
  private
186
188
 
@@ -17,12 +17,13 @@
17
17
  # specific language governing permissions and limitations
18
18
  # under the License.
19
19
 
20
- require 'selenium/webdriver/ie/driver'
21
- require 'selenium/webdriver/ie/options'
22
-
23
20
  module Selenium
24
21
  module WebDriver
25
22
  module IE
23
+ autoload :Driver, 'selenium/webdriver/ie/driver'
24
+ autoload :Options, 'selenium/webdriver/ie/options'
25
+ autoload :Service, 'selenium/webdriver/ie/service'
26
+
26
27
  def self.driver_path=(path)
27
28
  WebDriver.logger.deprecate 'Selenium::WebDriver::IE#driver_path=',
28
29
  'Selenium::WebDriver::IE::Service#driver_path='
@@ -37,5 +38,3 @@ module Selenium
37
38
  end # IE
38
39
  end # WebDriver
39
40
  end # Selenium
40
-
41
- require 'selenium/webdriver/ie/service'
@@ -32,15 +32,16 @@ module Selenium
32
32
  include DriverExtensions::TakesScreenshot
33
33
 
34
34
  def initialize(opts = {})
35
- opts[:desired_capabilities] = create_capabilities(opts)
35
+ opts[:desired_capabilities] ||= Remote::Capabilities.internet_explorer
36
36
 
37
37
  opts[:url] ||= service_url(opts)
38
38
 
39
39
  listener = opts.delete(:listener)
40
40
  desired_capabilities = opts.delete(:desired_capabilities)
41
+ options = opts.delete(:options)
41
42
 
42
43
  @bridge = Remote::Bridge.new(opts)
43
- @bridge.create_session(desired_capabilities)
44
+ @bridge.create_session(desired_capabilities, options)
44
45
 
45
46
  super(@bridge, listener: listener)
46
47
  end
@@ -48,24 +49,6 @@ module Selenium
48
49
  def browser
49
50
  :internet_explorer
50
51
  end
51
-
52
- def quit
53
- super
54
- ensure
55
- @service&.stop
56
- end
57
-
58
- private
59
-
60
- def create_capabilities(opts)
61
- caps = opts.delete(:desired_capabilities) { Remote::Capabilities.internet_explorer }
62
- options = opts.delete(:options) { Options.new }
63
- options = options.as_json
64
- caps.merge!(options) unless options.empty?
65
-
66
- caps
67
- end
68
-
69
52
  end # Driver
70
53
  end # IE
71
54
  end # WebDriver