bbc-capybara 1.1.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (107) hide show
  1. data/History.txt +325 -0
  2. data/License.txt +22 -0
  3. data/README.md +815 -0
  4. data/lib/capybara.rb +368 -0
  5. data/lib/capybara/cucumber.rb +25 -0
  6. data/lib/capybara/driver/base.rb +64 -0
  7. data/lib/capybara/driver/node.rb +74 -0
  8. data/lib/capybara/dsl.rb +50 -0
  9. data/lib/capybara/node/actions.rb +146 -0
  10. data/lib/capybara/node/base.rb +63 -0
  11. data/lib/capybara/node/document.rb +25 -0
  12. data/lib/capybara/node/element.rb +201 -0
  13. data/lib/capybara/node/finders.rb +154 -0
  14. data/lib/capybara/node/matchers.rb +442 -0
  15. data/lib/capybara/node/simple.rb +132 -0
  16. data/lib/capybara/query.rb +63 -0
  17. data/lib/capybara/rack_test/browser.rb +126 -0
  18. data/lib/capybara/rack_test/driver.rb +80 -0
  19. data/lib/capybara/rack_test/form.rb +80 -0
  20. data/lib/capybara/rack_test/node.rb +121 -0
  21. data/lib/capybara/rails.rb +17 -0
  22. data/lib/capybara/rspec.rb +26 -0
  23. data/lib/capybara/rspec/features.rb +22 -0
  24. data/lib/capybara/rspec/matchers.rb +152 -0
  25. data/lib/capybara/selector.rb +156 -0
  26. data/lib/capybara/selenium/driver.rb +169 -0
  27. data/lib/capybara/selenium/node.rb +91 -0
  28. data/lib/capybara/server.rb +87 -0
  29. data/lib/capybara/session.rb +322 -0
  30. data/lib/capybara/spec/driver.rb +329 -0
  31. data/lib/capybara/spec/fixtures/capybara.jpg +3 -0
  32. data/lib/capybara/spec/fixtures/test_file.txt +1 -0
  33. data/lib/capybara/spec/public/jquery-ui.js +791 -0
  34. data/lib/capybara/spec/public/jquery.js +9046 -0
  35. data/lib/capybara/spec/public/test.js +43 -0
  36. data/lib/capybara/spec/session.rb +148 -0
  37. data/lib/capybara/spec/session/all_spec.rb +78 -0
  38. data/lib/capybara/spec/session/attach_file_spec.rb +76 -0
  39. data/lib/capybara/spec/session/check_spec.rb +68 -0
  40. data/lib/capybara/spec/session/choose_spec.rb +29 -0
  41. data/lib/capybara/spec/session/click_button_spec.rb +305 -0
  42. data/lib/capybara/spec/session/click_link_or_button_spec.rb +37 -0
  43. data/lib/capybara/spec/session/click_link_spec.rb +120 -0
  44. data/lib/capybara/spec/session/current_url_spec.rb +83 -0
  45. data/lib/capybara/spec/session/fill_in_spec.rb +127 -0
  46. data/lib/capybara/spec/session/find_button_spec.rb +18 -0
  47. data/lib/capybara/spec/session/find_by_id_spec.rb +18 -0
  48. data/lib/capybara/spec/session/find_field_spec.rb +26 -0
  49. data/lib/capybara/spec/session/find_link_spec.rb +19 -0
  50. data/lib/capybara/spec/session/find_spec.rb +168 -0
  51. data/lib/capybara/spec/session/first_spec.rb +105 -0
  52. data/lib/capybara/spec/session/has_button_spec.rb +32 -0
  53. data/lib/capybara/spec/session/has_css_spec.rb +243 -0
  54. data/lib/capybara/spec/session/has_field_spec.rb +192 -0
  55. data/lib/capybara/spec/session/has_link_spec.rb +37 -0
  56. data/lib/capybara/spec/session/has_select_spec.rb +129 -0
  57. data/lib/capybara/spec/session/has_selector_spec.rb +129 -0
  58. data/lib/capybara/spec/session/has_table_spec.rb +34 -0
  59. data/lib/capybara/spec/session/has_text_spec.rb +138 -0
  60. data/lib/capybara/spec/session/has_xpath_spec.rb +123 -0
  61. data/lib/capybara/spec/session/headers.rb +19 -0
  62. data/lib/capybara/spec/session/javascript.rb +312 -0
  63. data/lib/capybara/spec/session/response_code.rb +19 -0
  64. data/lib/capybara/spec/session/select_spec.rb +119 -0
  65. data/lib/capybara/spec/session/text_spec.rb +24 -0
  66. data/lib/capybara/spec/session/uncheck_spec.rb +21 -0
  67. data/lib/capybara/spec/session/unselect_spec.rb +67 -0
  68. data/lib/capybara/spec/session/within_spec.rb +178 -0
  69. data/lib/capybara/spec/test_app.rb +156 -0
  70. data/lib/capybara/spec/views/buttons.erb +4 -0
  71. data/lib/capybara/spec/views/fieldsets.erb +29 -0
  72. data/lib/capybara/spec/views/form.erb +366 -0
  73. data/lib/capybara/spec/views/frame_one.erb +8 -0
  74. data/lib/capybara/spec/views/frame_two.erb +8 -0
  75. data/lib/capybara/spec/views/header_links.erb +7 -0
  76. data/lib/capybara/spec/views/host_links.erb +12 -0
  77. data/lib/capybara/spec/views/popup_one.erb +8 -0
  78. data/lib/capybara/spec/views/popup_two.erb +8 -0
  79. data/lib/capybara/spec/views/postback.erb +13 -0
  80. data/lib/capybara/spec/views/tables.erb +62 -0
  81. data/lib/capybara/spec/views/with_html.erb +75 -0
  82. data/lib/capybara/spec/views/with_html_entities.erb +1 -0
  83. data/lib/capybara/spec/views/with_js.erb +53 -0
  84. data/lib/capybara/spec/views/with_scope.erb +36 -0
  85. data/lib/capybara/spec/views/with_simple_html.erb +1 -0
  86. data/lib/capybara/spec/views/within_frames.erb +10 -0
  87. data/lib/capybara/spec/views/within_popups.erb +25 -0
  88. data/lib/capybara/util/save_and_open_page.rb +45 -0
  89. data/lib/capybara/util/timeout.rb +27 -0
  90. data/lib/capybara/version.rb +3 -0
  91. data/spec/basic_node_spec.rb +89 -0
  92. data/spec/capybara_spec.rb +46 -0
  93. data/spec/driver/rack_test_driver_spec.rb +90 -0
  94. data/spec/driver/selenium_driver_spec.rb +55 -0
  95. data/spec/dsl_spec.rb +255 -0
  96. data/spec/fixtures/selenium_driver_rspec_failure.rb +8 -0
  97. data/spec/fixtures/selenium_driver_rspec_success.rb +8 -0
  98. data/spec/rspec/features_spec.rb +43 -0
  99. data/spec/rspec/matchers_spec.rb +564 -0
  100. data/spec/rspec_spec.rb +51 -0
  101. data/spec/save_and_open_page_spec.rb +155 -0
  102. data/spec/server_spec.rb +74 -0
  103. data/spec/session/rack_test_session_spec.rb +61 -0
  104. data/spec/session/selenium_session_spec.rb +26 -0
  105. data/spec/spec_helper.rb +31 -0
  106. data/spec/timeout_spec.rb +28 -0
  107. metadata +297 -0
