selenium-webdriver 2.53.4 → 3.0.0.beta1
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGES +24 -18
- data/README.md +2 -3
- data/lib/selenium/server.rb +64 -68
- data/lib/selenium/webdriver.rb +5 -9
- data/lib/selenium/webdriver/chrome.rb +18 -3
- data/lib/selenium/webdriver/chrome/bridge.rb +13 -16
- data/lib/selenium/webdriver/chrome/profile.rb +7 -9
- data/lib/selenium/webdriver/chrome/service.rb +8 -84
- data/lib/selenium/webdriver/common.rb +1 -2
- data/lib/selenium/webdriver/common/action_builder.rb +28 -38
- data/lib/selenium/webdriver/common/alert.rb +7 -10
- data/lib/selenium/webdriver/common/bridge_helper.rb +10 -15
- data/lib/selenium/webdriver/common/driver.rb +19 -28
- data/lib/selenium/webdriver/common/driver_extensions/has_input_devices.rb +0 -3
- data/lib/selenium/webdriver/common/driver_extensions/has_location.rb +4 -6
- data/lib/selenium/webdriver/common/driver_extensions/has_network_connection.rb +4 -5
- data/lib/selenium/webdriver/common/driver_extensions/has_remote_status.rb +0 -2
- data/lib/selenium/webdriver/common/driver_extensions/has_session_id.rb +0 -2
- data/lib/selenium/webdriver/common/driver_extensions/has_touch_screen.rb +0 -2
- data/lib/selenium/webdriver/common/driver_extensions/has_web_storage.rb +0 -3
- data/lib/selenium/webdriver/common/driver_extensions/rotatable.rb +3 -6
- data/lib/selenium/webdriver/common/driver_extensions/takes_screenshot.rb +2 -5
- data/lib/selenium/webdriver/common/driver_extensions/uploads_files.rb +2 -5
- data/lib/selenium/webdriver/common/element.rb +27 -29
- data/lib/selenium/webdriver/common/error.rb +17 -20
- data/lib/selenium/webdriver/common/file_reaper.rb +3 -9
- data/lib/selenium/webdriver/common/html5/local_storage.rb +6 -8
- data/lib/selenium/webdriver/common/html5/session_storage.rb +6 -8
- data/lib/selenium/webdriver/common/html5/shared_web_storage.rb +6 -15
- data/lib/selenium/webdriver/common/keyboard.rb +7 -12
- data/lib/selenium/webdriver/common/keys.rb +67 -69
- data/lib/selenium/webdriver/common/log_entry.rb +3 -4
- data/lib/selenium/webdriver/common/logs.rb +2 -4
- data/lib/selenium/webdriver/common/mouse.rb +9 -12
- data/lib/selenium/webdriver/common/navigation.rb +2 -4
- data/lib/selenium/webdriver/common/options.rb +16 -19
- data/lib/selenium/webdriver/common/platform.rb +61 -90
- data/lib/selenium/webdriver/common/port_prober.rb +1 -2
- data/lib/selenium/webdriver/common/profile_helper.rb +5 -8
- data/lib/selenium/webdriver/common/proxy.rb +58 -70
- data/lib/selenium/webdriver/common/search_context.rb +15 -19
- data/lib/selenium/webdriver/common/service.rb +127 -0
- data/lib/selenium/webdriver/common/socket_lock.rb +5 -11
- data/lib/selenium/webdriver/common/socket_poller.rb +4 -9
- data/lib/selenium/webdriver/common/target_locator.rb +11 -13
- data/lib/selenium/webdriver/common/timeouts.rb +4 -6
- data/lib/selenium/webdriver/common/touch_action_builder.rb +2 -4
- data/lib/selenium/webdriver/common/touch_screen.rb +15 -18
- data/lib/selenium/webdriver/common/w3c_error.rb +3 -6
- data/lib/selenium/webdriver/common/wait.rb +6 -11
- data/lib/selenium/webdriver/common/window.rb +12 -15
- data/lib/selenium/webdriver/common/zipper.rb +6 -8
- data/lib/selenium/webdriver/edge.rb +18 -3
- data/lib/selenium/webdriver/edge/bridge.rb +11 -16
- data/lib/selenium/webdriver/edge/legacy_support.rb +38 -39
- data/lib/selenium/webdriver/edge/service.rb +8 -82
- data/lib/selenium/webdriver/firefox.rb +25 -6
- data/lib/selenium/webdriver/firefox/binary.rb +37 -53
- data/lib/selenium/webdriver/firefox/bridge.rb +3 -6
- data/lib/selenium/webdriver/firefox/extension.rb +4 -6
- data/lib/selenium/webdriver/firefox/extension/prefs.json +1 -10
- data/lib/selenium/webdriver/firefox/extension/webdriver.xpi +0 -0
- data/lib/selenium/webdriver/firefox/launcher.rb +8 -11
- data/lib/selenium/webdriver/firefox/profile.rb +40 -42
- data/lib/selenium/webdriver/firefox/profiles_ini.rb +8 -15
- data/lib/selenium/webdriver/firefox/service.rb +23 -79
- data/lib/selenium/webdriver/firefox/util.rb +0 -2
- data/lib/selenium/webdriver/firefox/w3c_bridge.rb +2 -4
- data/lib/selenium/webdriver/ie.rb +16 -7
- data/lib/selenium/webdriver/ie/bridge.rb +16 -23
- data/lib/selenium/webdriver/{iphone.rb → ie/service.rb} +26 -4
- data/lib/selenium/webdriver/phantomjs.rb +8 -3
- data/lib/selenium/webdriver/phantomjs/bridge.rb +9 -11
- data/lib/selenium/webdriver/phantomjs/service.rb +17 -81
- data/lib/selenium/webdriver/remote.rb +0 -2
- data/lib/selenium/webdriver/remote/bridge.rb +193 -191
- data/lib/selenium/webdriver/remote/capabilities.rb +60 -90
- data/lib/selenium/webdriver/remote/commands.rb +197 -192
- data/lib/selenium/webdriver/remote/http/common.rb +15 -13
- data/lib/selenium/webdriver/remote/http/curb.rb +5 -9
- data/lib/selenium/webdriver/remote/http/default.rb +32 -37
- data/lib/selenium/webdriver/remote/http/persistent.rb +4 -6
- data/lib/selenium/webdriver/remote/response.rb +13 -21
- data/lib/selenium/webdriver/remote/server_error.rb +1 -3
- data/lib/selenium/webdriver/remote/w3c_bridge.rb +200 -195
- data/lib/selenium/webdriver/remote/w3c_capabilities.rb +38 -46
- data/lib/selenium/webdriver/remote/w3c_commands.rb +116 -113
- data/lib/selenium/webdriver/safari.rb +23 -7
- data/lib/selenium/{client/javascript_frameworks/jquery.rb → webdriver/safari/apple_bridge.rb} +28 -9
- data/lib/selenium/webdriver/safari/browser.rb +0 -2
- data/lib/selenium/webdriver/safari/{bridge.rb → legacy_bridge.rb} +12 -9
- data/lib/selenium/webdriver/safari/options.rb +3 -4
- data/lib/selenium/webdriver/safari/resources/client.js +56 -7255
- data/lib/selenium/webdriver/safari/server.rb +18 -24
- data/lib/selenium/{client/javascript_frameworks/prototype.rb → webdriver/safari/service.rb} +27 -9
- data/lib/selenium/webdriver/support.rb +1 -0
- data/lib/selenium/webdriver/support/abstract_event_listener.rb +17 -2
- data/lib/selenium/webdriver/support/block_event_listener.rb +1 -3
- data/lib/selenium/webdriver/support/color.rb +55 -38
- data/lib/selenium/webdriver/{android.rb → support/escaper.rb} +19 -4
- data/lib/selenium/webdriver/support/event_firing_bridge.rb +36 -38
- data/lib/selenium/webdriver/support/select.rb +33 -84
- data/selenium-webdriver.gemspec +23 -23
- metadata +19 -30
- 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/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/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/ie/server.rb +0 -133
- data/lib/selenium/webdriver/iphone/bridge.rb +0 -64
@@ -20,7 +20,6 @@
|
|
20
20
|
module Selenium
|
21
21
|
module WebDriver
|
22
22
|
module Safari
|
23
|
-
|
24
23
|
class Server
|
25
24
|
SOCKET_LOCK_TIMEOUT = 45
|
26
25
|
|
@@ -47,16 +46,17 @@ module Selenium
|
|
47
46
|
json = JSON.generate(command)
|
48
47
|
puts ">>> #{json}" if $DEBUG
|
49
48
|
|
50
|
-
frame = WebSocket::Frame::Outgoing::Server.new(:
|
49
|
+
frame = WebSocket::Frame::Outgoing::Server.new(version: @version, data: json, type: :text)
|
51
50
|
|
52
51
|
@ws.write frame.to_s
|
53
52
|
@ws.flush
|
54
53
|
end
|
55
54
|
|
56
55
|
def receive
|
57
|
-
@frame ||= WebSocket::Frame::Incoming::Server.new(:
|
56
|
+
@frame ||= WebSocket::Frame::Incoming::Server.new(version: @version)
|
58
57
|
|
59
|
-
|
58
|
+
msg = nil
|
59
|
+
until msg
|
60
60
|
end_time = Time.now + @command_timeout
|
61
61
|
|
62
62
|
begin
|
@@ -64,7 +64,7 @@ module Selenium
|
|
64
64
|
rescue Errno::EWOULDBLOCK, Errno::EAGAIN
|
65
65
|
now = Time.now
|
66
66
|
if now >= end_time
|
67
|
-
raise Error::TimeOutError,
|
67
|
+
raise Error::TimeOutError, 'timed out waiting for Safari to respond'
|
68
68
|
end
|
69
69
|
|
70
70
|
IO.select([@ws], nil, nil, end_time - now)
|
@@ -72,6 +72,7 @@ module Selenium
|
|
72
72
|
end
|
73
73
|
|
74
74
|
@frame << data
|
75
|
+
msg = @frame.next
|
75
76
|
end
|
76
77
|
|
77
78
|
puts "<<< #{msg}" if $DEBUG
|
@@ -93,13 +94,14 @@ module Selenium
|
|
93
94
|
process_handshake
|
94
95
|
end
|
95
96
|
|
96
|
-
|
97
|
+
def headers
|
98
|
+
headers = <<-headers
|
97
99
|
HTTP/1.1 %d %s
|
98
100
|
Content-Type: text/html; charset=utf-8
|
99
101
|
Server: safaridriver-ruby
|
100
|
-
|
101
|
-
|
102
|
-
|
102
|
+
headers
|
103
|
+
headers.gsub!("\n", "\r\n")
|
104
|
+
end
|
103
105
|
|
104
106
|
def html
|
105
107
|
"<!DOCTYPE html><script>#{Safari.resource_path.join('client.js').read}</script>"
|
@@ -109,19 +111,17 @@ Server: safaridriver-ruby
|
|
109
111
|
http = @server.accept
|
110
112
|
|
111
113
|
req = ''
|
112
|
-
until req.include?("\r\n\r\n")
|
113
|
-
req << http.read(1)
|
114
|
-
end
|
114
|
+
req << http.read(1) until req.include?("\r\n\r\n")
|
115
115
|
|
116
|
-
if !req.include?(
|
117
|
-
http <<
|
116
|
+
if !req.include?('?url=')
|
117
|
+
http << format(headers, 302, 'Moved Temporarily')
|
118
118
|
http << "Location: #{uri}?url=#{encode_form_component ws_uri}\r\n"
|
119
119
|
http << "\r\n\r\n"
|
120
120
|
http.close
|
121
121
|
|
122
122
|
process_initial_http_request
|
123
123
|
else
|
124
|
-
http <<
|
124
|
+
http << format(headers, 200, 'OK')
|
125
125
|
http << "\r\n\r\n"
|
126
126
|
http << html
|
127
127
|
http.close
|
@@ -130,7 +130,7 @@ Server: safaridriver-ruby
|
|
130
130
|
|
131
131
|
def process_handshake
|
132
132
|
@ws = @server.accept
|
133
|
-
hs
|
133
|
+
hs = WebSocket::Handshake::Server.new
|
134
134
|
|
135
135
|
req = ''
|
136
136
|
until hs.finished?
|
@@ -141,7 +141,7 @@ Server: safaridriver-ruby
|
|
141
141
|
end
|
142
142
|
|
143
143
|
unless hs.valid?
|
144
|
-
if req.include?
|
144
|
+
if req.include? 'favicon.ico'
|
145
145
|
@ws.close
|
146
146
|
process_handshake
|
147
147
|
return
|
@@ -159,12 +159,7 @@ Server: safaridriver-ruby
|
|
159
159
|
end
|
160
160
|
|
161
161
|
def encode_form_component(str)
|
162
|
-
|
163
|
-
URI.encode_www_form_component(str)
|
164
|
-
else
|
165
|
-
# best effort for 1.8
|
166
|
-
str.gsub(":", '%3A').gsub('/', '%2F')
|
167
|
-
end
|
162
|
+
URI.encode_www_form_component(str)
|
168
163
|
end
|
169
164
|
|
170
165
|
private
|
@@ -180,7 +175,6 @@ Server: safaridriver-ruby
|
|
180
175
|
def socket_lock
|
181
176
|
@socket_lock ||= SocketLock.new(@port - 1, SOCKET_LOCK_TIMEOUT)
|
182
177
|
end
|
183
|
-
|
184
178
|
end # Server
|
185
179
|
end # Safari
|
186
180
|
end # WebDriver
|
@@ -18,15 +18,33 @@
|
|
18
18
|
# under the License.
|
19
19
|
|
20
20
|
module Selenium
|
21
|
-
module
|
22
|
-
module
|
23
|
-
|
21
|
+
module WebDriver
|
22
|
+
module Safari
|
23
|
+
#
|
24
|
+
# @api private
|
25
|
+
#
|
24
26
|
|
25
|
-
|
26
|
-
|
27
|
+
class Service < WebDriver::Service
|
28
|
+
DEFAULT_PORT = 7050
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
def start_process
|
33
|
+
server_command = [@executable_path, "--port=#{@port}", *@extra_args]
|
34
|
+
@process = ChildProcess.build(*server_command)
|
35
|
+
|
36
|
+
@process.io.inherit! if $DEBUG
|
37
|
+
@process.start
|
27
38
|
end
|
28
39
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
40
|
+
def stop_server
|
41
|
+
connect_to_server { |http| http.head('/shutdown') }
|
42
|
+
end
|
43
|
+
|
44
|
+
def cannot_connect_error_text
|
45
|
+
"unable to connect to safaridriver #{@host}:#{@port}"
|
46
|
+
end
|
47
|
+
end # Service
|
48
|
+
end # Safari
|
49
|
+
end # WebDriver
|
50
|
+
end # Selenium
|
@@ -20,5 +20,6 @@
|
|
20
20
|
require 'selenium/webdriver/support/event_firing_bridge'
|
21
21
|
require 'selenium/webdriver/support/abstract_event_listener'
|
22
22
|
require 'selenium/webdriver/support/block_event_listener'
|
23
|
+
require 'selenium/webdriver/support/escaper'
|
23
24
|
require 'selenium/webdriver/support/select'
|
24
25
|
require 'selenium/webdriver/support/color'
|
@@ -20,7 +20,6 @@
|
|
20
20
|
module Selenium
|
21
21
|
module WebDriver
|
22
22
|
module Support
|
23
|
-
|
24
23
|
#
|
25
24
|
# Subclass and override methods from this class
|
26
25
|
# to implement your own event listener.
|
@@ -48,24 +47,40 @@ module Selenium
|
|
48
47
|
|
49
48
|
class AbstractEventListener
|
50
49
|
def before_navigate_to(url, driver) end
|
50
|
+
|
51
51
|
def after_navigate_to(url, driver) end
|
52
|
+
|
52
53
|
def before_navigate_back(driver) end
|
54
|
+
|
53
55
|
def after_navigate_back(driver) end
|
56
|
+
|
54
57
|
def before_navigate_forward(driver) end
|
58
|
+
|
55
59
|
def after_navigate_forward(driver) end
|
60
|
+
|
56
61
|
def before_find(by, what, driver) end
|
62
|
+
|
57
63
|
def after_find(by, what, driver) end
|
64
|
+
|
58
65
|
def before_click(element, driver) end
|
66
|
+
|
59
67
|
def after_click(element, driver) end
|
68
|
+
|
60
69
|
def before_change_value_of(element, driver) end
|
70
|
+
|
61
71
|
def after_change_value_of(element, driver) end
|
72
|
+
|
62
73
|
def before_execute_script(script, driver) end
|
74
|
+
|
63
75
|
def after_execute_script(script, driver) end
|
76
|
+
|
64
77
|
def before_quit(driver) end
|
78
|
+
|
65
79
|
def after_quit(driver) end
|
80
|
+
|
66
81
|
def before_close(driver) end
|
67
|
-
def after_close(driver) end
|
68
82
|
|
83
|
+
def after_close(driver) end
|
69
84
|
end # AbstractEventListener
|
70
85
|
end # Support
|
71
86
|
end # WebDriver
|
@@ -20,16 +20,14 @@
|
|
20
20
|
module Selenium
|
21
21
|
module WebDriver
|
22
22
|
module Support
|
23
|
-
|
24
23
|
class BlockEventListener
|
25
24
|
def initialize(callback)
|
26
25
|
@callback = callback
|
27
26
|
end
|
28
27
|
|
29
|
-
def method_missing(meth, *args
|
28
|
+
def method_missing(meth, *args)
|
30
29
|
@callback.call meth, *args
|
31
30
|
end
|
32
|
-
|
33
31
|
end # BlockEventListener
|
34
32
|
end # Support
|
35
33
|
end # WebDriver
|
@@ -21,33 +21,52 @@ module Selenium
|
|
21
21
|
module WebDriver
|
22
22
|
module Support
|
23
23
|
class Color
|
24
|
-
RGB_PATTERN
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
24
|
+
RGB_PATTERN = %r{^\s*rgb\(\s*(\d{1,3})\s*,
|
25
|
+
\s*(\d{1,3})\s*,
|
26
|
+
\s*(\d{1,3})\s*\)\s*$}x
|
27
|
+
RGB_PCT_PATTERN = %r{^\s*rgb\(\s*(\d{1,3}|\d{1,2}\.\d+)%\s*,
|
28
|
+
\s*(\d{1,3}|\d{1,2}\.\d+)%\s*,
|
29
|
+
\s*(\d{1,3}|\d{1,2}\.\d+)%\s*\)\s*$}x
|
30
|
+
RGBA_PATTERN = %r{^\s*rgba\(\s*(\d{1,3})\s*,
|
31
|
+
\s*(\d{1,3})\s*,
|
32
|
+
\s*(\d{1,3})\s*,
|
33
|
+
\s*(0|1|0\.\d+)\s*\)\s*$}x
|
34
|
+
RGBA_PCT_PATTERN = %r{^\s*rgba\(\s*(\d{1,3}|\d{1,2}\.\d+)
|
35
|
+
%\s*,\s*(\d{1,3}|\d{1,2}\.\d+)
|
36
|
+
%\s*,\s*(\d{1,3}|\d{1,2}\.\d+)
|
37
|
+
%\s*,\s*(0|1|0\.\d+)\s*\)\s*$}x
|
38
|
+
HEX_PATTERN = /#(\h{2})(\h{2})(\h{2})/
|
39
|
+
HEX3_PATTERN = /#(\h)(\h)(\h)/
|
40
|
+
HSL_PATTERN = %r{^\s*hsl\(\s*(\d{1,3})\s*,
|
41
|
+
\s*(\d{1,3})%\s*,
|
42
|
+
\s*(\d{1,3})%\s*\)\s*$}x
|
43
|
+
HSLA_PATTERN = %r{^\s*hsla\(\s*(\d{1,3})\s*,
|
44
|
+
\s*(\d{1,3})%\s*,
|
45
|
+
\s*(\d{1,3})%\s*,
|
46
|
+
\s*(0|1|0\.\d+)\s*\)\s*$}x
|
32
47
|
|
33
48
|
attr_reader :red, :green, :blue, :alpha
|
34
49
|
|
35
50
|
def self.from_string(str)
|
36
51
|
case str
|
37
52
|
when RGB_PATTERN
|
38
|
-
new
|
53
|
+
new Regexp.last_match(1), Regexp.last_match(2), Regexp.last_match(3)
|
39
54
|
when RGB_PCT_PATTERN
|
40
|
-
|
55
|
+
array = [Regexp.last_match(1), Regexp.last_match(2), Regexp.last_match(3)]
|
56
|
+
new(*array.map { |e| Float(e) / 100 * 255 })
|
41
57
|
when RGBA_PATTERN
|
42
|
-
new
|
58
|
+
new Regexp.last_match(1), Regexp.last_match(2), Regexp.last_match(3), Regexp.last_match(4)
|
43
59
|
when RGBA_PCT_PATTERN
|
44
|
-
|
60
|
+
array = [Regexp.last_match(1), Regexp.last_match(2), Regexp.last_match(3)]
|
61
|
+
new(*array.map { |e| Float(e) / 100 * 255 } << Regexp.last_match(4))
|
45
62
|
when HEX_PATTERN
|
46
|
-
|
63
|
+
array = [Regexp.last_match(1), Regexp.last_match(2), Regexp.last_match(3)]
|
64
|
+
new(*array.map { |e| e.to_i(16) })
|
47
65
|
when HEX3_PATTERN
|
48
|
-
|
66
|
+
array = [Regexp.last_match(1), Regexp.last_match(2), Regexp.last_match(3)]
|
67
|
+
new(*array.map { |e| (e * 2).to_i(16) })
|
49
68
|
when HSL_PATTERN, HSLA_PATTERN
|
50
|
-
from_hsl(
|
69
|
+
from_hsl(Regexp.last_match(1), Regexp.last_match(2), Regexp.last_match(3), Regexp.last_match(4))
|
51
70
|
else
|
52
71
|
raise ArgumentError, "could not convert #{str.inspect} into color"
|
53
72
|
end
|
@@ -67,40 +86,39 @@ module Selenium
|
|
67
86
|
luminocity2 = (l < 0.5) ? l * (1 + s) : l + s - l * s
|
68
87
|
luminocity1 = 2 * l - luminocity2
|
69
88
|
|
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)
|
89
|
+
r = hue_to_rgb(luminocity1, luminocity2, h + 1.0 / 3.0)
|
90
|
+
g = hue_to_rgb(luminocity1, luminocity2, h)
|
91
|
+
b = hue_to_rgb(luminocity1, luminocity2, h - 1.0 / 3.0)
|
88
92
|
end
|
89
93
|
|
90
94
|
new (r * 255).round, (g * 255).round, (b * 255).round, a
|
91
95
|
end
|
92
96
|
|
97
|
+
def self.hue_to_rgb(lum1, lum2, hue)
|
98
|
+
hue += 1 if hue < 0.0
|
99
|
+
hue -= 1 if hue > 1.0
|
100
|
+
|
101
|
+
if hue < 1.0 / 6.0
|
102
|
+
(lum1 + (lum2 - lum1) * 6.0 * hue)
|
103
|
+
elsif hue < 1.0 / 2.0
|
104
|
+
lum2
|
105
|
+
elsif hue < 2.0 / 3.0
|
106
|
+
lum1 + (lum2 - lum1) * ((2.0 / 3.0) - hue) * 6.0
|
107
|
+
else
|
108
|
+
lum1
|
109
|
+
end
|
110
|
+
end
|
93
111
|
|
94
112
|
def initialize(red, green, blue, alpha = 1)
|
95
|
-
@red
|
113
|
+
@red = Integer(red)
|
96
114
|
@green = Integer(green)
|
97
|
-
@blue
|
115
|
+
@blue = Integer(blue)
|
98
116
|
@alpha = Float(alpha)
|
99
117
|
end
|
100
118
|
|
101
119
|
def ==(other)
|
102
120
|
return true if equal?(other)
|
103
|
-
return false unless other.
|
121
|
+
return false unless other.is_a?(self.class)
|
104
122
|
|
105
123
|
[red, green, blue, alpha] == [other.red, other.green, other.blue, other.alpha]
|
106
124
|
end
|
@@ -120,9 +138,8 @@ module Selenium
|
|
120
138
|
end
|
121
139
|
|
122
140
|
def hex
|
123
|
-
|
141
|
+
format '#%02x%02x%02x', red, green, blue
|
124
142
|
end
|
125
|
-
|
126
143
|
end # Color
|
127
144
|
end # Support
|
128
145
|
end # WebDriver
|
@@ -19,10 +19,25 @@
|
|
19
19
|
|
20
20
|
module Selenium
|
21
21
|
module WebDriver
|
22
|
-
module
|
22
|
+
module Support
|
23
|
+
module Escaper
|
24
|
+
def self.escape(str)
|
25
|
+
if str.include?('"') && str.include?("'")
|
26
|
+
parts = str.split('"', -1).map { |part| %("#{part}") }
|
23
27
|
|
24
|
-
|
28
|
+
quoted = parts.join(%(, '"', ))
|
29
|
+
.gsub(/^"", |, ""$/, '')
|
30
|
+
|
31
|
+
"concat(#{quoted})"
|
32
|
+
elsif str.include?('"')
|
33
|
+
# escape string with just a quote into being single quoted: f"oo -> 'f"oo'
|
34
|
+
"'#{str}'"
|
35
|
+
else
|
36
|
+
# otherwise return the quoted string
|
37
|
+
%("#{str}")
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end # Escaper
|
41
|
+
end # Support
|
25
42
|
end # WebDriver
|
26
43
|
end # Selenium
|
27
|
-
|
28
|
-
require 'selenium/webdriver/android/bridge'
|
@@ -20,7 +20,6 @@
|
|
20
20
|
module Selenium
|
21
21
|
module WebDriver
|
22
22
|
module Support
|
23
|
-
|
24
23
|
#
|
25
24
|
# @api private
|
26
25
|
#
|
@@ -29,69 +28,69 @@ module Selenium
|
|
29
28
|
def initialize(delegate, listener)
|
30
29
|
@delegate = delegate
|
31
30
|
|
32
|
-
if listener.respond_to? :call
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
31
|
+
@listener = if listener.respond_to? :call
|
32
|
+
BlockEventListener.new(listener)
|
33
|
+
else
|
34
|
+
listener
|
35
|
+
end
|
37
36
|
end
|
38
37
|
|
39
38
|
def get(url)
|
40
|
-
dispatch(:navigate_to, url, driver)
|
39
|
+
dispatch(:navigate_to, url, driver) do
|
41
40
|
@delegate.get(url)
|
42
|
-
|
41
|
+
end
|
43
42
|
end
|
44
43
|
|
45
|
-
def
|
46
|
-
dispatch(:navigate_forward, driver)
|
47
|
-
@delegate.
|
48
|
-
|
44
|
+
def go_forward
|
45
|
+
dispatch(:navigate_forward, driver) do
|
46
|
+
@delegate.go_forward
|
47
|
+
end
|
49
48
|
end
|
50
49
|
|
51
|
-
def
|
52
|
-
dispatch(:navigate_back, driver)
|
53
|
-
@delegate.
|
54
|
-
|
50
|
+
def go_back
|
51
|
+
dispatch(:navigate_back, driver) do
|
52
|
+
@delegate.go_back
|
53
|
+
end
|
55
54
|
end
|
56
55
|
|
57
|
-
def
|
58
|
-
dispatch(:click, create_element(ref), driver)
|
59
|
-
@delegate.
|
60
|
-
|
56
|
+
def click_element(ref)
|
57
|
+
dispatch(:click, create_element(ref), driver) do
|
58
|
+
@delegate.click_element(ref)
|
59
|
+
end
|
61
60
|
end
|
62
61
|
|
63
|
-
def
|
64
|
-
dispatch(:change_value_of, create_element(ref), driver)
|
65
|
-
@delegate.
|
66
|
-
|
62
|
+
def clear_element(ref)
|
63
|
+
dispatch(:change_value_of, create_element(ref), driver) do
|
64
|
+
@delegate.clear_element(ref)
|
65
|
+
end
|
67
66
|
end
|
68
67
|
|
69
|
-
def
|
70
|
-
dispatch(:change_value_of, create_element(ref), driver)
|
71
|
-
@delegate.
|
72
|
-
|
68
|
+
def send_keys_to_element(ref, keys)
|
69
|
+
dispatch(:change_value_of, create_element(ref), driver) do
|
70
|
+
@delegate.send_keys_to_element(ref, keys)
|
71
|
+
end
|
73
72
|
end
|
74
73
|
|
75
74
|
def find_element_by(how, what, parent = nil)
|
76
|
-
e = dispatch(:find, how, what, driver)
|
75
|
+
e = dispatch(:find, how, what, driver) do
|
77
76
|
@delegate.find_element_by how, what, parent
|
78
|
-
|
77
|
+
end
|
79
78
|
|
80
79
|
Element.new self, e.ref
|
81
80
|
end
|
82
81
|
|
83
82
|
def find_elements_by(how, what, parent = nil)
|
84
|
-
es = dispatch(:find, how, what, driver)
|
83
|
+
es = dispatch(:find, how, what, driver) do
|
85
84
|
@delegate.find_elements_by(how, what, parent)
|
86
|
-
|
85
|
+
end
|
87
86
|
|
88
87
|
es.map { |e| Element.new self, e.ref }
|
89
88
|
end
|
90
89
|
|
91
|
-
def
|
92
|
-
dispatch(:execute_script, script, driver)
|
93
|
-
@delegate.
|
94
|
-
|
90
|
+
def execute_script(script, *args)
|
91
|
+
dispatch(:execute_script, script, driver) do
|
92
|
+
@delegate.execute_script(script, *args)
|
93
|
+
end
|
95
94
|
end
|
96
95
|
|
97
96
|
def quit
|
@@ -113,7 +112,7 @@ module Selenium
|
|
113
112
|
@driver ||= Driver.new(self)
|
114
113
|
end
|
115
114
|
|
116
|
-
def dispatch(name, *args
|
115
|
+
def dispatch(name, *args)
|
117
116
|
@listener.__send__("before_#{name}", *args)
|
118
117
|
returned = yield
|
119
118
|
@listener.__send__("after_#{name}", *args)
|
@@ -125,7 +124,6 @@ module Selenium
|
|
125
124
|
@delegate.__send__(meth, *args, &blk)
|
126
125
|
end
|
127
126
|
end # EventFiringBridge
|
128
|
-
|
129
127
|
end # Support
|
130
128
|
end # WebDriver
|
131
129
|
end # Selenium
|