Implement active_element as a query and revert the reload_proc changes
This commit is contained in:
parent
c53207d1a0
commit
d2b1ba32f6
|
@ -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'
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
|
@ -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
|
||||
|
||||
##
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue