mirror of
https://github.com/teamcapybara/capybara.git
synced 2022-11-09 12:08:07 -05:00
Implement reloading for active element
This commit is contained in:
parent
5c1d6d34f8
commit
c53207d1a0
5 changed files with 32 additions and 9 deletions
|
@ -22,11 +22,12 @@ module Capybara
|
||||||
# @see Capybara::Node
|
# @see Capybara::Node
|
||||||
#
|
#
|
||||||
class Element < Base
|
class Element < Base
|
||||||
def initialize(session, base, query_scope, query)
|
def initialize(session, base, query_scope, query, &reload_proc)
|
||||||
super(session, base)
|
super(session, base)
|
||||||
@query_scope = query_scope
|
@query_scope = query_scope
|
||||||
@query = query
|
@query = query
|
||||||
@allow_reload = false
|
@allow_reload = false
|
||||||
|
@reload_proc = reload_proc
|
||||||
@query_idx = nil
|
@query_idx = nil
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -550,7 +551,11 @@ module Capybara
|
||||||
return self unless @allow_reload
|
return self unless @allow_reload
|
||||||
|
|
||||||
begin
|
begin
|
||||||
reloaded = @query.resolve_for(query_scope.reload)[@query_idx.to_i]
|
reloaded = if @reload_proc
|
||||||
|
@reload_proc.call
|
||||||
|
else
|
||||||
|
@query.resolve_for(query_scope.reload)[@query_idx.to_i]
|
||||||
|
end
|
||||||
@base = reloaded.base if reloaded
|
@base = reloaded.base if reloaded
|
||||||
rescue StandardError => e
|
rescue StandardError => e
|
||||||
raise e unless catch_error?(e)
|
raise e unless catch_error?(e)
|
||||||
|
|
|
@ -149,11 +149,12 @@ class Capybara::Selenium::Driver < Capybara::Driver::Base
|
||||||
end
|
end
|
||||||
|
|
||||||
def active_element
|
def active_element
|
||||||
build_node(browser.switch_to.active_element)
|
build_node(native_active_element)
|
||||||
end
|
end
|
||||||
|
|
||||||
def send_keys(*args)
|
def send_keys(*args)
|
||||||
active_element.native.send_keys(*args)
|
# Should this call the specialized nodes rather than native???
|
||||||
|
native_active_element.send_keys(*args)
|
||||||
end
|
end
|
||||||
|
|
||||||
def save_screenshot(path, **_options)
|
def save_screenshot(path, **_options)
|
||||||
|
@ -333,6 +334,10 @@ private
|
||||||
args.map { |arg| arg.is_a?(Capybara::Selenium::Node) ? arg.native : arg }
|
args.map { |arg| arg.is_a?(Capybara::Selenium::Node) ? arg.native : arg }
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def native_active_element
|
||||||
|
browser.switch_to.active_element
|
||||||
|
end
|
||||||
|
|
||||||
def clear_browser_state
|
def clear_browser_state
|
||||||
delete_all_cookies
|
delete_all_cookies
|
||||||
clear_storage
|
clear_storage
|
||||||
|
|
|
@ -318,7 +318,9 @@ module Capybara
|
||||||
# Not supported by Rack Test
|
# Not supported by Rack Test
|
||||||
#
|
#
|
||||||
def active_element
|
def active_element
|
||||||
driver.active_element
|
Capybara::Node::Element.new(self, driver.active_element, nil, nil) do
|
||||||
|
active_element
|
||||||
|
end.tap(&:allow_reload!)
|
||||||
end
|
end
|
||||||
|
|
||||||
##
|
##
|
||||||
|
|
|
@ -5,10 +5,22 @@ Capybara::SpecHelper.spec '#active_element', requires: [:js] do
|
||||||
@session.visit('/form')
|
@session.visit('/form')
|
||||||
@session.send_keys(:tab)
|
@session.send_keys(:tab)
|
||||||
|
|
||||||
expect(@session.active_element).to eq(@session.find_by_id('form_title'))
|
expect(@session.active_element).to match_selector(:css, '#form_title');
|
||||||
|
|
||||||
@session.send_keys(:tab)
|
@session.send_keys(:tab)
|
||||||
|
|
||||||
expect(@session.active_element).not_to eq(@session.find_by_id('form_title'))
|
expect(@session.active_element).not_to match_selector(:css, '#form_title');
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'should support reloading' do
|
||||||
|
@session.visit('/form')
|
||||||
|
expect(@session.active_element).to match_selector(:css, 'body')
|
||||||
|
@session.execute_script <<-JS
|
||||||
|
window.setTimeout(() => {
|
||||||
|
document.querySelector('#form_title').focus();
|
||||||
|
}, 1000)
|
||||||
|
JS
|
||||||
|
expect(@session.active_element).to match_selector(:css, 'body', wait: false)
|
||||||
|
expect(@session.active_element).to match_selector(:css, '#form_title', wait: 2)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,11 +1,10 @@
|
||||||
|
|
||||||
<h1>Form</h1>
|
<h1>Form</h1>
|
||||||
|
|
||||||
<form action="/form" method="post" novalidate>
|
<form action="/form" method="post" novalidate>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
<label for="form_title">Title</label>
|
<label for="form_title">Title</label>
|
||||||
<select name="form[title]" id="form_title" class="title">
|
<select name="form[title]" id="form_title" class="title" tabindex=1>
|
||||||
<option class="title">Mrs</option>
|
<option class="title">Mrs</option>
|
||||||
<option class="title">Mr</option>
|
<option class="title">Mr</option>
|
||||||
<option>Miss</option>
|
<option>Miss</option>
|
||||||
|
|
Loading…
Add table
Reference in a new issue