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 # @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)

View file

@ -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

View file

@ -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
## ##

View file

@ -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

View file

@ -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>