1
0
Fork 0
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:
Thomas Walpole 2021-08-15 12:34:15 -07:00
parent 5c1d6d34f8
commit c53207d1a0
5 changed files with 32 additions and 9 deletions

View file

@ -22,11 +22,12 @@ module Capybara
# @see Capybara::Node
#
class Element < Base
def initialize(session, base, query_scope, query)
def initialize(session, base, query_scope, query, &reload_proc)
super(session, base)
@query_scope = query_scope
@query = query
@allow_reload = false
@reload_proc = reload_proc
@query_idx = nil
end
@ -550,7 +551,11 @@ module Capybara
return self unless @allow_reload
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
rescue StandardError => e
raise e unless catch_error?(e)

View file

@ -149,11 +149,12 @@ class Capybara::Selenium::Driver < Capybara::Driver::Base
end
def active_element
build_node(browser.switch_to.active_element)
build_node(native_active_element)
end
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
def save_screenshot(path, **_options)
@ -333,6 +334,10 @@ private
args.map { |arg| arg.is_a?(Capybara::Selenium::Node) ? arg.native : arg }
end
def native_active_element
browser.switch_to.active_element
end
def clear_browser_state
delete_all_cookies
clear_storage

View file

@ -318,7 +318,9 @@ module Capybara
# Not supported by Rack Test
#
def active_element
driver.active_element
Capybara::Node::Element.new(self, driver.active_element, nil, nil) do
active_element
end.tap(&:allow_reload!)
end
##

View file

@ -5,10 +5,22 @@ Capybara::SpecHelper.spec '#active_element', requires: [:js] do
@session.visit('/form')
@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)
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

View file

@ -1,11 +1,10 @@
<h1>Form</h1>
<form action="/form" method="post" novalidate>
<p>
<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">Mr</option>
<option>Miss</option>