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/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'
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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
|
# 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
|
||||||
|
|
||||||
##
|
##
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue