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/sibling_query'
require 'capybara/queries/style_query'
require 'capybara/queries/active_element_query'
require 'capybara/node/finders'
require 'capybara/node/matchers'

View File

@ -22,12 +22,11 @@ module Capybara
# @see Capybara::Node
#
class Element < Base
def initialize(session, base, query_scope, query, &reload_proc)
def initialize(session, base, query_scope, query)
super(session, base)
@query_scope = query_scope
@query = query
@allow_reload = false
@reload_proc = reload_proc
@query_idx = nil
end
@ -551,11 +550,7 @@ module Capybara
return self unless @allow_reload
begin
reloaded = if @reload_proc
@reload_proc.call
else
@query.resolve_for(query_scope.reload)[@query_idx.to_i]
end
reloaded = @query.resolve_for(query_scope ? query_scope.reload : session)[@query_idx.to_i]
@base = reloaded.base if reloaded
rescue StandardError => 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
#
def active_element
Capybara::Node::Element.new(self, driver.active_element, nil, nil) do
active_element
end.tap(&:allow_reload!)
Capybara::Queries::ActiveElementQuery.new.resolve_for(self)[0].tap(&:allow_reload!)
end
##

View File

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