selenium-webdriver 4.4.0 → 4.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 (121) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES +86 -1
  3. data/LICENSE +1 -1
  4. data/NOTICE +1 -1
  5. data/bin/linux/selenium-manager +0 -0
  6. data/bin/macos/selenium-manager +0 -0
  7. data/bin/windows/selenium-manager.exe +0 -0
  8. data/lib/selenium/server.rb +20 -16
  9. data/lib/selenium/webdriver/atoms/findElements.js +0 -0
  10. data/lib/selenium/webdriver/atoms/getAttribute.js +0 -0
  11. data/lib/selenium/webdriver/atoms/isDisplayed.js +0 -0
  12. data/lib/selenium/webdriver/atoms/mutationListener.js +0 -0
  13. data/lib/selenium/webdriver/atoms.rb +2 -3
  14. data/lib/selenium/webdriver/bidi/browsing_context.rb +88 -0
  15. data/lib/selenium/webdriver/bidi/browsing_context_info.rb +35 -0
  16. data/lib/selenium/webdriver/bidi/log/base_log_entry.rb +35 -0
  17. data/lib/selenium/webdriver/bidi/log/console_log_entry.rb +35 -0
  18. data/lib/selenium/webdriver/bidi/log/generic_log_entry.rb +33 -0
  19. data/lib/selenium/webdriver/bidi/log/javascript_log_entry.rb +33 -0
  20. data/lib/selenium/webdriver/bidi/log_inspector.rb +140 -0
  21. data/lib/selenium/webdriver/bidi/navigate_result.rb +33 -0
  22. data/lib/selenium/webdriver/bidi/session.rb +13 -0
  23. data/lib/selenium/webdriver/bidi.rb +2 -1
  24. data/lib/selenium/webdriver/chrome/driver.rb +19 -28
  25. data/lib/selenium/webdriver/chrome/features.rb +5 -72
  26. data/lib/selenium/webdriver/chrome/options.rb +3 -237
  27. data/lib/selenium/webdriver/chrome/profile.rb +3 -83
  28. data/lib/selenium/webdriver/chrome/service.rb +4 -19
  29. data/lib/selenium/webdriver/chromium/driver.rb +61 -0
  30. data/lib/selenium/webdriver/chromium/features.rb +103 -0
  31. data/lib/selenium/webdriver/chromium/options.rb +261 -0
  32. data/lib/selenium/webdriver/chromium/profile.rb +113 -0
  33. data/lib/selenium/webdriver/chromium/service.rb +42 -0
  34. data/lib/selenium/webdriver/chromium.rb +32 -0
  35. data/lib/selenium/webdriver/common/action_builder.rb +11 -48
  36. data/lib/selenium/webdriver/common/child_process.rb +124 -0
  37. data/lib/selenium/webdriver/common/driver.rb +34 -25
  38. data/lib/selenium/webdriver/common/driver_extensions/downloads_files.rb +0 -2
  39. data/lib/selenium/webdriver/common/driver_extensions/full_page_screenshot.rb +0 -1
  40. data/lib/selenium/webdriver/common/driver_extensions/has_addons.rb +0 -2
  41. data/lib/selenium/webdriver/common/driver_extensions/has_apple_permissions.rb +0 -2
  42. data/lib/selenium/webdriver/common/driver_extensions/has_authentication.rb +0 -2
  43. data/lib/selenium/webdriver/common/driver_extensions/has_bidi.rb +0 -2
  44. data/lib/selenium/webdriver/common/driver_extensions/has_casting.rb +0 -1
  45. data/lib/selenium/webdriver/common/driver_extensions/has_cdp.rb +0 -2
  46. data/lib/selenium/webdriver/common/driver_extensions/has_context.rb +0 -2
  47. data/lib/selenium/webdriver/common/driver_extensions/has_debugger.rb +0 -2
  48. data/lib/selenium/webdriver/common/driver_extensions/has_devtools.rb +0 -2
  49. data/lib/selenium/webdriver/common/driver_extensions/has_launching.rb +0 -2
  50. data/lib/selenium/webdriver/common/driver_extensions/has_location.rb +1 -2
  51. data/lib/selenium/webdriver/common/driver_extensions/has_log_events.rb +0 -1
  52. data/lib/selenium/webdriver/common/driver_extensions/has_network_conditions.rb +0 -2
  53. data/lib/selenium/webdriver/common/driver_extensions/has_network_interception.rb +0 -2
  54. data/lib/selenium/webdriver/common/driver_extensions/has_permissions.rb +0 -2
  55. data/lib/selenium/webdriver/common/driver_extensions/has_pinned_scripts.rb +0 -2
  56. data/lib/selenium/webdriver/common/element.rb +7 -7
  57. data/lib/selenium/webdriver/common/error.rb +0 -2
  58. data/lib/selenium/webdriver/common/html5/shared_web_storage.rb +2 -2
  59. data/lib/selenium/webdriver/common/interactions/pointer_actions.rb +3 -3
  60. data/lib/selenium/webdriver/common/interactions/pointer_move.rb +2 -2
  61. data/lib/selenium/webdriver/common/interactions/scroll.rb +7 -5
  62. data/lib/selenium/webdriver/common/logger.rb +10 -2
  63. data/lib/selenium/webdriver/common/options.rb +30 -8
  64. data/lib/selenium/webdriver/common/platform.rb +4 -1
  65. data/lib/selenium/webdriver/common/profile_helper.rb +1 -1
  66. data/lib/selenium/webdriver/common/proxy.rb +1 -1
  67. data/lib/selenium/webdriver/common/selenium_manager.rb +89 -0
  68. data/lib/selenium/webdriver/common/service.rb +16 -8
  69. data/lib/selenium/webdriver/common/service_manager.rb +2 -10
  70. data/lib/selenium/webdriver/common/shadow_root.rb +1 -2
  71. data/lib/selenium/webdriver/common/socket_lock.rb +2 -2
  72. data/lib/selenium/webdriver/common/takes_screenshot.rb +2 -3
  73. data/lib/selenium/webdriver/common/target_locator.rb +2 -3
  74. data/lib/selenium/webdriver/common/timeouts.rb +2 -2
  75. data/lib/selenium/webdriver/common/virtual_authenticator/credential.rb +8 -6
  76. data/lib/selenium/webdriver/common/virtual_authenticator/virtual_authenticator.rb +0 -1
  77. data/lib/selenium/webdriver/common/virtual_authenticator/virtual_authenticator_options.rb +16 -16
  78. data/lib/selenium/webdriver/common/websocket_connection.rb +10 -2
  79. data/lib/selenium/webdriver/common.rb +2 -0
  80. data/lib/selenium/webdriver/devtools/console_event.rb +0 -2
  81. data/lib/selenium/webdriver/devtools/exception_event.rb +0 -2
  82. data/lib/selenium/webdriver/devtools/mutation_event.rb +0 -2
  83. data/lib/selenium/webdriver/devtools/network_interceptor.rb +3 -6
  84. data/lib/selenium/webdriver/devtools/pinned_script.rb +0 -2
  85. data/lib/selenium/webdriver/devtools/request.rb +0 -2
  86. data/lib/selenium/webdriver/devtools/response.rb +0 -2
  87. data/lib/selenium/webdriver/devtools.rb +0 -1
  88. data/lib/selenium/webdriver/edge/driver.rb +20 -3
  89. data/lib/selenium/webdriver/edge/features.rb +3 -4
  90. data/lib/selenium/webdriver/edge/options.rb +3 -5
  91. data/lib/selenium/webdriver/edge/profile.rb +2 -2
  92. data/lib/selenium/webdriver/edge/service.rb +2 -2
  93. data/lib/selenium/webdriver/firefox/driver.rb +19 -2
  94. data/lib/selenium/webdriver/firefox/features.rb +5 -2
  95. data/lib/selenium/webdriver/firefox/options.rb +6 -2
  96. data/lib/selenium/webdriver/firefox/profile.rb +6 -6
  97. data/lib/selenium/webdriver/firefox/service.rb +0 -1
  98. data/lib/selenium/webdriver/ie/driver.rb +20 -1
  99. data/lib/selenium/webdriver/ie/service.rb +1 -2
  100. data/lib/selenium/webdriver/remote/bridge.rb +8 -15
  101. data/lib/selenium/webdriver/remote/capabilities.rb +34 -12
  102. data/lib/selenium/webdriver/remote/commands.rb +0 -2
  103. data/lib/selenium/webdriver/remote/driver.rb +13 -13
  104. data/lib/selenium/webdriver/remote/http/curb.rb +0 -2
  105. data/lib/selenium/webdriver/remote/http/default.rb +1 -0
  106. data/lib/selenium/webdriver/remote/response.rb +0 -1
  107. data/lib/selenium/webdriver/safari/driver.rb +20 -1
  108. data/lib/selenium/webdriver/safari/features.rb +0 -2
  109. data/lib/selenium/webdriver/safari/options.rb +5 -1
  110. data/lib/selenium/webdriver/safari.rb +1 -1
  111. data/lib/selenium/webdriver/support/color.rb +15 -15
  112. data/lib/selenium/webdriver/support/guards/guard.rb +0 -2
  113. data/lib/selenium/webdriver/support/guards/guard_condition.rb +0 -2
  114. data/lib/selenium/webdriver/support/relative_locator.rb +0 -1
  115. data/lib/selenium/webdriver/support/select.rb +3 -1
  116. data/lib/selenium/webdriver/version.rb +1 -1
  117. data/lib/selenium/webdriver.rb +3 -4
  118. data/selenium-webdriver.gemspec +8 -9
  119. metadata +29 -73
  120. data/lib/selenium/webdriver/support/cdp/domain.rb.erb +0 -63
  121. data/lib/selenium/webdriver/support/cdp_client_generator.rb +0 -108
