capybara 0.3.9 → 0.4.0.rc

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. data/History.txt +43 -1
  2. data/README.rdoc +168 -98
  3. data/lib/capybara.rb +77 -15
  4. data/lib/capybara/driver/base.rb +21 -16
  5. data/lib/capybara/driver/celerity_driver.rb +39 -41
  6. data/lib/capybara/driver/culerity_driver.rb +2 -1
  7. data/lib/capybara/driver/node.rb +66 -0
  8. data/lib/capybara/driver/rack_test_driver.rb +66 -67
  9. data/lib/capybara/driver/selenium_driver.rb +43 -47
  10. data/lib/capybara/dsl.rb +44 -6
  11. data/lib/capybara/node.rb +185 -24
  12. data/lib/capybara/node/actions.rb +170 -0
  13. data/lib/capybara/node/finders.rb +150 -0
  14. data/lib/capybara/node/matchers.rb +360 -0
  15. data/lib/capybara/rails.rb +1 -0
  16. data/lib/capybara/selector.rb +52 -0
  17. data/lib/capybara/server.rb +68 -87
  18. data/lib/capybara/session.rb +221 -207
  19. data/lib/capybara/spec/driver.rb +45 -35
  20. data/lib/capybara/spec/public/test.js +1 -1
  21. data/lib/capybara/spec/session.rb +28 -53
  22. data/lib/capybara/spec/session/all_spec.rb +7 -3
  23. data/lib/capybara/spec/session/check_spec.rb +50 -52
  24. data/lib/capybara/spec/session/click_button_spec.rb +9 -0
  25. data/lib/capybara/spec/session/click_link_or_button_spec.rb +37 -0
  26. data/lib/capybara/spec/session/current_url_spec.rb +7 -0
  27. data/lib/capybara/spec/session/find_button_spec.rb +4 -2
  28. data/lib/capybara/spec/session/find_by_id_spec.rb +4 -2
  29. data/lib/capybara/spec/session/find_field_spec.rb +7 -3
  30. data/lib/capybara/spec/session/find_link_spec.rb +5 -3
  31. data/lib/capybara/spec/session/find_spec.rb +71 -6
  32. data/lib/capybara/spec/session/has_field_spec.rb +1 -1
  33. data/lib/capybara/spec/session/has_selector_spec.rb +129 -0
  34. data/lib/capybara/spec/session/has_xpath_spec.rb +4 -4
  35. data/lib/capybara/spec/session/javascript.rb +25 -5
  36. data/lib/capybara/spec/session/select_spec.rb +16 -2
  37. data/lib/capybara/spec/session/unselect_spec.rb +8 -1
  38. data/lib/capybara/spec/session/within_spec.rb +5 -5
  39. data/lib/capybara/spec/views/form.erb +65 -1
  40. data/lib/capybara/spec/views/popup_one.erb +8 -0
  41. data/lib/capybara/spec/views/popup_two.erb +8 -0
  42. data/lib/capybara/spec/views/with_html.erb +5 -0
  43. data/lib/capybara/spec/views/within_popups.erb +25 -0
  44. data/lib/capybara/{save_and_open_page.rb → util/save_and_open_page.rb} +3 -3
  45. data/lib/capybara/util/timeout.rb +27 -0
  46. data/lib/capybara/version.rb +1 -1
  47. data/spec/capybara_spec.rb +18 -8
  48. data/spec/driver/celerity_driver_spec.rb +10 -14
  49. data/spec/driver/culerity_driver_spec.rb +4 -3
  50. data/spec/driver/rack_test_driver_spec.rb +39 -2
  51. data/spec/driver/remote_culerity_driver_spec.rb +5 -7
  52. data/spec/driver/remote_selenium_driver_spec.rb +7 -10
  53. data/spec/driver/selenium_driver_spec.rb +3 -2
  54. data/spec/dsl_spec.rb +5 -14
  55. data/spec/save_and_open_page_spec.rb +19 -19
  56. data/spec/server_spec.rb +22 -10
  57. data/spec/session/celerity_session_spec.rb +17 -21
  58. data/spec/session/culerity_session_spec.rb +3 -3
  59. data/spec/session/rack_test_session_spec.rb +2 -2
  60. data/spec/session/selenium_session_spec.rb +2 -2
  61. data/spec/spec_helper.rb +27 -6
  62. data/spec/{wait_until_spec.rb → timeout_spec.rb} +14 -14
  63. metadata +88 -46
  64. data/lib/capybara/searchable.rb +0 -54
  65. data/lib/capybara/spec/session/click_spec.rb +0 -24
  66. data/lib/capybara/spec/session/locate_spec.rb +0 -65
  67. data/lib/capybara/wait_until.rb +0 -28
  68. data/lib/capybara/xpath.rb +0 -179
  69. data/spec/searchable_spec.rb +0 -66
  70. data/spec/xpath_spec.rb +0 -180
