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.
- checksums.yaml +7 -0
- data/CHANGES +795 -3
- data/Gemfile +2 -0
- data/{COPYING → LICENSE} +1 -3
- data/README.md +13 -9
- data/lib/selenium/server.rb +93 -71
- data/lib/selenium/webdriver/atoms/getAttribute.js +7 -0
- data/lib/selenium/webdriver/atoms/isDisplayed.js +102 -0
- data/lib/selenium/webdriver/atoms.rb +37 -0
- data/lib/selenium/webdriver/chrome/bridge.rb +47 -99
- data/lib/selenium/webdriver/chrome/driver.rb +127 -0
- data/lib/selenium/webdriver/chrome/options.rb +190 -0
- data/lib/selenium/webdriver/chrome/profile.rb +40 -20
- data/lib/selenium/webdriver/chrome/service.rb +46 -62
- data/lib/selenium/webdriver/chrome.rb +34 -6
- data/lib/selenium/webdriver/common/action_builder.rb +69 -56
- data/lib/selenium/webdriver/common/alert.rb +25 -8
- data/lib/selenium/webdriver/common/bridge_helper.rb +35 -20
- data/lib/selenium/webdriver/common/driver.rb +90 -63
- data/lib/selenium/webdriver/common/driver_extensions/downloads_files.rb +45 -0
- data/lib/selenium/webdriver/common/driver_extensions/has_addons.rb +50 -0
- data/lib/selenium/webdriver/common/driver_extensions/has_debugger.rb +42 -0
- data/lib/selenium/webdriver/common/driver_extensions/has_location.rb +26 -11
- data/lib/selenium/webdriver/common/driver_extensions/has_network_conditions.rb +51 -0
- data/lib/selenium/webdriver/common/driver_extensions/has_network_connection.rb +58 -0
- data/lib/selenium/webdriver/common/driver_extensions/has_permissions.rb +51 -0
- data/lib/selenium/webdriver/common/driver_extensions/has_remote_status.rb +23 -6
- data/lib/selenium/webdriver/common/driver_extensions/has_session_id.rb +19 -2
- data/lib/selenium/webdriver/common/driver_extensions/has_touch_screen.rb +24 -7
- data/lib/selenium/webdriver/common/driver_extensions/has_web_storage.rb +19 -3
- data/lib/selenium/webdriver/common/driver_extensions/rotatable.rb +23 -7
- data/lib/selenium/webdriver/common/driver_extensions/takes_screenshot.rb +26 -5
- data/lib/selenium/webdriver/common/driver_extensions/uploads_files.rb +20 -6
- data/lib/selenium/webdriver/common/element.rb +79 -37
- data/lib/selenium/webdriver/common/error.rb +282 -106
- data/lib/selenium/webdriver/common/file_reaper.rb +23 -12
- data/lib/selenium/webdriver/common/html5/local_storage.rb +29 -12
- data/lib/selenium/webdriver/common/html5/session_storage.rb +29 -12
- data/lib/selenium/webdriver/common/html5/shared_web_storage.rb +29 -18
- data/lib/selenium/webdriver/common/interactions/input_device.rb +54 -0
- data/lib/selenium/webdriver/common/interactions/interaction.rb +53 -0
- data/lib/selenium/webdriver/common/interactions/interactions.rb +43 -0
- data/lib/selenium/webdriver/common/interactions/key_actions.rb +145 -0
- data/lib/selenium/webdriver/common/interactions/key_input.rb +66 -0
- data/lib/selenium/webdriver/common/interactions/none_input.rb +36 -0
- data/lib/selenium/webdriver/common/interactions/pointer_actions.rb +363 -0
- data/lib/selenium/webdriver/common/interactions/pointer_input.rb +139 -0
- data/lib/selenium/webdriver/common/keyboard.rb +27 -12
- data/lib/selenium/webdriver/common/keys.rb +118 -81
- data/lib/selenium/webdriver/common/log_entry.rb +27 -8
- data/lib/selenium/webdriver/common/logger.rb +115 -0
- data/lib/selenium/webdriver/common/logs.rb +24 -7
- data/lib/selenium/webdriver/common/manager.rb +177 -0
- data/lib/selenium/webdriver/common/mouse.rb +29 -12
- data/lib/selenium/webdriver/common/navigation.rb +21 -4
- data/lib/selenium/webdriver/common/options.rb +43 -126
- data/lib/selenium/webdriver/common/platform.rb +101 -97
- data/lib/selenium/webdriver/common/port_prober.rb +24 -17
- data/lib/selenium/webdriver/common/profile_helper.rb +27 -11
- data/lib/selenium/webdriver/common/proxy.rb +86 -73
- data/lib/selenium/webdriver/common/search_context.rb +49 -33
- data/lib/selenium/webdriver/common/service.rb +219 -0
- data/lib/selenium/webdriver/common/socket_lock.rb +82 -0
- data/lib/selenium/webdriver/common/socket_poller.rb +47 -26
- data/lib/selenium/webdriver/common/target_locator.rb +35 -14
- data/lib/selenium/webdriver/common/timeouts.rb +23 -6
- data/lib/selenium/webdriver/common/touch_action_builder.rb +25 -11
- data/lib/selenium/webdriver/common/touch_screen.rb +42 -24
- data/lib/selenium/webdriver/common/w3c_action_builder.rb +212 -0
- data/lib/selenium/webdriver/common/w3c_manager.rb +45 -0
- data/lib/selenium/webdriver/common/wait.rb +34 -14
- data/lib/selenium/webdriver/common/window.rb +75 -16
- data/lib/selenium/webdriver/common/zipper.rb +26 -11
- data/lib/selenium/webdriver/common.rb +40 -7
- data/lib/selenium/webdriver/edge/bridge.rb +76 -0
- data/lib/selenium/webdriver/edge/driver.rb +66 -0
- data/lib/selenium/webdriver/edge/options.rb +80 -0
- data/lib/selenium/webdriver/edge/service.rb +52 -0
- data/lib/selenium/webdriver/edge.rb +44 -0
- data/lib/selenium/webdriver/firefox/binary.rb +70 -48
- data/lib/selenium/webdriver/firefox/driver.rb +50 -0
- data/lib/selenium/webdriver/firefox/extension/prefs.json +14 -13
- data/lib/selenium/webdriver/firefox/extension/webdriver.xpi +0 -0
- data/lib/selenium/webdriver/firefox/extension.rb +50 -19
- data/lib/selenium/webdriver/firefox/launcher.rb +33 -28
- data/lib/selenium/webdriver/firefox/legacy/driver.rb +83 -0
- data/lib/selenium/webdriver/firefox/marionette/bridge.rb +49 -0
- data/lib/selenium/webdriver/firefox/marionette/driver.rb +90 -0
- data/lib/selenium/webdriver/firefox/options.rb +162 -0
- data/lib/selenium/webdriver/firefox/profile.rb +66 -48
- data/lib/selenium/webdriver/firefox/profiles_ini.rb +28 -16
- data/lib/selenium/webdriver/firefox/service.rb +52 -0
- data/lib/selenium/webdriver/firefox/util.rb +19 -2
- data/lib/selenium/webdriver/firefox.rb +46 -10
- data/lib/selenium/webdriver/ie/driver.rb +85 -0
- data/lib/selenium/webdriver/ie/options.rb +138 -0
- data/lib/selenium/webdriver/ie/service.rb +54 -0
- data/lib/selenium/webdriver/ie.rb +32 -10
- data/lib/selenium/webdriver/remote/bridge.rb +117 -572
- data/lib/selenium/webdriver/remote/capabilities.rb +116 -99
- data/lib/selenium/webdriver/remote/driver.rb +51 -0
- data/lib/selenium/webdriver/remote/http/common.rb +54 -23
- data/lib/selenium/webdriver/remote/http/curb.rb +30 -12
- data/lib/selenium/webdriver/remote/http/default.rb +85 -42
- data/lib/selenium/webdriver/remote/http/persistent.rb +29 -7
- data/lib/selenium/webdriver/remote/oss/bridge.rb +594 -0
- data/lib/selenium/webdriver/remote/oss/commands.rb +223 -0
- data/lib/selenium/webdriver/remote/response.rb +68 -30
- data/lib/selenium/webdriver/remote/server_error.rb +22 -5
- data/lib/selenium/webdriver/remote/w3c/bridge.rb +605 -0
- data/lib/selenium/webdriver/remote/w3c/capabilities.rb +310 -0
- data/lib/selenium/webdriver/remote/w3c/commands.rb +157 -0
- data/lib/selenium/webdriver/remote.rb +27 -13
- data/lib/selenium/webdriver/safari/bridge.rb +38 -107
- data/lib/selenium/webdriver/safari/driver.rb +68 -0
- data/lib/selenium/webdriver/safari/options.rb +56 -75
- data/lib/selenium/webdriver/safari/service.rb +38 -0
- data/lib/selenium/webdriver/safari.rb +49 -31
- data/lib/selenium/webdriver/support/abstract_event_listener.rb +40 -6
- data/lib/selenium/webdriver/support/block_event_listener.rb +24 -7
- data/lib/selenium/webdriver/support/color.rb +82 -46
- data/lib/selenium/webdriver/support/escaper.rb +43 -0
- data/lib/selenium/webdriver/support/event_firing_bridge.rb +56 -39
- data/lib/selenium/webdriver/support/select.rb +66 -89
- data/lib/selenium/webdriver/support.rb +20 -0
- data/lib/selenium/webdriver/version.rb +24 -0
- data/lib/selenium/webdriver.rb +55 -25
- data/lib/selenium-webdriver.rb +19 -0
- data/selenium-webdriver.gemspec +42 -29
- metadata +331 -260
- data/Gemfile.lock +0 -48
- data/lib/selenium/client/base.rb +0 -132
- data/lib/selenium/client/driver.rb +0 -10
- data/lib/selenium/client/errors.rb +0 -9
- data/lib/selenium/client/extensions.rb +0 -118
- data/lib/selenium/client/idiomatic.rb +0 -488
- data/lib/selenium/client/javascript_expression_builder.rb +0 -116
- data/lib/selenium/client/javascript_frameworks/jquery.rb +0 -13
- data/lib/selenium/client/javascript_frameworks/prototype.rb +0 -13
- data/lib/selenium/client/legacy_driver.rb +0 -1720
- data/lib/selenium/client/protocol.rb +0 -104
- data/lib/selenium/client/selenium_helper.rb +0 -34
- data/lib/selenium/client.rb +0 -38
- data/lib/selenium/rake/server_task.rb +0 -157
- data/lib/selenium/webdriver/android/bridge.rb +0 -49
- data/lib/selenium/webdriver/android.rb +0 -9
- data/lib/selenium/webdriver/common/core_ext/base64.rb +0 -9
- data/lib/selenium/webdriver/common/core_ext/dir.rb +0 -42
- data/lib/selenium/webdriver/common/core_ext/string.rb +0 -5
- data/lib/selenium/webdriver/common/driver_extensions/has_browser_connection.rb +0 -17
- data/lib/selenium/webdriver/common/driver_extensions/has_input_devices.rb +0 -39
- data/lib/selenium/webdriver/common/html5/location.rb +0 -0
- data/lib/selenium/webdriver/common/json_helper.rb +0 -34
- data/lib/selenium/webdriver/firefox/bridge.rb +0 -70
- data/lib/selenium/webdriver/firefox/socket_lock.rb +0 -61
- data/lib/selenium/webdriver/ie/bridge.rb +0 -69
- data/lib/selenium/webdriver/ie/server.rb +0 -90
- data/lib/selenium/webdriver/iphone/bridge.rb +0 -45
- data/lib/selenium/webdriver/iphone.rb +0 -9
- data/lib/selenium/webdriver/opera/bridge.rb +0 -112
- data/lib/selenium/webdriver/opera/service.rb +0 -49
- data/lib/selenium/webdriver/opera.rb +0 -24
- data/lib/selenium/webdriver/phantomjs/bridge.rb +0 -59
- data/lib/selenium/webdriver/phantomjs/service.rb +0 -90
- data/lib/selenium/webdriver/phantomjs.rb +0 -22
- data/lib/selenium/webdriver/remote/commands.rb +0 -192
- data/lib/selenium/webdriver/safari/browser.rb +0 -20
- data/lib/selenium/webdriver/safari/extensions.rb +0 -170
- data/lib/selenium/webdriver/safari/resources/SafariDriver.safariextz +0 -0
- data/lib/selenium/webdriver/safari/resources/client.js +0 -6903
- data/lib/selenium/webdriver/safari/server.rb +0 -145
- data/lib/selenium-client.rb +0 -2
|
@@ -1,75 +1,59 @@
|
|
|
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 Chrome
|
|
4
|
-
|
|
5
23
|
#
|
|
6
24
|
# @api private
|
|
7
25
|
#
|
|
8
26
|
|
|
9
|
-
class Service
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
path
|
|
24
|
-
)
|
|
27
|
+
class Service < WebDriver::Service
|
|
28
|
+
@default_port = 9515
|
|
29
|
+
@executable = 'chromedriver'
|
|
30
|
+
@missing_text = <<~ERROR
|
|
31
|
+
Unable to find chromedriver. Please download the server from
|
|
32
|
+
https://chromedriver.storage.googleapis.com/index.html and place it somewhere on your PATH.
|
|
33
|
+
More info at https://github.com/SeleniumHQ/selenium/wiki/ChromeDriver.
|
|
34
|
+
ERROR
|
|
35
|
+
@shutdown_supported = true
|
|
36
|
+
|
|
37
|
+
def self.driver_path=(path)
|
|
38
|
+
Platform.assert_executable path if path.is_a?(String)
|
|
39
|
+
@driver_path = path
|
|
25
40
|
end
|
|
26
41
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
@process = ChildProcess.build(*server_command)
|
|
41
|
-
@socket_poller = SocketPoller.new Platform.localhost, port, START_TIMEOUT
|
|
42
|
-
|
|
43
|
-
@process.io.inherit! if $DEBUG == true
|
|
44
|
-
end
|
|
45
|
-
|
|
46
|
-
def start
|
|
47
|
-
@process.start
|
|
48
|
-
|
|
49
|
-
unless @socket_poller.connected?
|
|
50
|
-
raise Error::WebDriverError, "unable to connect to chromedriver #{@uri}"
|
|
51
|
-
end
|
|
52
|
-
|
|
53
|
-
Platform.exit_hook { stop } # make sure we don't leave the server running
|
|
54
|
-
end
|
|
55
|
-
|
|
56
|
-
def stop
|
|
57
|
-
return if @process.nil? || @process.exited?
|
|
58
|
-
|
|
59
|
-
Net::HTTP.start(uri.host, uri.port) do |http|
|
|
60
|
-
http.open_timeout = STOP_TIMEOUT / 2
|
|
61
|
-
http.read_timeout = STOP_TIMEOUT / 2
|
|
62
|
-
|
|
63
|
-
http.head("/shutdown")
|
|
64
|
-
end
|
|
65
|
-
|
|
66
|
-
@process.poll_for_exit STOP_TIMEOUT
|
|
67
|
-
rescue ChildProcess::TimeoutError
|
|
68
|
-
# ok, force quit
|
|
69
|
-
@process.stop STOP_TIMEOUT
|
|
42
|
+
private
|
|
43
|
+
|
|
44
|
+
# Note: This processing is deprecated
|
|
45
|
+
def extract_service_args(driver_opts)
|
|
46
|
+
driver_args = super
|
|
47
|
+
driver_opts = driver_opts.dup
|
|
48
|
+
driver_args << "--log-path=#{driver_opts.delete(:log_path)}" if driver_opts.key?(:log_path)
|
|
49
|
+
driver_args << "--url-base=#{driver_opts.delete(:url_base)}" if driver_opts.key?(:url_base)
|
|
50
|
+
driver_args << "--port-server=#{driver_opts.delete(:port_server)}" if driver_opts.key?(:port_server)
|
|
51
|
+
driver_args << "--whitelisted-ips=#{driver_opts.delete(:whitelisted_ips)}" if driver_opts.key?(:whitelisted_ips)
|
|
52
|
+
driver_args << "--verbose" if driver_opts.key?(:verbose)
|
|
53
|
+
driver_args << "--silent" if driver_opts.key?(:silent)
|
|
54
|
+
driver_args
|
|
70
55
|
end
|
|
71
56
|
end # Service
|
|
72
|
-
|
|
73
57
|
end # Chrome
|
|
74
58
|
end # WebDriver
|
|
75
|
-
end #
|
|
59
|
+
end # Selenium
|
|
@@ -1,15 +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
|
+
|
|
1
20
|
require 'net/http'
|
|
2
21
|
|
|
3
|
-
require 'selenium/webdriver/chrome/service'
|
|
4
22
|
require 'selenium/webdriver/chrome/bridge'
|
|
23
|
+
require 'selenium/webdriver/chrome/driver'
|
|
5
24
|
require 'selenium/webdriver/chrome/profile'
|
|
25
|
+
require 'selenium/webdriver/chrome/options'
|
|
6
26
|
|
|
7
27
|
module Selenium
|
|
8
28
|
module WebDriver
|
|
9
|
-
|
|
10
29
|
module Chrome
|
|
11
30
|
def self.driver_path=(path)
|
|
12
|
-
|
|
31
|
+
WebDriver.logger.deprecate 'Selenium::WebDriver::Chrome#driver_path=',
|
|
32
|
+
'Selenium::WebDriver::Chrome::Service#driver_path='
|
|
33
|
+
Selenium::WebDriver::Chrome::Service.driver_path = path
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def self.driver_path
|
|
37
|
+
WebDriver.logger.deprecate 'Selenium::WebDriver::Chrome#driver_path',
|
|
38
|
+
'Selenium::WebDriver::Chrome::Service#driver_path'
|
|
39
|
+
Selenium::WebDriver::Chrome::Service.driver_path
|
|
13
40
|
end
|
|
14
41
|
|
|
15
42
|
def self.path=(path)
|
|
@@ -20,7 +47,8 @@ module Selenium
|
|
|
20
47
|
def self.path
|
|
21
48
|
@path ||= nil
|
|
22
49
|
end
|
|
50
|
+
end # Chrome
|
|
51
|
+
end # WebDriver
|
|
52
|
+
end # Selenium
|
|
23
53
|
|
|
24
|
-
|
|
25
|
-
end
|
|
26
|
-
end
|
|
54
|
+
require 'selenium/webdriver/chrome/service'
|
|
@@ -1,13 +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
|
-
|
|
4
22
|
#
|
|
5
23
|
# The ActionBuilder provides the user a way to set up and perform
|
|
6
24
|
# complex user interactions.
|
|
7
25
|
#
|
|
8
|
-
# This class should not be instantiated directly, but is created by
|
|
9
|
-
# Selenium::WebDriver::DriverExtensions::HasInputDevices#action, which
|
|
10
|
-
# is available on Driver instances that support the user interaction API.
|
|
26
|
+
# This class should not be instantiated directly, but is created by Driver#action
|
|
11
27
|
#
|
|
12
28
|
# @example
|
|
13
29
|
#
|
|
@@ -20,18 +36,17 @@ module Selenium
|
|
|
20
36
|
#
|
|
21
37
|
|
|
22
38
|
class ActionBuilder
|
|
23
|
-
|
|
24
39
|
#
|
|
25
40
|
# @api private
|
|
26
41
|
#
|
|
27
42
|
|
|
28
43
|
def initialize(mouse, keyboard)
|
|
29
|
-
@devices
|
|
30
|
-
:
|
|
31
|
-
:
|
|
44
|
+
@devices = {
|
|
45
|
+
mouse: mouse,
|
|
46
|
+
keyboard: keyboard
|
|
32
47
|
}
|
|
33
48
|
|
|
34
|
-
@actions
|
|
49
|
+
@actions = []
|
|
35
50
|
end
|
|
36
51
|
|
|
37
52
|
#
|
|
@@ -51,19 +66,19 @@ module Selenium
|
|
|
51
66
|
#
|
|
52
67
|
# @example Press a key on an element
|
|
53
68
|
#
|
|
54
|
-
# el = driver.find_element(:
|
|
69
|
+
# el = driver.find_element(id: "some_id")
|
|
55
70
|
# driver.action.key_down(el, :shift).perform
|
|
56
71
|
#
|
|
57
|
-
# @
|
|
58
|
-
#
|
|
72
|
+
# @overload key_down(key)
|
|
73
|
+
# @param [:shift, :alt, :control, :command, :meta] key The modifier key to press
|
|
74
|
+
# @overload key_down(element, key)
|
|
75
|
+
# @param [Element] element An optional element to move to first
|
|
76
|
+
# @param [:shift, :alt, :control, :command, :meta] key The modifier key to press
|
|
59
77
|
# @raise [ArgumentError] if the given key is not a modifier
|
|
60
|
-
# @return [ActionBuilder] A self reference
|
|
61
|
-
#
|
|
78
|
+
# @return [ActionBuilder] A self reference
|
|
62
79
|
|
|
63
80
|
def key_down(*args)
|
|
64
|
-
if args.first.
|
|
65
|
-
@actions << [:mouse, :click, [args.shift]]
|
|
66
|
-
end
|
|
81
|
+
@actions << [:mouse, :click, [args.shift]] if args.first.is_a? Element
|
|
67
82
|
|
|
68
83
|
@actions << [:keyboard, :press, args]
|
|
69
84
|
self
|
|
@@ -79,19 +94,20 @@ module Selenium
|
|
|
79
94
|
#
|
|
80
95
|
# @example Release a key from an element
|
|
81
96
|
#
|
|
82
|
-
# el = driver.find_element(:
|
|
97
|
+
# el = driver.find_element(id: "some_id")
|
|
83
98
|
# driver.action.key_up(el, :alt).perform
|
|
84
99
|
#
|
|
85
|
-
# @
|
|
86
|
-
#
|
|
87
|
-
# @
|
|
88
|
-
#
|
|
100
|
+
# @overload key_up(key)
|
|
101
|
+
# @param [:shift, :alt, :control, :command, :meta] key The modifier key to release
|
|
102
|
+
# @overload key_up(element, key)
|
|
103
|
+
# @param [Element] element An optional element to move to first
|
|
104
|
+
# @param [:shift, :alt, :control, :command, :meta] key The modifier key to release
|
|
105
|
+
# @raise [ArgumentError] if the given key is not a modifier
|
|
106
|
+
# @return [ActionBuilder] A self reference
|
|
89
107
|
#
|
|
90
108
|
|
|
91
109
|
def key_up(*args)
|
|
92
|
-
if args.first.
|
|
93
|
-
@actions << [:mouse, :click, [args.shift]]
|
|
94
|
-
end
|
|
110
|
+
@actions << [:mouse, :click, [args.shift]] if args.first.is_a? Element
|
|
95
111
|
|
|
96
112
|
@actions << [:keyboard, :release, args]
|
|
97
113
|
self
|
|
@@ -106,22 +122,23 @@ module Selenium
|
|
|
106
122
|
#
|
|
107
123
|
# @example Send the text "help" to an element
|
|
108
124
|
#
|
|
109
|
-
# el = driver.find_element(:
|
|
125
|
+
# el = driver.find_element(id: "some_id")
|
|
110
126
|
# driver.action.send_keys(el, "help").perform
|
|
111
127
|
#
|
|
112
128
|
# @example Send the text "help" to the currently focused element
|
|
113
129
|
#
|
|
114
130
|
# driver.action.send_keys("help").perform
|
|
115
131
|
#
|
|
116
|
-
# @
|
|
117
|
-
#
|
|
118
|
-
# @
|
|
132
|
+
# @overload send_keys(keys)
|
|
133
|
+
# @param [Array, Symbol, String] keys The key(s) to press and release
|
|
134
|
+
# @overload send_keys(element, keys)
|
|
135
|
+
# @param [Element] element An optional element to move to first
|
|
136
|
+
# @param [Array, Symbol, String] keys The key(s) to press and release
|
|
137
|
+
# @return [ActionBuilder] A self reference
|
|
119
138
|
#
|
|
120
139
|
|
|
121
140
|
def send_keys(*args)
|
|
122
|
-
if args.first.
|
|
123
|
-
@actions << [:mouse, :click, [args.shift]]
|
|
124
|
-
end
|
|
141
|
+
@actions << [:mouse, :click, [args.shift]] if args.first.is_a? Element
|
|
125
142
|
|
|
126
143
|
@actions << [:keyboard, :send_keys, args]
|
|
127
144
|
self
|
|
@@ -135,10 +152,10 @@ module Selenium
|
|
|
135
152
|
#
|
|
136
153
|
# @example Clicking and holding on some element
|
|
137
154
|
#
|
|
138
|
-
# el = driver.find_element(:
|
|
155
|
+
# el = driver.find_element(id: "some_id")
|
|
139
156
|
# driver.action.click_and_hold(el).perform
|
|
140
157
|
#
|
|
141
|
-
# @param [
|
|
158
|
+
# @param [Element] element the element to move to and click.
|
|
142
159
|
# @return [ActionBuilder] A self reference.
|
|
143
160
|
#
|
|
144
161
|
|
|
@@ -152,7 +169,7 @@ module Selenium
|
|
|
152
169
|
#
|
|
153
170
|
# @example Releasing an element after clicking and holding it
|
|
154
171
|
#
|
|
155
|
-
# el = driver.find_element(:
|
|
172
|
+
# el = driver.find_element(id: "some_id")
|
|
156
173
|
# driver.action.click_and_hold(el).release.perform
|
|
157
174
|
#
|
|
158
175
|
# @return [ActionBuilder] A self reference.
|
|
@@ -172,7 +189,7 @@ module Selenium
|
|
|
172
189
|
#
|
|
173
190
|
# @example Clicking on an element
|
|
174
191
|
#
|
|
175
|
-
# el = driver.find_element(:
|
|
192
|
+
# el = driver.find_element(id: "some_id")
|
|
176
193
|
# driver.action.click(el).perform
|
|
177
194
|
#
|
|
178
195
|
# @example Clicking at the current mouse position
|
|
@@ -195,7 +212,7 @@ module Selenium
|
|
|
195
212
|
#
|
|
196
213
|
# @example Double click an element
|
|
197
214
|
#
|
|
198
|
-
# el = driver.find_element(:
|
|
215
|
+
# el = driver.find_element(id: "some_id")
|
|
199
216
|
# driver.action.double_click(el).perform
|
|
200
217
|
#
|
|
201
218
|
# @param [Selenium::WebDriver::Element] element An optional element to move to.
|
|
@@ -216,12 +233,12 @@ module Selenium
|
|
|
216
233
|
#
|
|
217
234
|
# @example Scroll element into view and move the mouse to it
|
|
218
235
|
#
|
|
219
|
-
# el = driver.find_element(:
|
|
236
|
+
# el = driver.find_element(id: "some_id")
|
|
220
237
|
# driver.action.move_to(el).perform
|
|
221
238
|
#
|
|
222
239
|
# @example
|
|
223
240
|
#
|
|
224
|
-
# el = driver.find_element(:
|
|
241
|
+
# el = driver.find_element(id: "some_id")
|
|
225
242
|
# driver.action.move_to(el, 100, 100).perform
|
|
226
243
|
#
|
|
227
244
|
# @param [Selenium::WebDriver::Element] element to move to.
|
|
@@ -233,11 +250,11 @@ module Selenium
|
|
|
233
250
|
#
|
|
234
251
|
|
|
235
252
|
def move_to(element, right_by = nil, down_by = nil)
|
|
236
|
-
if right_by && down_by
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
253
|
+
@actions << if right_by && down_by
|
|
254
|
+
[:mouse, :move_to, [element, Integer(right_by), Integer(down_by)]]
|
|
255
|
+
else
|
|
256
|
+
[:mouse, :move_to, [element]]
|
|
257
|
+
end
|
|
241
258
|
|
|
242
259
|
self
|
|
243
260
|
end
|
|
@@ -262,7 +279,7 @@ module Selenium
|
|
|
262
279
|
#
|
|
263
280
|
|
|
264
281
|
def move_by(right_by, down_by)
|
|
265
|
-
@actions << [:mouse, :move_by, [right_by, down_by]]
|
|
282
|
+
@actions << [:mouse, :move_by, [Integer(right_by), Integer(down_by)]]
|
|
266
283
|
self
|
|
267
284
|
end
|
|
268
285
|
|
|
@@ -272,7 +289,7 @@ module Selenium
|
|
|
272
289
|
#
|
|
273
290
|
# @example Context-click at middle of given element
|
|
274
291
|
#
|
|
275
|
-
# el = driver.find_element(:
|
|
292
|
+
# el = driver.find_element(id: "some_id")
|
|
276
293
|
# driver.action.context_click(el).perform
|
|
277
294
|
#
|
|
278
295
|
# @param [Selenium::WebDriver::Element] element An element to context click.
|
|
@@ -291,8 +308,8 @@ module Selenium
|
|
|
291
308
|
#
|
|
292
309
|
# @example Drag and drop one element onto another
|
|
293
310
|
#
|
|
294
|
-
# el1 = driver.find_element(:
|
|
295
|
-
# el2 = driver.find_element(:
|
|
311
|
+
# el1 = driver.find_element(id: "some_id1")
|
|
312
|
+
# el2 = driver.find_element(id: "some_id2")
|
|
296
313
|
# driver.action.drag_and_drop(el1, el2).perform
|
|
297
314
|
#
|
|
298
315
|
# @param [Selenium::WebDriver::Element] source element to emulate button down at.
|
|
@@ -304,7 +321,7 @@ module Selenium
|
|
|
304
321
|
def drag_and_drop(source, target)
|
|
305
322
|
click_and_hold source
|
|
306
323
|
move_to target
|
|
307
|
-
release
|
|
324
|
+
release
|
|
308
325
|
|
|
309
326
|
self
|
|
310
327
|
end
|
|
@@ -315,14 +332,12 @@ module Selenium
|
|
|
315
332
|
#
|
|
316
333
|
# @example Drag and drop an element by offset
|
|
317
334
|
#
|
|
318
|
-
# el = driver.find_element(:
|
|
335
|
+
# el = driver.find_element(id: "some_id1")
|
|
319
336
|
# driver.action.drag_and_drop_by(el, 100, 100).perform
|
|
320
337
|
#
|
|
321
338
|
# @param [Selenium::WebDriver::Element] source Element to emulate button down at.
|
|
322
339
|
# @param [Integer] right_by horizontal move offset.
|
|
323
340
|
# @param [Integer] down_by vertical move offset.
|
|
324
|
-
# @param [Selenium::WebDriver::Element] target Element to move to and release the
|
|
325
|
-
# mouse at.
|
|
326
341
|
# @return [ActionBuilder] A self reference.
|
|
327
342
|
#
|
|
328
343
|
|
|
@@ -334,19 +349,17 @@ module Selenium
|
|
|
334
349
|
self
|
|
335
350
|
end
|
|
336
351
|
|
|
337
|
-
|
|
338
352
|
#
|
|
339
353
|
# Executes the actions added to the builder.
|
|
340
354
|
#
|
|
341
355
|
|
|
342
356
|
def perform
|
|
343
|
-
@actions.each
|
|
357
|
+
@actions.each do |receiver, method, args|
|
|
344
358
|
@devices.fetch(receiver).__send__(method, *args)
|
|
345
|
-
|
|
359
|
+
end
|
|
346
360
|
|
|
347
361
|
nil
|
|
348
362
|
end
|
|
349
|
-
|
|
350
363
|
end # ActionBuilder
|
|
351
364
|
end # WebDriver
|
|
352
365
|
end # Selenium
|
|
@@ -1,30 +1,47 @@
|
|
|
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
|
class Alert
|
|
4
|
-
|
|
5
23
|
def initialize(bridge)
|
|
6
24
|
@bridge = bridge
|
|
7
25
|
|
|
8
26
|
# fail fast if the alert doesn't exist
|
|
9
|
-
bridge.
|
|
27
|
+
bridge.alert_text
|
|
10
28
|
end
|
|
11
29
|
|
|
12
30
|
def accept
|
|
13
|
-
@bridge.
|
|
31
|
+
@bridge.accept_alert
|
|
14
32
|
end
|
|
15
33
|
|
|
16
34
|
def dismiss
|
|
17
|
-
@bridge.
|
|
35
|
+
@bridge.dismiss_alert
|
|
18
36
|
end
|
|
19
37
|
|
|
20
38
|
def send_keys(keys)
|
|
21
|
-
@bridge.
|
|
39
|
+
@bridge.alert = keys
|
|
22
40
|
end
|
|
23
41
|
|
|
24
42
|
def text
|
|
25
|
-
@bridge.
|
|
43
|
+
@bridge.alert_text
|
|
26
44
|
end
|
|
27
|
-
|
|
28
45
|
end # Alert
|
|
29
46
|
end # WebDriver
|
|
30
|
-
end # Selenium
|
|
47
|
+
end # Selenium
|
|
@@ -1,6 +1,24 @@
|
|
|
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
|
-
|
|
4
22
|
#
|
|
5
23
|
# Shared across bridges
|
|
6
24
|
#
|
|
@@ -8,52 +26,50 @@ module Selenium
|
|
|
8
26
|
#
|
|
9
27
|
|
|
10
28
|
module BridgeHelper
|
|
11
|
-
|
|
12
29
|
def unwrap_script_result(arg)
|
|
13
30
|
case arg
|
|
14
31
|
when Array
|
|
15
32
|
arg.map { |e| unwrap_script_result(e) }
|
|
16
33
|
when Hash
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
end
|
|
34
|
+
element_id = element_id_from(arg)
|
|
35
|
+
return Element.new(self, element_id) if element_id
|
|
36
|
+
|
|
37
|
+
arg.each { |k, v| arg[k] = unwrap_script_result(v) }
|
|
22
38
|
else
|
|
23
39
|
arg
|
|
24
40
|
end
|
|
25
41
|
end
|
|
26
42
|
|
|
27
43
|
def element_id_from(id)
|
|
28
|
-
id['ELEMENT']
|
|
44
|
+
id['ELEMENT'] || id['element-6066-11e4-a52e-4f735466cecf']
|
|
29
45
|
end
|
|
30
46
|
|
|
31
47
|
def parse_cookie_string(str)
|
|
32
48
|
result = {
|
|
33
|
-
'name'
|
|
34
|
-
'value'
|
|
35
|
-
'domain'
|
|
36
|
-
'path'
|
|
49
|
+
'name' => '',
|
|
50
|
+
'value' => '',
|
|
51
|
+
'domain' => '',
|
|
52
|
+
'path' => '',
|
|
37
53
|
'expires' => '',
|
|
38
|
-
'secure'
|
|
54
|
+
'secure' => false
|
|
39
55
|
}
|
|
40
56
|
|
|
41
|
-
str.split(
|
|
42
|
-
if attribute.include?
|
|
43
|
-
key, value = attribute.strip.split(
|
|
57
|
+
str.split(';').each do |attribute|
|
|
58
|
+
if attribute.include? '='
|
|
59
|
+
key, value = attribute.strip.split('=', 2)
|
|
44
60
|
if result['name'].empty?
|
|
45
61
|
result['name'] = key
|
|
46
62
|
result['value'] = value
|
|
47
63
|
elsif key == 'domain' && value.strip =~ /^\.(.+)/
|
|
48
|
-
result['domain'] =
|
|
64
|
+
result['domain'] = Regexp.last_match(1)
|
|
49
65
|
elsif key && value
|
|
50
66
|
result[key] = value
|
|
51
67
|
end
|
|
52
|
-
elsif attribute ==
|
|
68
|
+
elsif attribute == 'secure'
|
|
53
69
|
result['secure'] = true
|
|
54
70
|
end
|
|
55
71
|
|
|
56
|
-
unless [nil,
|
|
72
|
+
unless [nil, '', '0'].include?(result['expires'])
|
|
57
73
|
# firefox stores expiry as number of seconds
|
|
58
74
|
result['expires'] = Time.at(result['expires'].to_i)
|
|
59
75
|
end
|
|
@@ -61,7 +77,6 @@ module Selenium
|
|
|
61
77
|
|
|
62
78
|
result
|
|
63
79
|
end
|
|
64
|
-
|
|
65
80
|
end # BridgeHelper
|
|
66
81
|
end # WebDriver
|
|
67
82
|
end # Selenium
|