@@ -0,0 +1,103 @@
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 Chromium
23
+ module Features
24
+ CHROMIUM_COMMANDS = {
25
+ launch_app: [:post, 'session/:session_id/chromium/launch_app'],
26
+ get_network_conditions: [:get, 'session/:session_id/chromium/network_conditions'],
27
+ set_network_conditions: [:post, 'session/:session_id/chromium/network_conditions'],
28
+ delete_network_conditions: [:delete, 'session/:session_id/chromium/network_conditions'],
29
+ set_permission: [:post, 'session/:session_id/permissions'],
30
+ get_available_log_types: [:get, 'session/:session_id/se/log/types'],
31
+ get_log: [:post, 'session/:session_id/se/log']
32
+ }.freeze
33
+
34
+ def commands(command)
35
+ CHROME_COMMANDS[command] || self.class::COMMANDS[command]
36
+ end
37
+
38
+ def launch_app(id)
39
+ execute :launch_app, {}, {id: id}
40
+ end
41
+
42
+ def cast_sinks
43
+ execute :get_cast_sinks
44
+ end
45
+
46
+ def cast_sink_to_use=(name)
47
+ execute :set_cast_sink_to_use, {}, {sinkName: name}
48
+ end
49
+
50
+ def cast_issue_message
51
+ execute :cast_issue_message
52
+ end
53
+
54
+ def start_cast_tab_mirroring(name)
55
+ execute :start_cast_tab_mirroring, {}, {sinkName: name}
56
+ end
57
+
58
+ def start_cast_desktop_mirroring(name)
59
+ execute :start_cast_desktop_mirroring, {}, {sinkName: name}
60
+ end
61
+
62
+ def stop_casting(name)
63
+ execute :stop_casting, {}, {sinkName: name}
64
+ end
65
+
66
+ def set_permission(name, value)
67
+ execute :set_permission, {}, {descriptor: {name: name}, state: value}
68
+ end
69
+
70
+ def network_conditions
71
+ execute :get_network_conditions
72
+ end
73
+
74
+ def network_conditions=(conditions)
75
+ execute :set_network_conditions, {}, {network_conditions: conditions}
76
+ end
77
+
78
+ def delete_network_conditions
79
+ execute :delete_network_conditions
80
+ end
81
+
82
+ def send_command(command_params)
83
+ execute :send_command, {}, command_params
84
+ end
85
+
86
+ def available_log_types
87
+ types = execute :get_available_log_types
88
+ Array(types).map(&:to_sym)
89
+ end
90
+
91
+ def log(type)
92
+ data = execute :get_log, {}, {type: type.to_s}
93
+
94
+ Array(data).map do |l|
95
+ LogEntry.new l.fetch('level', 'UNKNOWN'), l.fetch('timestamp'), l.fetch('message')
96
+ rescue KeyError
97
+ next
98
+ end
99
+ end
100
+ end # Bridge
101
+ end # Chromium
102
+ end # WebDriver
103
+ end # Selenium
@@ -0,0 +1,261 @@
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 Chromium
23
+ class Options < WebDriver::Options
24
+ attr_accessor :profile, :logging_prefs
25
+
26
+ # see: http://chromedriver.chromium.org/capabilities
27
+ CAPABILITIES = {args: 'args',
28
+ binary: 'binary',
29
+ local_state: 'localState',
30
+ prefs: 'prefs',
31
+ detach: 'detach',
32
+ debugger_address: 'debuggerAddress',
33
+ exclude_switches: 'excludeSwitches',
34
+ minidump_path: 'minidumpPath',
35
+ emulation: 'mobileEmulation',
36
+ perf_logging_prefs: 'perfLoggingPrefs',
37
+ window_types: 'windowTypes',
38
+ android_package: 'androidPackage',
39
+ android_activity: 'androidActivity',
40
+ android_device_serial: 'androidDeviceSerial',
41
+ android_use_running_app: 'androidUseRunningApp'}.freeze
42
+
43
+ # NOTE: special handling of 'extensions' to validate when set instead of when used
44
+ attr_reader :extensions
45
+
46
+ # Create a new Options instance.
47
+ #
48
+ # @example
49
+ # options = Selenium::WebDriver::Chrome::Options.new(args: ['start-maximized', 'user-data-dir=/tmp/temp_profile'])
50
+ # driver = Selenium::WebDriver.for(:chrome, capabilities: options)
51
+ #
52
+ # @param [Profile] profile An instance of a Chrome::Profile Class
53
+ # @param [Hash] opts the pre-defined options to create the Chrome::Options with
54
+ # @option opts [Array] encoded_extensions List of extensions that do not need to be Base64 encoded
55
+ # @option opts [Array<String>] args List of command-line arguments to use when starting Chrome
56
+ # @option opts [String] binary Path to the Chrome executable to use
57
+ # @option opts [Hash] prefs A hash with each entry consisting of the name of the preference and its value
58
+ # @option opts [Array<String>] extensions A list of paths to (.crx) Chrome extensions to install on startup
59
+ # @option opts [Hash] options A hash for raw options
60
+ # @option opts [Hash] emulation A hash for raw emulation options
61
+ # @option opts [Hash] local_state A hash for the Local State file in the user data folder
62
+ # @option opts [Boolean] detach whether browser is closed when the driver is sent the quit command
63
+ # @option opts [String] debugger_address address of a Chrome debugger server to connect to
64
+ # @option opts [Array<String>] exclude_switches command line switches to exclude
65
+ # @option opts [String] minidump_path Directory to store Chrome minidumps (linux only)
66
+ # @option opts [Hash] perf_logging_prefs A hash for performance logging preferences
67
+ # @option opts [Array<String>] window_types A list of window types to appear in the list of window handles
68
+ #
69
+
70
+ def initialize(profile: nil, **opts)
71
+ super(**opts)
72
+
73
+ @profile = profile
74
+
75
+ @options = {args: [],
76
+ prefs: {},
77
+ emulation: {},
78
+ extensions: [],
79
+ local_state: {},
80
+ exclude_switches: [],
81
+ perf_logging_prefs: {},
82
+ window_types: []}.merge(@options)
83
+
84
+ @logging_prefs = options.delete(:logging_prefs) || {}
85
+ @encoded_extensions = @options.delete(:encoded_extensions) || []
86
+ @extensions = []
87
+ @options.delete(:extensions).each { |ext| validate_extension(ext) }
88
+ end
89
+
90
+ #
91
+ # Add an extension by local path.
92
+ #
93
+ # @example
94
+ # options = Selenium::WebDriver::Chrome::Options.new
95
+ # options.add_extension('/path/to/extension.crx')
96
+ #
97
+ # @param [String] path The local path to the .crx file
98
+ #
99
+
100
+ def add_extension(path)
101
+ validate_extension(path)
102
+ end
103
+
104
+ #
105
+ # Add an extension by local path.
106
+ #
107
+ # @example
108
+ # extensions = ['/path/to/extension.crx', '/path/to/other.crx']
109
+ # options = Selenium::WebDriver::Chrome::Options.new
110
+ # options.extensions = extensions
111
+ #
112
+ # @param [Array<String>] extensions A list of paths to (.crx) Chrome extensions to install on startup
113
+ #
114
+
115
+ def extensions=(extensions)
116
+ extensions.each { |ext| validate_extension(ext) }
117
+ end
118
+
119
+ #
120
+ # Add an extension by Base64-encoded string.
121
+ #
122
+ # @example
123
+ # options = Selenium::WebDriver::Chrome::Options.new
124
+ # options.add_encoded_extension(encoded_string)
125
+ #
126
+ # @param [String] encoded The Base64-encoded string of the .crx file
127
+ #
128
+
129
+ def add_encoded_extension(encoded)
130
+ @encoded_extensions << encoded
131
+ end
132
+
133
+ #
134
+ # Add a command-line argument to use when starting Chrome.
135
+ #
136
+ # @example Start Chrome maximized
137
+ # options = Selenium::WebDriver::Chrome::Options.new
138
+ # options.add_argument('start-maximized')
139
+ #
140
+ # @param [String] arg The command-line argument to add
141
+ #
142
+
143
+ def add_argument(arg)
144
+ @options[:args] << arg
145
+ end
146
+
147
+ #
148
+ # Add a preference that is only applied to the user profile in use.
149
+ #
150
+ # @example Set the default homepage
151
+ # options = Selenium::WebDriver::Chrome::Options.new
152
+ # options.add_preference('homepage', 'http://www.seleniumhq.com/')
153
+ #
154
+ # @param [String] name Key of the preference
155
+ # @param [Boolean, String, Integer] value Value of the preference
156
+ #
157
+
158
+ def add_preference(name, value)
159
+ @options[:prefs][name] = value
160
+ end
161
+
162
+ #
163
+ # Run Chrome in headless mode.
164
+ # Old headless uses a non-production browser and is set with `--headless`
165
+ # Native headless from v86 - v108 is set with `--headless=chrome`
166
+ # Native headless from v109+ is set with `--headless=new`
167
+ #
168
+ # @example Enable headless mode
169
+ # options = Selenium::WebDriver::Chrome::Options.new
170
+ # options.headless!
171
+ #
172
+
173
+ def headless!
174
+ WebDriver.logger.deprecate('`Options#headless!`',
175
+ "`Options#add_argument('--headless=new')`",
176
+ id: :headless)
177
+ add_argument '--headless'
178
+ end
179
+
180
+ #
181
+ # Add emulation device information
182
+ #
183
+ # see: http://chromedriver.chromium.org/mobile-emulation
184
+ #
185
+ # @example Start Chrome in mobile emulation mode by device name
186
+ # options = Selenium::WebDriver::Chrome::Options.new
187
+ # options.add_emulation(device_name: 'iPhone 6')
188
+ #
189
+ # @example Start Chrome in mobile emulation mode by device metrics
190
+ # options = Selenium::WebDriver::Chrome::Options.new
191
+ # options.add_emulation(device_metrics: {width: 400, height: 800, pixelRatio: 1, touch: true})
192
+ #
193
+ # @param [Hash] opts the pre-defined options for adding mobile emulation values
194
+ # @option opts [String] :device_name A valid device name from the Chrome DevTools Emulation panel
195
+ # @option opts [Hash] :device_metrics Hash containing width, height, pixelRatio, touch
196
+ # @option opts [String] :user_agent Full user agent
197
+ #
198
+
199
+ def add_emulation(**opts)
200
+ @options[:emulation] = opts
201
+ end
202
+
203
+ #
204
+ # Enables mobile browser use on Android.
205
+ #
206
+ # @see https://chromedriver.chromium.org/getting-started/getting-started---android
207
+ #
208
+ # @param [String] package The package name of the Chrome or WebView app.
209
+ # @param [String] serial_number The device serial number on which to launch the Chrome or WebView app.
210
+ # @param [String] use_running_app When true uses an already-running Chrome or WebView app,
211
+ # instead of launching the app with a clear data directory.
212
+ # @param [String] activity Name of the Activity hosting the WebView (Not available on Chrome Apps).
213
+ #
214
+
215
+ def enable_android(package: 'com.android.chrome', serial_number: nil, use_running_app: nil, activity: nil)
216
+ @options[:android_package] = package
217
+ @options[:android_activity] = activity unless activity.nil?
218
+ @options[:android_device_serial] = serial_number unless serial_number.nil?
219
+ @options[:android_use_running_app] = use_running_app unless use_running_app.nil?
220
+ end
221
+
222
+ protected
223
+
224
+ def process_browser_options(browser_options)
225
+ enable_logging(browser_options) unless @logging_prefs.empty?
226
+
227
+ options = browser_options[self.class::KEY]
228
+ options['binary'] ||= binary_path if binary_path
229
+
230
+ if @profile
231
+ options['args'] ||= []
232
+ options['args'] << "--user-data-dir=#{@profile.directory}"
233
+ end
234
+
235
+ return if (@encoded_extensions + @extensions).empty?
236
+
237
+ options['extensions'] = @encoded_extensions + @extensions.map { |ext| encode_extension(ext) }
238
+ end
239
+
240
+ def binary_path
241
+ Chrome.path
242
+ end
243
+
244
+ def encode_extension(path)
245
+ File.open(path, 'rb') { |crx_file| Base64.strict_encode64 crx_file.read }
246
+ end
247
+
248
+ def validate_extension(path)
249
+ raise Error::WebDriverError, "could not find extension at #{path.inspect}" unless File.file?(path)
250
+ raise Error::WebDriverError, "file was not an extension #{path.inspect}" unless File.extname(path) == '.crx'
251
+
252
+ @extensions << path
253
+ end
254
+
255
+ def camelize?(key)
256
+ !%w[localState prefs].include?(key)
257
+ end
258
+ end # Options
259
+ end # Chromium
260
+ end # WebDriver
261
+ end # Selenium
@@ -0,0 +1,113 @@
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 Chromium
23
+ #
24
+ # @private
25
+ #
26
+
27
+ class Profile
28
+ include ProfileHelper
29
+
30
+ def initialize(model = nil)
31
+ @model = verify_model(model)
32
+ @extensions = []
33
+ @encoded_extensions = []
34
+ @directory = nil
35
+ end
36
+
37
+ def add_extension(path)
38
+ raise Error::WebDriverError, "could not find extension at #{path.inspect}" unless File.file?(path)
39
+
40
+ @extensions << path
41
+ end
42
+
43
+ def add_encoded_extension(encoded)
44
+ @encoded_extensions << encoded
45
+ end
46
+
47
+ def directory
48
+ @directory || layout_on_disk
49
+ end
50
+
51
+ #
52
+ # Set a preference in the profile.
53
+ #
54
+ # See https://src.chromium.org/viewvc/chrome/trunk/src/chrome/common/pref_names.cc
55
+ #
56
+
57
+ def []=(key, value)
58
+ parts = key.split('.')
59
+ parts[0..-2].inject(prefs) { |a, e| a[e] ||= {} }[parts.last] = value
60
+ end
61
+
62
+ def [](key)
63
+ parts = key.split('.')
64
+ parts.inject(prefs) { |a, e| a.fetch(e) }
65
+ end
66
+
67
+ def layout_on_disk
68
+ @directory = @model ? create_tmp_copy(@model) : Dir.mktmpdir('webdriver-chrome-profile')
69
+ FileReaper << @directory
70
+
71
+ write_prefs_to @directory
72
+
73
+ @directory
74
+ end
75
+
76
+ def as_json(*)
77
+ extensions = @extensions.map do |crx_path|
78
+ File.open(crx_path, 'rb') { |crx_file| Base64.strict_encode64 crx_file.read }
79
+ end
80
+
81
+ extensions.concat(@encoded_extensions)
82
+
83
+ opts = {'directory' => directory || layout_on_disk}
84
+ opts['extensions'] = extensions if extensions.any?
85
+ opts
86
+ end
87
+
88
+ private
89
+
90
+ def write_prefs_to(dir)
91
+ prefs_file = prefs_file_for(dir)
92
+
93
+ FileUtils.mkdir_p File.dirname(prefs_file)
94
+ File.open(prefs_file, 'w') { |file| file << JSON.generate(prefs) }
95
+ end
96
+
97
+ def prefs
98
+ @prefs ||= read_model_prefs
99
+ end
100
+
101
+ def read_model_prefs
102
+ return {} unless @model
103
+
104
+ JSON.parse File.read(prefs_file_for(@model))
105
+ end
106
+
107
+ def prefs_file_for(dir)
108
+ File.join dir, 'Default', 'Preferences'
109
+ end
110
+ end # Profile
111
+ end # Chromium
112
+ end # WebDriver
113
+ end # Selenium
@@ -0,0 +1,42 @@
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 Chromium
23
+ class Service < WebDriver::Service
24
+ protected
25
+
26
+ def extract_service_args(driver_opts)
27
+ driver_args = super
28
+ driver_opts = driver_opts.dup
29
+ driver_args << "--log-path=#{driver_opts.delete(:log_path)}" if driver_opts.key?(:log_path)
30
+ driver_args << "--url-base=#{driver_opts.delete(:url_base)}" if driver_opts.key?(:url_base)
31
+ driver_args << "--port-server=#{driver_opts.delete(:port_server)}" if driver_opts.key?(:port_server)
32
+ if driver_opts.key?(:whitelisted_ips)
33
+ driver_args << "--whitelisted-ips=#{driver_opts.delete(:whitelisted_ips)}"
34
+ end
35
+ driver_args << '--verbose' if driver_opts.key?(:verbose)
36
+ driver_args << '--silent' if driver_opts.key?(:silent)
37
+ driver_args
38
+ end
39
+ end # Service
40
+ end # Chromium
41
+ end # WebDriver
42
+ end # Selenium
@@ -0,0 +1,32 @@
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
+ require 'net/http'
21
+
22
+ module Selenium
23
+ module WebDriver
24
+ module Chromium
25
+ autoload :Features, 'selenium/webdriver/chromium/features'
26
+ autoload :Driver, 'selenium/webdriver/chromium/driver'
27
+ autoload :Profile, 'selenium/webdriver/chromium/profile'
28
+ autoload :Options, 'selenium/webdriver/chromium/options'
29
+ autoload :Service, 'selenium/webdriver/chromium/service'
30
+ end # Chromium
31
+ end # WebDriver
32
+ end # Selenium
@@ -42,30 +42,13 @@ module Selenium
42
42
  # @return [ActionBuilder] A self reference.
