From ac82714b8ca7ecc7bc15217cbd295db9b66a6153 Mon Sep 17 00:00:00 2001 From: Thomas Walpole Date: Tue, 8 Jan 2019 15:51:05 -0800 Subject: [PATCH] Provide the ability to handle multiple cached initial values --- lib/capybara/driver/node.rb | 6 +++--- lib/capybara/node/base.rb | 2 +- lib/capybara/node/element.rb | 9 +++------ lib/capybara/node/simple.rb | 5 +++-- lib/capybara/queries/selector_query.rb | 4 ++-- lib/capybara/selenium/driver.rb | 4 ++-- .../selenium/driver_specializations/chrome_driver.rb | 4 ++-- .../selenium/driver_specializations/firefox_driver.rb | 4 ++-- lib/capybara/selenium/extensions/find.rb | 8 ++------ lib/capybara/selenium/node.rb | 4 ++-- 10 files changed, 22 insertions(+), 28 deletions(-) diff --git a/lib/capybara/driver/node.rb b/lib/capybara/driver/node.rb index 0653f604..f847579f 100644 --- a/lib/capybara/driver/node.rb +++ b/lib/capybara/driver/node.rb @@ -3,12 +3,12 @@ module Capybara module Driver class Node - attr_reader :driver, :native, :initial_visibility + attr_reader :driver, :native, :initial_cache - def initialize(driver, native, initial_visibility = nil) + def initialize(driver, native, initial_cache = {}) @driver = driver @native = native - @initial_visibility = initial_visibility + @initial_cache = initial_cache end def all_text diff --git a/lib/capybara/node/base.rb b/lib/capybara/node/base.rb index 3b21d559..72a153a2 100644 --- a/lib/capybara/node/base.rb +++ b/lib/capybara/node/base.rb @@ -105,7 +105,7 @@ module Capybara # @api private def find_xpath(xpath, **options) - if base.method(:find_css).arity != 1 + if base.method(:find_xpath).arity != 1 base.find_xpath(xpath, **options) else base.find_xpath(xpath) diff --git a/lib/capybara/node/element.rb b/lib/capybara/node/element.rb index 4c111107..b4092c4d 100644 --- a/lib/capybara/node/element.rb +++ b/lib/capybara/node/element.rb @@ -465,12 +465,9 @@ module Capybara %(Obsolete #) end - def initial_visibility - if base.respond_to? :initial_visibility - base.initial_visibility - else - nil - end + # @api private + def initial_cache + base.respond_to?(:initial_cache) ? base.initial_cache : {} end STYLE_SCRIPT = <<~JS diff --git a/lib/capybara/node/simple.rb b/lib/capybara/node/simple.rb index 270a6106..96058ed2 100644 --- a/lib/capybara/node/simple.rb +++ b/lib/capybara/node/simple.rb @@ -178,8 +178,9 @@ module Capybara Capybara.session_options end - def initial_visibility - nil + # @api private + def initial_cache + {} end private diff --git a/lib/capybara/queries/selector_query.rb b/lib/capybara/queries/selector_query.rb index b7e86e6f..8bd6c8e8 100644 --- a/lib/capybara/queries/selector_query.rb +++ b/lib/capybara/queries/selector_query.rb @@ -416,9 +416,9 @@ module Capybara def matches_visible_filter?(node) case visible when :visible then - node.initial_visibility || (node.initial_visibility.nil? && node.visible?) + node.initial_cache[:visible] || (node.initial_cache[:visible].nil? && node.visible?) when :hidden then - (node.initial_visibility == false) || (node.initial_visibility.nil? && !node.visible?) + (node.initial_cache[:visible] == false) || (node.initial_cache[:visbile].nil? && !node.visible?) else true end end diff --git a/lib/capybara/selenium/driver.rb b/lib/capybara/selenium/driver.rb index 31819e33..ca424ffb 100644 --- a/lib/capybara/selenium/driver.rb +++ b/lib/capybara/selenium/driver.rb @@ -346,8 +346,8 @@ private browser end - def build_node(native_node, initial_visibility = nil) - ::Capybara::Selenium::Node.new(self, native_node, initial_visibility) + def build_node(native_node, initial_cache = {}) + ::Capybara::Selenium::Node.new(self, native_node, initial_cache) end def specialize_driver(sel_driver) diff --git a/lib/capybara/selenium/driver_specializations/chrome_driver.rb b/lib/capybara/selenium/driver_specializations/chrome_driver.rb index 97b059b5..e2dc5893 100644 --- a/lib/capybara/selenium/driver_specializations/chrome_driver.rb +++ b/lib/capybara/selenium/driver_specializations/chrome_driver.rb @@ -51,8 +51,8 @@ private result['value'] end - def build_node(native_node, initial_visibility = nil) - ::Capybara::Selenium::ChromeNode.new(self, native_node, initial_visibility) + def build_node(native_node, initial_cache = {}) + ::Capybara::Selenium::ChromeNode.new(self, native_node, initial_cache) end def bridge diff --git a/lib/capybara/selenium/driver_specializations/firefox_driver.rb b/lib/capybara/selenium/driver_specializations/firefox_driver.rb index 6b4d298c..0df359e0 100644 --- a/lib/capybara/selenium/driver_specializations/firefox_driver.rb +++ b/lib/capybara/selenium/driver_specializations/firefox_driver.rb @@ -44,7 +44,7 @@ module Capybara::Selenium::Driver::FirefoxDriver private - def build_node(native_node, initial_visibility = nil) - ::Capybara::Selenium::FirefoxNode.new(self, native_node, initial_visibility) + def build_node(native_node, initial_cache = {}) + ::Capybara::Selenium::FirefoxNode.new(self, native_node, initial_cache) end end diff --git a/lib/capybara/selenium/extensions/find.rb b/lib/capybara/selenium/extensions/find.rb index 6abe6950..cf822f4f 100644 --- a/lib/capybara/selenium/extensions/find.rb +++ b/lib/capybara/selenium/extensions/find.rb @@ -16,12 +16,8 @@ module Capybara def find_by(format, selector, uses_visibility:, texts:) els = find_context.find_elements(format, selector) els = filter_by_text(els, texts) if (els.size > 1) && !texts.empty? - visibilities = if uses_visibility && els.size > 1 - element_visibilities(els) - else - [] - end - els.map.with_index { |el, idx| build_node(el, visibilities[idx]) } + visibilities = uses_visibility && els.size > 1 ? element_visibilities(els) : [] + els.map.with_index { |el, idx| build_node(el, visible: visibilities[idx]) } end def element_visibilities(elements) diff --git a/lib/capybara/selenium/node.rb b/lib/capybara/selenium/node.rb index 4f58cda8..f90df208 100644 --- a/lib/capybara/selenium/node.rb +++ b/lib/capybara/selenium/node.rb @@ -349,8 +349,8 @@ private native end - def build_node(native_node, initial_visibility = nil) - self.class.new(driver, native_node, initial_visibility) + def build_node(native_node, initial_cache = {}) + self.class.new(driver, native_node, initial_cache) end GET_XPATH_SCRIPT = <<~'JS'