Class: Capybara::Selenium::Driver
Defined Under Namespace
Modules: ChromeDriver, EdgeDriver, FirefoxDriver, InternetExplorerDriver, SafariDriver, W3CFirefoxDriver
Constant Summary
collapse
- DEFAULT_OPTIONS =
{
browser: :firefox,
clear_local_storage: nil,
clear_session_storage: nil
}.freeze
- SPECIAL_OPTIONS =
%i[browser clear_local_storage clear_session_storage timeout native_displayed].freeze
Class Attribute Summary collapse
Instance Attribute Summary collapse
Class Method Summary
collapse
Instance Method Summary
collapse
-
#accept_modal(_type, **options) ⇒ Object
-
#browser ⇒ Object
-
#close_window(handle) ⇒ Object
-
#current_url ⇒ Object
-
#current_window_handle ⇒ Object
-
#dismiss_modal(_type, **options) ⇒ Object
-
#evaluate_async_script(script, *args) ⇒ Object
-
#evaluate_script(script, *args) ⇒ Object
-
#execute_script(script, *args) ⇒ Object
-
#frame_obscured_at?(x:, y:) ⇒ Boolean
-
#fullscreen_window(handle) ⇒ Object
-
#go_back ⇒ Object
-
#go_forward ⇒ Object
-
#html ⇒ Object
-
#initialize(app, **options) ⇒ Driver
constructor
A new instance of Driver.
-
#invalid_element_errors ⇒ Object
-
#maximize_window(handle) ⇒ Object
-
#needs_server? ⇒ Boolean
-
#no_such_window_error ⇒ Object
-
#open_new_window(kind = :tab) ⇒ Object
-
#quit ⇒ Object
-
#refresh ⇒ Object
-
#reset! ⇒ Object
-
#resize_window_to(handle, width, height) ⇒ Object
-
#save_screenshot(path, **_options) ⇒ Object
-
#send_keys(*args) ⇒ Object
-
#switch_to_frame(frame) ⇒ Object
-
#switch_to_window(handle) ⇒ Object
-
#title ⇒ Object
-
#visit(path) ⇒ Object
-
#wait? ⇒ Boolean
-
#window_handles ⇒ Object
-
#window_size(handle) ⇒ Object
Methods included from Find
#find_css, #find_xpath
#find_css, #find_xpath, #frame_title, #frame_url, #response_headers, #session_options, #status_code
Constructor Details
#initialize(app, **options) ⇒ Driver
Returns a new instance of Driver.
77
78
79
80
81
82
83
84
85
86
|
# File 'lib/capybara/selenium/driver.rb', line 77
def initialize(app, **options)
super()
self.class.load_selenium
@app = app
@browser = nil
@exit_status = nil
@frame_handles = Hash.new { |hash, handle| hash[handle] = [] }
@options = DEFAULT_OPTIONS.merge(options)
@node_class = ::Capybara::Selenium::Node
end
|
Class Attribute Details
.specializations ⇒ Object
Returns the value of attribute specializations
50
51
52
|
# File 'lib/capybara/selenium/driver.rb', line 50
def specializations
@specializations
end
|
Instance Attribute Details
#app ⇒ Object
Returns the value of attribute app
15
16
17
|
# File 'lib/capybara/selenium/driver.rb', line 15
def app
@app
end
|
#options ⇒ Object
Returns the value of attribute options
15
16
17
|
# File 'lib/capybara/selenium/driver.rb', line 15
def options
@options
end
|
Class Method Details
.load_selenium ⇒ Object
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
# File 'lib/capybara/selenium/driver.rb', line 18
def load_selenium
require 'selenium-webdriver'
require 'capybara/selenium/logger_suppressor'
require 'capybara/selenium/patches/atoms'
require 'capybara/selenium/patches/is_displayed'
require 'capybara/selenium/patches/action_pauser'
selenium_webdriver_version =
if Gem.loaded_specs['selenium-webdriver']
Gem.loaded_specs['selenium-webdriver'].version
else
Gem::Version.new(Selenium::WebDriver::VERSION)
end
if selenium_webdriver_version < Gem::Version.new('3.5.0')
warn "Warning: You're using an unsupported version of selenium-webdriver, please upgrade."
end
rescue LoadError => e
raise e unless e.message.include?('selenium-webdriver')
raise LoadError, "Capybara's selenium driver is unable to load `selenium-webdriver`, please install the gem and add `gem 'selenium-webdriver'` to your Gemfile if you are using bundler."
end
|
.register_specialization(browser_name, specialization) ⇒ Object
52
53
54
55
|
# File 'lib/capybara/selenium/driver.rb', line 52
def register_specialization(browser_name, specialization)
@specializations ||= {}
@specializations[browser_name] = specialization
end
|
Instance Method Details
#accept_modal(_type, **options) ⇒ Object
247
248
249
250
251
252
253
254
255
256
|
# File 'lib/capybara/selenium/driver.rb', line 247
def accept_modal(_type, **options)
yield if block_given?
modal = find_modal(**options)
modal.send_keys options[:with] if options[:with]
message = modal.text
modal.accept
message
end
|
#browser ⇒ Object
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
|
# File 'lib/capybara/selenium/driver.rb', line 58
def browser
unless @browser
options[:http_client] ||= begin
require 'capybara/selenium/patches/persistent_client'
if options[:timeout]
::Capybara::Selenium::PersistentClient.new(read_timeout: options[:timeout])
else
::Capybara::Selenium::PersistentClient.new
end
end
processed_options = options.reject { |key, _val| SPECIAL_OPTIONS.include?(key) }
@browser = Selenium::WebDriver.for(options[:browser], processed_options)
specialize_driver
setup_exit_handler
end
@browser
end
|
#close_window(handle) ⇒ Object
224
225
226
227
228
229
230
|
# File 'lib/capybara/selenium/driver.rb', line 224
def close_window(handle)
raise ArgumentError, 'Not allowed to close the primary window' if handle == window_handles.first
within_given_window(handle) do
browser.close
end
end
|
#current_url ⇒ Object
114
115
116
|
# File 'lib/capybara/selenium/driver.rb', line 114
def current_url
browser.current_url
end
|
#current_window_handle ⇒ Object
194
195
196
|
# File 'lib/capybara/selenium/driver.rb', line 194
def current_window_handle
browser.window_handle
end
|
#dismiss_modal(_type, **options) ⇒ Object
258
259
260
261
262
263
264
|
# File 'lib/capybara/selenium/driver.rb', line 258
def dismiss_modal(_type, **options)
yield if block_given?
modal = find_modal(**options)
message = modal.text
modal.dismiss
message
end
|
#evaluate_async_script(script, *args) ⇒ Object
130
131
132
133
134
|
# File 'lib/capybara/selenium/driver.rb', line 130
def evaluate_async_script(script, *args)
browser.manage.timeouts.script_timeout = Capybara.default_max_wait_time
result = browser.execute_async_script(script, *native_args(args))
unwrap_script_result(result)
end
|
#evaluate_script(script, *args) ⇒ Object
125
126
127
128
|
# File 'lib/capybara/selenium/driver.rb', line 125
def evaluate_script(script, *args)
result = execute_script("return #{script}", *args)
unwrap_script_result(result)
end
|
#execute_script(script, *args) ⇒ Object
121
122
123
|
# File 'lib/capybara/selenium/driver.rb', line 121
def execute_script(script, *args)
browser.execute_script(script, *native_args(args))
end
|
#frame_obscured_at?(x:, y:) ⇒ Boolean
167
168
169
170
171
172
173
174
175
176
177
|
# File 'lib/capybara/selenium/driver.rb', line 167
def frame_obscured_at?(x:, y:)
frame = @frame_handles[current_window_handle].last
return false unless frame
switch_to_frame(:parent)
begin
frame.base.obscured?(x: x, y: y)
ensure
switch_to_frame(frame)
end
end
|
#fullscreen_window(handle) ⇒ Object
218
219
220
221
222
|
# File 'lib/capybara/selenium/driver.rb', line 218
def fullscreen_window(handle)
within_given_window(handle) do
browser.manage.window.full_screen
end
end
|
#go_back ⇒ Object
96
97
98
|
# File 'lib/capybara/selenium/driver.rb', line 96
def go_back
browser.navigate.back
end
|
#go_forward ⇒ Object
100
101
102
|
# File 'lib/capybara/selenium/driver.rb', line 100
def go_forward
browser.navigate.forward
end
|
#html ⇒ Object
104
105
106
107
108
|
# File 'lib/capybara/selenium/driver.rb', line 104
def html
browser.page_source
rescue Selenium::WebDriver::Error::JavascriptError => e
raise unless e.message.include?('documentElement is null')
end
|
#invalid_element_errors ⇒ Object
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
|
# File 'lib/capybara/selenium/driver.rb', line 279
def invalid_element_errors
@invalid_element_errors ||= begin
[
::Selenium::WebDriver::Error::StaleElementReferenceError,
::Selenium::WebDriver::Error::ElementNotInteractableError,
::Selenium::WebDriver::Error::InvalidSelectorError, ::Selenium::WebDriver::Error::ElementClickInterceptedError,
::Selenium::WebDriver::Error::NoSuchElementError, ::Selenium::WebDriver::Error::InvalidArgumentError ].tap do |errors|
unless selenium_4?
::Selenium::WebDriver.logger.suppress_deprecations do
errors.concat [
::Selenium::WebDriver::Error::UnhandledError,
::Selenium::WebDriver::Error::ElementNotVisibleError,
::Selenium::WebDriver::Error::InvalidElementStateError,
::Selenium::WebDriver::Error::ElementNotSelectableError
]
end
end
end
end
end
|
#maximize_window(handle) ⇒ Object
211
212
213
214
215
216
|
# File 'lib/capybara/selenium/driver.rb', line 211
def maximize_window(handle)
within_given_window(handle) do
browser.manage.window.maximize
end
sleep 0.1 end
|
#needs_server? ⇒ Boolean
119
|
# File 'lib/capybara/selenium/driver.rb', line 119
def needs_server?; true; end
|
#no_such_window_error ⇒ Object
303
304
305
|
# File 'lib/capybara/selenium/driver.rb', line 303
def no_such_window_error
Selenium::WebDriver::Error::NoSuchWindowError
end
|
#open_new_window(kind = :tab) ⇒ Object
236
237
238
239
240
241
|
# File 'lib/capybara/selenium/driver.rb', line 236
def open_new_window(kind = :tab)
browser.manage.new_window(kind)
rescue NoMethodError, Selenium::WebDriver::Error::WebDriverError
browser.execute_script('window.open();')
end
|
#quit ⇒ Object
266
267
268
269
270
271
272
273
274
275
276
277
|
# File 'lib/capybara/selenium/driver.rb', line 266
def quit
@browser&.quit
rescue Selenium::WebDriver::Error::SessionNotCreatedError, Errno::ECONNREFUSED
rescue Selenium::WebDriver::Error::UnknownError => e
unless silenced_unknown_error_message?(e.message) warn "Ignoring Selenium UnknownError during driver quit: #{e.message}"
end
ensure
@browser = nil
end
|
#refresh ⇒ Object
92
93
94
|
# File 'lib/capybara/selenium/driver.rb', line 92
def refresh
browser.navigate.refresh
end
|
#reset! ⇒ Object
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
|
# File 'lib/capybara/selenium/driver.rb', line 144
def reset!
return unless @browser
navigated = false
timer = Capybara::Helpers.timer(expire_in: 10)
begin
reset_browser_state unless navigated
navigated = true
wait_for_empty_page(timer)
rescue *unhandled_alert_errors
accept_unhandled_reset_alert
retry
end
end
|
#resize_window_to(handle, width, height) ⇒ Object
205
206
207
208
209
|
# File 'lib/capybara/selenium/driver.rb', line 205
def resize_window_to(handle, width, height)
within_given_window(handle) do
browser.manage.window.resize_to(width, height)
end
end
|
#save_screenshot(path, **_options) ⇒ Object
140
141
142
|
# File 'lib/capybara/selenium/driver.rb', line 140
def save_screenshot(path, **_options)
browser.save_screenshot(path)
end
|
#send_keys(*args) ⇒ Object
136
137
138
|
# File 'lib/capybara/selenium/driver.rb', line 136
def send_keys(*args)
active_element.send_keys(*args)
end
|
#switch_to_frame(frame) ⇒ Object
179
180
181
182
183
184
185
186
187
188
189
190
191
192
|
# File 'lib/capybara/selenium/driver.rb', line 179
def switch_to_frame(frame)
handles = @frame_handles[current_window_handle]
case frame
when :top
handles.clear
browser.switch_to.default_content
when :parent
handles.pop
browser.switch_to.parent_frame
else
handles << frame
browser.switch_to.frame(frame.native)
end
end
|
#switch_to_window(handle) ⇒ Object
243
244
245
|
# File 'lib/capybara/selenium/driver.rb', line 243
def switch_to_window(handle)
browser.switch_to.window handle
end
|
#title ⇒ Object
110
111
112
|
# File 'lib/capybara/selenium/driver.rb', line 110
def title
browser.title
end
|
#visit(path) ⇒ Object
88
89
90
|
# File 'lib/capybara/selenium/driver.rb', line 88
def visit(path)
browser.navigate.to(path)
end
|
#wait? ⇒ Boolean
118
|
# File 'lib/capybara/selenium/driver.rb', line 118
def wait?; true; end
|
#window_handles ⇒ Object
232
233
234
|
# File 'lib/capybara/selenium/driver.rb', line 232
def window_handles
browser.window_handles
end
|
#window_size(handle) ⇒ Object
198
199
200
201
202
203
|
# File 'lib/capybara/selenium/driver.rb', line 198
def window_size(handle)
within_given_window(handle) do
size = browser.manage.window.size
[size.width, size.height]
end
end
|