@@ -0,0 +1,83 @@
1
+ shared_examples_for "current_url" do
2
+ before :all do
3
+ @servers = 2.times.map { Capybara::Server.new(TestApp.clone).boot }
4
+ # sanity check
5
+ @servers[0].port.should_not == @servers[1].port
6
+ @servers.map { |s| s.port }.should_not include 80
7
+ end
8
+
9
+ def bases
10
+ @servers.map { |s| "http://#{s.host}:#{s.port}" }
11
+ end
12
+
13
+ describe '#current_url, #current_path, #current_host' do
14
+ def should_be_on server_index, path="/host", scheme="http"
15
+ # Check that we are on /host on the given server
16
+ s = @servers[server_index]
17
+ @session.current_url.chomp('?').should == "#{scheme}://#{s.host}:#{s.port}#{path}"
18
+ @session.current_host.should == "#{scheme}://#{s.host}" # no port
19
+ @session.current_path.should == path
20
+ if path == '/host'
21
+ # Server should agree with us
22
+ @session.body.should include("Current host is #{scheme}://#{s.host}:#{s.port}")
23
+ end
24
+ end
25
+
26
+ def visit_host_links
27
+ @session.visit("#{bases[0]}/host_links?absolute_host=#{bases[1]}")
28
+ end
29
+
30
+ it "is affected by visiting a page directly" do
31
+ @session.visit("#{bases[0]}/host")
32
+ should_be_on 0
33
+ end
34
+
35
+ it "returns to the app host when visiting a relative url" do
36
+ Capybara.app_host = bases[1]
37
+ @session.visit("#{bases[0]}/host")
38
+ should_be_on 0
39
+ @session.visit('/host')
40
+ should_be_on 1
41
+ Capybara.app_host = nil
42
+ end
43
+
44
+ it "is affected by setting Capybara.app_host" do
45
+ Capybara.app_host = bases[0]
46
+ @session.visit("/host")
47
+ should_be_on 0
48
+ Capybara.app_host = bases[1]
49
+ @session.visit("/host")
50
+ should_be_on 1
51
+ Capybara.app_host = nil
52
+ end
53
+
54
+ it "is unaffected by following a relative link" do
55
+ visit_host_links
56
+ @session.click_link("Relative Host")
57
+ should_be_on 0
58
+ end
59
+
60
+ it "is affected by following an absolute link" do
61
+ visit_host_links
62
+ @session.click_link("Absolute Host")
63
+ should_be_on 1
64
+ end
65
+
66
+ it "is unaffected by posting through a relative form" do
67
+ visit_host_links
68
+ @session.click_button("Relative Host")
69
+ should_be_on 0
70
+ end
71
+
72
+ it "is affected by posting through an absolute form" do
73
+ visit_host_links
74
+ @session.click_button("Absolute Host")
75
+ should_be_on 1
76
+ end
77
+
78
+ it "is affected by following a redirect" do
79
+ @session.visit("#{bases[0]}/redirect")
80
+ should_be_on 0, "/landed"
81
+ end
82
+ end
83
+ end
@@ -0,0 +1,127 @@
1
+ shared_examples_for "fill_in" do
2
+ describe "#fill_in" do
3
+ before do
4
+ @session.visit('/form')
5
+ end
6
+
7
+ it "should fill in a text field by id" do
8
+ @session.fill_in('form_first_name', :with => 'Harry')
9
+ @session.click_button('awesome')
10
+ extract_results(@session)['first_name'].should == 'Harry'
11
+ end
12
+
13
+ it "should fill in a text field by name" do
14
+ @session.fill_in('form[last_name]', :with => 'Green')
15
+ @session.click_button('awesome')
16
+ extract_results(@session)['last_name'].should == 'Green'
17
+ end
18
+
19
+ it "should fill in a text field by label without for" do
20
+ @session.fill_in('Street', :with => 'Avenue Q')
21
+ @session.click_button('awesome')
22
+ extract_results(@session)['street'].should == 'Avenue Q'
23
+ end
24
+
25
+ it "should fill in a url field by label without for" do
26
+ @session.fill_in('Html5 Url', :with => 'http://www.avenueq.com')
27
+ @session.click_button('html5_submit')
28
+ extract_results(@session)['html5_url'].should == 'http://www.avenueq.com'
29
+ end
30
+
31
+ it "should favour exact label matches over partial matches" do
32
+ @session.fill_in('Name', :with => 'Harry Jones')
33
+ @session.click_button('awesome')
34
+ extract_results(@session)['name'].should == 'Harry Jones'
35
+ end
36
+
37
+ it "should fill in a textarea by id" do
38
+ @session.fill_in('form_description', :with => 'Texty text')
39
+ @session.click_button('awesome')
40
+ extract_results(@session)['description'].should == 'Texty text'
41
+ end
42
+
43
+ it "should fill in a textarea by label" do
44
+ @session.fill_in('Description', :with => 'Texty text')
45
+ @session.click_button('awesome')
46
+ extract_results(@session)['description'].should == 'Texty text'
47
+ end
48
+
49
+ it "should fill in a textarea by name" do
50
+ @session.fill_in('form[description]', :with => 'Texty text')
51
+ @session.click_button('awesome')
52
+ extract_results(@session)['description'].should == 'Texty text'
53
+ end
54
+
55
+ it "should fill in a password field by id" do
56
+ @session.fill_in('form_password', :with => 'supasikrit')
57
+ @session.click_button('awesome')
58
+ extract_results(@session)['password'].should == 'supasikrit'
59
+ end
60
+
61
+ it "should fill in a field with a custom type" do
62
+ @session.fill_in('Schmooo', :with => 'Schmooo is the game')
63
+ @session.click_button('awesome')
64
+ extract_results(@session)['schmooo'].should == 'Schmooo is the game'
65
+ end
66
+
67
+ it "should fill in a field without a type" do
68
+ @session.fill_in('Phone', :with => '+1 555 7022')
69
+ @session.click_button('awesome')
70
+ extract_results(@session)['phone'].should == '+1 555 7022'
71
+ end
72
+
73
+ it "should fill in a text field respecting its maxlength attribute" do
74
+ @session.fill_in('Zipcode', :with => '52071350')
75
+ @session.click_button('awesome')
76
+ extract_results(@session)['zipcode'].should == '52071'
77
+ end
78
+
79
+ it "should fill in a password field by name" do
80
+ @session.fill_in('form[password]', :with => 'supasikrit')
81
+ @session.click_button('awesome')
82
+ extract_results(@session)['password'].should == 'supasikrit'
83
+ end
84
+
85
+ it "should fill in a password field by label" do
86
+ @session.fill_in('Password', :with => 'supasikrit')
87
+ @session.click_button('awesome')
88
+ extract_results(@session)['password'].should == 'supasikrit'
89
+ end
90
+
91
+ it "should fill in a password field by name" do
92
+ @session.fill_in('form[password]', :with => 'supasikrit')
93
+ @session.click_button('awesome')
94
+ extract_results(@session)['password'].should == 'supasikrit'
95
+ end
96
+
97
+ it "should prefer exact matches over partial matches" do
98
+ @session.fill_in('Name', :with => 'Ford Prefect')
99
+ @session.click_button('awesome')
100
+ extract_results(@session)['name'].should == 'Ford Prefect'
101
+ end
102
+
103
+ it "should throw an exception if a hash containing 'with' is not provided" do
104
+ lambda{@session.fill_in 'Name', 'ignu'}.should raise_error
105
+ end
106
+
107
+ context "with ignore_hidden_fields" do
108
+ before { Capybara.ignore_hidden_elements = true }
109
+ after { Capybara.ignore_hidden_elements = false }
110
+ it "should not find a hidden field" do
111
+ msg = "no text field, text area or password field with id, name, or label 'Super Secret' found"
112
+ running do
113
+ @session.fill_in('Super Secret', :with => '777')
114
+ end.should raise_error(Capybara::ElementNotFound, msg)
115
+ end
116
+ end
117
+
118
+ context "with a locator that doesn't exist" do
119
+ it "should raise an error" do
120
+ msg = "no text field, text area or password field with id, name, or label 'does not exist' found"
121
+ running do
122
+ @session.fill_in('does not exist', :with => 'Blah blah')
123
+ end.should raise_error(Capybara::ElementNotFound, msg)
124
+ end
125
+ end
126
+ end
127
+ end
@@ -0,0 +1,18 @@
1
+ shared_examples_for "find_button" do
2
+ describe '#find_button' do
3
+ before do
4
+ @session.visit('/form')
5
+ end
6
+
7
+ it "should find any field" do
8
+ @session.find_button('med')[:id].should == "mediocre"
9
+ @session.find_button('crap321').value.should == "crappy"
10
+ end
11
+
12
+ it "should raise error if the field doesn't exist" do
13
+ running do
14
+ @session.find_button('Does not exist')
15
+ end.should raise_error(Capybara::ElementNotFound)
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,18 @@
1
+ shared_examples_for "find_by_id" do
2
+ describe '#find_by_id' do
3
+ before do
4
+ @session.visit('/with_html')
5
+ end
6
+
7
+ it "should find any element by id" do
8
+ @session.find_by_id('red').tag_name.should == 'a'
9
+ @session.find_by_id('hidden_via_ancestor').tag_name.should == 'div'
10
+ end
11
+
12
+ it "should raise error if no element with id is found" do
13
+ running do
14
+ @session.find_by_id('nothing_with_this_id')
15
+ end.should raise_error(Capybara::ElementNotFound)
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,26 @@
1
+ shared_examples_for "find_field" do
2
+ describe '#find_field' do
3
+ before do
4
+ @session.visit('/form')
5
+ end
6
+
7
+ it "should find any field" do
8
+ @session.find_field('Dog').value.should == 'dog'
9
+ @session.find_field('form_description').text.should == 'Descriptive text goes here'
10
+ @session.find_field('Region')[:name].should == 'form[region]'
11
+ end
12
+
13
+ it "should raise error if the field doesn't exist" do
14
+ running do
15
+ @session.find_field('Does not exist')
16
+ end.should raise_error(Capybara::ElementNotFound)
17
+ end
18
+
19
+ it "should be aliased as 'field_labeled' for webrat compatibility" do
20
+ @session.field_labeled('Dog').value.should == 'dog'
21
+ running do
22
+ @session.field_labeled('Does not exist')
23
+ end.should raise_error(Capybara::ElementNotFound)
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,19 @@
1
+ shared_examples_for "find_link" do
2
+
3
+ describe '#find_link' do
4
+ before do
5
+ @session.visit('/with_html')
6
+ end
7
+
8
+ it "should find any field" do
9
+ @session.find_link('foo').text.should == "ullamco"
10
+ @session.find_link('labore')[:href].should =~ %r(/with_simple_html$)
11
+ end
12
+
13
+ it "should raise error if the field doesn't exist" do
14
+ running do
15
+ @session.find_link('Does not exist')
16
+ end.should raise_error(Capybara::ElementNotFound)
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,168 @@
1
+ shared_examples_for "find" do
2
+ describe '#find' do
3
+ before do
4
+ @session.visit('/with_html')
5
+ end
6
+
7
+ after do
8
+ Capybara::Selector.remove(:monkey)
9
+ end
10
+
11
+ it "should find the first element using the given locator" do
12
+ @session.find('//h1').text.should == 'This is a test'
13
+ @session.find("//input[@id='test_field']")[:value].should == 'monkey'
14
+ end
15
+
16
+ it "should find the first element using the given locator and options" do
17
+ @session.find('//a', :text => 'Redirect')[:id].should == 'red'
18
+ @session.find(:css, 'a', :text => 'A link')[:title].should == 'twas a fine link'
19
+ end
20
+
21
+ describe 'the returned node' do
22
+ it "should act like a session object" do
23
+ @session.visit('/form')
24
+ @form = @session.find(:css, '#get-form')
25
+ @form.should have_field('Middle Name')
26
+ @form.should have_no_field('Languages')
27
+ @form.fill_in('Middle Name', :with => 'Monkey')
28
+ @form.click_button('med')
29
+ extract_results(@session)['middle_name'].should == 'Monkey'
30
+ end
31
+
32
+ it "should scope CSS selectors" do
33
+ @session.find(:css, '#second').should have_no_css('h1')
34
+ end
35
+
36
+ it "should have a reference to its parent if there is one" do
37
+ @node = @session.find(:css, '#first')
38
+ @node.parent.should == @node.session.document
39
+ @node.find('a').parent.should == @node
40
+ end
41
+ end
42
+
43
+ context "with css selectors" do
44
+ it "should find the first element using the given locator" do
45
+ @session.find(:css, 'h1').text.should == 'This is a test'
46
+ @session.find(:css, "input[id='test_field']")[:value].should == 'monkey'
47
+ end
48
+ end
49
+
50
+ context "with id selectors" do
51
+ it "should find the first element using the given locator" do
52
+ @session.find(:id, 'john_monkey').text.should == 'Monkey John'
53
+ @session.find(:id, 'red').text.should == 'Redirect'
54
+ @session.find(:red).text.should == 'Redirect'
55
+ end
56
+ end
57
+
58
+ context "with xpath selectors" do
59
+ it "should find the first element using the given locator" do
60
+ @session.find(:xpath, '//h1').text.should == 'This is a test'
61
+ @session.find(:xpath, "//input[@id='test_field']")[:value].should == 'monkey'
62
+ end
63
+ end
64
+
65
+ context "with custom selector" do
66
+ it "should use the custom selector" do
67
+ Capybara.add_selector(:monkey) do
68
+ xpath { |name| ".//*[@id='#{name}_monkey']" }
69
+ end
70
+ @session.find(:monkey, 'john').text.should == 'Monkey John'
71
+ @session.find(:monkey, 'paul').text.should == 'Monkey Paul'
72
+ end
73
+ end
74
+
75
+ context "with custom selector with :for option" do
76
+ it "should use the selector when it matches the :for option" do
77
+ Capybara.add_selector(:monkey) do
78
+ xpath { |num| ".//*[contains(@id, 'monkey')][#{num}]" }
79
+ match { |value| value.is_a?(Fixnum) }
80
+ end
81
+ @session.find(:monkey, '2').text.should == 'Monkey Paul'
82
+ @session.find(1).text.should == 'Monkey John'
83
+ @session.find(2).text.should == 'Monkey Paul'
84
+ @session.find('//h1').text.should == 'This is a test'
85
+ end
86
+ end
87
+
88
+ context "with custom selector with failure_message option" do
89
+ it "should raise an error with the failure message if the element is not found" do
90
+ Capybara.add_selector(:monkey) do
91
+ xpath { |num| ".//*[contains(@id, 'monkey')][#{num}]" }
92
+ failure_message { |node, selector| node.all(".//*[contains(@id, 'monkey')]").map { |node| node.text }.sort.join(', ') }
93
+ end
94
+ running do
95
+ @session.find(:monkey, '14').text.should == 'Monkey Paul'
96
+ end.should raise_error(Capybara::ElementNotFound, "Monkey John, Monkey Paul")
97
+ end
98
+
99
+ it "should pass the selector as the second argument" do
100
+ Capybara.add_selector(:monkey) do
101
+ xpath { |num| ".//*[contains(@id, 'monkey')][#{num}]" }
102
+ failure_message { |node, selector| selector.name.to_s + ': ' + selector.locator + ' - ' + node.all(".//*[contains(@id, 'monkey')]").map { |node| node.text }.sort.join(', ') }
103
+ end
104
+ running do
105
+ @session.find(:monkey, '14').text.should == 'Monkey Paul'
106
+ end.should raise_error(Capybara::ElementNotFound, "monkey: 14 - Monkey John, Monkey Paul")
107
+ end
108
+ end
109
+
110
+ context "with custom selector with custom filter" do
111
+ before do
112
+ Capybara.add_selector(:monkey) do
113
+ xpath { |num| ".//*[contains(@id, 'monkey')][#{num}]" }
114
+ filter(:name) { |node, name| node.text == name }
115
+ end
116
+ end
117
+
118
+ it "should find elements that match the filter" do
119
+ @session.find(:monkey, '1', :name => 'Monkey John').text.should == 'Monkey John'
120
+ @session.find(:monkey, '2', :name => 'Monkey Paul').text.should == 'Monkey Paul'
121
+ end
122
+
123
+ it "should not find elements that don't match the filter" do
124
+ expect { @session.find(:monkey, '2', :name => 'Monkey John') }.to raise_error(Capybara::ElementNotFound)
125
+ expect { @session.find(:monkey, '1', :name => 'Monkey Paul') }.to raise_error(Capybara::ElementNotFound)
126
+ end
127
+ end
128
+
129
+ context "with css as default selector" do
130
+ before { Capybara.default_selector = :css }
131
+ it "should find the first element using the given locator" do
132
+ @session.find('h1').text.should == 'This is a test'
133
+ @session.find("input[id='test_field']")[:value].should == 'monkey'
134
+ end
135
+ after { Capybara.default_selector = :xpath }
136
+ end
137
+
138
+ it "should raise ElementNotFound with specified fail message if nothing was found" do
139
+ running do
140
+ @session.find(:xpath, '//div[@id="nosuchthing"]', :message => 'arghh').should be_nil
141
+ end.should raise_error(Capybara::ElementNotFound, "arghh")
142
+ end
143
+
144
+ it "should raise ElementNotFound with a useful default message if nothing was found" do
145
+ running do
146
+ @session.find(:xpath, '//div[@id="nosuchthing"]').should be_nil
147
+ end.should raise_error(Capybara::ElementNotFound, "Unable to find xpath \"//div[@id=\\\"nosuchthing\\\"]\"")
148
+ end
149
+
150
+ it "should accept an XPath instance and respect the order of paths" do
151
+ @session.visit('/form')
152
+ @xpath = XPath::HTML.fillable_field('Name')
153
+ @session.find(@xpath).value.should == 'John Smith'
154
+ end
155
+
156
+ context "within a scope" do
157
+ before do
158
+ @session.visit('/with_scope')
159
+ end
160
+
161
+ it "should find the first element using the given locator" do
162
+ @session.within(:xpath, "//div[@id='for_bar']") do
163
+ @session.find('.//li').text.should =~ /With Simple HTML/
164
+ end
165
+ end
166
+ end
167
+ end
168
+ end