selenium-webdriver 4.0.0.alpha2 → 4.0.0.alpha3

Sign up to get free protection for your applications and to get access to all the features.
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