Class: Capybara::Selenium::Driver
Defined Under Namespace
Modules: ChromeDriver, FirefoxDriver, InternetExplorerDriver
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
Instance Attribute Summary collapse
Class Method Summary
collapse
Instance Method Summary
collapse
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.
40
41
42
43
44
45
46
47
48
|
# File 'lib/capybara/selenium/driver.rb', line 40
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
|
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
17
18
19
20
21
22
23
24
|
# File 'lib/capybara/selenium/driver.rb', line 17
def self.load_selenium
require 'selenium-webdriver'
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 => err
raise err if err.message !~ /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
|
Instance Method Details
#accept_modal(_type, **options) ⇒ Object
188
189
190
191
192
193
194
195
196
197
|
# File 'lib/capybara/selenium/driver.rb', line 188
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
26
27
28
29
30
31
32
33
34
35
36
37
38
|
# File 'lib/capybara/selenium/driver.rb', line 26
def browser
@browser ||= begin
if options[:timeout]
options[:http_client] ||= Selenium::WebDriver::Remote::Http::Default.new(read_timeout: options[:timeout])
end
processed_options = options.reject { |key, _val| SPECIAL_OPTIONS.include?(key) }
Selenium::WebDriver.for(options[:browser], processed_options).tap do |driver|
specialize_driver(driver)
setup_exit_handler
end
end
@browser
end
|
#close_window(handle) ⇒ Object
168
169
170
171
172
173
174
|
# File 'lib/capybara/selenium/driver.rb', line 168
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
74
75
76
|
# File 'lib/capybara/selenium/driver.rb', line 74
def current_url
browser.current_url
end
|
#current_window_handle ⇒ Object
138
139
140
|
# File 'lib/capybara/selenium/driver.rb', line 138
def current_window_handle
browser.window_handle
end
|
#dismiss_modal(_type, **options) ⇒ Object
199
200
201
202
203
204
205
|
# File 'lib/capybara/selenium/driver.rb', line 199
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
90
91
92
93
94
|
# File 'lib/capybara/selenium/driver.rb', line 90
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
85
86
87
88
|
# File 'lib/capybara/selenium/driver.rb', line 85
def evaluate_script(script, *args)
result = execute_script("return #{script}", *args)
unwrap_script_result(result)
end
|
#execute_script(script, *args) ⇒ Object
81
82
83
|
# File 'lib/capybara/selenium/driver.rb', line 81
def execute_script(script, *args)
browser.execute_script(script, *native_args(args))
end
|
#fullscreen_window(handle) ⇒ Object
162
163
164
165
166
|
# File 'lib/capybara/selenium/driver.rb', line 162
def fullscreen_window(handle)
within_given_window(handle) do
browser.manage.window.full_screen
end
end
|
#go_back ⇒ Object
58
59
60
|
# File 'lib/capybara/selenium/driver.rb', line 58
def go_back
browser.navigate.back
end
|
#go_forward ⇒ Object
62
63
64
|
# File 'lib/capybara/selenium/driver.rb', line 62
def go_forward
browser.navigate.forward
end
|
#html ⇒ Object
66
67
68
|
# File 'lib/capybara/selenium/driver.rb', line 66
def html
browser.page_source
end
|
#invalid_element_errors ⇒ Object
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
|
# File 'lib/capybara/selenium/driver.rb', line 220
def invalid_element_errors
[
::Selenium::WebDriver::Error::StaleElementReferenceError,
::Selenium::WebDriver::Error::UnhandledError,
::Selenium::WebDriver::Error::ElementNotVisibleError,
::Selenium::WebDriver::Error::InvalidSelectorError, ::Selenium::WebDriver::Error::ElementNotInteractableError,
::Selenium::WebDriver::Error::ElementClickInterceptedError,
::Selenium::WebDriver::Error::InvalidElementStateError,
::Selenium::WebDriver::Error::ElementNotSelectableError,
::Selenium::WebDriver::Error::ElementNotSelectableError,
::Selenium::WebDriver::Error::NoSuchElementError, ::Selenium::WebDriver::Error::InvalidArgumentError ]
end
|
#maximize_window(handle) ⇒ Object
155
156
157
158
159
160
|
# File 'lib/capybara/selenium/driver.rb', line 155
def maximize_window(handle)
within_given_window(handle) do
browser.manage.window.maximize
end
sleep 0.1 end
|
#needs_server? ⇒ Boolean
79
|
# File 'lib/capybara/selenium/driver.rb', line 79
def needs_server?; true; end
|
#no_such_window_error ⇒ Object
236
237
238
|
# File 'lib/capybara/selenium/driver.rb', line 236
def no_such_window_error
Selenium::WebDriver::Error::NoSuchWindowError
end
|
#open_new_window ⇒ Object
180
181
182
|
# File 'lib/capybara/selenium/driver.rb', line 180
def open_new_window
browser.execute_script('window.open();')
end
|
#quit ⇒ Object
207
208
209
210
211
212
213
214
215
216
217
218
|
# File 'lib/capybara/selenium/driver.rb', line 207
def quit
@browser&.quit
rescue Selenium::WebDriver::Error::SessionNotCreatedError, Errno::ECONNREFUSED rescue Selenium::WebDriver::Error::UnknownError => err
unless silenced_unknown_error_message?(err.message) warn "Ignoring Selenium UnknownError during driver quit: #{err.message}"
end
ensure
@browser = nil
end
|
#refresh ⇒ Object
54
55
56
|
# File 'lib/capybara/selenium/driver.rb', line 54
def refresh
browser.navigate.refresh
end
|
#reset! ⇒ Object
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
|
# File 'lib/capybara/selenium/driver.rb', line 100
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 Selenium::WebDriver::Error::UnhandledAlertError, Selenium::WebDriver::Error::UnexpectedAlertOpenError
accept_unhandled_reset_alert
retry
end
end
|
#resize_window_to(handle, width, height) ⇒ Object
149
150
151
152
153
|
# File 'lib/capybara/selenium/driver.rb', line 149
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
96
97
98
|
# File 'lib/capybara/selenium/driver.rb', line 96
def save_screenshot(path, **_options)
browser.save_screenshot(path)
end
|
#switch_to_frame(frame) ⇒ Object
123
124
125
126
127
128
129
130
131
132
133
134
135
136
|
# File 'lib/capybara/selenium/driver.rb', line 123
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.native
browser.switch_to.frame(frame.native)
end
end
|
#switch_to_window(handle) ⇒ Object
184
185
186
|
# File 'lib/capybara/selenium/driver.rb', line 184
def switch_to_window(handle)
browser.switch_to.window handle
end
|
#title ⇒ Object
70
71
72
|
# File 'lib/capybara/selenium/driver.rb', line 70
def title
browser.title
end
|
#visit(path) ⇒ Object
50
51
52
|
# File 'lib/capybara/selenium/driver.rb', line 50
def visit(path)
browser.navigate.to(path)
end
|
#wait? ⇒ Boolean
78
|
# File 'lib/capybara/selenium/driver.rb', line 78
def wait?; true; end
|
#window_handles ⇒ Object
176
177
178
|
# File 'lib/capybara/selenium/driver.rb', line 176
def window_handles
browser.window_handles
end
|
#window_size(handle) ⇒ Object
142
143
144
145
146
147
|
# File 'lib/capybara/selenium/driver.rb', line 142
def window_size(handle)
within_given_window(handle) do
size = browser.manage.window.size
[size.width, size.height]
end
end
|