Implement active_element as a query and revert the reload_proc changes

This commit is contained in:
Thomas Walpole 2021-08-15 14:45:27 -07:00
parent c53207d1a0
commit d2b1ba32f6
5 changed files with 29 additions and 12 deletions

View File

@ -462,6 +462,7 @@ module Capybara
require 'capybara/queries/ancestor_query' require 'capybara/queries/ancestor_query'
require 'capybara/queries/sibling_query' require 'capybara/queries/sibling_query'
require 'capybara/queries/style_query' require 'capybara/queries/style_query'
require 'capybara/queries/active_element_query'
require 'capybara/node/finders' require 'capybara/node/finders'
require 'capybara/node/matchers' require 'capybara/node/matchers'

View File

@ -22,12 +22,11 @@ module Capybara
# @see Capybara::Node # @see Capybara::Node
# #
class Element < Base class Element < Base
def initialize(session, base, query_scope, query, &reload_proc) def initialize(session, base, query_scope, query)
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
@ -551,11 +550,7 @@ module Capybara
return self unless @allow_reload return self unless @allow_reload
begin begin
reloaded = if @reload_proc reloaded = @query.resolve_for(query_scope ? query_scope.reload : session)[@query_idx.to_i]
@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

@ -0,0 +1,18 @@
# frozen_string_literal: true
module Capybara
# @api private
module Queries
class ActiveElementQuery < BaseQuery
def initialize(**options)
@options = options
super(@options)
end
def resolve_for(session)
node = session.driver.active_element
[Capybara::Node::Element.new(session, node, nil, self)]
end
end
end
end

View File

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

View File

@ -5,11 +5,11 @@ 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 match_selector(:css, '#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 match_selector(:css, '#form_title'); expect(@session.active_element).not_to match_selector(:css, '#form_title')
end end
it 'should support reloading' do it 'should support reloading' do
@ -23,4 +23,9 @@ Capybara::SpecHelper.spec '#active_element', requires: [:js] do
expect(@session.active_element).to match_selector(:css, 'body', wait: false) expect(@session.active_element).to match_selector(:css, 'body', wait: false)
expect(@session.active_element).to match_selector(:css, '#form_title', wait: 2) expect(@session.active_element).to match_selector(:css, '#form_title', wait: 2)
end end
it 'should return a Capybara::Element' do
@session.visit('/form')
expect(@session.active_element).to be_a Capybara::Node::Element
end
end end