bbc-selenium-webdriver 1.17.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.
- data/CHANGES +473 -0
- data/README +31 -0
- data/lib/selenium-client.rb +2 -0
- data/lib/selenium-webdriver.rb +1 -0
- data/lib/selenium/client.rb +37 -0
- data/lib/selenium/client/base.rb +118 -0
- data/lib/selenium/client/driver.rb +10 -0
- data/lib/selenium/client/errors.rb +9 -0
- data/lib/selenium/client/extensions.rb +118 -0
- data/lib/selenium/client/idiomatic.rb +488 -0
- data/lib/selenium/client/javascript_expression_builder.rb +116 -0
- data/lib/selenium/client/javascript_frameworks/jquery.rb +13 -0
- data/lib/selenium/client/javascript_frameworks/prototype.rb +13 -0
- data/lib/selenium/client/legacy_driver.rb +1720 -0
- data/lib/selenium/client/protocol.rb +104 -0
- data/lib/selenium/client/selenium_helper.rb +34 -0
- data/lib/selenium/rake/server_task.rb +157 -0
- data/lib/selenium/server.rb +223 -0
- data/lib/selenium/webdriver.rb +64 -0
- data/lib/selenium/webdriver/android.rb +9 -0
- data/lib/selenium/webdriver/android/bridge.rb +51 -0
- data/lib/selenium/webdriver/chrome.rb +26 -0
- data/lib/selenium/webdriver/chrome/bridge.rb +106 -0
- data/lib/selenium/webdriver/chrome/profile.rb +83 -0
- data/lib/selenium/webdriver/chrome/service.rb +74 -0
- data/lib/selenium/webdriver/common.rb +30 -0
- data/lib/selenium/webdriver/common/action_builder.rb +352 -0
- data/lib/selenium/webdriver/common/alert.rb +26 -0
- data/lib/selenium/webdriver/common/bridge_helper.rb +67 -0
- data/lib/selenium/webdriver/common/core_ext/base64.rb +9 -0
- data/lib/selenium/webdriver/common/core_ext/dir.rb +42 -0
- data/lib/selenium/webdriver/common/core_ext/string.rb +5 -0
- data/lib/selenium/webdriver/common/driver.rb +301 -0
- data/lib/selenium/webdriver/common/driver_extensions/has_input_devices.rb +39 -0
- data/lib/selenium/webdriver/common/driver_extensions/rotatable.rb +44 -0
- data/lib/selenium/webdriver/common/driver_extensions/takes_screenshot.rb +43 -0
- data/lib/selenium/webdriver/common/driver_extensions/uploads_files.rb +46 -0
- data/lib/selenium/webdriver/common/element.rb +262 -0
- data/lib/selenium/webdriver/common/error.rb +212 -0
- data/lib/selenium/webdriver/common/file_reaper.rb +47 -0
- data/lib/selenium/webdriver/common/keyboard.rb +52 -0
- data/lib/selenium/webdriver/common/keys.rb +109 -0
- data/lib/selenium/webdriver/common/mouse.rb +65 -0
- data/lib/selenium/webdriver/common/navigation.rb +43 -0
- data/lib/selenium/webdriver/common/options.rb +128 -0
- data/lib/selenium/webdriver/common/platform.rb +166 -0
- data/lib/selenium/webdriver/common/port_prober.rb +25 -0
- data/lib/selenium/webdriver/common/profile_helper.rb +67 -0
- data/lib/selenium/webdriver/common/proxy.rb +120 -0
- data/lib/selenium/webdriver/common/search_context.rb +92 -0
- data/lib/selenium/webdriver/common/socket_poller.rb +100 -0
- data/lib/selenium/webdriver/common/target_locator.rb +81 -0
- data/lib/selenium/webdriver/common/timeouts.rb +29 -0
- data/lib/selenium/webdriver/common/wait.rb +60 -0
- data/lib/selenium/webdriver/common/window.rb +96 -0
- data/lib/selenium/webdriver/common/zipper.rb +82 -0
- data/lib/selenium/webdriver/firefox.rb +37 -0
- data/lib/selenium/webdriver/firefox/binary.rb +161 -0
- data/lib/selenium/webdriver/firefox/bridge.rb +58 -0
- data/lib/selenium/webdriver/firefox/extension.rb +52 -0
- data/lib/selenium/webdriver/firefox/extension/webdriver.xpi +0 -0
- data/lib/selenium/webdriver/firefox/launcher.rb +104 -0
- data/lib/selenium/webdriver/firefox/native/linux/amd64/x_ignore_nofocus.so +0 -0
- data/lib/selenium/webdriver/firefox/native/linux/x86/x_ignore_nofocus.so +0 -0
- data/lib/selenium/webdriver/firefox/profile.rb +315 -0
- data/lib/selenium/webdriver/firefox/profiles_ini.rb +62 -0
- data/lib/selenium/webdriver/firefox/socket_lock.rb +61 -0
- data/lib/selenium/webdriver/firefox/util.rb +29 -0
- data/lib/selenium/webdriver/ie.rb +19 -0
- data/lib/selenium/webdriver/ie/bridge.rb +60 -0
- data/lib/selenium/webdriver/ie/native/win32/IEDriver.dll +0 -0
- data/lib/selenium/webdriver/ie/native/x64/IEDriver.dll +0 -0
- data/lib/selenium/webdriver/ie/server.rb +64 -0
- data/lib/selenium/webdriver/iphone.rb +9 -0
- data/lib/selenium/webdriver/iphone/bridge.rb +50 -0
- data/lib/selenium/webdriver/opera.rb +24 -0
- data/lib/selenium/webdriver/opera/bridge.rb +113 -0
- data/lib/selenium/webdriver/opera/service.rb +49 -0
- data/lib/selenium/webdriver/remote.rb +21 -0
- data/lib/selenium/webdriver/remote/bridge.rb +473 -0
- data/lib/selenium/webdriver/remote/capabilities.rb +241 -0
- data/lib/selenium/webdriver/remote/commands.rb +181 -0
- data/lib/selenium/webdriver/remote/http/common.rb +74 -0
- data/lib/selenium/webdriver/remote/http/curb.rb +79 -0
- data/lib/selenium/webdriver/remote/http/default.rb +102 -0
- data/lib/selenium/webdriver/remote/http/persistent.rb +38 -0
- data/lib/selenium/webdriver/remote/response.rb +99 -0
- data/lib/selenium/webdriver/remote/server_error.rb +17 -0
- data/lib/selenium/webdriver/support.rb +4 -0
- data/lib/selenium/webdriver/support/abstract_event_listener.rb +28 -0
- data/lib/selenium/webdriver/support/block_event_listener.rb +17 -0
- data/lib/selenium/webdriver/support/event_firing_bridge.rb +112 -0
- data/lib/selenium/webdriver/support/select.rb +293 -0
- data/spec/integration/selenium/client/api/backward_compatible_api_spec.rb +22 -0
- data/spec/integration/selenium/client/api/browser_xpath_library_spec.rb +17 -0
- data/spec/integration/selenium/client/api/click_spec.rb +39 -0
- data/spec/integration/selenium/client/api/cookie_spec.rb +39 -0
- data/spec/integration/selenium/client/api/element_spec.rb +14 -0
- data/spec/integration/selenium/client/api/highlight_located_element_spec.rb +19 -0
- data/spec/integration/selenium/client/api/retrieve_last_remote_control_logs_spec.rb +33 -0
- data/spec/integration/selenium/client/api/screenshot_spec.rb +29 -0
- data/spec/integration/selenium/client/api/select_window_spec.rb +46 -0
- data/spec/integration/selenium/client/api/start_stop_spec.rb +9 -0
- data/spec/integration/selenium/client/api/wait_for_ajax_spec.rb +27 -0
- data/spec/integration/selenium/client/api/wait_for_element_spec.rb +56 -0
- data/spec/integration/selenium/client/api/wait_for_field_value_spec.rb +52 -0
- data/spec/integration/selenium/client/api/wait_for_text_spec.rb +98 -0
- data/spec/integration/selenium/client/sample-app/public/jquery-1.3.2.js +4376 -0
- data/spec/integration/selenium/client/sample-app/public/jquery.html +55 -0
- data/spec/integration/selenium/client/sample-app/public/prototype-1.6.0.3.js +4320 -0
- data/spec/integration/selenium/client/sample-app/public/prototype.html +59 -0
- data/spec/integration/selenium/client/sample-app/sample_app.rb +32 -0
- data/spec/integration/selenium/client/spec_helper.rb +125 -0
- data/spec/integration/selenium/webdriver/chrome/driver_spec.rb +28 -0
- data/spec/integration/selenium/webdriver/chrome/profile_spec.rb +42 -0
- data/spec/integration/selenium/webdriver/driver_spec.rb +253 -0
- data/spec/integration/selenium/webdriver/element_spec.rb +185 -0
- data/spec/integration/selenium/webdriver/error_spec.rb +30 -0
- data/spec/integration/selenium/webdriver/firefox/driver_spec.rb +21 -0
- data/spec/integration/selenium/webdriver/firefox/profile_spec.rb +141 -0
- data/spec/integration/selenium/webdriver/keyboard_spec.rb +57 -0
- data/spec/integration/selenium/webdriver/mouse_spec.rb +55 -0
- data/spec/integration/selenium/webdriver/navigation_spec.rb +44 -0
- data/spec/integration/selenium/webdriver/opera/driver_spec.rb +47 -0
- data/spec/integration/selenium/webdriver/options_spec.rb +49 -0
- data/spec/integration/selenium/webdriver/remote/element_spec.rb +24 -0
- data/spec/integration/selenium/webdriver/spec_helper.rb +44 -0
- data/spec/integration/selenium/webdriver/spec_support.rb +13 -0
- data/spec/integration/selenium/webdriver/spec_support/guards.rb +86 -0
- data/spec/integration/selenium/webdriver/spec_support/helpers.rb +46 -0
- data/spec/integration/selenium/webdriver/spec_support/jruby_test_environment.rb +29 -0
- data/spec/integration/selenium/webdriver/spec_support/rack_server.rb +123 -0
- data/spec/integration/selenium/webdriver/spec_support/test_environment.rb +199 -0
- data/spec/integration/selenium/webdriver/target_locator_spec.rb +170 -0
- data/spec/integration/selenium/webdriver/timeout_spec.rb +56 -0
- data/spec/integration/selenium/webdriver/window_spec.rb +56 -0
- data/spec/integration/selenium/webdriver/zipper_spec.rb +66 -0
- data/spec/unit/selenium/client/base_spec.rb +239 -0
- data/spec/unit/selenium/client/extensions_spec.rb +174 -0
- data/spec/unit/selenium/client/idiomatic_spec.rb +500 -0
- data/spec/unit/selenium/client/javascript_expression_builder_spec.rb +79 -0
- data/spec/unit/selenium/client/javascript_frameworks/jquery_spec.rb +10 -0
- data/spec/unit/selenium/client/javascript_frameworks/prototype_spec.rb +10 -0
- data/spec/unit/selenium/client/protocol_spec.rb +124 -0
- data/spec/unit/selenium/client/selenium_helper_spec.rb +56 -0
- data/spec/unit/selenium/client/spec_helper.rb +24 -0
- data/spec/unit/selenium/rake/task_spec.rb +79 -0
- data/spec/unit/selenium/server_spec.rb +131 -0
- data/spec/unit/selenium/webdriver/action_builder_spec.rb +90 -0
- data/spec/unit/selenium/webdriver/android/bridge_spec.rb +31 -0
- data/spec/unit/selenium/webdriver/chrome/bridge_spec.rb +94 -0
- data/spec/unit/selenium/webdriver/chrome/profile_spec.rb +57 -0
- data/spec/unit/selenium/webdriver/chrome/service_spec.rb +44 -0
- data/spec/unit/selenium/webdriver/error_spec.rb +41 -0
- data/spec/unit/selenium/webdriver/firefox/bridge_spec.rb +17 -0
- data/spec/unit/selenium/webdriver/iphone/bridge_spec.rb +30 -0
- data/spec/unit/selenium/webdriver/proxy_spec.rb +87 -0
- data/spec/unit/selenium/webdriver/remote/bridge_spec.rb +16 -0
- data/spec/unit/selenium/webdriver/remote/capabilities_spec.rb +111 -0
- data/spec/unit/selenium/webdriver/remote/http/common_spec.rb +24 -0
- data/spec/unit/selenium/webdriver/remote/http/default_spec.rb +46 -0
- data/spec/unit/selenium/webdriver/search_context_spec.rb +61 -0
- data/spec/unit/selenium/webdriver/socket_poller_spec.rb +68 -0
- data/spec/unit/selenium/webdriver/spec_helper.rb +6 -0
- data/spec/unit/selenium/webdriver/support/event_firing_spec.rb +111 -0
- data/spec/unit/selenium/webdriver/support/select_spec.rb +290 -0
- data/spec/unit/selenium/webdriver/wait_spec.rb +40 -0
- metadata +215 -0
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
module Selenium
|
|
2
|
+
module WebDriver
|
|
3
|
+
|
|
4
|
+
#
|
|
5
|
+
# @api private
|
|
6
|
+
#
|
|
7
|
+
|
|
8
|
+
module DriverExtensions
|
|
9
|
+
module UploadsFiles
|
|
10
|
+
|
|
11
|
+
#
|
|
12
|
+
# Set the file detector to pass local files to a remote WebDriver.
|
|
13
|
+
#
|
|
14
|
+
# The detector is an object that responds to #call, and when called
|
|
15
|
+
# will determine if the given string represents a file. If it does,
|
|
16
|
+
# the path to the file on the local file system should be returned,
|
|
17
|
+
# otherwise nil or false.
|
|
18
|
+
#
|
|
19
|
+
# Example:
|
|
20
|
+
#
|
|
21
|
+
# driver = Selenium::WebDriver.for :remote
|
|
22
|
+
# driver.file_detector = lambda do |args|
|
|
23
|
+
# # args => ["/path/to/file"]
|
|
24
|
+
# str = args.first.to_s
|
|
25
|
+
# str if File.exist?(str)
|
|
26
|
+
# end
|
|
27
|
+
#
|
|
28
|
+
# driver.find_element(:id => "upload").send_keys "/path/to/file"
|
|
29
|
+
#
|
|
30
|
+
# By default, no file detection is performed.
|
|
31
|
+
#
|
|
32
|
+
# @api public
|
|
33
|
+
#
|
|
34
|
+
|
|
35
|
+
def file_detector=(detector)
|
|
36
|
+
unless detector.nil? or detector.respond_to? :call
|
|
37
|
+
raise ArgumentError, "detector must respond to #call"
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
bridge.file_detector = detector
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
end # UploadsFiles
|
|
44
|
+
end # DriverExtensions
|
|
45
|
+
end # WebDriver
|
|
46
|
+
end # Selenium
|
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
module Selenium
|
|
2
|
+
module WebDriver
|
|
3
|
+
class Element
|
|
4
|
+
include SearchContext
|
|
5
|
+
|
|
6
|
+
#
|
|
7
|
+
# Creates a new Element
|
|
8
|
+
#
|
|
9
|
+
# @api private
|
|
10
|
+
#
|
|
11
|
+
|
|
12
|
+
def initialize(bridge, id)
|
|
13
|
+
@bridge, @id = bridge, id
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def inspect
|
|
17
|
+
'#<%s:0x%x id=%s>' % [self.class, hash*2, @id.inspect]
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def ==(other)
|
|
21
|
+
other.kind_of?(self.class) && bridge.elementEquals(self, other)
|
|
22
|
+
end
|
|
23
|
+
alias_method :eql?, :==
|
|
24
|
+
|
|
25
|
+
def hash
|
|
26
|
+
@id.hash ^ @bridge.hash
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
#
|
|
30
|
+
# Click the element
|
|
31
|
+
#
|
|
32
|
+
|
|
33
|
+
def click
|
|
34
|
+
bridge.clickElement @id
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
#
|
|
38
|
+
# Get the tag name of this element
|
|
39
|
+
#
|
|
40
|
+
# @return [String]
|
|
41
|
+
#
|
|
42
|
+
|
|
43
|
+
def tag_name
|
|
44
|
+
bridge.getElementTagName @id
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
#
|
|
48
|
+
# Get the value of a the given attribute of the element. Will return the current value, even if
|
|
49
|
+
# this has been modified after the page has been loaded. More exactly, this method will return
|
|
50
|
+
# the value of the given attribute, unless that attribute is not present, in which case the
|
|
51
|
+
# value of the property with the same name is returned. If neither value is set, nil is
|
|
52
|
+
# returned. The "style" attribute is converted as best can be to a text representation with a
|
|
53
|
+
# trailing semi-colon. The following are deemed to be "boolean" attributes, and will
|
|
54
|
+
# return either "true" or "false":
|
|
55
|
+
#
|
|
56
|
+
# async, autofocus, autoplay, checked, compact, complete, controls, declare, defaultchecked,
|
|
57
|
+
# defaultselected, defer, disabled, draggable, ended, formnovalidate, hidden, indeterminate,
|
|
58
|
+
# iscontenteditable, ismap, itemscope, loop, multiple, muted, nohref, noresize, noshade, novalidate,
|
|
59
|
+
# nowrap, open, paused, pubdate, readonly, required, reversed, scoped, seamless, seeking,
|
|
60
|
+
# selected, spellcheck, truespeed, willvalidate
|
|
61
|
+
#
|
|
62
|
+
# Finally, the following commonly mis-capitalized attribute/property names are evaluated as
|
|
63
|
+
# expected:
|
|
64
|
+
#
|
|
65
|
+
# class, readonly
|
|
66
|
+
#
|
|
67
|
+
# @param [String]
|
|
68
|
+
# attribute name
|
|
69
|
+
# @return [String,nil]
|
|
70
|
+
# attribute value
|
|
71
|
+
#
|
|
72
|
+
|
|
73
|
+
def attribute(name)
|
|
74
|
+
bridge.getElementAttribute @id, name
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
#
|
|
78
|
+
# Get the text content of this element
|
|
79
|
+
#
|
|
80
|
+
# @return [String]
|
|
81
|
+
#
|
|
82
|
+
|
|
83
|
+
def text
|
|
84
|
+
bridge.getElementText @id
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
#
|
|
88
|
+
# Send keystrokes to this element
|
|
89
|
+
#
|
|
90
|
+
# @param [String, Symbol, Array]
|
|
91
|
+
#
|
|
92
|
+
# Examples:
|
|
93
|
+
#
|
|
94
|
+
# element.send_keys "foo" #=> value: 'foo'
|
|
95
|
+
# element.send_keys "tet", :arrow_left, "s" #=> value: 'test'
|
|
96
|
+
# element.send_keys [:control, 'a'], :space #=> value: ' '
|
|
97
|
+
#
|
|
98
|
+
# @see Keys::KEYS
|
|
99
|
+
#
|
|
100
|
+
|
|
101
|
+
def send_keys(*args)
|
|
102
|
+
bridge.sendKeysToElement @id, Keys.encode(args)
|
|
103
|
+
end
|
|
104
|
+
alias_method :send_key, :send_keys
|
|
105
|
+
|
|
106
|
+
#
|
|
107
|
+
# Clear this element
|
|
108
|
+
#
|
|
109
|
+
|
|
110
|
+
def clear
|
|
111
|
+
bridge.clearElement @id
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
#
|
|
115
|
+
# Is the element enabled?
|
|
116
|
+
#
|
|
117
|
+
# @return [Boolean]
|
|
118
|
+
#
|
|
119
|
+
|
|
120
|
+
def enabled?
|
|
121
|
+
bridge.isElementEnabled @id
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
#
|
|
125
|
+
# Is the element selected?
|
|
126
|
+
#
|
|
127
|
+
# @return [Boolean]
|
|
128
|
+
#
|
|
129
|
+
|
|
130
|
+
def selected?
|
|
131
|
+
bridge.isElementSelected @id
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
#
|
|
135
|
+
# Is the element displayed?
|
|
136
|
+
#
|
|
137
|
+
# @return [Boolean]
|
|
138
|
+
#
|
|
139
|
+
|
|
140
|
+
def displayed?
|
|
141
|
+
bridge.isElementDisplayed @id
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
#
|
|
145
|
+
# Submit this element
|
|
146
|
+
#
|
|
147
|
+
|
|
148
|
+
def submit
|
|
149
|
+
bridge.submitElement @id
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
#
|
|
153
|
+
# Get the value of the given CSS property
|
|
154
|
+
#
|
|
155
|
+
# Note that shorthand CSS properties (e.g. background, font, border, border-top, margin,
|
|
156
|
+
# margin-top, padding, padding-top, list-style, outline, pause, cue) are not returned,
|
|
157
|
+
# in accordance with the DOM CSS2 specification - you should directly access the longhand
|
|
158
|
+
# properties (e.g. background-color) to access the desired values.
|
|
159
|
+
#
|
|
160
|
+
# @see http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSStyleDeclaration
|
|
161
|
+
#
|
|
162
|
+
|
|
163
|
+
def style(prop)
|
|
164
|
+
bridge.getElementValueOfCssProperty @id, prop
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
#
|
|
168
|
+
# Get the location of this element.
|
|
169
|
+
#
|
|
170
|
+
# @return [WebDriver::Point]
|
|
171
|
+
#
|
|
172
|
+
|
|
173
|
+
def location
|
|
174
|
+
bridge.getElementLocation @id
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
#
|
|
178
|
+
# Determine an element's location on the screen once it has been scrolled into view.
|
|
179
|
+
#
|
|
180
|
+
# @return [WebDriver::Point]
|
|
181
|
+
#
|
|
182
|
+
|
|
183
|
+
def location_once_scrolled_into_view
|
|
184
|
+
bridge.getElementLocationOnceScrolledIntoView @id
|
|
185
|
+
end
|
|
186
|
+
|
|
187
|
+
#
|
|
188
|
+
# Get the size of this element
|
|
189
|
+
#
|
|
190
|
+
# @return [WebDriver::Dimension]
|
|
191
|
+
#
|
|
192
|
+
|
|
193
|
+
def size
|
|
194
|
+
bridge.getElementSize @id
|
|
195
|
+
end
|
|
196
|
+
|
|
197
|
+
#-------------------------------- sugar --------------------------------
|
|
198
|
+
|
|
199
|
+
#
|
|
200
|
+
# element.first(:id, 'foo')
|
|
201
|
+
#
|
|
202
|
+
|
|
203
|
+
alias_method :first, :find_element
|
|
204
|
+
|
|
205
|
+
#
|
|
206
|
+
# element.all(:class, 'bar')
|
|
207
|
+
#
|
|
208
|
+
|
|
209
|
+
alias_method :all, :find_elements
|
|
210
|
+
|
|
211
|
+
#
|
|
212
|
+
# element['class'] or element[:class] #=> "someclass"
|
|
213
|
+
#
|
|
214
|
+
alias_method :[], :attribute
|
|
215
|
+
|
|
216
|
+
#
|
|
217
|
+
# for SearchContext and execute_script
|
|
218
|
+
#
|
|
219
|
+
# @api private
|
|
220
|
+
#
|
|
221
|
+
|
|
222
|
+
def ref
|
|
223
|
+
@id
|
|
224
|
+
end
|
|
225
|
+
|
|
226
|
+
#
|
|
227
|
+
# Convert to a WebElement JSON Object for transmission over the wire.
|
|
228
|
+
# @see http://code.google.com/p/selenium/wiki/JsonWireProtocol#Basic_Concepts_And_Terms
|
|
229
|
+
#
|
|
230
|
+
# @api private
|
|
231
|
+
#
|
|
232
|
+
|
|
233
|
+
def to_json(*args)
|
|
234
|
+
MultiJson.encode as_json
|
|
235
|
+
end
|
|
236
|
+
|
|
237
|
+
#
|
|
238
|
+
# For Rails 3 - http://jonathanjulian.com/2010/04/rails-to_json-or-as_json/
|
|
239
|
+
#
|
|
240
|
+
# @api private
|
|
241
|
+
#
|
|
242
|
+
|
|
243
|
+
def as_json(opts = nil)
|
|
244
|
+
{ :ELEMENT => @id }
|
|
245
|
+
end
|
|
246
|
+
|
|
247
|
+
private
|
|
248
|
+
|
|
249
|
+
def bridge
|
|
250
|
+
@bridge
|
|
251
|
+
end
|
|
252
|
+
|
|
253
|
+
def selectable?
|
|
254
|
+
tn = tag_name.downcase
|
|
255
|
+
type = attribute(:type).to_s.downcase
|
|
256
|
+
|
|
257
|
+
tn == "option" || (tn == "input" && %w[radio checkbox].include?(type))
|
|
258
|
+
end
|
|
259
|
+
|
|
260
|
+
end # Element
|
|
261
|
+
end # WebDriver
|
|
262
|
+
end # Selenium
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
module Selenium
|
|
2
|
+
module WebDriver
|
|
3
|
+
module Error
|
|
4
|
+
|
|
5
|
+
class WebDriverError < StandardError; end
|
|
6
|
+
class UnsupportedOperationError < WebDriverError; end
|
|
7
|
+
|
|
8
|
+
class IndexOutOfBoundsError < WebDriverError; end # 1
|
|
9
|
+
class NoCollectionError < WebDriverError; end # 2
|
|
10
|
+
class NoStringError < WebDriverError; end # 3
|
|
11
|
+
class NoStringLengthError < WebDriverError; end # 4
|
|
12
|
+
class NoStringWrapperError < WebDriverError; end # 5
|
|
13
|
+
class NoSuchDriverError < WebDriverError; end # 6
|
|
14
|
+
|
|
15
|
+
#
|
|
16
|
+
# An element could not be located on the page using the given search
|
|
17
|
+
# parameters.
|
|
18
|
+
#
|
|
19
|
+
|
|
20
|
+
class NoSuchElementError < WebDriverError; end # 7
|
|
21
|
+
|
|
22
|
+
#
|
|
23
|
+
# A request to switch to a frame could not be satisfied because the
|
|
24
|
+
# frame could not be found.
|
|
25
|
+
#
|
|
26
|
+
|
|
27
|
+
class NoSuchFrameError < WebDriverError; end # 8
|
|
28
|
+
class UnknownCommandError < WebDriverError; end # 9
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
#
|
|
32
|
+
# Indicates that a reference to an element is now "stale" - the element
|
|
33
|
+
# no longer appears in the DOM of the page.
|
|
34
|
+
#
|
|
35
|
+
|
|
36
|
+
class StaleElementReferenceError < WebDriverError; end # 10
|
|
37
|
+
|
|
38
|
+
#
|
|
39
|
+
# Raised to indicate that although an element is present on the DOM,
|
|
40
|
+
# it is not visible, and so is not able to be interacted with.
|
|
41
|
+
#
|
|
42
|
+
|
|
43
|
+
class ElementNotVisibleError < WebDriverError; end # 11
|
|
44
|
+
|
|
45
|
+
#
|
|
46
|
+
# Raised when an interaction could not be performed because the element
|
|
47
|
+
# is in an invalid state (e.g. attempting to click a disabled element).
|
|
48
|
+
#
|
|
49
|
+
|
|
50
|
+
class InvalidElementStateError < WebDriverError; end # 12
|
|
51
|
+
|
|
52
|
+
#
|
|
53
|
+
# An unknown server-side error occurred while processing the command.
|
|
54
|
+
#
|
|
55
|
+
|
|
56
|
+
class UnknownError < WebDriverError; end # 13
|
|
57
|
+
class ExpectedError < WebDriverError; end # 14
|
|
58
|
+
|
|
59
|
+
#
|
|
60
|
+
# An attempt was made to select an element that cannot be selected.
|
|
61
|
+
#
|
|
62
|
+
|
|
63
|
+
class ElementNotSelectableError < WebDriverError; end # 15
|
|
64
|
+
class NoSuchDocumentError < WebDriverError; end # 16
|
|
65
|
+
|
|
66
|
+
#
|
|
67
|
+
# An error occurred while executing user supplied JavaScript.
|
|
68
|
+
#
|
|
69
|
+
|
|
70
|
+
class JavascriptError < WebDriverError; end # 17
|
|
71
|
+
class NoScriptResultError < WebDriverError; end # 18
|
|
72
|
+
|
|
73
|
+
#
|
|
74
|
+
# An error occurred while searching for an element by XPath.
|
|
75
|
+
#
|
|
76
|
+
|
|
77
|
+
class XPathLookupError < WebDriverError; end # 19
|
|
78
|
+
class NoSuchCollectionError < WebDriverError; end # 20
|
|
79
|
+
|
|
80
|
+
#
|
|
81
|
+
# Raised when a command does not complete in enough time.
|
|
82
|
+
#
|
|
83
|
+
|
|
84
|
+
class TimeOutError < WebDriverError; end # 21
|
|
85
|
+
class NullPointerError < WebDriverError; end # 22
|
|
86
|
+
class NoSuchWindowError < WebDriverError; end # 23
|
|
87
|
+
|
|
88
|
+
#
|
|
89
|
+
# Raised when attempting to add a cookie under a different domain than
|
|
90
|
+
# the current URL.
|
|
91
|
+
#
|
|
92
|
+
|
|
93
|
+
class InvalidCookieDomainError < WebDriverError; end # 24
|
|
94
|
+
|
|
95
|
+
#
|
|
96
|
+
# Raised when a driver fails to set a cookie.
|
|
97
|
+
#
|
|
98
|
+
|
|
99
|
+
class UnableToSetCookieError < WebDriverError; end # 25
|
|
100
|
+
class UnexpectedAlertError < WebDriverError; end # 26
|
|
101
|
+
|
|
102
|
+
#
|
|
103
|
+
# Indicates that a user has tried to access an alert when one is not present.
|
|
104
|
+
#
|
|
105
|
+
|
|
106
|
+
class NoAlertPresentError < WebDriverError; end # 27
|
|
107
|
+
|
|
108
|
+
#
|
|
109
|
+
# A script did not complete before its timeout expired.
|
|
110
|
+
#
|
|
111
|
+
|
|
112
|
+
class ScriptTimeOutError < WebDriverError; end # 28
|
|
113
|
+
|
|
114
|
+
#
|
|
115
|
+
# The coordinates provided to an interactions operation are invalid.
|
|
116
|
+
#
|
|
117
|
+
|
|
118
|
+
class InvalidElementCoordinatesError < WebDriverError; end # 29
|
|
119
|
+
|
|
120
|
+
#
|
|
121
|
+
# Indicates that IME support is not available. This exception is rasied
|
|
122
|
+
# for every IME-related method call if IME support is not available on
|
|
123
|
+
# the machine.
|
|
124
|
+
#
|
|
125
|
+
|
|
126
|
+
class IMENotAvailableError < WebDriverError; end # 30
|
|
127
|
+
|
|
128
|
+
#
|
|
129
|
+
# Indicates that activating an IME engine has failed.
|
|
130
|
+
#
|
|
131
|
+
|
|
132
|
+
class IMEEngineActivationFailedError < WebDriverError; end # 31
|
|
133
|
+
|
|
134
|
+
#
|
|
135
|
+
# Argument was an invalid selector (e.g. XPath/CSS).
|
|
136
|
+
#
|
|
137
|
+
|
|
138
|
+
class InvalidSelectorError < WebDriverError; end # 32
|
|
139
|
+
# 33
|
|
140
|
+
|
|
141
|
+
#
|
|
142
|
+
# Indicates that the target provided to the actions #move method is
|
|
143
|
+
# invalid, e.g. outside of the bounds of the window.
|
|
144
|
+
#
|
|
145
|
+
|
|
146
|
+
class MoveTargetOutOfBoundsError < WebDriverError; end # 34
|
|
147
|
+
|
|
148
|
+
# @api private
|
|
149
|
+
Errors = [
|
|
150
|
+
IndexOutOfBoundsError, # 1
|
|
151
|
+
NoCollectionError, # 2
|
|
152
|
+
NoStringError, # 3
|
|
153
|
+
NoStringLengthError, # 4
|
|
154
|
+
NoStringWrapperError, # 5
|
|
155
|
+
NoSuchDriverError, # 6
|
|
156
|
+
NoSuchElementError, # 7
|
|
157
|
+
NoSuchFrameError, # 8
|
|
158
|
+
UnknownCommandError, # 9
|
|
159
|
+
StaleElementReferenceError, # 10
|
|
160
|
+
ElementNotVisibleError, # 11
|
|
161
|
+
InvalidElementStateError, # 12
|
|
162
|
+
UnknownError, # 13
|
|
163
|
+
ExpectedError, # 14
|
|
164
|
+
ElementNotSelectableError, # 15
|
|
165
|
+
NoSuchDocumentError, # 16
|
|
166
|
+
JavascriptError, # 17
|
|
167
|
+
NoScriptResultError, # 18
|
|
168
|
+
XPathLookupError, # 19
|
|
169
|
+
NoSuchCollectionError, # 20
|
|
170
|
+
TimeOutError, # 21
|
|
171
|
+
NullPointerError, # 22
|
|
172
|
+
NoSuchWindowError, # 23
|
|
173
|
+
InvalidCookieDomainError, # 24
|
|
174
|
+
UnableToSetCookieError, # 25
|
|
175
|
+
UnexpectedAlertError, # 26
|
|
176
|
+
NoAlertPresentError, # 27
|
|
177
|
+
ScriptTimeOutError, # 28
|
|
178
|
+
InvalidElementCoordinatesError, # 29
|
|
179
|
+
IMENotAvailableError, # 30
|
|
180
|
+
IMEEngineActivationFailedError, # 31
|
|
181
|
+
InvalidSelectorError, # 32
|
|
182
|
+
nil, # 33
|
|
183
|
+
MoveTargetOutOfBoundsError # 34
|
|
184
|
+
]
|
|
185
|
+
|
|
186
|
+
# aliased for backwards compatibility
|
|
187
|
+
ObsoleteElementError = StaleElementReferenceError
|
|
188
|
+
|
|
189
|
+
# aliased for backwards compatibility
|
|
190
|
+
UnhandledError = UnknownError
|
|
191
|
+
|
|
192
|
+
# aliased for backwards compatibility
|
|
193
|
+
UnexpectedJavascriptError = JavascriptError
|
|
194
|
+
|
|
195
|
+
# aliased for backwards compatibility
|
|
196
|
+
NoAlertOpenError = NoAlertPresentError
|
|
197
|
+
|
|
198
|
+
# aliased for backwards compatibility
|
|
199
|
+
ElementNotDisplayedError = ElementNotVisibleError
|
|
200
|
+
|
|
201
|
+
class << self
|
|
202
|
+
def for_code(code)
|
|
203
|
+
return if code == 0
|
|
204
|
+
return WebDriverError if code.nil?
|
|
205
|
+
|
|
206
|
+
Errors[code - 1] || WebDriverError
|
|
207
|
+
end
|
|
208
|
+
end
|
|
209
|
+
|
|
210
|
+
end # Error
|
|
211
|
+
end # WebDriver
|
|
212
|
+
end # Selenium
|