@@ -1,54 +0,0 @@
1
- module Capybara
2
- module Searchable
3
- def find(*args)
4
- all(*args).first
5
- end
6
-
7
- def find_field(locator)
8
- find(:xpath, XPath.field(locator))
9
- end
10
- alias_method :field_labeled, :find_field
11
-
12
- def find_link(locator)
13
- find(:xpath, XPath.link(locator))
14
- end
15
-
16
- def find_button(locator)
17
- find(:xpath, XPath.button(locator))
18
- end
19
-
20
- def find_by_id(id)
21
- find(:css, "##{id}")
22
- end
23
-
24
- def all(*args)
25
- options = if args.last.is_a?(Hash) then args.pop else {} end
26
- if args[1].nil?
27
- kind, locator = Capybara.default_selector, args.first
28
- else
29
- kind, locator = args
30
- end
31
- locator = XPath.from_css(locator) if kind == :css
32
-
33
- results = all_unfiltered(locator)
34
-
35
- if options[:text]
36
- options[:text] = Regexp.escape(options[:text]) unless options[:text].kind_of?(Regexp)
37
- results = results.select { |n| n.text.match(options[:text]) }
38
- end
39
-
40
- if options[:visible] or Capybara.ignore_hidden_elements
41
- results = results.select { |n| n.visible? }
42
- end
43
-
44
- results
45
- end
46
-
47
- private
48
-
49
- def all_unfiltered(locator)
50
- raise "Must be overridden"
51
- end
52
-
53
- end
54
- end
@@ -1,24 +0,0 @@
1
- shared_examples_for "click" do
2
- describe '#click' do
3
- it "should click on a link" do
4
- @session.visit('/with_html')
5
- @session.click('labore')
6
- @session.body.should include('Bar')
7
- end
8
-
9
- it "should click on a button" do
10
- @session.visit('/form')
11
- @session.click('awe123')
12
- extract_results(@session)['first_name'].should == 'John'
13
- end
14
-
15
- context "with a locator that doesn't exist" do
16
- it "should raise an error" do
17
- @session.visit('/with_html')
18
- running do
19
- @session.click('does not exist')
20
- end.should raise_error(Capybara::ElementNotFound)
21
- end
22
- end
23
- end
24
- end
@@ -1,65 +0,0 @@
1
- shared_examples_for "locate" do
2
- describe '#locate' do
3
- before do
4
- @session.visit('/with_html')
5
- end
6
-
7
- it "should find the first element using the given locator" do
8
- @session.locate('//h1').text.should == 'This is a test'
9
- @session.locate("//input[@id='test_field']")[:value].should == 'monkey'
10
- end
11
-
12
- context "with css selectors" do
13
- it "should find the first element using the given locator" do
14
- @session.locate(:css, 'h1').text.should == 'This is a test'
15
- @session.locate(:css, "input[id='test_field']")[:value].should == 'monkey'
16
- end
17
- end
18
-
19
- context "with xpath selectors" do
20
- it "should find the first element using the given locator" do
21
- @session.locate(:xpath, '//h1').text.should == 'This is a test'
22
- @session.locate(:xpath, "//input[@id='test_field']")[:value].should == 'monkey'
23
- end
24
- end
25
-
26
- context "with css as default selector" do
27
- before { Capybara.default_selector = :css }
28
- it "should find the first element using the given locator" do
29
- @session.locate('h1').text.should == 'This is a test'
30
- @session.locate("input[id='test_field']")[:value].should == 'monkey'
31
- end
32
- after { Capybara.default_selector = :xpath }
33
- end
34
-
35
- it "should raise ElementNotFound with specified fail message if nothing was found" do
36
- running do
37
- @session.locate(:xpath, '//div[@id="nosuchthing"]', 'arghh').should be_nil
38
- end.should raise_error(Capybara::ElementNotFound, "arghh")
39
- end
40
-
41
- it "should raise ElementNotFound with a useful default message if nothing was found" do
42
- running do
43
- @session.locate(:xpath, '//div[@id="nosuchthing"]').should be_nil
44
- end.should raise_error(Capybara::ElementNotFound, "Unable to locate '//div[@id=\"nosuchthing\"]'")
45
- end
46
-
47
- it "should accept an XPath instance and respect the order of paths" do
48
- @session.visit('/form')
49
- @xpath = Capybara::XPath.text_field('Name')
50
- @session.locate(@xpath).value.should == 'John Smith'
51
- end
52
-
53
- context "within a scope" do
54
- before do
55
- @session.visit('/with_scope')
56
- end
57
-
58
- it "should find the first element using the given locator" do
59
- @session.within(:xpath, "//div[@id='for_bar']") do
60
- @session.locate('//li').text.should =~ /With Simple HTML/
61
- end
62
- end
63
- end
64
- end
65
- end
@@ -1,28 +0,0 @@
1
- module Capybara
2
- #Provides timeout similar to standard library Timeout, but avoids threads
3
- class WaitUntil
4
-
5
- class << self
6
-
7
- def timeout(seconds = 1, driver = nil, &block)
8
- start_time = Time.now
9
-
10
- result = nil
11
-
12
- until result
13
- return result if result = yield
14
-
15
- delay = seconds - (Time.now - start_time)
16
- if delay <= 0
17
- raise TimeoutError
18
- end
19
-
20
- driver && driver.wait_until(delay)
21
-
22
- sleep(0.05)
23
- end
24
- end
25
-
26
- end
27
- end
28
- end
@@ -1,179 +0,0 @@
1
- module Capybara
2
- # this is a class for generating XPath queries, use it like this:
3
- # Xpath.text_field('foo').link('blah').to_s
4
- # this will generate an XPath that matches either a text field or a link
5
- class XPath
6
-
7
- class << self
8
- def escape(string)
9
- if string.include?("'")
10
- string = string.split("'", -1).map do |substr|
11
- "'#{substr}'"
12
- end.join(%q{,"'",})
13
- "concat(#{string})"
14
- else
15
- "'#{string}'"
16
- end
17
- end
18
-
19
- def wrap(path)
20
- if path.is_a?(self)
21
- path
22
- else
23
- new(path.to_s)
24
- end
25
- end
26
-
27
- def respond_to?(method)
28
- new.respond_to?(method)
29
- end
30
-
31
- def method_missing(*args)
32
- new.send(*args)
33
- end
34
- end
35
-
36
- attr_reader :paths
37
-
38
- def initialize(*paths)
39
- @paths = paths
40
- end
41
-
42
- def scope(scope)
43
- XPath.new(*paths.map { |p| scope + p })
44
- end
45
-
46
- def to_s
47
- @paths.join(' | ')
48
- end
49
-
50
- def append(path)
51
- XPath.new(*[@paths, XPath.wrap(path).paths].flatten)
52
- end
53
-
54
- def prepend(path)
55
- XPath.new(*[XPath.wrap(path).paths, @paths].flatten)
56
- end
57
-
58
- def from_css(css)
59
- append(Nokogiri::CSS.xpath_for(css).first)
60
- end
61
- alias_method :for_css, :from_css
62
-
63
- def field(locator, options={})
64
- if options[:with]
65
- fillable_field(locator, options)
66
- else
67
- xpath = fillable_field(locator)
68
- xpath = xpath.input_field(:file, locator, options)
69
- xpath = xpath.checkbox(locator, options)
70
- xpath = xpath.radio_button(locator, options)
71
- xpath.select(locator, options)
72
- end
73
- end
74
-
75
- def fillable_field(locator, options={})
76
- text_area(locator, options).text_field(locator, options)
77
- end
78
-
79
- def content(locator)
80
- append("/descendant-or-self::*[contains(normalize-space(.),#{s(locator)})]")
81
- end
82
-
83
- def table(locator, options={})
84
- conditions = ""
85
- if options[:rows]
86
- row_conditions = options[:rows].map do |row|
87
- row = row.map { |column| "*[self::td or self::th][text()=#{s(column)}]" }.join(sibling)
88
- "tr[./#{row}]"
89
- end.join(sibling)
90
- conditions << "[.//#{row_conditions}]"
91
- end
92
- append("//table[@id=#{s(locator)} or contains(caption,#{s(locator)})]#{conditions}")
93
- end
94
-
95
- def fieldset(locator)
96
- append("//fieldset[@id=#{s(locator)} or contains(legend,#{s(locator)})]")
97
- end
98
-
99
- def link(locator)
100
- xpath = append("//a[@href][@id=#{s(locator)} or contains(.,#{s(locator)}) or contains(@title,#{s(locator)}) or img[contains(@alt,#{s(locator)})]]")
101
- xpath.prepend("//a[@href][text()=#{s(locator)} or @title=#{s(locator)} or img[@alt=#{s(locator)}]]")
102
- end
103
-
104
- def button(locator)
105
- xpath = append("//input[@type='submit' or @type='image' or @type='button'][@id=#{s(locator)} or contains(@value,#{s(locator)})]")
106
- xpath = xpath.append("//button[@id=#{s(locator)} or contains(@value,#{s(locator)}) or contains(.,#{s(locator)})]")
107
- xpath = xpath.prepend("//input[@type='submit' or @type='image' or @type='button'][@value=#{s(locator)}]")
108
- xpath = xpath.prepend("//input[@type='image'][@alt=#{s(locator)} or contains(@alt,#{s(locator)})]")
109
- xpath = xpath.prepend("//button[@value=#{s(locator)} or text()=#{s(locator)}]")
110
- end
111
-
112
- def text_field(locator, options={})
113
- options = options.merge(:value => options[:with]) if options.has_key?(:with)
114
- add_field(locator, "//input[not(@type) or (@type!='radio' and @type!='checkbox' and @type!='hidden')]", options)
115
- end
116
-
117
- def text_area(locator, options={})
118
- options = options.merge(:text => options[:with]) if options.has_key?(:with)
119
- add_field(locator, "//textarea", options)
120
- end
121
-
122
- def select(locator, options={})
123
- add_field(locator, "//select", options)
124
- end
125
-
126
- def checkbox(locator, options={})
127
- input_field(:checkbox, locator, options)
128
- end
129
-
130
- def radio_button(locator, options={})
131
- input_field(:radio, locator, options)
132
- end
133
-
134
- def file_field(locator, options={})
135
- input_field(:file, locator, options)
136
- end
137
-
138
- protected
139
-
140
- def input_field(type, locator, options={})
141
- options = options.merge(:value => options[:with]) if options.has_key?(:with)
142
- add_field(locator, "//input[@type='#{type}']", options)
143
- end
144
-
145
- # place this between to nodes to indicate that they should be siblings
146
- def sibling
147
- '/following-sibling::*[1]/self::'
148
- end
149
-
150
- def add_field(locator, field, options={})
151
- postfix = extract_postfix(options)
152
- xpath = append("#{field}[@id=#{s(locator)}]#{postfix}")
153
- xpath = xpath.append("#{field}[@name=#{s(locator)}]#{postfix}")
154
- xpath = xpath.append("#{field}[@id=//label[contains(.,#{s(locator)})]/@for]#{postfix}")
155
- xpath = xpath.append("//label[contains(.,#{s(locator)})]#{field}#{postfix}")
156
- xpath.prepend("#{field}[@id=//label[text()=#{s(locator)}]/@for]#{postfix}")
157
- end
158
-
159
- def extract_postfix(options)
160
- options.inject("") do |postfix, (key, value)|
161
- case key
162
- when :value then postfix += "[@value=#{s(value)}]"
163
- when :text then postfix += "[text()=#{s(value)}]"
164
- when :checked then postfix += "[@checked]"
165
- when :unchecked then postfix += "[not(@checked)]"
166
- when :options then postfix += value.map { |o| "[.//option/text()=#{s(o)}]" }.join
167
- when :selected then postfix += [value].flatten.map { |o| "[.//option[@selected]/text()=#{s(o)}]" }.join
168
- end
169
- postfix
170
- end
171
- end
172
-
173
- # Sanitize a String for putting it into an xpath query
174
- def s(string)
175
- XPath.escape(string)
176
- end
177
-
178
- end
179
- end
@@ -1,66 +0,0 @@
1
- require File.expand_path('spec_helper', File.dirname(__FILE__))
2
-
3
- module Capybara
4
-
5
- describe Searchable do
6
- class Klass
7
- include Searchable
8
-
9
- def all_unfiltered(locator, options = {})
10
- []
11
- end
12
-
13
- end
14
-
15
- describe "#all" do
16
- before do
17
- @searchable = Klass.new
18
- end
19
-
20
- it "should return unfiltered list without options" do
21
- node1 = stub(Node)
22
- node2 = stub(Node)
23
- @searchable.should_receive(:all_unfiltered).with('//x').and_return([node1, node2])
24
- @searchable.all('//x').should == [node1, node2]
25
- end
26
-
27
- context "with :text filter" do
28
- before do
29
- @node1 = stub(Node, :text => 'node one text (with parens)')
30
- @node2 = stub(Node, :text => 'node two text [-]')
31
- @searchable.stub(:all_unfiltered).and_return([@node1, @node2])
32
- end
33
-
34
- it "should accept regular expression" do
35
- @searchable.all('//x', :text => /node one/).should == [@node1]
36
- @searchable.all('//x', :text => /node two/).should == [@node2]
37
- end
38
-
39
- it "should accept text" do
40
- @searchable.all('//x', :text => "node one").should == [@node1]
41
- @searchable.all('//x', :text => "node two").should == [@node2]
42
- end
43
-
44
- it "should allow Regexp reserved words in text" do
45
- @searchable.all('//x', :text => "node one text (with parens)").should == [@node1]
46
- @searchable.all('//x', :text => "node two text [-]").should == [@node2]
47
- end
48
- end
49
-
50
- context "with :visible filter" do
51
- before do
52
- @visible_node = stub(Node, :visible? => true)
53
- @hidden_node = stub(Node, :visible? => false)
54
- @searchable.stub(:all_unfiltered).and_return([@visible_node, @hidden_node])
55
- end
56
-
57
- it "should filter out hidden nodes" do
58
- @searchable.all('//x', :visible => true).should == [@visible_node]
59
- end
60
-
61
- end
62
-
63
- end #all
64
- end
65
-
66
- end
@@ -1,180 +0,0 @@
1
- require File.expand_path('spec_helper', File.dirname(__FILE__))
2
-
3
- describe Capybara::XPath do
4
-
5
- before do
6
- @driver = Capybara::Driver::RackTest.new(TestApp)
7
- @driver.visit('/form')
8
- @xpath = Capybara::XPath.new
9
- end
10
-
11
- it "should proxy any class method calls to a new instance" do
12
- @query = Capybara::XPath.fillable_field('First Name').to_s
13
- @driver.find(@query).first.value.should == 'John'
14
- end
15
-
16
- it "should respond to instance methods at the class level" do
17
- Capybara::XPath.should respond_to(:fillable_field)
18
- end
19
-
20
- describe '.wrap' do
21
- it "should return an XPath unmodified" do
22
- Capybara::XPath.wrap(@xpath).should == @xpath
23
- end
24
-
25
- it "should wrap a string in an xpath object" do
26
- @xpath = Capybara::XPath.wrap('//foo/bar')
27
- @xpath.should be_an_instance_of(Capybara::XPath)
28
- @xpath.paths.should == ['//foo/bar']
29
- end
30
- end
31
-
32
- describe '#append' do
33
- it "should append an XPath's paths" do
34
- @xpath = Capybara::XPath.wrap('//test')
35
- @xpath = @xpath.append(Capybara::XPath.wrap('//foo/bar'))
36
- @xpath.paths.should == ['//test', '//foo/bar']
37
- end
38
-
39
- it "should append an String as a new path" do
40
- @xpath = Capybara::XPath.wrap('//test')
41
- @xpath = @xpath.append('//foo/bar')
42
- @xpath.paths.should == ['//test', '//foo/bar']
43
- end
44
- end
45
-
46
- describe '#prepend' do
47
- it "should prepend an XPath's paths" do
48
- @xpath = Capybara::XPath.wrap('//test')
49
- @xpath = @xpath.prepend(Capybara::XPath.wrap('//foo/bar'))
50
- @xpath.paths.should == ['//foo/bar', '//test']
51
- end
52
-
53
- it "should prepend an String as a new path" do
54
- @xpath = Capybara::XPath.wrap('//test')
55
- @xpath = @xpath.prepend('//foo/bar')
56
- @xpath.paths.should == ['//foo/bar', '//test']
57
- end
58
- end
59
-
60
- describe '#scope' do
61
- it "should prepend the given scope to all paths" do
62
- @xpath = Capybara::XPath.new('//foo/bar', '//test[@blah=foo]').scope('//quox')
63
- @xpath.paths.should include('//quox//foo/bar', '//quox//test[@blah=foo]')
64
- end
65
- end
66
-
67
- describe '#field' do
68
- it "should find any field by id or label" do
69
- @query = @xpath.field('First Name').to_s
70
- @driver.find(@query).first.value.should == 'John'
71
- @query = @xpath.field('Password').to_s
72
- @driver.find(@query).first.value.should == 'seeekrit'
73
- @query = @xpath.field('Description').to_s
74
- @driver.find(@query).first.text.should == 'Descriptive text goes here'
75
- @query = @xpath.field('Document').to_s
76
- @driver.find(@query).first[:name].should == 'form[document]'
77
- @query = @xpath.field('Cat').to_s
78
- @driver.find(@query).first.value.should == 'cat'
79
- @query = @xpath.field('Male').to_s
80
- @driver.find(@query).first.value.should == 'male'
81
- @query = @xpath.field('Region').to_s
82
- @driver.find(@query).first[:name].should == 'form[region]'
83
- end
84
-
85
- it "should be chainable" do
86
- @query = @xpath.field('First Name').button('Click me!').to_s
87
- @driver.find(@query).first.value.should == 'John'
88
- end
89
- end
90
-
91
- describe '#fillable_field' do
92
- it "should find a text field, password field, or text area by id or label" do
93
- @query = @xpath.fillable_field('First Name').to_s
94
- @driver.find(@query).first.value.should == 'John'
95
- @query = @xpath.fillable_field('Password').to_s
96
- @driver.find(@query).first.value.should == 'seeekrit'
97
- @query = @xpath.fillable_field('Description').to_s
98
- @driver.find(@query).first.text.should == 'Descriptive text goes here'
99
- end
100
-
101
- it "should be chainable" do
102
- @query = @xpath.fillable_field('First Name').button('Click me!').to_s
103
- @driver.find(@query).first.value.should == 'John'
104
- end
105
- end
106
-
107
- describe '#text_area' do
108
- it "should find a text area by id or label" do
109
- @query = @xpath.text_area('form_description').to_s
110
- @driver.find(@query).first.text.should == 'Descriptive text goes here'
111
- @query = @xpath.text_area('Description').to_s
112
- @driver.find(@query).first.text.should == 'Descriptive text goes here'
113
- end
114
-
115
- it "should be chainable" do
116
- @query = @xpath.text_area('Description').button('Click me!').to_s
117
- @driver.find(@query).first.text.should == 'Descriptive text goes here'
118
- end
119
- end
120
-
121
- describe '#button' do
122
- it "should find a button by id or content" do
123
- @query = @xpath.button('awe123').to_s
124
- @driver.find(@query).first.value.should == 'awesome'
125
- @query = @xpath.button('okay556').to_s
126
- @driver.find(@query).first.value.should == 'okay'
127
- @query = @xpath.button('click_me_123').to_s
128
- @driver.find(@query).first.value.should == 'click_me'
129
- @query = @xpath.button('Click me!').to_s
130
- @driver.find(@query).first.value.should == 'click_me'
131
- @query = @xpath.button('fresh_btn').to_s
132
- @driver.find(@query).first.value.should == 'i am fresh'
133
- @query = @xpath.button('i am fresh').to_s
134
- @driver.find(@query).first[:name].should == 'form[fresh]'
135
- end
136
- end
137
-
138
- describe '#radio_button' do
139
- it "should find a radio button by id or label" do
140
- @query = @xpath.radio_button('Male').to_s
141
- @driver.find(@query).first.value.should == 'male'
142
- @query = @xpath.radio_button('gender_male').to_s
143
- @driver.find(@query).first.value.should == 'male'
144
- end
145
-
146
- it "should be chainable" do
147
- @query = @xpath.radio_button('Male').button('Click me!').to_s
148
- @driver.find(@query).first.value.should == 'male'
149
- end
150
- end
151
-
152
- describe '#checkbox' do
153
- it "should find a checkbox by id or label" do
154
- @query = @xpath.checkbox('Cat').to_s
155
- @driver.find(@query).first.value.should == 'cat'
156
- @query = @xpath.checkbox('form_pets_cat').to_s
157
- @driver.find(@query).first.value.should == 'cat'
158
- end
159
-
160
- it "should be chainable" do
161
- @query = @xpath.checkbox('Cat').button('Click me!').to_s
162
- @driver.find(@query).first.value.should == 'cat'
163
- end
164
- end
165
-
166
- describe '#select' do
167
- it "should find a select by id or label" do
168
- @query = @xpath.select('Region').to_s
169
- @driver.find(@query).first[:name].should == 'form[region]'
170
- @query = @xpath.select('form_region').to_s
171
- @driver.find(@query).first[:name].should == 'form[region]'
172
- end
173
-
174
- it "should be chainable" do
175
- @query = @xpath.select('Region').button('Click me!').to_s
176
- @driver.find(@query).first[:name].should == 'form[region]'
177
- end
178
- end
179
-
180
- end