diff --git a/lib/capybara/document.rb b/lib/capybara/document.rb index 5a06b13d..cfed3f5d 100644 --- a/lib/capybara/document.rb +++ b/lib/capybara/document.rb @@ -1,13 +1,4 @@ module Capybara class Document < Node - def initialize(session) - @session = session - end - - def all_unfiltered(locator) - XPath.wrap(locator).paths.map do |path| - driver.find(path) - end.flatten - end end end diff --git a/lib/capybara/driver/celerity_driver.rb b/lib/capybara/driver/celerity_driver.rb index eb9d377a..5040bea6 100644 --- a/lib/capybara/driver/celerity_driver.rb +++ b/lib/capybara/driver/celerity_driver.rb @@ -77,9 +77,7 @@ class Capybara::Driver::Celerity < Capybara::Driver::Base node.fire_event(event.to_s) end - private - - def all_unfiltered(locator) + def find(locator) noko_node = Nokogiri::HTML(driver.body).xpath(node.xpath).first all_nodes = noko_node.xpath(locator).map { |n| n.path }.join(' | ') driver.find(all_nodes) diff --git a/lib/capybara/driver/selenium_driver.rb b/lib/capybara/driver/selenium_driver.rb index a4363ef8..2b8d7ffc 100644 --- a/lib/capybara/driver/selenium_driver.rb +++ b/lib/capybara/driver/selenium_driver.rb @@ -73,12 +73,12 @@ class Capybara::Driver::Selenium < Capybara::Driver::Base node.displayed? and node.displayed? != "false" end - private - - def all_unfiltered(locator) + def find(locator) node.find_elements(:xpath, locator).map { |n| self.class.new(driver, n) } end + private + def type self[:type] end diff --git a/lib/capybara/element.rb b/lib/capybara/element.rb index 8a70070c..d2b6da8a 100644 --- a/lib/capybara/element.rb +++ b/lib/capybara/element.rb @@ -1,24 +1,12 @@ module Capybara class Element < Node - def initialize(session, driver_node) - @session = session - @driver_node = driver_node - end - + # TODO: maybe we should explicitely delegate? def method_missing(*args) - @driver_node.send(*args) + @base.send(*args) end def respond_to?(method) - super || @driver_node.respond_to?(method) - end - - protected - - def all_unfiltered(locator) - XPath.wrap(locator).paths.map do |path| - @driver_node.find(path) - end.flatten + super || @base.respond_to?(method) end end end diff --git a/lib/capybara/node.rb b/lib/capybara/node.rb index caef36f8..7bd89931 100644 --- a/lib/capybara/node.rb +++ b/lib/capybara/node.rb @@ -1,6 +1,11 @@ module Capybara class Node - attr_reader :session + attr_reader :session, :base + + def initialize(session, base) + @session = session + @base = base + end def click_link_or_button(locator) msg = "no link or button '#{locator}' found" @@ -189,7 +194,9 @@ module Capybara end locator = XPath.from_css(locator) if kind == :css - results = all_unfiltered(locator) + results = XPath.wrap(locator).paths.map do |path| + base.find(path) + end.flatten if options[:text] diff --git a/lib/capybara/session.rb b/lib/capybara/session.rb index a518731d..6b07d62c 100644 --- a/lib/capybara/session.rb +++ b/lib/capybara/session.rb @@ -41,7 +41,7 @@ module Capybara def_delegator :driver, :source def document - Capybara::Document.new(self) + Capybara::Document.new(self, driver) end def method_missing(*args)