lib/capybara/node.rb in capybara-0.3.9 vs lib/capybara/node.rb in capybara-0.4.0.rc

- old
+ new

@@ -1,60 +1,221 @@ +require 'capybara/node/finders' +require 'capybara/node/actions' +require 'capybara/node/matchers' + module Capybara + + ## + # + # A {Capybara::Node} represents either an element on a page through the subclass + # {Capybara::Element} or a document through {Capybara::Document}. + # + # Both types of Node share the same methods, used for interacting with the + # elements on the page. These methods are divided into three categories, + # finders, actions and matchers. These are found in the modules + # {Capybara::Node::Finders}, {Capybara::Node::Actions} and {Capybara::Node::Matchers} + # respectively. + # + # A {Capybara::Session} exposes all methods from {Capybara::Document} directly: + # + # session = Capybara::Session.new(:rack_test, my_app) + # session.visit('/') + # session.fill_in('Foo', :with => 'Bar') # from Capybara::Node::Actions + # bar = session.find('#bar') # from Capybara::Node::Finders + # bar.select('Baz', :from => 'Quox') # from Capybara::Node::Actions + # session.has_css?('#foobar') # from Capybara::Node::Matchers + # class Node - include Searchable + attr_reader :session, :base - attr_reader :driver, :node + include Capybara::Node::Finders + include Capybara::Node::Actions + include Capybara::Node::Matchers - def initialize(driver, node) - @driver = driver - @node = node + def initialize(session, base) + @session = session + @base = base end + protected + + def driver + session.driver + end + end + + ## + # + # A {Capybara::Element} represents a single element on the page. It is possible + # to interact with the contents of this element the same as with a document: + # + # session = Capybara::Session.new(:rack_test, my_app) + # + # bar = session.find('#bar') # from Capybara::Node::Finders + # bar.select('Baz', :from => 'Quox') # from Capybara::Node::Actions + # + # {Capybara::Element} also has access to HTML attributes and other properties of the + # element: + # + # bar.value + # bar.text + # bar[:title] + # + # @see Capybara::Node + # + class Element < Node + + ## + # + # @return [Object] The native element from the driver, this allows access to driver specific methods + # + def native + base.native + end + + ## + # + # @deprecated node is deprecated, please use {Capybara::Element#native} instead + # + def node + Capybara.deprecate("node", "native") + native + end + + ## + # + # @return [String] The text of the element + # def text - raise NotImplementedError + base.text end - def [](name) - raise NotImplementedError + ## + # + # Retrieve the given attribute + # + # element[:title] # => HTML title attribute + # + # @param [Symbol] attribute The attribute to retrieve + # @return [String] The value of the attribute + # + def [](attribute) + base[attribute] end + ## + # + # @return [String] The value of the form element + # def value - self[:value] + base.value end + ## + # + # Set the value of the form element to the given value. + # + # @param [String] value The new value + # def set(value) - raise NotImplementedError + base.set(value) end - def select(option) - raise NotImplementedError + ## + # + # Select this node if is an option element inside a select tag + # + def select_option + base.select_option end - def unselect(option) - raise NotImplementedError + ## + # + # Unselect this node if is an option element inside a multiple select tag + # + def unselect_option + base.unselect_option end + ## + # + # Click the Element + # def click - raise NotImplementedError + base.click end - def drag_to(element) - raise NotImplementedError - end - + ## + # + # @return [String] The tag name of the element + # def tag_name - raise NotImplementedError + base.tag_name end + ## + # + # Whether or not the element is visible. Not all drivers support CSS, so + # the result may be inaccurate. + # + # @return [Boolean] Whether the element is visible + # def visible? - raise NotImplementedError + base.visible? end + ## + # + # An XPath expression describing where on the page the element can be found + # + # @return [String] An XPath expression + # def path - raise NotSupportedByDriverError + base.path end - + + ## + # + # Trigger any event on the current element, for example mouseover or focus + # events. Does not work in Selenium. + # + # @param [String] event The name of the event to trigger + # def trigger(event) - raise NotSupportedByDriverError + base.trigger(event) + end + + ## + # + # Drag the element to the given other element. + # + # source = page.find('#foo') + # target = page.find('#bar') + # source.drag_to(target) + # + # @param [Capybara::Element] node The element to drag to + # + def drag_to(node) + base.drag_to(node.base) + end + + def inspect + %(#<Capybara::Element tag="#{tag_name}" path="#{path}">) + rescue NotSupportedByDriverError + %(#<Capybara::Element tag="#{tag_name}">) + end + + end + + ## + # + # A {Capybara::Document} represents an HTML document. Any operation + # performed on it will be performed on the entire document. + # + # @see Capybara::Node + # + class Document < Node + def inspect + %(#<Capybara::Document>) end end end