1
0
Fork 0
mirror of https://github.com/teamcapybara/capybara.git synced 2022-11-09 12:08:07 -05:00
teamcapybara--capybara/lib/capybara/node.rb

206 lines
4.6 KiB
Ruby
Raw Normal View History

require 'capybara/node/finders'
require 'capybara/node/actions'
require 'capybara/node/matchers'
module Capybara
2010-07-16 16:07:14 -04:00
##
#
# 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,
2010-07-16 16:07:14 -04:00
# 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
2010-07-16 16:07:14 -04:00
# bar.select('Baz', :from => 'Quox') # from Capybara::Node::Actions
2010-07-17 13:04:47 -04:00
# session.has_css?('#foobar') # from Capybara::Node::Matchers
2010-07-16 16:07:14 -04:00
#
class Node
2010-07-09 19:58:34 -04:00
attr_reader :session, :base
include Capybara::Node::Finders
include Capybara::Node::Actions
include Capybara::Node::Matchers
2010-07-09 19:58:34 -04:00
def initialize(session, base)
@session = session
@base = base
end
protected
def driver
session.driver
end
end
2010-07-16 16:07:14 -04:00
##
#
# 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
2010-07-16 16:07:14 -04:00
# bar.select('Baz', :from => 'Quox') # from Capybara::Node::Actions
#
# Elements also have access to HTML attributes and other properties of the
# element:
#
# bar.value
# bar.text
# bar[:title]
#
# @see Capybara::Node
#
class Element < Node
2010-07-16 16:07:14 -04:00
##
#
# @return [Object] The native element from the driver, this allows access to driver specific methods
#
def native
base.native
end
2010-07-16 16:07:14 -04:00
##
#
# @return [String] The text of the element
#
def text
base.text
end
2010-07-16 16:07:14 -04:00
##
#
# 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
2010-07-16 16:07:14 -04:00
##
#
# @return [String] The value of the form element
#
def value
base.value
end
2010-07-16 16:07:14 -04:00
##
#
# Set the value of the form element to the given value.
#
# @param [String] value The new value
#
def set(value)
base.set(value)
end
2010-07-16 16:07:14 -04:00
##
#
# Select this node if is an option element inside a select tag
2010-07-16 16:07:14 -04:00
#
def select_option
base.select_option
end
2010-07-16 16:07:14 -04:00
##
#
# Unselect this node if is an option element inside a multiple select tag
2010-07-16 16:07:14 -04:00
#
def unselect_option
base.unselect_option
end
2010-07-16 16:07:14 -04:00
##
#
# Click the Element
#
def click
base.click
end
2010-07-16 16:07:14 -04:00
##
#
# @return [String] The tag name of the element
#
def tag_name
base.tag_name
end
2010-07-16 16:07:14 -04:00
##
#
# 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?
base.visible?
end
2010-07-16 16:07:14 -04:00
##
#
# An XPath expression describing where on the page the element can be found
#
# @return [String] An XPath expression
#
def path
base.path
end
2010-07-16 16:07:14 -04:00
##
#
# 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)
base.trigger(event)
end
2010-07-16 16:07:14 -04:00
##
#
# Drag the element to the given other element.
#
# source = page.find('#foo')
# target = page.find('#bar')
2010-07-16 16:07:14 -04:00
# 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
class Document < Node
def inspect
%(#<Capybara::Document>)
end
end
end