From d2b1ba32f69b08d731b9a39bdddee03d448a93a7 Mon Sep 17 00:00:00 2001 From: Thomas Walpole Date: Sun, 15 Aug 2021 14:45:27 -0700 Subject: [PATCH] Implement active_element as a query and revert the reload_proc changes --- lib/capybara.rb | 1 + lib/capybara/node/element.rb | 9 ++------- lib/capybara/queries/active_element_query.rb | 18 ++++++++++++++++++ lib/capybara/session.rb | 4 +--- .../spec/session/active_element_spec.rb | 9 +++++++-- 5 files changed, 29 insertions(+), 12 deletions(-) create mode 100644 lib/capybara/queries/active_element_query.rb diff --git a/lib/capybara.rb b/lib/capybara.rb index 39282c91..4c552e40 100644 --- a/lib/capybara.rb +++ b/lib/capybara.rb @@ -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' diff --git a/lib/capybara/node/element.rb b/lib/capybara/node/element.rb index 001ef91a..c4528faa 100644 --- a/lib/capybara/node/element.rb +++ b/lib/capybara/node/element.rb @@ -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) diff --git a/lib/capybara/queries/active_element_query.rb b/lib/capybara/queries/active_element_query.rb new file mode 100644 index 00000000..fcbf0588 --- /dev/null +++ b/lib/capybara/queries/active_element_query.rb @@ -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 diff --git a/lib/capybara/session.rb b/lib/capybara/session.rb index d4ecab92..15bfc139 100644 --- a/lib/capybara/session.rb +++ b/lib/capybara/session.rb @@ -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 ## diff --git a/lib/capybara/spec/session/active_element_spec.rb b/lib/capybara/spec/session/active_element_spec.rb index a985c7b2..48abfeed 100644 --- a/lib/capybara/spec/session/active_element_spec.rb +++ b/lib/capybara/spec/session/active_element_spec.rb @@ -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