capybara 1.1.4 → 2.0.0.beta2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (84) hide show
  1. data/History.txt +100 -0
  2. data/License.txt +22 -0
  3. data/README.md +829 -0
  4. data/lib/capybara.rb +124 -6
  5. data/lib/capybara/cucumber.rb +2 -5
  6. data/lib/capybara/driver/base.rb +5 -5
  7. data/lib/capybara/driver/node.rb +2 -2
  8. data/lib/capybara/dsl.rb +3 -121
  9. data/lib/capybara/node/actions.rb +12 -28
  10. data/lib/capybara/node/base.rb +5 -13
  11. data/lib/capybara/node/element.rb +21 -21
  12. data/lib/capybara/node/finders.rb +27 -89
  13. data/lib/capybara/node/matchers.rb +107 -69
  14. data/lib/capybara/node/simple.rb +11 -13
  15. data/lib/capybara/query.rb +78 -0
  16. data/lib/capybara/rack_test/browser.rb +16 -27
  17. data/lib/capybara/rack_test/driver.rb +11 -1
  18. data/lib/capybara/rack_test/node.rb +17 -1
  19. data/lib/capybara/result.rb +84 -0
  20. data/lib/capybara/rspec/matchers.rb +28 -63
  21. data/lib/capybara/selector.rb +97 -33
  22. data/lib/capybara/selenium/driver.rb +14 -61
  23. data/lib/capybara/selenium/node.rb +6 -15
  24. data/lib/capybara/server.rb +32 -27
  25. data/lib/capybara/session.rb +54 -30
  26. data/lib/capybara/spec/public/jquery-ui.js +791 -0
  27. data/lib/capybara/spec/public/jquery.js +9046 -0
  28. data/lib/capybara/spec/public/test.js +4 -1
  29. data/lib/capybara/spec/session.rb +56 -27
  30. data/lib/capybara/spec/session/all_spec.rb +8 -4
  31. data/lib/capybara/spec/session/attach_file_spec.rb +12 -9
  32. data/lib/capybara/spec/session/check_spec.rb +6 -3
  33. data/lib/capybara/spec/session/choose_spec.rb +4 -1
  34. data/lib/capybara/spec/session/click_button_spec.rb +5 -14
  35. data/lib/capybara/spec/session/click_link_or_button_spec.rb +2 -1
  36. data/lib/capybara/spec/session/click_link_spec.rb +3 -17
  37. data/lib/capybara/spec/session/current_url_spec.rb +77 -9
  38. data/lib/capybara/spec/session/fill_in_spec.rb +8 -18
  39. data/lib/capybara/spec/session/find_spec.rb +19 -46
  40. data/lib/capybara/spec/session/first_spec.rb +2 -34
  41. data/lib/capybara/spec/session/has_css_spec.rb +1 -1
  42. data/lib/capybara/spec/session/has_field_spec.rb +28 -0
  43. data/lib/capybara/spec/session/has_select_spec.rb +84 -31
  44. data/lib/capybara/spec/session/has_table_spec.rb +7 -69
  45. data/lib/capybara/spec/session/has_text_spec.rb +168 -0
  46. data/lib/capybara/spec/session/javascript.rb +65 -81
  47. data/lib/capybara/spec/session/node_spec.rb +115 -0
  48. data/lib/capybara/spec/session/screenshot.rb +29 -0
  49. data/lib/capybara/spec/session/select_spec.rb +12 -12
  50. data/lib/capybara/spec/session/text_spec.rb +9 -4
  51. data/lib/capybara/spec/session/unselect_spec.rb +12 -6
  52. data/lib/capybara/spec/session/visit_spec.rb +76 -0
  53. data/lib/capybara/spec/session/within_frame_spec.rb +33 -0
  54. data/lib/capybara/spec/session/within_spec.rb +47 -58
  55. data/lib/capybara/spec/session/within_window_spec.rb +40 -0
  56. data/lib/capybara/spec/test_app.rb +27 -3
  57. data/lib/capybara/spec/views/form.erb +11 -10
  58. data/lib/capybara/spec/views/host_links.erb +2 -2
  59. data/lib/capybara/spec/views/tables.erb +6 -66
  60. data/lib/capybara/spec/views/with_html.erb +3 -3
  61. data/lib/capybara/spec/views/with_js.erb +11 -8
  62. data/lib/capybara/util/save_and_open_page.rb +4 -3
  63. data/lib/capybara/version.rb +1 -1
  64. data/spec/basic_node_spec.rb +15 -3
  65. data/spec/dsl_spec.rb +12 -10
  66. data/spec/rack_test_spec.rb +152 -0
  67. data/spec/rspec/features_spec.rb +0 -2
  68. data/spec/rspec/matchers_spec.rb +164 -89
  69. data/spec/rspec_spec.rb +0 -2
  70. data/spec/selenium_spec.rb +67 -0
  71. data/spec/server_spec.rb +35 -23
  72. data/spec/spec_helper.rb +18 -2
  73. metadata +30 -30
  74. data/README.rdoc +0 -722
  75. data/lib/capybara/spec/driver.rb +0 -301
  76. data/lib/capybara/spec/session/current_host_spec.rb +0 -68
  77. data/lib/capybara/spec/session/has_content_spec.rb +0 -106
  78. data/lib/capybara/util/timeout.rb +0 -27
  79. data/spec/driver/rack_test_driver_spec.rb +0 -89
  80. data/spec/driver/selenium_driver_spec.rb +0 -37
  81. data/spec/session/rack_test_session_spec.rb +0 -55
  82. data/spec/session/selenium_session_spec.rb +0 -26
  83. data/spec/string_spec.rb +0 -77
  84. data/spec/timeout_spec.rb +0 -28
