selenium-webdriver 2.53.4 → 3.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/CHANGES +363 -10
- data/LICENSE +1 -1
- data/README.md +2 -3
- data/lib/selenium-webdriver.rb +0 -2
- data/lib/selenium/server.rb +69 -70
- data/lib/selenium/webdriver.rb +32 -23
- data/lib/selenium/webdriver/atoms.rb +18 -0
- data/lib/selenium/webdriver/atoms/getAttribute.js +8 -0
- data/lib/selenium/webdriver/chrome.rb +8 -6
- data/lib/selenium/webdriver/chrome/driver.rb +112 -0
- data/lib/selenium/webdriver/chrome/options.rb +168 -0
- data/lib/selenium/webdriver/chrome/profile.rb +17 -17
- data/lib/selenium/webdriver/chrome/service.rb +22 -89
- data/lib/selenium/webdriver/common.rb +13 -6
- data/lib/selenium/webdriver/common/action_builder.rb +49 -57
- data/lib/selenium/webdriver/common/alert.rb +5 -15
- data/lib/selenium/webdriver/common/bridge_helper.rb +10 -17
- data/lib/selenium/webdriver/common/driver.rb +53 -68
- data/lib/selenium/webdriver/common/driver_extensions/{has_input_devices.rb → has_addons.rb} +13 -23
- data/lib/selenium/webdriver/common/driver_extensions/has_location.rb +4 -8
- data/lib/selenium/webdriver/common/driver_extensions/has_network_connection.rb +4 -7
- data/lib/selenium/webdriver/common/driver_extensions/has_remote_status.rb +0 -4
- data/lib/selenium/webdriver/common/driver_extensions/has_session_id.rb +0 -4
- data/lib/selenium/webdriver/common/driver_extensions/has_touch_screen.rb +1 -5
- data/lib/selenium/webdriver/common/driver_extensions/has_web_storage.rb +0 -5
- data/lib/selenium/webdriver/common/driver_extensions/rotatable.rb +4 -9
- data/lib/selenium/webdriver/common/driver_extensions/takes_screenshot.rb +7 -7
- data/lib/selenium/webdriver/common/driver_extensions/uploads_files.rb +2 -7
- data/lib/selenium/webdriver/common/element.rb +57 -39
- data/lib/selenium/webdriver/common/error.rb +204 -106
- data/lib/selenium/webdriver/common/file_reaper.rb +3 -11
- data/lib/selenium/webdriver/common/html5/local_storage.rb +6 -10
- data/lib/selenium/webdriver/common/html5/session_storage.rb +6 -10
- data/lib/selenium/webdriver/common/html5/shared_web_storage.rb +7 -18
- data/lib/selenium/webdriver/{safari/options.rb → common/interactions/input_device.rb} +20 -31
- data/lib/selenium/webdriver/common/interactions/interaction.rb +50 -0
- data/lib/selenium/webdriver/{safari/browser.rb → common/interactions/interactions.rb} +16 -15
- data/lib/selenium/webdriver/common/interactions/key_actions.rb +143 -0
- data/lib/selenium/webdriver/common/interactions/key_input.rb +62 -0
- data/lib/selenium/webdriver/{android.rb → common/interactions/none_input.rb} +11 -6
- data/lib/selenium/webdriver/common/interactions/pointer_actions.rb +353 -0
- data/lib/selenium/webdriver/common/interactions/pointer_input.rb +132 -0
- data/lib/selenium/webdriver/common/keyboard.rb +7 -14
- data/lib/selenium/webdriver/common/keys.rb +99 -82
- data/lib/selenium/webdriver/common/log_entry.rb +3 -6
- data/lib/selenium/webdriver/common/logger.rb +140 -0
- data/lib/selenium/webdriver/common/logs.rb +2 -6
- data/lib/selenium/webdriver/common/mouse.rb +9 -14
- data/lib/selenium/webdriver/common/navigation.rb +2 -6
- data/lib/selenium/webdriver/common/options.rb +20 -23
- data/lib/selenium/webdriver/common/platform.rb +70 -97
- data/lib/selenium/webdriver/common/port_prober.rb +3 -4
- data/lib/selenium/webdriver/common/profile_helper.rb +6 -11
- data/lib/selenium/webdriver/common/proxy.rb +58 -72
- data/lib/selenium/webdriver/common/search_context.rb +22 -29
- data/lib/selenium/webdriver/common/service.rb +161 -0
- data/lib/selenium/webdriver/common/socket_lock.rb +6 -14
- data/lib/selenium/webdriver/common/socket_poller.rb +5 -12
- data/lib/selenium/webdriver/common/target_locator.rb +11 -15
- data/lib/selenium/webdriver/common/timeouts.rb +4 -8
- data/lib/selenium/webdriver/common/touch_action_builder.rb +2 -6
- data/lib/selenium/webdriver/common/touch_screen.rb +19 -23
- data/lib/selenium/webdriver/common/w3c_action_builder.rb +209 -0
- data/lib/selenium/webdriver/{phantomjs.rb → common/w3c_options.rb} +16 -14
- data/lib/selenium/webdriver/common/wait.rb +6 -13
- data/lib/selenium/webdriver/common/window.rb +48 -17
- data/lib/selenium/webdriver/common/zipper.rb +6 -10
- data/lib/selenium/webdriver/edge.rb +5 -12
- data/lib/selenium/webdriver/edge/bridge.rb +32 -63
- data/lib/selenium/webdriver/edge/driver.rb +73 -0
- data/lib/selenium/webdriver/edge/service.rb +18 -87
- data/lib/selenium/webdriver/firefox.rb +20 -11
- data/lib/selenium/webdriver/firefox/binary.rb +40 -56
- data/lib/selenium/webdriver/firefox/driver.rb +48 -0
- data/lib/selenium/webdriver/firefox/extension.rb +18 -8
- data/lib/selenium/webdriver/firefox/extension/prefs.json +3 -11
- data/lib/selenium/webdriver/firefox/extension/webdriver.xpi +0 -0
- data/lib/selenium/webdriver/firefox/launcher.rb +13 -22
- data/lib/selenium/webdriver/firefox/legacy/driver.rb +79 -0
- data/lib/selenium/webdriver/{iphone.rb → firefox/marionette/bridge.rb} +25 -6
- data/lib/selenium/webdriver/firefox/marionette/driver.rb +96 -0
- data/lib/selenium/webdriver/firefox/options.rb +149 -0
- data/lib/selenium/webdriver/firefox/profile.rb +46 -46
- data/lib/selenium/webdriver/firefox/profiles_ini.rb +8 -18
- data/lib/selenium/webdriver/firefox/service.rb +23 -83
- data/lib/selenium/webdriver/firefox/util.rb +0 -4
- data/lib/selenium/webdriver/ie.rb +4 -8
- data/lib/selenium/webdriver/ie/driver.rb +90 -0
- data/lib/selenium/webdriver/ie/options.rb +136 -0
- data/lib/selenium/webdriver/ie/service.rb +58 -0
- data/lib/selenium/webdriver/remote.rb +8 -16
- data/lib/selenium/webdriver/remote/bridge.rb +96 -565
- data/lib/selenium/webdriver/remote/capabilities.rb +76 -94
- data/lib/selenium/webdriver/remote/driver.rb +49 -0
- data/lib/selenium/webdriver/remote/http/common.rb +22 -20
- data/lib/selenium/webdriver/remote/http/curb.rb +9 -12
- data/lib/selenium/webdriver/remote/http/default.rb +54 -41
- data/lib/selenium/webdriver/remote/http/persistent.rb +9 -8
- data/lib/selenium/webdriver/remote/oss/bridge.rb +586 -0
- data/lib/selenium/webdriver/remote/oss/commands.rb +221 -0
- data/lib/selenium/webdriver/remote/response.rb +39 -27
- data/lib/selenium/webdriver/remote/server_error.rb +1 -5
- data/lib/selenium/webdriver/remote/w3c/bridge.rb +573 -0
- data/lib/selenium/webdriver/remote/w3c/capabilities.rb +290 -0
- data/lib/selenium/webdriver/remote/w3c/commands.rb +148 -0
- data/lib/selenium/webdriver/safari.rb +20 -29
- data/lib/selenium/webdriver/{firefox/w3c_bridge.rb → safari/driver.rb} +21 -30
- data/lib/selenium/webdriver/safari/service.rb +57 -0
- data/lib/selenium/webdriver/support.rb +1 -2
- data/lib/selenium/webdriver/support/abstract_event_listener.rb +17 -4
- data/lib/selenium/webdriver/support/block_event_listener.rb +1 -5
- data/lib/selenium/webdriver/support/color.rb +57 -42
- data/lib/selenium/webdriver/support/escaper.rb +41 -0
- data/lib/selenium/webdriver/support/event_firing_bridge.rb +36 -40
- data/lib/selenium/webdriver/support/select.rb +33 -86
- data/selenium-webdriver.gemspec +22 -25
- metadata +254 -261
- data/lib/selenium-client.rb +0 -21
- data/lib/selenium/client.rb +0 -57
- data/lib/selenium/client/base.rb +0 -151
- data/lib/selenium/client/driver.rb +0 -29
- data/lib/selenium/client/errors.rb +0 -28
- data/lib/selenium/client/extensions.rb +0 -132
- data/lib/selenium/client/idiomatic.rb +0 -507
- data/lib/selenium/client/javascript_expression_builder.rb +0 -135
- data/lib/selenium/client/javascript_frameworks/jquery.rb +0 -32
- data/lib/selenium/client/javascript_frameworks/prototype.rb +0 -32
- data/lib/selenium/client/legacy_driver.rb +0 -1722
- data/lib/selenium/client/protocol.rb +0 -123
- data/lib/selenium/client/selenium_helper.rb +0 -49
- data/lib/selenium/rake/server_task.rb +0 -176
- data/lib/selenium/webdriver/android/bridge.rb +0 -68
- data/lib/selenium/webdriver/chrome/bridge.rb +0 -139
- data/lib/selenium/webdriver/common/core_ext/base64.rb +0 -28
- data/lib/selenium/webdriver/common/core_ext/dir.rb +0 -61
- data/lib/selenium/webdriver/common/html5/location.rb +0 -19
- data/lib/selenium/webdriver/common/w3c_error.rb +0 -194
- data/lib/selenium/webdriver/edge/legacy_support.rb +0 -117
- data/lib/selenium/webdriver/firefox/bridge.rb +0 -89
- data/lib/selenium/webdriver/ie/bridge.rb +0 -88
- data/lib/selenium/webdriver/ie/server.rb +0 -133
- data/lib/selenium/webdriver/iphone/bridge.rb +0 -64
- data/lib/selenium/webdriver/phantomjs/bridge.rb +0 -78
- data/lib/selenium/webdriver/phantomjs/service.rb +0 -130
- data/lib/selenium/webdriver/remote/commands.rb +0 -211
- data/lib/selenium/webdriver/remote/w3c_bridge.rb +0 -668
- data/lib/selenium/webdriver/remote/w3c_capabilities.rb +0 -236
- data/lib/selenium/webdriver/remote/w3c_commands.rb +0 -132
- data/lib/selenium/webdriver/safari/bridge.rb +0 -135
- data/lib/selenium/webdriver/safari/resources/client.js +0 -7255
- data/lib/selenium/webdriver/safari/server.rb +0 -187
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
#
|
|
3
1
|
# Licensed to the Software Freedom Conservancy (SFC) under one
|
|
4
2
|
# or more contributor license agreements. See the NOTICE file
|
|
5
3
|
# distributed with this work for additional information
|
|
@@ -19,32 +17,32 @@
|
|
|
19
17
|
|
|
20
18
|
module Selenium
|
|
21
19
|
module WebDriver
|
|
22
|
-
module
|
|
20
|
+
module Safari
|
|
23
21
|
|
|
22
|
+
#
|
|
23
|
+
# Driver implementation for Safari.
|
|
24
24
|
# @api private
|
|
25
|
-
|
|
25
|
+
#
|
|
26
|
+
|
|
27
|
+
class Driver < WebDriver::Driver
|
|
28
|
+
include DriverExtensions::TakesScreenshot
|
|
26
29
|
|
|
27
30
|
def initialize(opts = {})
|
|
28
|
-
|
|
29
|
-
Binary.path = caps[:firefox_binary] if caps[:firefox_binary]
|
|
31
|
+
opts[:desired_capabilities] ||= Remote::Capabilities.safari
|
|
30
32
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
33
|
+
unless opts.key?(:url)
|
|
34
|
+
driver_path = opts.delete(:driver_path) || Safari.driver_path
|
|
35
|
+
driver_opts = opts.delete(:driver_opts) || {}
|
|
36
|
+
port = opts.delete(:port) || Service::DEFAULT_PORT
|
|
34
37
|
|
|
35
|
-
|
|
36
|
-
|
|
38
|
+
@service = Service.new(driver_path, port, driver_opts)
|
|
39
|
+
@service.start
|
|
40
|
+
opts[:url] = @service.uri
|
|
41
|
+
end
|
|
37
42
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
def driver_extensions
|
|
43
|
-
[
|
|
44
|
-
DriverExtensions::TakesScreenshot,
|
|
45
|
-
DriverExtensions::HasInputDevices,
|
|
46
|
-
DriverExtensions::HasWebStorage
|
|
47
|
-
]
|
|
43
|
+
listener = opts.delete(:listener)
|
|
44
|
+
@bridge = Remote::Bridge.handshake(opts)
|
|
45
|
+
super(@bridge, listener: listener)
|
|
48
46
|
end
|
|
49
47
|
|
|
50
48
|
def quit
|
|
@@ -53,14 +51,7 @@ module Selenium
|
|
|
53
51
|
@service.stop if @service
|
|
54
52
|
end
|
|
55
53
|
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
def extract_service_args(opts)
|
|
59
|
-
service_log_path = opts.delete(:service_log_path)
|
|
60
|
-
service_log_path ? ["--log-path=#{service_log_path}"] : []
|
|
61
|
-
end
|
|
62
|
-
|
|
63
|
-
end # W3CBridge
|
|
64
|
-
end # Firefox
|
|
54
|
+
end # Driver
|
|
55
|
+
end # Safari
|
|
65
56
|
end # WebDriver
|
|
66
57
|
end # Selenium
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# Licensed to the Software Freedom Conservancy (SFC) under one
|
|
2
|
+
# or more contributor license agreements. See the NOTICE file
|
|
3
|
+
# distributed with this work for additional information
|
|
4
|
+
# regarding copyright ownership. The SFC licenses this file
|
|
5
|
+
# to you under the Apache License, Version 2.0 (the
|
|
6
|
+
# "License"); you may not use this file except in compliance
|
|
7
|
+
# with the License. You may obtain a copy of the License at
|
|
8
|
+
#
|
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
#
|
|
11
|
+
# Unless required by applicable law or agreed to in writing,
|
|
12
|
+
# software distributed under the License is distributed on an
|
|
13
|
+
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
14
|
+
# KIND, either express or implied. See the License for the
|
|
15
|
+
# specific language governing permissions and limitations
|
|
16
|
+
# under the License.
|
|
17
|
+
|
|
18
|
+
module Selenium
|
|
19
|
+
module WebDriver
|
|
20
|
+
module Safari
|
|
21
|
+
#
|
|
22
|
+
# @api private
|
|
23
|
+
#
|
|
24
|
+
|
|
25
|
+
class Service < WebDriver::Service
|
|
26
|
+
DEFAULT_PORT = 7050
|
|
27
|
+
@executable = '/usr/bin/safaridriver'.freeze
|
|
28
|
+
@missing_text = <<-ERROR.gsub(/\n +| {2,}/, ' ').freeze
|
|
29
|
+
Unable to find Apple's safaridriver which comes with Safari 10.
|
|
30
|
+
More info at https://webkit.org/blog/6900/webdriver-support-in-safari-10/
|
|
31
|
+
ERROR
|
|
32
|
+
|
|
33
|
+
def stop
|
|
34
|
+
stop_process
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
private
|
|
38
|
+
|
|
39
|
+
def binary_path(path)
|
|
40
|
+
path = self.class.executable if path.nil?
|
|
41
|
+
raise Error::WebDriverError, self.class.missing_text unless path
|
|
42
|
+
Platform.assert_executable path
|
|
43
|
+
path
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def start_process
|
|
47
|
+
@process = build_process(@executable_path, "--port=#{@port}", *@extra_args)
|
|
48
|
+
@process.start
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def cannot_connect_error_text
|
|
52
|
+
"unable to connect to safaridriver #{@host}:#{@port}"
|
|
53
|
+
end
|
|
54
|
+
end # Service
|
|
55
|
+
end # Safari
|
|
56
|
+
end # WebDriver
|
|
57
|
+
end # Selenium
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
#
|
|
3
1
|
# Licensed to the Software Freedom Conservancy (SFC) under one
|
|
4
2
|
# or more contributor license agreements. See the NOTICE file
|
|
5
3
|
# distributed with this work for additional information
|
|
@@ -20,5 +18,6 @@
|
|
|
20
18
|
require 'selenium/webdriver/support/event_firing_bridge'
|
|
21
19
|
require 'selenium/webdriver/support/abstract_event_listener'
|
|
22
20
|
require 'selenium/webdriver/support/block_event_listener'
|
|
21
|
+
require 'selenium/webdriver/support/escaper'
|
|
23
22
|
require 'selenium/webdriver/support/select'
|
|
24
23
|
require 'selenium/webdriver/support/color'
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
#
|
|
3
1
|
# Licensed to the Software Freedom Conservancy (SFC) under one
|
|
4
2
|
# or more contributor license agreements. See the NOTICE file
|
|
5
3
|
# distributed with this work for additional information
|
|
@@ -20,7 +18,6 @@
|
|
|
20
18
|
module Selenium
|
|
21
19
|
module WebDriver
|
|
22
20
|
module Support
|
|
23
|
-
|
|
24
21
|
#
|
|
25
22
|
# Subclass and override methods from this class
|
|
26
23
|
# to implement your own event listener.
|
|
@@ -48,24 +45,40 @@ module Selenium
|
|
|
48
45
|
|
|
49
46
|
class AbstractEventListener
|
|
50
47
|
def before_navigate_to(url, driver) end
|
|
48
|
+
|
|
51
49
|
def after_navigate_to(url, driver) end
|
|
50
|
+
|
|
52
51
|
def before_navigate_back(driver) end
|
|
52
|
+
|
|
53
53
|
def after_navigate_back(driver) end
|
|
54
|
+
|
|
54
55
|
def before_navigate_forward(driver) end
|
|
56
|
+
|
|
55
57
|
def after_navigate_forward(driver) end
|
|
58
|
+
|
|
56
59
|
def before_find(by, what, driver) end
|
|
60
|
+
|
|
57
61
|
def after_find(by, what, driver) end
|
|
62
|
+
|
|
58
63
|
def before_click(element, driver) end
|
|
64
|
+
|
|
59
65
|
def after_click(element, driver) end
|
|
66
|
+
|
|
60
67
|
def before_change_value_of(element, driver) end
|
|
68
|
+
|
|
61
69
|
def after_change_value_of(element, driver) end
|
|
70
|
+
|
|
62
71
|
def before_execute_script(script, driver) end
|
|
72
|
+
|
|
63
73
|
def after_execute_script(script, driver) end
|
|
74
|
+
|
|
64
75
|
def before_quit(driver) end
|
|
76
|
+
|
|
65
77
|
def after_quit(driver) end
|
|
78
|
+
|
|
66
79
|
def before_close(driver) end
|
|
67
|
-
def after_close(driver) end
|
|
68
80
|
|
|
81
|
+
def after_close(driver) end
|
|
69
82
|
end # AbstractEventListener
|
|
70
83
|
end # Support
|
|
71
84
|
end # WebDriver
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
#
|
|
3
1
|
# Licensed to the Software Freedom Conservancy (SFC) under one
|
|
4
2
|
# or more contributor license agreements. See the NOTICE file
|
|
5
3
|
# distributed with this work for additional information
|
|
@@ -20,16 +18,14 @@
|
|
|
20
18
|
module Selenium
|
|
21
19
|
module WebDriver
|
|
22
20
|
module Support
|
|
23
|
-
|
|
24
21
|
class BlockEventListener
|
|
25
22
|
def initialize(callback)
|
|
26
23
|
@callback = callback
|
|
27
24
|
end
|
|
28
25
|
|
|
29
|
-
def method_missing(meth, *args
|
|
26
|
+
def method_missing(meth, *args)
|
|
30
27
|
@callback.call meth, *args
|
|
31
28
|
end
|
|
32
|
-
|
|
33
29
|
end # BlockEventListener
|
|
34
30
|
end # Support
|
|
35
31
|
end # WebDriver
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
#
|
|
3
1
|
# Licensed to the Software Freedom Conservancy (SFC) under one
|
|
4
2
|
# or more contributor license agreements. See the NOTICE file
|
|
5
3
|
# distributed with this work for additional information
|
|
@@ -21,33 +19,52 @@ module Selenium
|
|
|
21
19
|
module WebDriver
|
|
22
20
|
module Support
|
|
23
21
|
class Color
|
|
24
|
-
RGB_PATTERN
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
22
|
+
RGB_PATTERN = %r{^\s*rgb\(\s*(\d{1,3})\s*,
|
|
23
|
+
\s*(\d{1,3})\s*,
|
|
24
|
+
\s*(\d{1,3})\s*\)\s*$}x
|
|
25
|
+
RGB_PCT_PATTERN = %r{^\s*rgb\(\s*(\d{1,3}|\d{1,2}\.\d+)%\s*,
|
|
26
|
+
\s*(\d{1,3}|\d{1,2}\.\d+)%\s*,
|
|
27
|
+
\s*(\d{1,3}|\d{1,2}\.\d+)%\s*\)\s*$}x
|
|
28
|
+
RGBA_PATTERN = %r{^\s*rgba\(\s*(\d{1,3})\s*,
|
|
29
|
+
\s*(\d{1,3})\s*,
|
|
30
|
+
\s*(\d{1,3})\s*,
|
|
31
|
+
\s*(0|1|0\.\d+)\s*\)\s*$}x
|
|
32
|
+
RGBA_PCT_PATTERN = %r{^\s*rgba\(\s*(\d{1,3}|\d{1,2}\.\d+)
|
|
33
|
+
%\s*,\s*(\d{1,3}|\d{1,2}\.\d+)
|
|
34
|
+
%\s*,\s*(\d{1,3}|\d{1,2}\.\d+)
|
|
35
|
+
%\s*,\s*(0|1|0\.\d+)\s*\)\s*$}x
|
|
36
|
+
HEX_PATTERN = /#(\h{2})(\h{2})(\h{2})/
|
|
37
|
+
HEX3_PATTERN = /#(\h)(\h)(\h)/
|
|
38
|
+
HSL_PATTERN = %r{^\s*hsl\(\s*(\d{1,3})\s*,
|
|
39
|
+
\s*(\d{1,3})%\s*,
|
|
40
|
+
\s*(\d{1,3})%\s*\)\s*$}x
|
|
41
|
+
HSLA_PATTERN = %r{^\s*hsla\(\s*(\d{1,3})\s*,
|
|
42
|
+
\s*(\d{1,3})%\s*,
|
|
43
|
+
\s*(\d{1,3})%\s*,
|
|
44
|
+
\s*(0|1|0\.\d+)\s*\)\s*$}x
|
|
32
45
|
|
|
33
46
|
attr_reader :red, :green, :blue, :alpha
|
|
34
47
|
|
|
35
48
|
def self.from_string(str)
|
|
36
49
|
case str
|
|
37
50
|
when RGB_PATTERN
|
|
38
|
-
new
|
|
51
|
+
new Regexp.last_match(1), Regexp.last_match(2), Regexp.last_match(3)
|
|
39
52
|
when RGB_PCT_PATTERN
|
|
40
|
-
|
|
53
|
+
array = [Regexp.last_match(1), Regexp.last_match(2), Regexp.last_match(3)]
|
|
54
|
+
new(*array.map { |e| Float(e) / 100 * 255 })
|
|
41
55
|
when RGBA_PATTERN
|
|
42
|
-
new
|
|
56
|
+
new Regexp.last_match(1), Regexp.last_match(2), Regexp.last_match(3), Regexp.last_match(4)
|
|
43
57
|
when RGBA_PCT_PATTERN
|
|
44
|
-
|
|
58
|
+
array = [Regexp.last_match(1), Regexp.last_match(2), Regexp.last_match(3)]
|
|
59
|
+
new(*array.map { |e| Float(e) / 100 * 255 } << Regexp.last_match(4))
|
|
45
60
|
when HEX_PATTERN
|
|
46
|
-
|
|
61
|
+
array = [Regexp.last_match(1), Regexp.last_match(2), Regexp.last_match(3)]
|
|
62
|
+
new(*array.map { |e| e.to_i(16) })
|
|
47
63
|
when HEX3_PATTERN
|
|
48
|
-
|
|
64
|
+
array = [Regexp.last_match(1), Regexp.last_match(2), Regexp.last_match(3)]
|
|
65
|
+
new(*array.map { |e| (e * 2).to_i(16) })
|
|
49
66
|
when HSL_PATTERN, HSLA_PATTERN
|
|
50
|
-
from_hsl(
|
|
67
|
+
from_hsl(Regexp.last_match(1), Regexp.last_match(2), Regexp.last_match(3), Regexp.last_match(4))
|
|
51
68
|
else
|
|
52
69
|
raise ArgumentError, "could not convert #{str.inspect} into color"
|
|
53
70
|
end
|
|
@@ -59,48 +76,47 @@ module Selenium
|
|
|
59
76
|
l = Float(l) / 100
|
|
60
77
|
a = Float(a || 1)
|
|
61
78
|
|
|
62
|
-
if s
|
|
79
|
+
if s.zero?
|
|
63
80
|
r = l
|
|
64
81
|
g = r
|
|
65
82
|
b = r
|
|
66
83
|
else
|
|
67
|
-
luminocity2 =
|
|
84
|
+
luminocity2 = l < 0.5 ? l * (1 + s) : l + s - l * s
|
|
68
85
|
luminocity1 = 2 * l - luminocity2
|
|
69
86
|
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
if hue < 1.0 / 6.0
|
|
75
|
-
(lum1 + (lum2 - lum1) * 6.0 * hue)
|
|
76
|
-
elsif hue < 1.0 / 2.0
|
|
77
|
-
lum2
|
|
78
|
-
elsif hue < 2.0 / 3.0
|
|
79
|
-
lum1 + (lum2 - lum1) * ((2.0 / 3.0) - hue) * 6.0
|
|
80
|
-
else
|
|
81
|
-
lum1
|
|
82
|
-
end
|
|
83
|
-
end
|
|
84
|
-
|
|
85
|
-
r = hue_to_rgb.call(luminocity1, luminocity2, h + 1.0 / 3.0)
|
|
86
|
-
g = hue_to_rgb.call(luminocity1, luminocity2, h)
|
|
87
|
-
b = hue_to_rgb.call(luminocity1, luminocity2, h - 1.0 / 3.0)
|
|
87
|
+
r = hue_to_rgb(luminocity1, luminocity2, h + 1.0 / 3.0)
|
|
88
|
+
g = hue_to_rgb(luminocity1, luminocity2, h)
|
|
89
|
+
b = hue_to_rgb(luminocity1, luminocity2, h - 1.0 / 3.0)
|
|
88
90
|
end
|
|
89
91
|
|
|
90
92
|
new (r * 255).round, (g * 255).round, (b * 255).round, a
|
|
91
93
|
end
|
|
92
94
|
|
|
95
|
+
def self.hue_to_rgb(lum1, lum2, hue)
|
|
96
|
+
hue += 1 if hue < 0.0
|
|
97
|
+
hue -= 1 if hue > 1.0
|
|
98
|
+
|
|
99
|
+
if hue < 1.0 / 6.0
|
|
100
|
+
(lum1 + (lum2 - lum1) * 6.0 * hue)
|
|
101
|
+
elsif hue < 1.0 / 2.0
|
|
102
|
+
lum2
|
|
103
|
+
elsif hue < 2.0 / 3.0
|
|
104
|
+
lum1 + (lum2 - lum1) * ((2.0 / 3.0) - hue) * 6.0
|
|
105
|
+
else
|
|
106
|
+
lum1
|
|
107
|
+
end
|
|
108
|
+
end
|
|
93
109
|
|
|
94
110
|
def initialize(red, green, blue, alpha = 1)
|
|
95
|
-
@red
|
|
111
|
+
@red = Integer(red)
|
|
96
112
|
@green = Integer(green)
|
|
97
|
-
@blue
|
|
113
|
+
@blue = Integer(blue)
|
|
98
114
|
@alpha = Float(alpha)
|
|
99
115
|
end
|
|
100
116
|
|
|
101
117
|
def ==(other)
|
|
102
118
|
return true if equal?(other)
|
|
103
|
-
return false unless other.
|
|
119
|
+
return false unless other.is_a?(self.class)
|
|
104
120
|
|
|
105
121
|
[red, green, blue, alpha] == [other.red, other.green, other.blue, other.alpha]
|
|
106
122
|
end
|
|
@@ -120,9 +136,8 @@ module Selenium
|
|
|
120
136
|
end
|
|
121
137
|
|
|
122
138
|
def hex
|
|
123
|
-
|
|
139
|
+
format '#%02x%02x%02x', red, green, blue
|
|
124
140
|
end
|
|
125
|
-
|
|
126
141
|
end # Color
|
|
127
142
|
end # Support
|
|
128
143
|
end # WebDriver
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# Licensed to the Software Freedom Conservancy (SFC) under one
|
|
2
|
+
# or more contributor license agreements. See the NOTICE file
|
|
3
|
+
# distributed with this work for additional information
|
|
4
|
+
# regarding copyright ownership. The SFC licenses this file
|
|
5
|
+
# to you under the Apache License, Version 2.0 (the
|
|
6
|
+
# "License"); you may not use this file except in compliance
|
|
7
|
+
# with the License. You may obtain a copy of the License at
|
|
8
|
+
#
|
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
#
|
|
11
|
+
# Unless required by applicable law or agreed to in writing,
|
|
12
|
+
# software distributed under the License is distributed on an
|
|
13
|
+
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
14
|
+
# KIND, either express or implied. See the License for the
|
|
15
|
+
# specific language governing permissions and limitations
|
|
16
|
+
# under the License.
|
|
17
|
+
|
|
18
|
+
module Selenium
|
|
19
|
+
module WebDriver
|
|
20
|
+
module Support
|
|
21
|
+
module Escaper
|
|
22
|
+
def self.escape(str)
|
|
23
|
+
if str.include?('"') && str.include?("'")
|
|
24
|
+
parts = str.split('"', -1).map { |part| %("#{part}") }
|
|
25
|
+
|
|
26
|
+
quoted = parts.join(%(, '"', ))
|
|
27
|
+
.gsub(/^"", |, ""$/, '')
|
|
28
|
+
|
|
29
|
+
"concat(#{quoted})"
|
|
30
|
+
elsif str.include?('"')
|
|
31
|
+
# escape string with just a quote into being single quoted: f"oo -> 'f"oo'
|
|
32
|
+
"'#{str}'"
|
|
33
|
+
else
|
|
34
|
+
# otherwise return the quoted string
|
|
35
|
+
%("#{str}")
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end # Escaper
|
|
39
|
+
end # Support
|
|
40
|
+
end # WebDriver
|
|
41
|
+
end # Selenium
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
# encoding: utf-8
|
|
2
|
-
#
|
|
3
1
|
# Licensed to the Software Freedom Conservancy (SFC) under one
|
|
4
2
|
# or more contributor license agreements. See the NOTICE file
|
|
5
3
|
# distributed with this work for additional information
|
|
@@ -20,7 +18,6 @@
|
|
|
20
18
|
module Selenium
|
|
21
19
|
module WebDriver
|
|
22
20
|
module Support
|
|
23
|
-
|
|
24
21
|
#
|
|
25
22
|
# @api private
|
|
26
23
|
#
|
|
@@ -29,69 +26,69 @@ module Selenium
|
|
|
29
26
|
def initialize(delegate, listener)
|
|
30
27
|
@delegate = delegate
|
|
31
28
|
|
|
32
|
-
if listener.respond_to? :call
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
29
|
+
@listener = if listener.respond_to? :call
|
|
30
|
+
BlockEventListener.new(listener)
|
|
31
|
+
else
|
|
32
|
+
listener
|
|
33
|
+
end
|
|
37
34
|
end
|
|
38
35
|
|
|
39
36
|
def get(url)
|
|
40
|
-
dispatch(:navigate_to, url, driver)
|
|
37
|
+
dispatch(:navigate_to, url, driver) do
|
|
41
38
|
@delegate.get(url)
|
|
42
|
-
|
|
39
|
+
end
|
|
43
40
|
end
|
|
44
41
|
|
|
45
|
-
def
|
|
46
|
-
dispatch(:navigate_forward, driver)
|
|
47
|
-
@delegate.
|
|
48
|
-
|
|
42
|
+
def go_forward
|
|
43
|
+
dispatch(:navigate_forward, driver) do
|
|
44
|
+
@delegate.go_forward
|
|
45
|
+
end
|
|
49
46
|
end
|
|
50
47
|
|
|
51
|
-
def
|
|
52
|
-
dispatch(:navigate_back, driver)
|
|
53
|
-
@delegate.
|
|
54
|
-
|
|
48
|
+
def go_back
|
|
49
|
+
dispatch(:navigate_back, driver) do
|
|
50
|
+
@delegate.go_back
|
|
51
|
+
end
|
|
55
52
|
end
|
|
56
53
|
|
|
57
|
-
def
|
|
58
|
-
dispatch(:click, create_element(ref), driver)
|
|
59
|
-
@delegate.
|
|
60
|
-
|
|
54
|
+
def click_element(ref)
|
|
55
|
+
dispatch(:click, create_element(ref), driver) do
|
|
56
|
+
@delegate.click_element(ref)
|
|
57
|
+
end
|
|
61
58
|
end
|
|
62
59
|
|
|
63
|
-
def
|
|
64
|
-
dispatch(:change_value_of, create_element(ref), driver)
|
|
65
|
-
@delegate.
|
|
66
|
-
|
|
60
|
+
def clear_element(ref)
|
|
61
|
+
dispatch(:change_value_of, create_element(ref), driver) do
|
|
62
|
+
@delegate.clear_element(ref)
|
|
63
|
+
end
|
|
67
64
|
end
|
|
68
65
|
|
|
69
|
-
def
|
|
70
|
-
dispatch(:change_value_of, create_element(ref), driver)
|
|
71
|
-
@delegate.
|
|
72
|
-
|
|
66
|
+
def send_keys_to_element(ref, keys)
|
|
67
|
+
dispatch(:change_value_of, create_element(ref), driver) do
|
|
68
|
+
@delegate.send_keys_to_element(ref, keys)
|
|
69
|
+
end
|
|
73
70
|
end
|
|
74
71
|
|
|
75
72
|
def find_element_by(how, what, parent = nil)
|
|
76
|
-
e = dispatch(:find, how, what, driver)
|
|
73
|
+
e = dispatch(:find, how, what, driver) do
|
|
77
74
|
@delegate.find_element_by how, what, parent
|
|
78
|
-
|
|
75
|
+
end
|
|
79
76
|
|
|
80
77
|
Element.new self, e.ref
|
|
81
78
|
end
|
|
82
79
|
|
|
83
80
|
def find_elements_by(how, what, parent = nil)
|
|
84
|
-
es = dispatch(:find, how, what, driver)
|
|
81
|
+
es = dispatch(:find, how, what, driver) do
|
|
85
82
|
@delegate.find_elements_by(how, what, parent)
|
|
86
|
-
|
|
83
|
+
end
|
|
87
84
|
|
|
88
85
|
es.map { |e| Element.new self, e.ref }
|
|
89
86
|
end
|
|
90
87
|
|
|
91
|
-
def
|
|
92
|
-
dispatch(:execute_script, script, driver)
|
|
93
|
-
@delegate.
|
|
94
|
-
|
|
88
|
+
def execute_script(script, *args)
|
|
89
|
+
dispatch(:execute_script, script, driver) do
|
|
90
|
+
@delegate.execute_script(script, *args)
|
|
91
|
+
end
|
|
95
92
|
end
|
|
96
93
|
|
|
97
94
|
def quit
|
|
@@ -113,7 +110,7 @@ module Selenium
|
|
|
113
110
|
@driver ||= Driver.new(self)
|
|
114
111
|
end
|
|
115
112
|
|
|
116
|
-
def dispatch(name, *args
|
|
113
|
+
def dispatch(name, *args)
|
|
117
114
|
@listener.__send__("before_#{name}", *args)
|
|
118
115
|
returned = yield
|
|
119
116
|
@listener.__send__("after_#{name}", *args)
|
|
@@ -125,7 +122,6 @@ module Selenium
|
|
|
125
122
|
@delegate.__send__(meth, *args, &blk)
|
|
126
123
|
end
|
|
127
124
|
end # EventFiringBridge
|
|
128
|
-
|
|
129
125
|
end # Support
|
|
130
126
|
end # WebDriver
|
|
131
127
|
end # Selenium
|