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].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
-
#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.
56
57
58
59
60
61
62
63
64
|
# File 'lib/capybara/selenium/driver.rb', line 56
def initialize(app, **options)
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.
29
30
31
|
# File 'lib/capybara/selenium/driver.rb', line 29
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
|
# File 'lib/capybara/selenium/driver.rb', line 18
def load_selenium
require 'selenium-webdriver'
require 'capybara/selenium/logger_suppressor'
require 'capybara/selenium/patches/atoms'
warn "Warning: You're using an unsupported version of selenium-webdriver, please upgrade." if Gem.loaded_specs['selenium-webdriver'].version < Gem::Version.new('3.5.0')
rescue LoadError => e
raise e unless e.message.match?(/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
31
32
33
34
|
# File 'lib/capybara/selenium/driver.rb', line 31
def register_specialization(browser_name, specialization)
@specializations ||= {}
@specializations[browser_name] = specialization
end
|
Instance Method Details
#accept_modal(_type, **options) ⇒ Object
219
220
221
222
223
224
225
226
227
228
|
# File 'lib/capybara/selenium/driver.rb', line 219
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
# File 'lib/capybara/selenium/driver.rb', line 37
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
196
197
198
199
200
201
202
|
# File 'lib/capybara/selenium/driver.rb', line 196
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
90
91
92
|
# File 'lib/capybara/selenium/driver.rb', line 90
def current_url
browser.current_url
end
|
#current_window_handle ⇒ Object
166
167
168
|
# File 'lib/capybara/selenium/driver.rb', line 166
def current_window_handle
browser.window_handle
end
|
#dismiss_modal(_type, **options) ⇒ Object
230
231
232
233
234
235
236
|
# File 'lib/capybara/selenium/driver.rb', line 230
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
106
107
108
109
110
|
# File 'lib/capybara/selenium/driver.rb', line 106
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
101
102
103
104
|
# File 'lib/capybara/selenium/driver.rb', line 101
def evaluate_script(script, *args)
result = execute_script("return #{script}", *args)
unwrap_script_result(result)
end
|
#execute_script(script, *args) ⇒ Object
97
98
99
|
# File 'lib/capybara/selenium/driver.rb', line 97
def execute_script(script, *args)
browser.execute_script(script, *native_args(args))
end
|
#frame_obscured_at?(x:, y:) ⇒ Boolean
139
140
141
142
143
144
145
146
147
148
149
|
# File 'lib/capybara/selenium/driver.rb', line 139
def frame_obscured_at?(x:, y:)
frame = @frame_handles[current_window_handle].last
return false unless frame
switch_to_frame(:parent)
begin
return frame.base.obscured?(x: x, y: y)
ensure
switch_to_frame(frame)
end
end
|
#fullscreen_window(handle) ⇒ Object
190
191
192
193
194
|
# File 'lib/capybara/selenium/driver.rb', line 190
def fullscreen_window(handle)
within_given_window(handle) do
browser.manage.window.full_screen
end
end
|
#go_back ⇒ Object
74
75
76
|
# File 'lib/capybara/selenium/driver.rb', line 74
def go_back
browser.navigate.back
end
|
#go_forward ⇒ Object
78
79
80
|
# File 'lib/capybara/selenium/driver.rb', line 78
def go_forward
browser.navigate.forward
end
|
#html ⇒ Object
82
83
84
|
# File 'lib/capybara/selenium/driver.rb', line 82
def html
browser.page_source
end
|
#invalid_element_errors ⇒ Object
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
|
# File 'lib/capybara/selenium/driver.rb', line 251
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
183
184
185
186
187
188
|
# File 'lib/capybara/selenium/driver.rb', line 183
def maximize_window(handle)
within_given_window(handle) do
browser.manage.window.maximize
end
sleep 0.1 end
|
#needs_server? ⇒ Boolean
95
|
# File 'lib/capybara/selenium/driver.rb', line 95
def needs_server?; true; end
|
#no_such_window_error ⇒ Object
275
276
277
|
# File 'lib/capybara/selenium/driver.rb', line 275
def no_such_window_error
Selenium::WebDriver::Error::NoSuchWindowError
end
|
#open_new_window(kind = :tab) ⇒ Object
208
209
210
211
212
213
|
# File 'lib/capybara/selenium/driver.rb', line 208
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
238
239
240
241
242
243
244
245
246
247
248
249
|
# File 'lib/capybara/selenium/driver.rb', line 238
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
70
71
72
|
# File 'lib/capybara/selenium/driver.rb', line 70
def refresh
browser.navigate.refresh
end
|
#reset! ⇒ Object
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
|
# File 'lib/capybara/selenium/driver.rb', line 116
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
177
178
179
180
181
|
# File 'lib/capybara/selenium/driver.rb', line 177
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
112
113
114
|
# File 'lib/capybara/selenium/driver.rb', line 112
def save_screenshot(path, **_options)
browser.save_screenshot(path)
end
|
#switch_to_frame(frame) ⇒ Object
151
152
153
154
155
156
157
158
159
160
161
162
163
164
|
# File 'lib/capybara/selenium/driver.rb', line 151
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
215
216
217
|
# File 'lib/capybara/selenium/driver.rb', line 215
def switch_to_window(handle)
browser.switch_to.window handle
end
|
#title ⇒ Object
86
87
88
|
# File 'lib/capybara/selenium/driver.rb', line 86
def title
browser.title
end
|
#visit(path) ⇒ Object
66
67
68
|
# File 'lib/capybara/selenium/driver.rb', line 66
def visit(path)
browser.navigate.to(path)
end
|
#wait? ⇒ Boolean
94
|
# File 'lib/capybara/selenium/driver.rb', line 94
def wait?; true; end
|
#window_handles ⇒ Object
204
205
206
|
# File 'lib/capybara/selenium/driver.rb', line 204
def window_handles
browser.window_handles
end
|
#window_size(handle) ⇒ Object
170
171
172
173
174
175
|
# File 'lib/capybara/selenium/driver.rb', line 170
def window_size(handle)
within_given_window(handle) do
size = browser.manage.window.size
[size.width, size.height]
end
end
|