43
43
  #
44
44
 
45
- def initialize(bridge, deprecated_mouse = nil, deprecated_keyboard = nil, deprecated_async = nil,
46
- devices: [], async: false, duration: 250)
45
+ def initialize(bridge, devices: [], async: false, duration: 250)
47
46
  @bridge = bridge
48
47
  @duration = duration
49
-
50
- @async = if deprecated_async.nil?
51
- async
52
- else
53
- WebDriver.logger.deprecate('initializing ActionBuilder with async parameter',
54
- ':async keyword',
55
- id: :action_async)
56
- deprecated_async
57
- end
58
-
48
+ @async = async
59
49
  @devices = []
60
- if deprecated_keyboard || deprecated_mouse
61
- WebDriver.logger.deprecate "initializing ActionBuilder with keyboard and mouse parameters",
62
- "devices keyword or, even better, Driver#action",
63
- id: :action_devices
64
- add_input(deprecated_mouse)
65
- add_input(deprecated_keyboard)
66
- else
67
- Array(devices).each { |device| add_input(device) }
68
- end
50
+
51
+ Array(devices).each { |device| add_input(device) }
69
52
  end
70
53
 
71
54
  #
@@ -118,20 +101,6 @@ module Selenium
118
101
  add_input(Interactions.wheel(name))
