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
-
#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.
60
61
62
63
64
65
66
67
68
|
# File 'lib/capybara/selenium/driver.rb', line 60
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.
33
34
35
|
# File 'lib/capybara/selenium/driver.rb', line 33
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
|
# 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'
if Gem.loaded_specs['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.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
35
36
37
38
|
# File 'lib/capybara/selenium/driver.rb', line 35
def register_specialization(browser_name, specialization)
@specializations ||= {}
@specializations[browser_name] = specialization
end
|
Instance Method Details
#accept_modal(_type, **options) ⇒ Object
223
224
225
226
227
228
229
230
231
232
|
# File 'lib/capybara/selenium/driver.rb', line 223
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
|
# File 'lib/capybara/selenium/driver.rb', line 41
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
200
201
202
203
204
205
206
|
# File 'lib/capybara/selenium/driver.rb', line 200
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
94
95
96
|
# File 'lib/capybara/selenium/driver.rb', line 94
def current_url
browser.current_url
end
|
#current_window_handle ⇒ Object
170
171
172
|
# File 'lib/capybara/selenium/driver.rb', line 170
def current_window_handle
browser.window_handle
end
|
#dismiss_modal(_type, **options) ⇒ Object
234
235
236
237
238
239
240
|
# File 'lib/capybara/selenium/driver.rb', line 234
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
110
111
112
113
114
|
# File 'lib/capybara/selenium/driver.rb', line 110
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
105
106
107
108
|
# File 'lib/capybara/selenium/driver.rb', line 105
def evaluate_script(script, *args)
result = execute_script("return #{script}", *args)
unwrap_script_result(result)
end
|
#execute_script(script, *args) ⇒ Object
101
102
103
|
# File 'lib/capybara/selenium/driver.rb', line 101
def execute_script(script, *args)
browser.execute_script(script, *native_args(args))
end
|
#frame_obscured_at?(x:, y:) ⇒ Boolean
143
144
145
146
147
148
149
150
151
152
153
|
# File 'lib/capybara/selenium/driver.rb', line 143
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
194
195
196
197
198
|
# File 'lib/capybara/selenium/driver.rb', line 194
def fullscreen_window(handle)
within_given_window(handle) do
browser.manage.window.full_screen
end
end
|
#go_back ⇒ Object
78
79
80
|
# File 'lib/capybara/selenium/driver.rb', line 78
def go_back
browser.navigate.back
end
|
#go_forward ⇒ Object
82
83
84
|
# File 'lib/capybara/selenium/driver.rb', line 82
def go_forward
browser.navigate.forward
end
|
#html ⇒ Object
86
87
88
|
# File 'lib/capybara/selenium/driver.rb', line 86
def html
browser.page_source
end
|
#invalid_element_errors ⇒ Object
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
|
# File 'lib/capybara/selenium/driver.rb', line 255
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
187
188
189
190
191
192
|
# File 'lib/capybara/selenium/driver.rb', line 187
def maximize_window(handle)
within_given_window(handle) do
browser.manage.window.maximize
end
sleep 0.1 end
|
#needs_server? ⇒ Boolean
99
|
# File 'lib/capybara/selenium/driver.rb', line 99
def needs_server?; true; end
|
#no_such_window_error ⇒ Object
279
280
281
|
# File 'lib/capybara/selenium/driver.rb', line 279
def no_such_window_error
Selenium::WebDriver::Error::NoSuchWindowError
end
|
#open_new_window(kind = :tab) ⇒ Object
212
213
214
215
216
217
|
# File 'lib/capybara/selenium/driver.rb', line 212
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
242
243
244
245
246
247
248
249
250
251
252
253
|
# File 'lib/capybara/selenium/driver.rb', line 242
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
74
75
76
|
# File 'lib/capybara/selenium/driver.rb', line 74
def refresh
browser.navigate.refresh
end
|
#reset! ⇒ Object
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
|
# File 'lib/capybara/selenium/driver.rb', line 120
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
181
182
183
184
185
|
# File 'lib/capybara/selenium/driver.rb', line 181
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
116
117
118
|
# File 'lib/capybara/selenium/driver.rb', line 116
def save_screenshot(path, **_options)
browser.save_screenshot(path)
end
|
#switch_to_frame(frame) ⇒ Object
155
156
157
158
159
160
161
162
163
164
165
166
167
168
|
# File 'lib/capybara/selenium/driver.rb', line 155
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
219
220
221
|
# File 'lib/capybara/selenium/driver.rb', line 219
def switch_to_window(handle)
browser.switch_to.window handle
end
|
#title ⇒ Object
90
91
92
|
# File 'lib/capybara/selenium/driver.rb', line 90
def title
browser.title
end
|
#visit(path) ⇒ Object
70
71
72
|
# File 'lib/capybara/selenium/driver.rb', line 70
def visit(path)
browser.navigate.to(path)
end
|
#wait? ⇒ Boolean
98
|
# File 'lib/capybara/selenium/driver.rb', line 98
def wait?; true; end
|
#window_handles ⇒ Object
208
209
210
|
# File 'lib/capybara/selenium/driver.rb', line 208
def window_handles
browser.window_handles
end
|
#window_size(handle) ⇒ Object
174
175
176
177
178
179
|
# File 'lib/capybara/selenium/driver.rb', line 174
def window_size(handle)
within_given_window(handle) do
size = browser.manage.window.size
[size.width, size.height]
end
end
|