selenium-webdriver 2.24.0 → 2.25.0.rc1
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.
- data/CHANGES +19 -0
- data/lib/selenium/webdriver/common/element.rb +7 -1
- data/lib/selenium/webdriver/common/error.rb +4 -12
- data/lib/selenium/webdriver/common/platform.rb +3 -1
- data/lib/selenium/webdriver/common/port_prober.rb +9 -1
- data/lib/selenium/webdriver/common/wait.rb +4 -1
- data/lib/selenium/webdriver/firefox/extension/webdriver.xpi +0 -0
- data/lib/selenium/webdriver/ie/bridge.rb +9 -1
- data/lib/selenium/webdriver/ie/server.rb +25 -3
- data/lib/selenium/webdriver/remote/http/default.rb +21 -2
- data/lib/selenium/webdriver/support.rb +2 -1
- data/lib/selenium/webdriver/support/color.rb +98 -0
- metadata +6 -5
data/CHANGES
CHANGED
@@ -1,3 +1,22 @@
|
|
1
|
+
2.25.0 (2012-07-19)
|
2
|
+
===================
|
3
|
+
|
4
|
+
* Respect no_proxy / NO_PROXY env vars (#4007).
|
5
|
+
* Improve error message if a configured proxy refuses the connection.
|
6
|
+
* Ignored exception can be configured on the Wait class.
|
7
|
+
* Add Selenium::WebDriver::Support::Color class.
|
8
|
+
* Ignore Errno::ENETUNREACH when trying to detect our local IP (#4165).
|
9
|
+
* Ignore Errno::EADDRNOTAVAIL in PortProber (#3987).
|
10
|
+
* Firefox:
|
11
|
+
* Enumerate through client rects until finding one with non-zero dimensions when clicking.
|
12
|
+
* Updated supported versions of Firefox to 17.
|
13
|
+
* Allow windows to be resized from a frame (#3897).
|
14
|
+
* Fix an issue where a call to submit could hang the driver.
|
15
|
+
* IE:
|
16
|
+
* Ability to configure logging through the :log_file and :log_level options.
|
17
|
+
* Increasing stability of file upload dialog handling (#3858)
|
18
|
+
* Better handling of overflow edge cases when determining element visibility.
|
19
|
+
|
1
20
|
2.24.0 (2012-06-19)
|
2
21
|
===================
|
3
22
|
|
@@ -128,7 +128,13 @@ module Selenium
|
|
128
128
|
alias_method :send_key, :send_keys
|
129
129
|
|
130
130
|
#
|
131
|
-
#
|
131
|
+
# If this element is a text entry element, this will clear the value. Has no effect on other
|
132
|
+
# elements. Text entry elements are INPUT and TEXTAREA elements.
|
133
|
+
#
|
134
|
+
# Note that the events fired by this event may not be as you'd expect. In particular, we don't
|
135
|
+
# fire any keyboard or mouse events. If you want to ensure keyboard events are
|
136
|
+
# fired, consider using #send_keys with the backspace key. To ensure you get a change event,
|
137
|
+
# consider following with a call to #send_keys with the tab key.
|
132
138
|
#
|
133
139
|
|
134
140
|
def clear
|
@@ -188,19 +188,11 @@ module Selenium
|
|
188
188
|
]
|
189
189
|
|
190
190
|
# aliased for backwards compatibility
|
191
|
-
ObsoleteElementError
|
192
|
-
|
193
|
-
# aliased for backwards compatibility
|
194
|
-
UnhandledError = UnknownError
|
195
|
-
|
196
|
-
# aliased for backwards compatibility
|
191
|
+
ObsoleteElementError = StaleElementReferenceError
|
192
|
+
UnhandledError = UnknownError
|
197
193
|
UnexpectedJavascriptError = JavascriptError
|
198
|
-
|
199
|
-
|
200
|
-
NoAlertOpenError = NoAlertPresentError
|
201
|
-
|
202
|
-
# aliased for backwards compatibility
|
203
|
-
ElementNotDisplayedError = ElementNotVisibleError
|
194
|
+
NoAlertOpenError = NoAlertPresentError
|
195
|
+
ElementNotDisplayedError = ElementNotVisibleError
|
204
196
|
|
205
197
|
class << self
|
206
198
|
def for_code(code)
|
@@ -161,13 +161,15 @@ module Selenium
|
|
161
161
|
ensure
|
162
162
|
Socket.do_not_reverse_lookup = orig
|
163
163
|
end
|
164
|
+
rescue Errno::ENETUNREACH
|
165
|
+
# no external ip
|
164
166
|
end
|
165
167
|
|
166
168
|
def interfaces
|
167
169
|
interfaces = Socket.getaddrinfo("localhost", 8080).map { |e| e[3] }
|
168
170
|
interfaces += ["0.0.0.0", Platform.ip]
|
169
171
|
|
170
|
-
interfaces.uniq
|
172
|
+
interfaces.compact.uniq
|
171
173
|
end
|
172
174
|
|
173
175
|
end # Platform
|
@@ -20,7 +20,15 @@ module Selenium
|
|
20
20
|
end
|
21
21
|
|
22
22
|
def self.free?(port)
|
23
|
-
Platform.interfaces.each
|
23
|
+
Platform.interfaces.each do |host|
|
24
|
+
begin
|
25
|
+
TCPServer.new(host, port).close
|
26
|
+
rescue Errno::EADDRNOTAVAIL
|
27
|
+
$stderr.puts "port prober could not bind to #{host}:#{port}" if $DEBUG
|
28
|
+
# ignored - some machines appear unable to bind to some of their interfaces
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
24
32
|
true
|
25
33
|
rescue SocketError, Errno::EADDRINUSE
|
26
34
|
false
|
@@ -12,11 +12,14 @@ module Selenium
|
|
12
12
|
# @option opts [Numeric] :timeout (5) Seconds to wait before timing out.
|
13
13
|
# @option opts [Numeric] :interval (0.2) Seconds to sleep between polls.
|
14
14
|
# @option opts [String] :message Exception mesage if timed out.
|
15
|
+
# @option opts [Array, Exception] :ignore Exceptions to ignore while polling (default: Error::NoSuchElementError)
|
16
|
+
#
|
15
17
|
|
16
18
|
def initialize(opts = {})
|
17
19
|
@timeout = opts.fetch(:timeout, DEFAULT_TIMEOUT)
|
18
20
|
@interval = opts.fetch(:interval, DEFAULT_INTERVAL)
|
19
21
|
@message = opts[:message]
|
22
|
+
@ignored = Array(opts[:ignore] || Error::NoSuchElementError)
|
20
23
|
end
|
21
24
|
|
22
25
|
|
@@ -35,7 +38,7 @@ module Selenium
|
|
35
38
|
begin
|
36
39
|
result = yield
|
37
40
|
return result if result
|
38
|
-
rescue
|
41
|
+
rescue *@ignored => last_error
|
39
42
|
# swallowed
|
40
43
|
end
|
41
44
|
|
Binary file
|
@@ -19,11 +19,19 @@ module Selenium
|
|
19
19
|
ignore_mode = opts.delete(:introduce_flakiness_by_ignoring_security_domains)
|
20
20
|
native_events = opts.delete(:native_events) != false
|
21
21
|
|
22
|
+
@server = Server.get
|
23
|
+
|
24
|
+
# get rid of this when the DLL server is gone
|
25
|
+
if @server.respond_to?(:log_level=)
|
26
|
+
# TODO: docs for these options
|
27
|
+
@server.log_level = opts.delete(:log_level)
|
28
|
+
@server.log_file = opts.delete(:log_file)
|
29
|
+
end
|
30
|
+
|
22
31
|
unless opts.empty?
|
23
32
|
raise ArgumentError, "unknown option#{'s' if opts.size != 1}: #{opts.inspect}"
|
24
33
|
end
|
25
34
|
|
26
|
-
@server = Server.get
|
27
35
|
@port = @server.start Integer(port), timeout
|
28
36
|
|
29
37
|
caps = Remote::Capabilities.internet_explorer
|
@@ -15,11 +15,22 @@ module Selenium
|
|
15
15
|
end
|
16
16
|
end
|
17
17
|
|
18
|
-
|
18
|
+
attr_accessor :log_level, :log_file
|
19
|
+
|
20
|
+
def initialize(binary_path, opts = {})
|
19
21
|
Platform.assert_executable binary_path
|
20
22
|
|
21
23
|
@binary_path = binary_path
|
22
|
-
@process
|
24
|
+
@process = nil
|
25
|
+
|
26
|
+
opts = opts.dup
|
27
|
+
@log_level = opts.delete(:log_level)
|
28
|
+
@log_file = opts.delete(:log_file)
|
29
|
+
|
30
|
+
unless opts.empty?
|
31
|
+
raise ArgumentError, "invalid option#{'s' if opts.size != 1}: #{opts.inspect}"
|
32
|
+
end
|
33
|
+
|
23
34
|
end
|
24
35
|
|
25
36
|
def start(port, timeout)
|
@@ -27,7 +38,7 @@ module Selenium
|
|
27
38
|
|
28
39
|
@port = port
|
29
40
|
|
30
|
-
@process = ChildProcess.new(@binary_path,
|
41
|
+
@process = ChildProcess.new(@binary_path, *server_args)
|
31
42
|
@process.io.inherit! if $DEBUG
|
32
43
|
@process.start
|
33
44
|
|
@@ -58,6 +69,17 @@ module Selenium
|
|
58
69
|
@process && @process.alive?
|
59
70
|
end
|
60
71
|
|
72
|
+
private
|
73
|
+
|
74
|
+
def server_args
|
75
|
+
args = ["--port=#{@port}"]
|
76
|
+
|
77
|
+
args << "--log-level=#{@log_level.to_s.upcase}" if @log_level
|
78
|
+
args << "--log-file=#{@log_file}" if @log_file
|
79
|
+
|
80
|
+
args
|
81
|
+
end
|
82
|
+
|
61
83
|
end
|
62
84
|
end
|
63
85
|
end
|
@@ -50,6 +50,12 @@ module Selenium
|
|
50
50
|
retries += 1
|
51
51
|
|
52
52
|
retry
|
53
|
+
rescue Errno::ECONNREFUSED => ex
|
54
|
+
if use_proxy?
|
55
|
+
raise ex.class, "using proxy: #{proxy.http}"
|
56
|
+
else
|
57
|
+
raise
|
58
|
+
end
|
53
59
|
end
|
54
60
|
|
55
61
|
if response.kind_of? Net::HTTPRedirection
|
@@ -77,7 +83,7 @@ module Selenium
|
|
77
83
|
end
|
78
84
|
|
79
85
|
def new_http_client
|
80
|
-
if
|
86
|
+
if use_proxy?
|
81
87
|
unless proxy.respond_to?(:http) && url = @proxy.http
|
82
88
|
raise Error::WebDriverError, "expected HTTP proxy, got #{@proxy.inspect}"
|
83
89
|
end
|
@@ -94,13 +100,26 @@ module Selenium
|
|
94
100
|
def proxy
|
95
101
|
@proxy ||= (
|
96
102
|
proxy = ENV['http_proxy'] || ENV['HTTP_PROXY']
|
103
|
+
no_proxy = ENV['no_proxy'] || ENV['NO_PROXY']
|
104
|
+
|
97
105
|
if proxy
|
98
106
|
proxy = "http://#{proxy}" unless proxy.start_with?("http://")
|
99
|
-
Proxy.new(:http => proxy)
|
107
|
+
Proxy.new(:http => proxy, :no_proxy => no_proxy)
|
100
108
|
end
|
101
109
|
)
|
102
110
|
end
|
103
111
|
|
112
|
+
def use_proxy?
|
113
|
+
return false if proxy.nil?
|
114
|
+
|
115
|
+
if proxy.no_proxy
|
116
|
+
hosts = proxy.no_proxy.split(",")
|
117
|
+
!(hosts.include?(server_url.host) || hosts.first == "*")
|
118
|
+
else
|
119
|
+
true
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
104
123
|
end # Default
|
105
124
|
end # Http
|
106
125
|
end # Remote
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'selenium/webdriver/support/event_firing_bridge'
|
2
2
|
require 'selenium/webdriver/support/abstract_event_listener'
|
3
3
|
require 'selenium/webdriver/support/block_event_listener'
|
4
|
-
require 'selenium/webdriver/support/select'
|
4
|
+
require 'selenium/webdriver/support/select'
|
5
|
+
require 'selenium/webdriver/support/color'
|
@@ -0,0 +1,98 @@
|
|
1
|
+
module Selenium
|
2
|
+
module WebDriver
|
3
|
+
module Support
|
4
|
+
class Color
|
5
|
+
RGB_PATTERN = /^\s*rgb\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*\)\s*$/
|
6
|
+
RGB_PCT_PATTERN = /^\s*rgb\(\s*(\d{1,3}|\d{1,2}\.\d+)%\s*,\s*(\d{1,3}|\d{1,2}\.\d+)%\s*,\s*(\d{1,3}|\d{1,2}\.\d+)%\s*\)\s*$/
|
7
|
+
RGBA_PATTERN = /^\s*rgba\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(0|1|0\.\d+)\s*\)\s*$/
|
8
|
+
RGBA_PCT_PATTERN = /^\s*rgba\(\s*(\d{1,3}|\d{1,2}\.\d+)%\s*,\s*(\d{1,3}|\d{1,2}\.\d+)%\s*,\s*(\d{1,3}|\d{1,2}\.\d+)%\s*,\s*(0|1|0\.\d+)\s*\)\s*$/
|
9
|
+
HEX_PATTERN = /#([A-Fa-f0-9]{2})([A-Fa-f0-9]{2})([A-Fa-f0-9]{2})/ # \p{XDigit} or \h only works on Ruby 1.9
|
10
|
+
HEX3_PATTERN = /#([A-Fa-f0-9])([A-Fa-f0-9])([A-Fa-f0-9])/ # \p{XDigit} or \h only works on Ruby 1.9
|
11
|
+
HSL_PATTERN = /^\s*hsl\(\s*(\d{1,3})\s*,\s*(\d{1,3})%\s*,\s*(\d{1,3})%\s*\)\s*$/
|
12
|
+
HSLA_PATTERN = /^\s*hsla\(\s*(\d{1,3})\s*,\s*(\d{1,3})%\s*,\s*(\d{1,3})%\s*,\s*(0|1|0\.\d+)\s*\)\s*$/
|
13
|
+
|
14
|
+
attr_reader :red, :green, :blue, :alpha
|
15
|
+
|
16
|
+
def self.from_string(str)
|
17
|
+
case str
|
18
|
+
when RGB_PATTERN
|
19
|
+
new $1, $2, $3
|
20
|
+
when RGB_PCT_PATTERN
|
21
|
+
new(*[$1, $2, $3].map { |e| Float(e) / 100 * 255 })
|
22
|
+
when RGBA_PATTERN
|
23
|
+
new $1, $2, $3, $4
|
24
|
+
when RGBA_PCT_PATTERN
|
25
|
+
new(*[$1, $2, $3].map { |e| Float(e) / 100 * 255 } << $4)
|
26
|
+
when HEX_PATTERN
|
27
|
+
new(*[$1, $2, $3].map { |e| e.to_i(16) })
|
28
|
+
when HEX3_PATTERN
|
29
|
+
new(*[$1, $2, $3].map { |e| (e * 2).to_i(16) })
|
30
|
+
when HSL_PATTERN, HSLA_PATTERN
|
31
|
+
from_hsl($1, $2, $3, $4)
|
32
|
+
else
|
33
|
+
raise ArgumentError, "could not convert #{str.inspect} into color"
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def self.from_hsl(h, s, l, a)
|
38
|
+
h = Float(h) / 360
|
39
|
+
s = Float(s) / 100
|
40
|
+
l = Float(l) / 100
|
41
|
+
a = Float(a || 1)
|
42
|
+
|
43
|
+
if s == 0
|
44
|
+
r = l
|
45
|
+
g = r
|
46
|
+
b = r
|
47
|
+
else
|
48
|
+
luminocity2 = (l < 0.5) ? l * (1 + s) : l + s - l * s
|
49
|
+
luminocity1 = 2 * l - luminocity2
|
50
|
+
|
51
|
+
hue_to_rgb = lambda do |lum1, lum2, hue|
|
52
|
+
hue += 1 if hue < 0.0
|
53
|
+
hue -= 1 if hue > 1.0
|
54
|
+
|
55
|
+
if hue < 1.0 / 6.0
|
56
|
+
(lum1 + (lum2 - lum1) * 6.0 * hue)
|
57
|
+
elsif hue < 1.0 / 2.0
|
58
|
+
lum2
|
59
|
+
elsif hue < 2.0 / 3.0
|
60
|
+
lum1 + (lum2 - lum1) * ((2.0 / 3.0) - hue) * 6.0
|
61
|
+
else
|
62
|
+
lum1
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
r = hue_to_rgb.call(luminocity1, luminocity2, h + 1.0 / 3.0)
|
67
|
+
g = hue_to_rgb.call(luminocity1, luminocity2, h)
|
68
|
+
b = hue_to_rgb.call(luminocity1, luminocity2, h - 1.0 / 3.0)
|
69
|
+
end
|
70
|
+
|
71
|
+
new r * 256, g * 256, b * 256, a
|
72
|
+
end
|
73
|
+
|
74
|
+
|
75
|
+
def initialize(red, green, blue, alpha = 1)
|
76
|
+
@red = Integer(red)
|
77
|
+
@green = Integer(green)
|
78
|
+
@blue = Integer(blue)
|
79
|
+
@alpha = Float(alpha)
|
80
|
+
end
|
81
|
+
|
82
|
+
def rgb
|
83
|
+
"rgb(#{red}, #{green}, #{blue})"
|
84
|
+
end
|
85
|
+
|
86
|
+
def rgba
|
87
|
+
a = alpha == 1 ? '1' : alpha
|
88
|
+
"rgba(#{red}, #{green}, #{blue}, #{a})"
|
89
|
+
end
|
90
|
+
|
91
|
+
def hex
|
92
|
+
"#%02x%02x%02x" % [red, green, blue]
|
93
|
+
end
|
94
|
+
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
metadata
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: selenium-webdriver
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
prerelease:
|
5
|
-
version: 2.
|
4
|
+
prerelease: 7
|
5
|
+
version: 2.25.0.rc1
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Jari Bakken
|
@@ -10,7 +10,7 @@ autorequire:
|
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
12
|
|
13
|
-
date: 2012-
|
13
|
+
date: 2012-07-19 00:00:00 +02:00
|
14
14
|
default_executable:
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
@@ -213,6 +213,7 @@ files:
|
|
213
213
|
- lib/selenium/webdriver/safari/server.rb
|
214
214
|
- lib/selenium/webdriver/support/abstract_event_listener.rb
|
215
215
|
- lib/selenium/webdriver/support/block_event_listener.rb
|
216
|
+
- lib/selenium/webdriver/support/color.rb
|
216
217
|
- lib/selenium/webdriver/support/event_firing_bridge.rb
|
217
218
|
- lib/selenium/webdriver/support/select.rb
|
218
219
|
- CHANGES
|
@@ -236,9 +237,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
236
237
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
237
238
|
none: false
|
238
239
|
requirements:
|
239
|
-
- - "
|
240
|
+
- - ">"
|
240
241
|
- !ruby/object:Gem::Version
|
241
|
-
version:
|
242
|
+
version: 1.3.1
|
242
243
|
requirements: []
|
243
244
|
|
244
245
|
rubyforge_project:
|