119
102
  end
120
103
 
121
- #
122
- # Retrieves the input device for the given name
123
- #
124
- # @param [String] name name of the input device
125
- # @return [Selenium::WebDriver::Interactions::InputDevice] input device with given name
126
- #
127
-
128
- def get_device(name)
129
- WebDriver.logger.deprecate('#get_device with name parameter',
130
- '#device with :name or :type keyword',
131
- id: :get_device)
132
- device(name: name)
133
- end
134
-
135
104
  #
136
105
  # Retrieves the input device for the given name or type
137
106
  #
@@ -194,11 +163,9 @@ module Selenium
194
163
  # @return [ActionBuilder] A self reference.
195
164
  #
196
165
 
197
- def pause(deprecated_device = nil, deprecated_duration = nil, device: nil, duration: 0)
198
- deprecate_method(deprecated_device, deprecated_duration)
199
-
200
- device ||= deprecated_device || pointer_input
201
- device.create_pause(deprecated_duration || duration)
166
+ def pause(device: nil, duration: 0)
167
+ device ||= pointer_input
168
+ device.create_pause(duration)
202
169
  self
203
170
  end
204
171
 
@@ -218,13 +185,10 @@ module Selenium
218
185
  # @return [ActionBuilder] A self reference.
219
186
  #
220
187
 
221
- def pauses(deprecated_device = nil, deprecated_number = nil, deprecated_duration = nil,
222
- device: nil, number: nil, duration: 0)
223
- deprecate_method(deprecated_device, deprecated_duration, deprecated_number, method: :pauses)
224
-
225
- number ||= deprecated_number || 2
226
- device ||= deprecated_device || pointer_input
227
- duration ||= deprecated_duration || 0
188
+ def pauses(device: nil, number: nil, duration: 0)
189
+ number ||= 2
190
+ device ||= pointer_input
191
+ duration ||= 0
228
192
 
229
193
  number.times { device.create_pause(duration) }
230
194
  self
@@ -294,7 +258,6 @@ module Selenium
294
258
  ':device, :duration, :number keywords',
295
259
  id: method
296
260
  end
297
-
298
261
  end # ActionBuilder
299
262
  end # WebDriver
300
263
  end # Selenium