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.
- data/History.txt +100 -0
- data/License.txt +22 -0
- data/README.md +829 -0
- data/lib/capybara.rb +124 -6
- data/lib/capybara/cucumber.rb +2 -5
- data/lib/capybara/driver/base.rb +5 -5
- data/lib/capybara/driver/node.rb +2 -2
- data/lib/capybara/dsl.rb +3 -121
- data/lib/capybara/node/actions.rb +12 -28
- data/lib/capybara/node/base.rb +5 -13
- data/lib/capybara/node/element.rb +21 -21
- data/lib/capybara/node/finders.rb +27 -89
- data/lib/capybara/node/matchers.rb +107 -69
- data/lib/capybara/node/simple.rb +11 -13
- data/lib/capybara/query.rb +78 -0
- data/lib/capybara/rack_test/browser.rb +16 -27
- data/lib/capybara/rack_test/driver.rb +11 -1
- data/lib/capybara/rack_test/node.rb +17 -1
- data/lib/capybara/result.rb +84 -0
- data/lib/capybara/rspec/matchers.rb +28 -63
- data/lib/capybara/selector.rb +97 -33
- data/lib/capybara/selenium/driver.rb +14 -61
- data/lib/capybara/selenium/node.rb +6 -15
- data/lib/capybara/server.rb +32 -27
- data/lib/capybara/session.rb +54 -30
- data/lib/capybara/spec/public/jquery-ui.js +791 -0
- data/lib/capybara/spec/public/jquery.js +9046 -0
- data/lib/capybara/spec/public/test.js +4 -1
- data/lib/capybara/spec/session.rb +56 -27
- data/lib/capybara/spec/session/all_spec.rb +8 -4
- data/lib/capybara/spec/session/attach_file_spec.rb +12 -9
- data/lib/capybara/spec/session/check_spec.rb +6 -3
- data/lib/capybara/spec/session/choose_spec.rb +4 -1
- data/lib/capybara/spec/session/click_button_spec.rb +5 -14
- data/lib/capybara/spec/session/click_link_or_button_spec.rb +2 -1
- data/lib/capybara/spec/session/click_link_spec.rb +3 -17
- data/lib/capybara/spec/session/current_url_spec.rb +77 -9
- data/lib/capybara/spec/session/fill_in_spec.rb +8 -18
- data/lib/capybara/spec/session/find_spec.rb +19 -46
- data/lib/capybara/spec/session/first_spec.rb +2 -34
- data/lib/capybara/spec/session/has_css_spec.rb +1 -1
- data/lib/capybara/spec/session/has_field_spec.rb +28 -0
- data/lib/capybara/spec/session/has_select_spec.rb +84 -31
- data/lib/capybara/spec/session/has_table_spec.rb +7 -69
- data/lib/capybara/spec/session/has_text_spec.rb +168 -0
- data/lib/capybara/spec/session/javascript.rb +65 -81
- data/lib/capybara/spec/session/node_spec.rb +115 -0
- data/lib/capybara/spec/session/screenshot.rb +29 -0
- data/lib/capybara/spec/session/select_spec.rb +12 -12
- data/lib/capybara/spec/session/text_spec.rb +9 -4
- data/lib/capybara/spec/session/unselect_spec.rb +12 -6
- data/lib/capybara/spec/session/visit_spec.rb +76 -0
- data/lib/capybara/spec/session/within_frame_spec.rb +33 -0
- data/lib/capybara/spec/session/within_spec.rb +47 -58
- data/lib/capybara/spec/session/within_window_spec.rb +40 -0
- data/lib/capybara/spec/test_app.rb +27 -3
- data/lib/capybara/spec/views/form.erb +11 -10
- data/lib/capybara/spec/views/host_links.erb +2 -2
- data/lib/capybara/spec/views/tables.erb +6 -66
- data/lib/capybara/spec/views/with_html.erb +3 -3
- data/lib/capybara/spec/views/with_js.erb +11 -8
- data/lib/capybara/util/save_and_open_page.rb +4 -3
- data/lib/capybara/version.rb +1 -1
- data/spec/basic_node_spec.rb +15 -3
- data/spec/dsl_spec.rb +12 -10
- data/spec/rack_test_spec.rb +152 -0
- data/spec/rspec/features_spec.rb +0 -2
- data/spec/rspec/matchers_spec.rb +164 -89
- data/spec/rspec_spec.rb +0 -2
- data/spec/selenium_spec.rb +67 -0
- data/spec/server_spec.rb +35 -23
- data/spec/spec_helper.rb +18 -2
- metadata +30 -30
- data/README.rdoc +0 -722
- data/lib/capybara/spec/driver.rb +0 -301
- data/lib/capybara/spec/session/current_host_spec.rb +0 -68
- data/lib/capybara/spec/session/has_content_spec.rb +0 -106
- data/lib/capybara/util/timeout.rb +0 -27
- data/spec/driver/rack_test_driver_spec.rb +0 -89
- data/spec/driver/selenium_driver_spec.rb +0 -37
- data/spec/session/rack_test_session_spec.rb +0 -55
- data/spec/session/selenium_session_spec.rb +0 -26
- data/spec/string_spec.rb +0 -77
- data/spec/timeout_spec.rb +0 -28
@@ -0,0 +1,29 @@
|
|
1
|
+
shared_examples_for "session with screenshot support" do
|
2
|
+
describe "#save_screenshot" do
|
3
|
+
let(:image_path) { File.join(Dir.tmpdir, 'capybara-screenshot.png') }
|
4
|
+
|
5
|
+
before do
|
6
|
+
@session.visit '/'
|
7
|
+
@session.save_screenshot image_path
|
8
|
+
end
|
9
|
+
|
10
|
+
it "should generate PNG file" do
|
11
|
+
magic = File.read(image_path, 4)
|
12
|
+
magic.should eq "\x89PNG"
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
shared_examples_for "session without screenshot support" do
|
18
|
+
describe "#save_screenshot" do
|
19
|
+
before do
|
20
|
+
@session.visit('/')
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should raise an error" do
|
24
|
+
running {
|
25
|
+
@session.save_screenshot 'raise_error.png'
|
26
|
+
}.should raise_error(Capybara::NotSupportedByDriverError)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -30,15 +30,9 @@ shared_examples_for "select" do
|
|
30
30
|
end
|
31
31
|
|
32
32
|
it "should select an option without giving a select box" do
|
33
|
-
@session.select("
|
33
|
+
@session.select("Swedish")
|
34
34
|
@session.click_button('awesome')
|
35
|
-
extract_results(@session)['
|
36
|
-
end
|
37
|
-
|
38
|
-
it "should favour exact matches to option labels" do
|
39
|
-
@session.select("Mr", :from => 'Title')
|
40
|
-
@session.click_button('awesome')
|
41
|
-
extract_results(@session)['title'].should == 'Mr'
|
35
|
+
extract_results(@session)['locale'].should == 'sv'
|
42
36
|
end
|
43
37
|
|
44
38
|
it "should escape quotes" do
|
@@ -63,13 +57,19 @@ shared_examples_for "select" do
|
|
63
57
|
|
64
58
|
context "with a locator that doesn't exist" do
|
65
59
|
it "should raise an error" do
|
66
|
-
|
60
|
+
msg = "Unable to find select box \"does not exist\""
|
61
|
+
running do
|
62
|
+
@session.select('foo', :from => 'does not exist')
|
63
|
+
end.should raise_error(Capybara::ElementNotFound, msg)
|
67
64
|
end
|
68
65
|
end
|
69
66
|
|
70
67
|
context "with an option that doesn't exist" do
|
71
68
|
it "should raise an error" do
|
72
|
-
|
69
|
+
msg = "Unable to find option \"Does not Exist\""
|
70
|
+
running do
|
71
|
+
@session.select('Does not Exist', :from => 'form_locale')
|
72
|
+
end.should raise_error(Capybara::ElementNotFound, msg)
|
73
73
|
end
|
74
74
|
end
|
75
75
|
|
@@ -96,7 +96,7 @@ shared_examples_for "select" do
|
|
96
96
|
@session.click_button('awesome')
|
97
97
|
extract_results(@session)['languages'].should include('Ruby', 'Javascript')
|
98
98
|
end
|
99
|
-
|
99
|
+
|
100
100
|
it "should remain selected if already selected" do
|
101
101
|
@session.select("Ruby", :from => 'Language')
|
102
102
|
@session.select("Javascript", :from => 'Language')
|
@@ -104,7 +104,7 @@ shared_examples_for "select" do
|
|
104
104
|
@session.click_button('awesome')
|
105
105
|
extract_results(@session)['languages'].should include('Ruby', 'Javascript')
|
106
106
|
end
|
107
|
-
|
107
|
+
|
108
108
|
it "should return value attribute rather than content if present" do
|
109
109
|
@session.find_field('Underwear').value.should include('thermal')
|
110
110
|
end
|
@@ -1,19 +1,24 @@
|
|
1
1
|
shared_examples_for "text" do
|
2
2
|
describe '#text' do
|
3
|
-
before do
|
4
|
-
@session.visit('/with_simple_html')
|
5
|
-
end
|
6
|
-
|
7
3
|
it "should print the text of the page" do
|
4
|
+
@session.visit('/with_simple_html')
|
8
5
|
@session.text.should == 'Bar'
|
9
6
|
end
|
10
7
|
|
11
8
|
context "with css as default selector" do
|
12
9
|
before { Capybara.default_selector = :css }
|
13
10
|
it "should print the text of the page" do
|
11
|
+
@session.visit('/with_simple_html')
|
14
12
|
@session.text.should == 'Bar'
|
15
13
|
end
|
16
14
|
after { Capybara.default_selector = :xpath }
|
17
15
|
end
|
16
|
+
|
17
|
+
it "should strip whitespace" do
|
18
|
+
@session.visit('/with_html')
|
19
|
+
n = @session.find(:css, '#second')
|
20
|
+
@session.find(:css, '#second').text.should =~ \
|
21
|
+
/\ADuis aute .* text with whitespace .* est laborum\.\z/
|
22
|
+
end
|
18
23
|
end
|
19
24
|
end
|
@@ -8,28 +8,28 @@ shared_examples_for "unselect" do
|
|
8
8
|
it "should unselect an option from a select box by id" do
|
9
9
|
@session.unselect('Commando', :from => 'form_underwear')
|
10
10
|
@session.click_button('awesome')
|
11
|
-
extract_results(@session)['underwear'].should include('Briefs', '
|
11
|
+
extract_results(@session)['underwear'].should include('Briefs', 'Boxerbriefs')
|
12
12
|
extract_results(@session)['underwear'].should_not include('Commando')
|
13
13
|
end
|
14
14
|
|
15
15
|
it "should unselect an option without a select box" do
|
16
16
|
@session.unselect('Commando')
|
17
17
|
@session.click_button('awesome')
|
18
|
-
extract_results(@session)['underwear'].should include('Briefs', '
|
18
|
+
extract_results(@session)['underwear'].should include('Briefs', 'Boxerbriefs')
|
19
19
|
extract_results(@session)['underwear'].should_not include('Commando')
|
20
20
|
end
|
21
21
|
|
22
22
|
it "should unselect an option from a select box by label" do
|
23
23
|
@session.unselect('Commando', :from => 'Underwear')
|
24
24
|
@session.click_button('awesome')
|
25
|
-
extract_results(@session)['underwear'].should include('Briefs', '
|
25
|
+
extract_results(@session)['underwear'].should include('Briefs', 'Boxerbriefs')
|
26
26
|
extract_results(@session)['underwear'].should_not include('Commando')
|
27
27
|
end
|
28
28
|
|
29
29
|
it "should favour exact matches to option labels" do
|
30
30
|
@session.unselect("Briefs", :from => 'Underwear')
|
31
31
|
@session.click_button('awesome')
|
32
|
-
extract_results(@session)['underwear'].should include('Commando', '
|
32
|
+
extract_results(@session)['underwear'].should include('Commando', 'Boxerbriefs')
|
33
33
|
extract_results(@session)['underwear'].should_not include('Briefs')
|
34
34
|
end
|
35
35
|
|
@@ -48,13 +48,19 @@ shared_examples_for "unselect" do
|
|
48
48
|
|
49
49
|
context "with a locator that doesn't exist" do
|
50
50
|
it "should raise an error" do
|
51
|
-
|
51
|
+
msg = "Unable to find select box \"does not exist\""
|
52
|
+
running do
|
53
|
+
@session.unselect('foo', :from => 'does not exist')
|
54
|
+
end.should raise_error(Capybara::ElementNotFound, msg)
|
52
55
|
end
|
53
56
|
end
|
54
57
|
|
55
58
|
context "with an option that doesn't exist" do
|
56
59
|
it "should raise an error" do
|
57
|
-
|
60
|
+
msg = "Unable to find option \"Does not Exist\""
|
61
|
+
running do
|
62
|
+
@session.unselect('Does not Exist', :from => 'form_underwear')
|
63
|
+
end.should raise_error(Capybara::ElementNotFound, msg)
|
58
64
|
end
|
59
65
|
end
|
60
66
|
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
shared_examples_for "visit" do
|
2
|
+
describe '#visit' do
|
3
|
+
it "should fetch a response from the driver with a relative url" do
|
4
|
+
@session.visit('/')
|
5
|
+
@session.body.should include('Hello world!')
|
6
|
+
@session.visit('/foo')
|
7
|
+
@session.body.should include('Another World')
|
8
|
+
end
|
9
|
+
|
10
|
+
it "should fetch a response from the driver with an absolute url with a port" do
|
11
|
+
# Preparation
|
12
|
+
@session.visit('/')
|
13
|
+
root_uri = URI.parse(@session.current_url)
|
14
|
+
|
15
|
+
@session.visit("http://#{root_uri.host}:#{root_uri.port}/")
|
16
|
+
@session.body.should include('Hello world!')
|
17
|
+
@session.visit("http://#{root_uri.host}:#{root_uri.port}/foo")
|
18
|
+
@session.body.should include('Another World')
|
19
|
+
end
|
20
|
+
|
21
|
+
context "when Capybara.always_include_port is true" do
|
22
|
+
|
23
|
+
let(:root_uri) do
|
24
|
+
@session.visit('/')
|
25
|
+
URI.parse(@session.current_url)
|
26
|
+
end
|
27
|
+
|
28
|
+
before(:each) do
|
29
|
+
Capybara.always_include_port = true
|
30
|
+
end
|
31
|
+
|
32
|
+
after(:each) do
|
33
|
+
Capybara.always_include_port = false
|
34
|
+
end
|
35
|
+
|
36
|
+
it "should fetch a response from the driver with an absolute url without a port" do
|
37
|
+
@session.visit("http://#{root_uri.host}/")
|
38
|
+
URI.parse(@session.current_url).port.should == root_uri.port
|
39
|
+
@session.body.should include('Hello world!')
|
40
|
+
|
41
|
+
@session.visit("http://#{root_uri.host}/foo")
|
42
|
+
URI.parse(@session.current_url).port.should == root_uri.port
|
43
|
+
@session.body.should include('Another World')
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
it "should send no referer when visiting a page" do
|
48
|
+
@session.visit '/get_referer'
|
49
|
+
@session.body.should include 'No referer'
|
50
|
+
end
|
51
|
+
|
52
|
+
it "should send no referer when visiting a second page" do
|
53
|
+
@session.visit '/get_referer'
|
54
|
+
@session.visit '/get_referer'
|
55
|
+
@session.body.should include 'No referer'
|
56
|
+
end
|
57
|
+
|
58
|
+
it "should send a referer when following a link" do
|
59
|
+
@session.visit '/referer_base'
|
60
|
+
@session.find('//a[@href="/get_referer"]').click
|
61
|
+
@session.body.should match %r{http://.*/referer_base}
|
62
|
+
end
|
63
|
+
|
64
|
+
it "should preserve the original referer URL when following a redirect" do
|
65
|
+
@session.visit('/referer_base')
|
66
|
+
@session.find('//a[@href="/redirect_to_get_referer"]').click
|
67
|
+
@session.body.should match %r{http://.*/referer_base}
|
68
|
+
end
|
69
|
+
|
70
|
+
it "should send a referer when submitting a form" do
|
71
|
+
@session.visit '/referer_base'
|
72
|
+
@session.find('//input').click
|
73
|
+
@session.body.should match %r{http://.*/referer_base}
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
shared_examples_for "session with frame support" do
|
2
|
+
describe '#within_frame' do
|
3
|
+
before(:each) do
|
4
|
+
@session.visit('/within_frames')
|
5
|
+
end
|
6
|
+
|
7
|
+
it "should find the div in frameOne" do
|
8
|
+
@session.within_frame("frameOne") do
|
9
|
+
@session.find("//*[@id='divInFrameOne']").text.should eql 'This is the text of divInFrameOne'
|
10
|
+
end
|
11
|
+
end
|
12
|
+
it "should find the div in FrameTwo" do
|
13
|
+
@session.within_frame("frameTwo") do
|
14
|
+
@session.find("//*[@id='divInFrameTwo']").text.should eql 'This is the text of divInFrameTwo'
|
15
|
+
end
|
16
|
+
end
|
17
|
+
it "should find the text div in the main window after finding text in frameOne" do
|
18
|
+
@session.within_frame("frameOne") do
|
19
|
+
@session.find("//*[@id='divInFrameOne']").text.should eql 'This is the text of divInFrameOne'
|
20
|
+
end
|
21
|
+
@session.find("//*[@id='divInMainWindow']").text.should eql 'This is the text for divInMainWindow'
|
22
|
+
end
|
23
|
+
it "should find the text div in the main window after finding text in frameTwo" do
|
24
|
+
@session.within_frame("frameTwo") do
|
25
|
+
@session.find("//*[@id='divInFrameTwo']").text.should eql 'This is the text of divInFrameTwo'
|
26
|
+
end
|
27
|
+
@session.find("//*[@id='divInMainWindow']").text.should eql 'This is the text for divInMainWindow'
|
28
|
+
end
|
29
|
+
it "should return the result of executing the block" do
|
30
|
+
@session.within_frame("frameOne") { "return value" }.should eql "return value"
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -6,7 +6,7 @@ shared_examples_for "within" do
|
|
6
6
|
|
7
7
|
context "with CSS selector" do
|
8
8
|
it "should click links in the given scope" do
|
9
|
-
@session.within(:css, "
|
9
|
+
@session.within(:css, "#for_bar li[contains('With Simple HTML')]") do
|
10
10
|
@session.click_link('Go')
|
11
11
|
end
|
12
12
|
@session.body.should include('Bar')
|
@@ -20,7 +20,7 @@ shared_examples_for "within" do
|
|
20
20
|
end
|
21
21
|
|
22
22
|
it "should accept additional options" do
|
23
|
-
@session.within(:css, "
|
23
|
+
@session.within(:css, "#for_bar li", :text => 'With Simple HTML') do
|
24
24
|
@session.click_link('Go')
|
25
25
|
end
|
26
26
|
@session.body.should include('Bar')
|
@@ -29,7 +29,7 @@ shared_examples_for "within" do
|
|
29
29
|
|
30
30
|
context "with XPath selector" do
|
31
31
|
it "should click links in the given scope" do
|
32
|
-
@session.within(:xpath, "//li[contains(.,'With Simple HTML')]") do
|
32
|
+
@session.within(:xpath, "//div[@id='for_bar']//li[contains(.,'With Simple HTML')]") do
|
33
33
|
@session.click_link('Go')
|
34
34
|
end
|
35
35
|
@session.body.should include('Bar')
|
@@ -38,7 +38,7 @@ shared_examples_for "within" do
|
|
38
38
|
|
39
39
|
context "with the default selector" do
|
40
40
|
it "should use XPath" do
|
41
|
-
@session.within("//li[contains(.,
|
41
|
+
@session.within("//div[@id='for_bar']//li[contains(.,'With Simple HTML')]") do
|
42
42
|
@session.click_link('Go')
|
43
43
|
end
|
44
44
|
@session.body.should include('Bar')
|
@@ -47,9 +47,9 @@ shared_examples_for "within" do
|
|
47
47
|
|
48
48
|
context "with Node rather than selector" do
|
49
49
|
it "should click links in the given scope" do
|
50
|
-
node_of_interest = @session.find(:css, "
|
50
|
+
node_of_interest = @session.find(:css, "#for_bar li[contains('With Simple HTML')]")
|
51
51
|
|
52
|
-
@session.within(node_of_interest) do
|
52
|
+
@session.within(node_of_interest) do
|
53
53
|
@session.click_link('Go')
|
54
54
|
end
|
55
55
|
@session.body.should include('Bar')
|
@@ -59,7 +59,7 @@ shared_examples_for "within" do
|
|
59
59
|
context "with the default selector set to CSS" do
|
60
60
|
before { Capybara.default_selector = :css }
|
61
61
|
it "should use CSS" do
|
62
|
-
@session.within("
|
62
|
+
@session.within("#for_bar li[contains('With Simple HTML')]") do
|
63
63
|
@session.click_link('Go')
|
64
64
|
end
|
65
65
|
@session.body.should include('Bar')
|
@@ -67,68 +67,57 @@ shared_examples_for "within" do
|
|
67
67
|
after { Capybara.default_selector = :xpath }
|
68
68
|
end
|
69
69
|
|
70
|
-
context "with
|
71
|
-
it "should
|
72
|
-
@session.within("//
|
73
|
-
@session.
|
74
|
-
|
75
|
-
@session.body.should include('Bar')
|
76
|
-
end
|
77
|
-
|
78
|
-
context "with nested scopes" do
|
79
|
-
it "should respect the inner scope" do
|
80
|
-
@session.within("//div[@id='for_bar']") do
|
81
|
-
@session.within(".//li[contains(.,'Bar')]") do
|
82
|
-
@session.click_link('Go')
|
83
|
-
end
|
70
|
+
context "with nested scopes" do
|
71
|
+
it "should respect the inner scope" do
|
72
|
+
@session.within("//div[@id='for_bar']") do
|
73
|
+
@session.within(".//li[contains(.,'Bar')]") do
|
74
|
+
@session.click_link('Go')
|
84
75
|
end
|
85
|
-
@session.body.should include('Another World')
|
86
|
-
end
|
87
|
-
|
88
|
-
it "should respect the outer scope" do
|
89
|
-
@session.within("//div[@id='another_foo']") do
|
90
|
-
@session.within(".//li[contains(.,'With Simple HTML')]") do
|
91
|
-
@session.click_link('Go')
|
92
|
-
end
|
93
|
-
end
|
94
|
-
@session.body.should include('Hello world')
|
95
76
|
end
|
77
|
+
@session.body.should include('Another World')
|
96
78
|
end
|
97
79
|
|
98
|
-
it "should
|
99
|
-
|
100
|
-
@session.within("
|
80
|
+
it "should respect the outer scope" do
|
81
|
+
@session.within("//div[@id='another_foo']") do
|
82
|
+
@session.within(".//li[contains(.,'With Simple HTML')]") do
|
83
|
+
@session.click_link('Go')
|
101
84
|
end
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
it "should restore the scope when an error is raised" do
|
106
|
-
running {
|
107
|
-
@session.within("//div[@id='for_bar']") do
|
108
|
-
running {
|
109
|
-
running {
|
110
|
-
@session.within(".//div[@id='doesnotexist']") do
|
111
|
-
end
|
112
|
-
}.should raise_error(Capybara::ElementNotFound)
|
113
|
-
}.should_not change { @session.has_xpath?(".//div[@id='another_foo']") }.from(false)
|
114
|
-
end
|
115
|
-
}.should_not change { @session.has_xpath?(".//div[@id='another_foo']") }.from(true)
|
85
|
+
end
|
86
|
+
@session.body.should include('Hello world')
|
116
87
|
end
|
117
88
|
end
|
118
89
|
|
119
|
-
|
120
|
-
|
121
|
-
@session.within("//
|
122
|
-
@session.click_button('Go')
|
90
|
+
it "should raise an error if the scope is not found on the page" do
|
91
|
+
running do
|
92
|
+
@session.within("//div[@id='doesnotexist']") do
|
123
93
|
end
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
94
|
+
end.should raise_error(Capybara::ElementNotFound)
|
95
|
+
end
|
96
|
+
|
97
|
+
it "should restore the scope when an error is raised" do
|
98
|
+
running do
|
99
|
+
@session.within("//div[@id='for_bar']") do
|
100
|
+
running do
|
101
|
+
running do
|
102
|
+
@session.within(".//div[@id='doesnotexist']") do
|
103
|
+
end
|
104
|
+
end.should raise_error(Capybara::ElementNotFound)
|
105
|
+
end.should_not change { @session.has_xpath?(".//div[@id='another_foo']") }.from(false)
|
129
106
|
end
|
130
|
-
|
107
|
+
end.should_not change { @session.has_xpath?(".//div[@id='another_foo']") }.from(true)
|
108
|
+
end
|
109
|
+
|
110
|
+
it "should fill in a field and click a button" do
|
111
|
+
@session.within("//li[contains(.,'Bar')]") do
|
112
|
+
@session.click_button('Go')
|
113
|
+
end
|
114
|
+
extract_results(@session)['first_name'].should == 'Peter'
|
115
|
+
@session.visit('/with_scope')
|
116
|
+
@session.within("//li[contains(.,'Bar')]") do
|
117
|
+
@session.fill_in('First Name', :with => 'Dagobert')
|
118
|
+
@session.click_button('Go')
|
131
119
|
end
|
120
|
+
extract_results(@session)['first_name'].should == 'Dagobert'
|
132
121
|
end
|
133
122
|
end
|
134
123
|
|
@@ -0,0 +1,40 @@
|
|
1
|
+
shared_examples_for "session with window support" do
|
2
|
+
describe '#within_window' do
|
3
|
+
before(:each) do
|
4
|
+
@session.visit('/within_popups')
|
5
|
+
end
|
6
|
+
after(:each) do
|
7
|
+
@session.within_window("firstPopup") do
|
8
|
+
@session.evaluate_script('window.close()')
|
9
|
+
end
|
10
|
+
@session.within_window("secondPopup") do
|
11
|
+
@session.evaluate_script('window.close()')
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
it "should find the div in firstPopup" do
|
16
|
+
@session.within_window("firstPopup") do
|
17
|
+
@session.find("//*[@id='divInPopupOne']").text.should eql 'This is the text of divInPopupOne'
|
18
|
+
end
|
19
|
+
end
|
20
|
+
it "should find the div in secondPopup" do
|
21
|
+
@session.within_window("secondPopup") do
|
22
|
+
@session.find("//*[@id='divInPopupTwo']").text.should eql 'This is the text of divInPopupTwo'
|
23
|
+
end
|
24
|
+
end
|
25
|
+
it "should find the divs in both popups" do
|
26
|
+
@session.within_window("secondPopup") do
|
27
|
+
@session.find("//*[@id='divInPopupTwo']").text.should eql 'This is the text of divInPopupTwo'
|
28
|
+
end
|
29
|
+
@session.within_window("firstPopup") do
|
30
|
+
@session.find("//*[@id='divInPopupOne']").text.should eql 'This is the text of divInPopupOne'
|
31
|
+
end
|
32
|
+
end
|
33
|
+
it "should find the div in the main window after finding a div in a popup" do
|
34
|
+
@session.within_window("secondPopup") do
|
35
|
+
@session.find("//*[@id='divInPopupTwo']").text.should eql 'This is the text of divInPopupTwo'
|
36
|
+
end
|
37
|
+
@session.find("//*[@id='divInMainWindow']").text.should eql 'This is the text for divInMainWindow'
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|