selenium-webdriver 0.0.27 → 0.0.28
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGES +9 -0
- data/lib/selenium/webdriver/chrome/bridge.rb +10 -3
- data/lib/selenium/webdriver/chrome/extension.zip +0 -0
- data/lib/selenium/webdriver/chrome/launcher.rb +13 -6
- data/lib/selenium/webdriver/driver.rb +12 -6
- data/lib/selenium/webdriver/element.rb +9 -0
- data/lib/selenium/webdriver/firefox/binary.rb +1 -1
- data/lib/selenium/webdriver/firefox/extension/webdriver.xpi +0 -0
- data/lib/selenium/webdriver/firefox/launcher.rb +5 -5
- data/lib/selenium/webdriver/firefox/profile.rb +5 -6
- data/lib/selenium/webdriver/ie/bridge.rb +10 -3
- data/lib/selenium/webdriver/ie/native/win32/InternetExplorerDriver.dll +0 -0
- data/lib/selenium/webdriver/ie/native/x64/InternetExplorerDriver.dll +0 -0
- data/lib/selenium/webdriver/remote/bridge.rb +4 -0
- data/lib/selenium/webdriver/remote/response.rb +32 -3
- data/lib/selenium/webdriver/zip_helper.rb +1 -4
- metadata +3 -3
data/CHANGES
CHANGED
@@ -1,3 +1,12 @@
|
|
1
|
+
0.0.28 (2010-08-23)
|
2
|
+
===================
|
3
|
+
|
4
|
+
* Fix behaviour of Element#==, Element#eql? and Element#hash (#hash still has issues on IE / remote).
|
5
|
+
* Include remote server backtrace in raised errors (if available).
|
6
|
+
* Chrome: Untrusted certificate support.
|
7
|
+
* IE: Fix NoMethodError when getElementAttribute returns nil.
|
8
|
+
* Driver#[] shorthand can take a locator hash, not just an id string.
|
9
|
+
|
1
10
|
0.0.27 (2010-07-22)
|
2
11
|
===================
|
3
12
|
|
@@ -6,9 +6,12 @@ module Selenium
|
|
6
6
|
class Bridge < Remote::Bridge
|
7
7
|
|
8
8
|
def initialize(opts = {})
|
9
|
-
@
|
9
|
+
@launcher = Launcher.launcher(
|
10
|
+
:default_profile => opts[:default_profile],
|
11
|
+
:secure_ssl => opts[:secure_ssl]
|
12
|
+
)
|
10
13
|
|
11
|
-
@
|
14
|
+
@executor = CommandExecutor.new
|
12
15
|
@launcher.launch(@executor.uri)
|
13
16
|
end
|
14
17
|
|
@@ -66,6 +69,10 @@ module Selenium
|
|
66
69
|
execute :implicitlyWait, :ms => milliseconds
|
67
70
|
end
|
68
71
|
|
72
|
+
def elementEquals(element, other)
|
73
|
+
element.ref == other.ref
|
74
|
+
end
|
75
|
+
|
69
76
|
private
|
70
77
|
|
71
78
|
def execute(command_name, opts = {}, args = nil)
|
@@ -117,4 +124,4 @@ module Selenium
|
|
117
124
|
end # Bridge
|
118
125
|
end # Chrome
|
119
126
|
end # WebDriver
|
120
|
-
end # Selenium
|
127
|
+
end # Selenium
|
Binary file
|
@@ -24,8 +24,8 @@ module Selenium
|
|
24
24
|
end
|
25
25
|
|
26
26
|
def initialize(opts = {})
|
27
|
-
super()
|
28
27
|
@default_profile = opts[:default_profile]
|
28
|
+
@secure_ssl = !!opts[:secure_ssl]
|
29
29
|
end
|
30
30
|
|
31
31
|
def self.binary_path
|
@@ -81,6 +81,10 @@ module Selenium
|
|
81
81
|
args << "--user-data-dir=#{Platform.wrap_in_quotes_if_necessary tmp_profile_dir}"
|
82
82
|
end
|
83
83
|
|
84
|
+
unless @secure_ssl
|
85
|
+
args << "--ignore-certificate-errors"
|
86
|
+
end
|
87
|
+
|
84
88
|
args << server_url
|
85
89
|
|
86
90
|
@process = ChildProcess.new(*args).start
|
@@ -91,23 +95,23 @@ module Selenium
|
|
91
95
|
end
|
92
96
|
|
93
97
|
def tmp_extension_dir
|
94
|
-
@tmp_extension_dir ||=
|
98
|
+
@tmp_extension_dir ||= (
|
95
99
|
dir = Dir.mktmpdir("webdriver-chrome-extension")
|
96
100
|
Platform.make_writable(dir)
|
97
101
|
FileReaper << dir
|
98
102
|
|
99
103
|
dir
|
100
|
-
|
104
|
+
)
|
101
105
|
end
|
102
106
|
|
103
107
|
def tmp_profile_dir
|
104
|
-
@tmp_profile_dir ||=
|
108
|
+
@tmp_profile_dir ||= (
|
105
109
|
dir = Dir.mktmpdir("webdriver-chrome-profile")
|
106
110
|
Platform.make_writable(dir)
|
107
111
|
FileReaper << dir
|
108
112
|
|
109
113
|
dir
|
110
|
-
|
114
|
+
)
|
111
115
|
end
|
112
116
|
|
113
117
|
class WindowsLauncher < Launcher
|
@@ -149,7 +153,10 @@ module Selenium
|
|
149
153
|
|
150
154
|
class MacOSXLauncher < UnixLauncher
|
151
155
|
def self.possible_paths
|
152
|
-
[
|
156
|
+
[
|
157
|
+
"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome",
|
158
|
+
"#{Platform.home}/Applications/Google Chrome.app/Contents/MacOS/Google Chrome"
|
159
|
+
]
|
153
160
|
end
|
154
161
|
end
|
155
162
|
|
@@ -229,16 +229,22 @@ module Selenium
|
|
229
229
|
|
230
230
|
alias_method :script, :execute_script
|
231
231
|
|
232
|
-
# Get the first element matching the given
|
232
|
+
# Get the first element matching the given selector. If given a
|
233
|
+
# String or Symbol, it will be used as the id of the element.
|
233
234
|
#
|
234
|
-
# @param
|
235
|
+
# @param [String,Hash] id or selector
|
235
236
|
# @return [WebDriver::Element]
|
236
237
|
#
|
237
|
-
# driver['someElementId']
|
238
|
+
# driver['someElementId'] #=> #<WebDriver::Element:0x1011c3b88>
|
239
|
+
# driver[:tag_name => 'div'] #=> #<WebDriver::Element:0x1011c3b88>
|
238
240
|
#
|
239
241
|
|
240
|
-
def [](
|
241
|
-
|
242
|
+
def [](sel)
|
243
|
+
if sel.kind_of?(String) || sel.kind_of?(Symbol)
|
244
|
+
sel = { :id => sel }
|
245
|
+
end
|
246
|
+
|
247
|
+
find_element sel
|
242
248
|
end
|
243
249
|
|
244
250
|
|
@@ -254,4 +260,4 @@ module Selenium
|
|
254
260
|
|
255
261
|
end # Driver
|
256
262
|
end # WebDriver
|
257
|
-
end # Selenium
|
263
|
+
end # Selenium
|
@@ -19,6 +19,15 @@ module Selenium
|
|
19
19
|
'#<%s:0x%x id=%s tag_name=%s>' % [self.class, hash*2, @id.inspect, tag_name.inspect]
|
20
20
|
end
|
21
21
|
|
22
|
+
def ==(other)
|
23
|
+
other.kind_of?(self.class) && bridge.elementEquals(self, other)
|
24
|
+
end
|
25
|
+
alias_method :eql?, :==
|
26
|
+
|
27
|
+
def hash
|
28
|
+
ref.hash
|
29
|
+
end
|
30
|
+
|
22
31
|
#
|
23
32
|
# Click the element
|
24
33
|
#
|
@@ -105,7 +105,7 @@ module Selenium
|
|
105
105
|
when :linux, :unix
|
106
106
|
Platform.find_binary("firefox3", "firefox2", "firefox") || "/usr/bin/firefox"
|
107
107
|
else
|
108
|
-
raise "
|
108
|
+
raise Error::WebDriverError, "unknown platform: #{Platform.os}"
|
109
109
|
end
|
110
110
|
|
111
111
|
unless File.file?(@path)
|
Binary file
|
@@ -11,14 +11,14 @@ module Selenium
|
|
11
11
|
STABLE_CONNECTION_TIMEOUT = 60
|
12
12
|
|
13
13
|
def initialize(binary, port = DEFAULT_PORT, profile = DEFAULT_PROFILE_NAME)
|
14
|
-
@binary
|
15
|
-
@port
|
14
|
+
@binary = binary
|
15
|
+
@port = port.to_i
|
16
16
|
|
17
17
|
if profile.kind_of? Profile
|
18
18
|
@profile = profile
|
19
19
|
else
|
20
20
|
@profile_name = profile
|
21
|
-
@profile
|
21
|
+
@profile = nil
|
22
22
|
end
|
23
23
|
|
24
24
|
# need to be really specific about what host to use
|
@@ -137,14 +137,14 @@ module Selenium
|
|
137
137
|
@binary.create_base_profile @profile_name
|
138
138
|
Profile.ini.refresh
|
139
139
|
existing = Profile.from_name @profile_name
|
140
|
-
raise "unable to find or create new profile" unless existing
|
140
|
+
raise Error::WebDriverError, "unable to find or create new profile" unless existing
|
141
141
|
end
|
142
142
|
|
143
143
|
@profile = existing
|
144
144
|
end
|
145
145
|
|
146
146
|
def assert_profile
|
147
|
-
raise "must create_profile first"
|
147
|
+
raise Error::WebDriverError, "must create_profile first" unless @profile
|
148
148
|
end
|
149
149
|
|
150
150
|
end # Launcher
|
@@ -8,8 +8,8 @@ module Selenium
|
|
8
8
|
EM_NAMESPACE_URI = "http://www.mozilla.org/2004/em-rdf#"
|
9
9
|
WEBDRIVER_EXTENSION_PATH = File.expand_path("#{WebDriver.root}/selenium/webdriver/firefox/extension/webdriver.xpi")
|
10
10
|
|
11
|
-
attr_reader
|
12
|
-
attr_writer
|
11
|
+
attr_reader :name, :directory
|
12
|
+
attr_writer :secure_ssl, :native_events, :load_no_focus_lib
|
13
13
|
attr_accessor :port
|
14
14
|
|
15
15
|
class << self
|
@@ -131,8 +131,7 @@ module Selenium
|
|
131
131
|
root = ZipHelper.unzip(path)
|
132
132
|
end
|
133
133
|
|
134
|
-
|
135
|
-
ext_path = File.join(extensions_dir, id)
|
134
|
+
ext_path = File.join extensions_dir, read_id_from_install_rdf(root)
|
136
135
|
|
137
136
|
FileUtils.rm_rf ext_path
|
138
137
|
FileUtils.mkdir_p File.dirname(ext_path), :mode => 0700
|
@@ -208,12 +207,12 @@ module Selenium
|
|
208
207
|
end
|
209
208
|
|
210
209
|
def write_prefs(prefs)
|
211
|
-
File.open(user_prefs_path, "w")
|
210
|
+
File.open(user_prefs_path, "w") { |file|
|
212
211
|
prefs.each do |key, value|
|
213
212
|
p key => value if $DEBUG
|
214
213
|
file.puts %{user_pref("#{key}", #{value});}
|
215
214
|
end
|
216
|
-
|
215
|
+
}
|
217
216
|
end
|
218
217
|
|
219
218
|
OVERRIDABLE_PREFERENCES = {
|
@@ -350,14 +350,17 @@ module Selenium
|
|
350
350
|
end
|
351
351
|
|
352
352
|
def getElementValue(element_pointer)
|
353
|
-
getElementAttribute(element_pointer, 'value')
|
353
|
+
val = getElementAttribute(element_pointer, 'value')
|
354
|
+
val.gsub("\r\n", "\n") if val
|
354
355
|
end
|
355
356
|
|
356
357
|
def getElementText(element_pointer)
|
357
|
-
create_string do |string_pointer|
|
358
|
+
val = create_string do |string_pointer|
|
358
359
|
check_error_code Lib.wdeGetText(element_pointer, string_pointer),
|
359
360
|
"unable to get text"
|
360
|
-
end
|
361
|
+
end
|
362
|
+
|
363
|
+
val.gsub("\r\n", "\n") if val
|
361
364
|
end
|
362
365
|
|
363
366
|
def sendKeysToElement(element_pointer, string)
|
@@ -434,6 +437,10 @@ module Selenium
|
|
434
437
|
raise NotImplementedError
|
435
438
|
end
|
436
439
|
|
440
|
+
def elementEquals(element, other)
|
441
|
+
executeScript "return arguments[0] === arguments[1]", element, other
|
442
|
+
end
|
443
|
+
|
437
444
|
def dragElement(element_pointer, right_by, down_by)
|
438
445
|
# TODO: check return values?
|
439
446
|
hwnd = FFI::MemoryPointer.new :pointer
|
Binary file
|
Binary file
|
@@ -339,6 +339,10 @@ module Selenium
|
|
339
339
|
execute :dragElement, {:id => element}, :x => rigth_by, :y => down_by
|
340
340
|
end
|
341
341
|
|
342
|
+
def elementEquals(element, other)
|
343
|
+
execute :elementEquals, :id => element.ref, :other => other.ref
|
344
|
+
end
|
345
|
+
|
342
346
|
private
|
343
347
|
|
344
348
|
def find_element_by(how, what, parent = nil)
|
@@ -16,11 +16,22 @@ module Selenium
|
|
16
16
|
end
|
17
17
|
|
18
18
|
def error
|
19
|
-
Error.for_code
|
19
|
+
klass = Error.for_code(@payload['status']) || return
|
20
|
+
|
21
|
+
ex = klass.new(error_message)
|
22
|
+
ex.set_backtrace(caller)
|
23
|
+
add_backtrace ex
|
24
|
+
|
25
|
+
ex
|
20
26
|
end
|
21
27
|
|
22
28
|
def error_message
|
23
|
-
@payload['value']
|
29
|
+
val = @payload['value']
|
30
|
+
msg = val['message'] or return ""
|
31
|
+
|
32
|
+
msg << " (#{ val['class'] })" if val['class']
|
33
|
+
|
34
|
+
msg
|
24
35
|
end
|
25
36
|
|
26
37
|
def [](key)
|
@@ -32,13 +43,31 @@ module Selenium
|
|
32
43
|
def assert_ok
|
33
44
|
if @code.nil? || @code >= 400
|
34
45
|
if e = error()
|
35
|
-
raise
|
46
|
+
raise e
|
36
47
|
else
|
37
48
|
raise Error::ServerError, self
|
38
49
|
end
|
39
50
|
end
|
40
51
|
end
|
41
52
|
|
53
|
+
def add_backtrace(ex)
|
54
|
+
return unless server_trace = @payload['value']['stackTrace']
|
55
|
+
|
56
|
+
backtrace = server_trace.map do |frame|
|
57
|
+
file = frame['fileName']
|
58
|
+
line = frame['lineNumber']
|
59
|
+
meth = frame['methodName']
|
60
|
+
|
61
|
+
if class_name = frame['className']
|
62
|
+
file = "#{class_name}(#{file})"
|
63
|
+
end
|
64
|
+
|
65
|
+
"[remote server] #{file}:#{line}:in `#{meth}'"
|
66
|
+
end
|
67
|
+
|
68
|
+
ex.set_backtrace(backtrace + ex.backtrace)
|
69
|
+
end
|
70
|
+
|
42
71
|
end # Response
|
43
72
|
end # Remote
|
44
73
|
end # WebDriver
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
version: 0.0.
|
8
|
+
- 28
|
9
|
+
version: 0.0.28
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Jari Bakken
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-
|
17
|
+
date: 2010-08-23 00:00:00 +02:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|