@@ -1,27 +0,0 @@
1
- module Capybara
2
- class << self
3
-
4
- ##
5
- # Provides timeout similar to standard library Timeout, but avoids threads
6
- #
7
- def timeout(seconds = 1, driver = nil, error_message = 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, error_message || "timed out"
18
- end
19
-
20
- driver && driver.wait_until(delay)
21
-
22
- sleep(0.05)
23
- end
24
- end
25
-
26
- end
27
- end
@@ -1,89 +0,0 @@
1
- # encoding: utf-8
2
- require 'spec_helper'
3
- require 'stringio'
4
-
5
- def capture(*streams)
6
- streams.map! { |stream| stream.to_s }
7
- begin
8
- result = StringIO.new
9
- streams.each { |stream| eval "$#{stream} = result" }
10
- yield
11
- ensure
12
- streams.each { |stream| eval("$#{stream} = #{stream.upcase}") }
13
- end
14
- result.string
15
- end
16
-
17
- describe Capybara::RackTest::Driver do
18
- before do
19
- @driver = TestSessions::RackTest.driver
20
- end
21
-
22
- it "should throw an error when no rack app is given" do
23
- running do
24
- Capybara::RackTest::Driver.new(nil)
25
- end.should raise_error(ArgumentError)
26
- end
27
-
28
- it_should_behave_like "driver"
29
- it_should_behave_like "driver with header support"
30
- it_should_behave_like "driver with status code support"
31
- it_should_behave_like "driver with cookies support"
32
- it_should_behave_like "driver with infinite redirect detection"
33
-
34
- describe '#reset!' do
35
- it { @driver.visit('/foo'); lambda { @driver.reset! }.should change(@driver, :current_url).to('') }
36
-
37
- it 'should reset headers' do
38
- @driver.header('FOO', 'BAR')
39
- @driver.visit('/get_header')
40
- @driver.body.should include('BAR')
41
-
42
- @driver.reset!
43
- @driver.visit('/get_header')
44
- @driver.body.should_not include('BAR')
45
- end
46
-
47
- it 'should reset response' do
48
- @driver.visit('/foo')
49
- lambda { @driver.response }.should_not raise_error
50
- @driver.reset!
51
- lambda { @driver.response }.should raise_error
52
- end
53
-
54
- it 'should request response' do
55
- @driver.visit('/foo')
56
- lambda { @driver.request }.should_not raise_error
57
- @driver.reset!
58
- lambda { @driver.request }.should raise_error
59
- end
60
- end
61
-
62
- describe ':headers option' do
63
- it 'should always set headers' do
64
- @driver = Capybara::RackTest::Driver.new(TestApp, :headers => {'HTTP_FOO' => 'foobar'})
65
- @driver.visit('/get_header')
66
- @driver.body.should include('foobar')
67
- end
68
-
69
- it 'should keep headers on link clicks' do
70
- @driver = Capybara::RackTest::Driver.new(TestApp, :headers => {'HTTP_FOO' => 'foobar'})
71
- @driver.visit('/header_links')
72
- @driver.find('.//a').first.click
73
- @driver.body.should include('foobar')
74
- end
75
-
76
- it 'should keep headers on form submit' do
77
- @driver = Capybara::RackTest::Driver.new(TestApp, :headers => {'HTTP_FOO' => 'foobar'})
78
- @driver.visit('/header_links')
79
- @driver.find('.//input').first.click
80
- @driver.body.should include('foobar')
81
- end
82
-
83
- it 'should keep headers on redirects' do
84
- @driver = Capybara::RackTest::Driver.new(TestApp, :headers => {'HTTP_FOO' => 'foobar'})
85
- @driver.visit('/get_header_via_redirect')
86
- @driver.body.should include('foobar')
87
- end
88
- end
89
- end
@@ -1,37 +0,0 @@
1
- require 'spec_helper'
2
- require 'rbconfig'
3
-
4
- describe Capybara::Selenium::Driver do
5
- before do
6
- @driver = TestSessions::Selenium.driver
7
- end
8
-
9
- it_should_behave_like "driver"
10
- it_should_behave_like "driver with javascript support"
11
- it_should_behave_like "driver with resynchronization support"
12
- it_should_behave_like "driver with frame support"
13
- it_should_behave_like "driver with support for window switching"
14
- it_should_behave_like "driver without status code support"
15
- it_should_behave_like "driver with cookies support"
16
-
17
- describe "exit codes" do
18
- before do
19
- @current_dir = Dir.getwd
20
- Dir.chdir(File.join(File.dirname(__FILE__), '..', '..'))
21
- end
22
-
23
- after do
24
- Dir.chdir(@current_dir)
25
- end
26
-
27
- it "should have return code 1 when running selenium_driver_rspec_failure.rb" do
28
- `rspec spec/fixtures/selenium_driver_rspec_failure.rb`
29
- $?.exitstatus.should be 1
30
- end
31
-
32
- it "should have return code 0 when running selenium_driver_rspec_success.rb" do
33
- `rspec spec/fixtures/selenium_driver_rspec_success.rb`
34
- $?.exitstatus.should be 0
35
- end
36
- end
37
- end
@@ -1,55 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Capybara::Session do
4
- context 'with rack test driver' do
5
- before do
6
- @session = TestSessions::RackTest
7
- end
8
-
9
- describe '#driver' do
10
- it "should be a rack test driver" do
11
- @session.driver.should be_an_instance_of(Capybara::RackTest::Driver)
12
- end
13
- end
14
-
15
- describe '#mode' do
16
- it "should remember the mode" do
17
- @session.mode.should == :rack_test
18
- end
19
- end
20
-
21
- describe '#click_link' do
22
- it "should use data-method if available" do
23
- @session.visit "/with_html"
24
- @session.click_link "A link with data-method"
25
- @session.body.should include('The requested object was deleted')
26
- end
27
-
28
- it "should not use data-method if option is false" do
29
- @session.driver.options[:respect_data_method] = false
30
- @session.visit "/with_html"
31
- @session.click_link "A link with data-method"
32
- @session.body.should include('Not deleted')
33
- end
34
-
35
- after do
36
- @session.driver.options[:respect_data_method] = true
37
- end
38
- end
39
-
40
- describe "#attach_file" do
41
- context "with multipart form" do
42
- it "should submit an empty form-data section if no file is submitted" do
43
- @session.visit("/form")
44
- @session.click_button("Upload Empty")
45
- @session.body.should include('Successfully ignored empty file field.')
46
- end
47
- end
48
- end
49
-
50
- it_should_behave_like "session"
51
- it_should_behave_like "session without javascript support"
52
- it_should_behave_like "session with headers support"
53
- it_should_behave_like "session with status code support"
54
- end
55
- end
@@ -1,26 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Capybara::Session do
4
- context 'with selenium driver' do
5
- before do
6
- @session = TestSessions::Selenium
7
- end
8
-
9
- describe '#driver' do
10
- it "should be a selenium driver" do
11
- @session.driver.should be_an_instance_of(Capybara::Selenium::Driver)
12
- end
13
- end
14
-
15
- describe '#mode' do
16
- it "should remember the mode" do
17
- @session.mode.should == :selenium
18
- end
19
- end
20
-
21
- it_should_behave_like "session"
22
- it_should_behave_like "session with javascript support"
23
- it_should_behave_like "session without headers support"
24
- it_should_behave_like "session without status code support"
25
- end
26
- end
@@ -1,77 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Capybara do
4
- describe '.string' do
5
- let :string do
6
- Capybara.string <<-STRING
7
- <div id="page">
8
- <div id="content">
9
- <h1 data="fantastic">Awesome</h1>
10
- <p>Yes it is</p>
11
- </div>
12
-
13
- <div id="footer" style="display: none">
14
- <p>c2010</p>
15
- <p>Jonas Nicklas</p>
16
- <input type="text" name="foo" value="bar"/>
17
- <select name="animal">
18
- <option>Monkey</option>
19
- <option selected="selected">Capybara</option>
20
- </select>
21
- </div>
22
- </div>
23
- STRING
24
- end
25
-
26
- it "allows using matchers" do
27
- string.should have_css('#page')
28
- string.should_not have_css('#does-not-exist')
29
- end
30
-
31
- it "allows using custom matchers" do
32
- Capybara.add_selector :lifeform do
33
- xpath { |name| "//option[contains(.,'#{name}')]" }
34
- end
35
- string.should have_selector(:page)
36
- string.should_not have_selector(:'does-not-exist')
37
- string.should have_selector(:lifeform, "Monkey")
38
- string.should_not have_selector(:lifeform, "Gorilla")
39
- end
40
-
41
- it "allows using matchers with text option" do
42
- string.should have_css('h1', :text => 'Awesome')
43
- string.should_not have_css('h1', :text => 'Not so awesome')
44
- end
45
-
46
- it "allows finding only visible nodes" do
47
- string.all('//p', :text => 'c2010', :visible => true).should be_empty
48
- string.all('//p', :text => 'c2010', :visible => false).should have(1).element
49
- end
50
-
51
- it "allows finding elements and extracting text from them" do
52
- string.find('//h1').text.should == 'Awesome'
53
- end
54
-
55
- it "allows finding elements and extracting attributes from them" do
56
- string.find('//h1')[:data].should == 'fantastic'
57
- end
58
-
59
- it "allows finding elements and extracting the tag name from them" do
60
- string.find('//h1').tag_name.should == 'h1'
61
- end
62
-
63
- it "allows finding elements and extracting the path" do
64
- string.find('//h1').path.should == '/html/body/div/div[1]/h1'
65
- end
66
-
67
- it "allows finding elements and extracting the value" do
68
- string.find('//input').value.should == 'bar'
69
- string.find('//select').value.should == 'Capybara'
70
- end
71
-
72
- it "allows finding elements and checking if they are visible" do
73
- string.find('//h1').should be_visible
74
- string.find('//input').should_not be_visible
75
- end
76
- end
77
- end
@@ -1,28 +0,0 @@
1
- require 'spec_helper'
2
-
3
- require 'capybara'
4
- require 'capybara/util/timeout'
5
-
6
- module Capybara
7
-
8
- describe '.timeout' do
9
-
10
- it "should return result of yield if it returns true value within timeout" do
11
- Capybara.timeout { "hello" }.should == "hello"
12
- end
13
-
14
- it "should keep trying within timeout" do
15
- count = 0
16
- Capybara.timeout { count += 1; count == 5 ? count : nil }.should == 5
17
- end
18
-
19
- it "should raise Capybara::TimeoutError if block fails to return true within timeout" do
20
- running do
21
- Capybara.timeout(0.1) { false }
22
- end.should raise_error(::Capybara::TimeoutError)
23
- end
24
-
25
- end
26
-
27
- end
28
-