Class: Capybara::XPath
- Inherits:
-
Object
- Object
- Capybara::XPath
- Defined in:
- lib/capybara/xpath.rb
Overview
this is a class for generating XPath queries, use it like this:
Xpath.text_field('foo').link('blah').to_s
this will generate an XPath that matches either a text field or a link
Instance Attribute Summary collapse
-
#paths ⇒ Object
readonly
Returns the value of attribute paths.
Class Method Summary collapse
Instance Method Summary collapse
- #append(path) ⇒ Object
- #button(locator) ⇒ Object
- #checkbox(locator, options = {}) ⇒ Object
- #content(locator) ⇒ Object
- #field(locator, options = {}) ⇒ Object
- #fieldset(locator) ⇒ Object
- #file_field(locator, options = {}) ⇒ Object
- #fillable_field(locator, options = {}) ⇒ Object
- #from_css(css) ⇒ Object (also: #for_css)
-
#initialize(*paths) ⇒ XPath
constructor
A new instance of XPath.
- #link(locator) ⇒ Object
- #prepend(path) ⇒ Object
- #radio_button(locator, options = {}) ⇒ Object
- #scope(scope) ⇒ Object
- #select(locator, options = {}) ⇒ Object
- #table(locator, options = {}) ⇒ Object
- #text_area(locator, options = {}) ⇒ Object
- #text_field(locator, options = {}) ⇒ Object
- #to_s ⇒ Object
Constructor Details
#initialize(*paths) ⇒ XPath
Returns a new instance of XPath.
27 28 29 |
# File 'lib/capybara/xpath.rb', line 27 def initialize(*paths) @paths = paths end |
Instance Attribute Details
#paths ⇒ Object (readonly)
Returns the value of attribute paths.
25 26 27 |
# File 'lib/capybara/xpath.rb', line 25 def paths @paths end |
Class Method Details
.method_missing(*args) ⇒ Object
20 21 22 |
# File 'lib/capybara/xpath.rb', line 20 def method_missing(*args) new.send(*args) end |
.respond_to?(method) ⇒ Boolean
16 17 18 |
# File 'lib/capybara/xpath.rb', line 16 def respond_to?(method) new.respond_to?(method) end |
.wrap(path) ⇒ Object
8 9 10 11 12 13 14 |
# File 'lib/capybara/xpath.rb', line 8 def wrap(path) if path.is_a?(self) path else new(path.to_s) end end |
Instance Method Details
#append(path) ⇒ Object
39 40 41 |
# File 'lib/capybara/xpath.rb', line 39 def append(path) XPath.new(*[@paths, XPath.wrap(path).paths].flatten) end |
#button(locator) ⇒ Object
93 94 95 96 97 98 99 |
# File 'lib/capybara/xpath.rb', line 93 def (locator) xpath = append("//input[@type='submit' or @type='image' or @type='button'][@id=#{s(locator)} or contains(@value,#{s(locator)})]") xpath = xpath.append("//button[@id=#{s(locator)} or contains(@value,#{s(locator)}) or contains(.,#{s(locator)})]") xpath = xpath.prepend("//input[@type='submit' or @type='image' or @type='button'][@value=#{s(locator)}]") xpath = xpath.prepend("//input[@type='image'][@alt=#{s(locator)} or contains(@alt,#{s(locator)})]") xpath = xpath.prepend("//button[@value=#{s(locator)} or text()=#{s(locator)}]") end |
#checkbox(locator, options = {}) ⇒ Object
115 116 117 |
# File 'lib/capybara/xpath.rb', line 115 def checkbox(locator, ={}) input_field(:checkbox, locator, ) end |
#content(locator) ⇒ Object
68 69 70 |
# File 'lib/capybara/xpath.rb', line 68 def content(locator) append("/descendant-or-self::*[contains(.,#{s(locator)})]") end |
#field(locator, options = {}) ⇒ Object
52 53 54 55 56 57 58 59 60 61 62 |
# File 'lib/capybara/xpath.rb', line 52 def field(locator, ={}) if [:with] fillable_field(locator, ) else xpath = fillable_field(locator) xpath = xpath.input_field(:file, locator, ) xpath = xpath.checkbox(locator, ) xpath = xpath.(locator, ) xpath.select(locator, ) end end |
#fieldset(locator) ⇒ Object
84 85 86 |
# File 'lib/capybara/xpath.rb', line 84 def fieldset(locator) append("//fieldset[@id=#{s(locator)} or contains(legend,#{s(locator)})]") end |
#file_field(locator, options = {}) ⇒ Object
123 124 125 |
# File 'lib/capybara/xpath.rb', line 123 def file_field(locator, ={}) input_field(:file, locator, ) end |
#fillable_field(locator, options = {}) ⇒ Object
64 65 66 |
# File 'lib/capybara/xpath.rb', line 64 def fillable_field(locator, ={}) text_area(locator, ).text_field(locator, ) end |
#from_css(css) ⇒ Object Also known as: for_css
47 48 49 |
# File 'lib/capybara/xpath.rb', line 47 def from_css(css) append(Nokogiri::CSS.xpath_for(css).first) end |
#link(locator) ⇒ Object
88 89 90 91 |
# File 'lib/capybara/xpath.rb', line 88 def link(locator) xpath = append("//a[@href][@id=#{s(locator)} or contains(.,#{s(locator)}) or contains(@title,#{s(locator)}) or img[contains(@alt,#{s(locator)})]]") xpath.prepend("//a[@href][text()=#{s(locator)} or @title=#{s(locator)} or img[@alt=#{s(locator)}]]") end |
#prepend(path) ⇒ Object
43 44 45 |
# File 'lib/capybara/xpath.rb', line 43 def prepend(path) XPath.new(*[XPath.wrap(path).paths, @paths].flatten) end |
#radio_button(locator, options = {}) ⇒ Object
119 120 121 |
# File 'lib/capybara/xpath.rb', line 119 def (locator, ={}) input_field(:radio, locator, ) end |
#scope(scope) ⇒ Object
31 32 33 |
# File 'lib/capybara/xpath.rb', line 31 def scope(scope) XPath.new(*paths.map { |p| scope + p }) end |
#select(locator, options = {}) ⇒ Object
111 112 113 |
# File 'lib/capybara/xpath.rb', line 111 def select(locator, ={}) add_field(locator, "//select", ) end |
#table(locator, options = {}) ⇒ Object
72 73 74 75 76 77 78 79 80 81 82 |
# File 'lib/capybara/xpath.rb', line 72 def table(locator, ={}) conditions = "" if [:rows] row_conditions = [:rows].map do |row| row = row.map { |column| "*[self::td or self::th][text()=#{s(column)}]" }.join(sibling) "tr[./#{row}]" end.join(sibling) conditions << "[.//#{row_conditions}]" end append("//table[@id=#{s(locator)} or contains(caption,#{s(locator)})]#{conditions}") end |
#text_area(locator, options = {}) ⇒ Object
106 107 108 109 |
# File 'lib/capybara/xpath.rb', line 106 def text_area(locator, ={}) = .merge(:text => [:with]) if .has_key?(:with) add_field(locator, "//textarea", ) end |
#text_field(locator, options = {}) ⇒ Object
101 102 103 104 |
# File 'lib/capybara/xpath.rb', line 101 def text_field(locator, ={}) = .merge(:value => [:with]) if .has_key?(:with) add_field(locator, "//input[@type!='radio' and @type!='checkbox' and @type!='hidden']", ) end |
#to_s ⇒ Object
35 36 37 |
# File 'lib/capybara/xpath.rb', line 35 def to_s @paths.join(' | ') end |