capybara 2.13.0 → 2.18.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/History.md +218 -18
- data/README.md +54 -23
- data/lib/capybara/config.rb +132 -0
- data/lib/capybara/cucumber.rb +1 -0
- data/lib/capybara/driver/base.rb +14 -0
- data/lib/capybara/dsl.rb +1 -3
- data/lib/capybara/helpers.rb +3 -3
- data/lib/capybara/minitest/spec.rb +14 -37
- data/lib/capybara/minitest.rb +95 -114
- data/lib/capybara/node/actions.rb +10 -10
- data/lib/capybara/node/base.rb +7 -2
- data/lib/capybara/node/element.rb +9 -3
- data/lib/capybara/node/finders.rb +92 -18
- data/lib/capybara/node/matchers.rb +21 -9
- data/lib/capybara/node/simple.rb +5 -0
- data/lib/capybara/queries/ancestor_query.rb +25 -0
- data/lib/capybara/queries/base_query.rb +12 -3
- data/lib/capybara/queries/current_path_query.rb +13 -9
- data/lib/capybara/queries/selector_query.rb +62 -23
- data/lib/capybara/queries/sibling_query.rb +25 -0
- data/lib/capybara/queries/text_query.rb +10 -5
- data/lib/capybara/queries/title_query.rb +1 -0
- data/lib/capybara/rack_test/browser.rb +13 -5
- data/lib/capybara/rack_test/driver.rb +6 -1
- data/lib/capybara/rack_test/form.rb +4 -3
- data/lib/capybara/rack_test/node.rb +1 -1
- data/lib/capybara/rspec/compound.rb +95 -0
- data/lib/capybara/rspec/matcher_proxies.rb +45 -0
- data/lib/capybara/rspec/matchers.rb +108 -7
- data/lib/capybara/rspec.rb +3 -1
- data/lib/capybara/selector/filter.rb +13 -41
- data/lib/capybara/selector/filter_set.rb +30 -4
- data/lib/capybara/selector/filters/base.rb +33 -0
- data/lib/capybara/selector/filters/expression_filter.rb +40 -0
- data/lib/capybara/selector/filters/node_filter.rb +27 -0
- data/lib/capybara/selector/selector.rb +36 -15
- data/lib/capybara/selector.rb +63 -42
- data/lib/capybara/selenium/driver.rb +177 -33
- data/lib/capybara/selenium/node.rb +106 -55
- data/lib/capybara/server.rb +6 -5
- data/lib/capybara/session/config.rb +114 -0
- data/lib/capybara/session/matchers.rb +15 -4
- data/lib/capybara/session.rb +178 -65
- data/lib/capybara/spec/fixtures/no_extension +1 -0
- data/lib/capybara/spec/public/test.js +18 -3
- data/lib/capybara/spec/session/accept_alert_spec.rb +9 -1
- data/lib/capybara/spec/session/accept_prompt_spec.rb +29 -1
- data/lib/capybara/spec/session/all_spec.rb +13 -1
- data/lib/capybara/spec/session/ancestor_spec.rb +85 -0
- data/lib/capybara/spec/session/assert_all_of_selectors_spec.rb +24 -8
- data/lib/capybara/spec/session/assert_selector.rb +1 -1
- data/lib/capybara/spec/session/assert_text.rb +8 -0
- data/lib/capybara/spec/session/assert_title.rb +22 -9
- data/lib/capybara/spec/session/attach_file_spec.rb +8 -1
- data/lib/capybara/spec/session/check_spec.rb +4 -4
- data/lib/capybara/spec/session/choose_spec.rb +2 -2
- data/lib/capybara/spec/session/click_button_spec.rb +1 -1
- data/lib/capybara/spec/session/click_link_or_button_spec.rb +3 -3
- data/lib/capybara/spec/session/click_link_spec.rb +1 -1
- data/lib/capybara/spec/session/current_url_spec.rb +3 -3
- data/lib/capybara/spec/session/dismiss_confirm_spec.rb +3 -3
- data/lib/capybara/spec/session/dismiss_prompt_spec.rb +1 -1
- data/lib/capybara/spec/session/evaluate_async_script_spec.rb +22 -0
- data/lib/capybara/spec/session/evaluate_script_spec.rb +1 -1
- data/lib/capybara/spec/session/fill_in_spec.rb +8 -2
- data/lib/capybara/spec/session/find_field_spec.rb +1 -0
- data/lib/capybara/spec/session/find_spec.rb +8 -6
- data/lib/capybara/spec/session/first_spec.rb +10 -5
- data/lib/capybara/spec/session/has_all_selectors_spec.rb +69 -0
- data/lib/capybara/spec/session/has_css_spec.rb +11 -0
- data/lib/capybara/spec/session/has_current_path_spec.rb +52 -7
- data/lib/capybara/spec/session/has_link_spec.rb +4 -4
- data/lib/capybara/spec/session/has_none_selectors_spec.rb +76 -0
- data/lib/capybara/spec/session/has_select_spec.rb +64 -6
- data/lib/capybara/spec/session/has_selector_spec.rb +1 -3
- data/lib/capybara/spec/session/has_text_spec.rb +5 -3
- data/lib/capybara/spec/session/has_title_spec.rb +4 -2
- data/lib/capybara/spec/session/has_xpath_spec.rb +5 -3
- data/lib/capybara/spec/session/node_spec.rb +50 -26
- data/lib/capybara/spec/session/refresh_spec.rb +28 -0
- data/lib/capybara/spec/session/reset_session_spec.rb +3 -3
- data/lib/capybara/spec/session/select_spec.rb +3 -2
- data/lib/capybara/spec/session/sibling_spec.rb +52 -0
- data/lib/capybara/spec/session/uncheck_spec.rb +2 -2
- data/lib/capybara/spec/session/unselect_spec.rb +2 -2
- data/lib/capybara/spec/session/visit_spec.rb +56 -1
- data/lib/capybara/spec/session/window/become_closed_spec.rb +11 -11
- data/lib/capybara/spec/session/window/switch_to_window_spec.rb +11 -9
- data/lib/capybara/spec/session/window/window_opened_by_spec.rb +4 -4
- data/lib/capybara/spec/session/window/within_window_spec.rb +27 -2
- data/lib/capybara/spec/spec_helper.rb +28 -4
- data/lib/capybara/spec/test_app.rb +3 -1
- data/lib/capybara/spec/views/form.erb +27 -1
- data/lib/capybara/spec/views/initial_alert.erb +10 -0
- data/lib/capybara/spec/views/with_fixed_header_footer.erb +17 -0
- data/lib/capybara/spec/views/with_hover.erb +5 -0
- data/lib/capybara/spec/views/with_html.erb +33 -2
- data/lib/capybara/spec/views/with_js.erb +12 -0
- data/lib/capybara/spec/views/with_windows.erb +4 -0
- data/lib/capybara/version.rb +1 -1
- data/lib/capybara/window.rb +1 -1
- data/lib/capybara.rb +102 -124
- data/spec/capybara_spec.rb +43 -21
- data/spec/dsl_spec.rb +1 -0
- data/spec/filter_set_spec.rb +28 -0
- data/spec/minitest_spec.rb +9 -1
- data/spec/minitest_spec_spec.rb +19 -5
- data/spec/per_session_config_spec.rb +67 -0
- data/spec/result_spec.rb +20 -0
- data/spec/rspec/shared_spec_matchers.rb +148 -44
- data/spec/rspec/views_spec.rb +4 -0
- data/spec/rspec_matchers_spec.rb +46 -0
- data/spec/rspec_spec.rb +77 -0
- data/spec/selector_spec.rb +2 -1
- data/spec/selenium_spec_chrome.rb +25 -17
- data/spec/selenium_spec_firefox.rb +2 -1
- data/spec/selenium_spec_marionette.rb +18 -5
- data/spec/session_spec.rb +44 -0
- data/spec/shared_selenium_session.rb +72 -8
- data/spec/spec_helper.rb +4 -0
- metadata +55 -8
@@ -11,6 +11,13 @@ Capybara::SpecHelper.spec '#accept_prompt', requires: [:modals] do
|
|
11
11
|
expect(@session).to have_xpath("//a[@id='open-prompt' and @response='']")
|
12
12
|
end
|
13
13
|
|
14
|
+
it "should accept the prompt with no message when there is a default" do
|
15
|
+
@session.accept_prompt do
|
16
|
+
@session.click_link('Open defaulted prompt')
|
17
|
+
end
|
18
|
+
expect(@session).to have_xpath("//a[@id='open-prompt-with-default' and @response='Default value!']")
|
19
|
+
end
|
20
|
+
|
14
21
|
it "should return the message presented" do
|
15
22
|
message = @session.accept_prompt do
|
16
23
|
@session.click_link('Open prompt')
|
@@ -25,6 +32,28 @@ Capybara::SpecHelper.spec '#accept_prompt', requires: [:modals] do
|
|
25
32
|
expect(@session).to have_xpath("//a[@id='open-prompt' and @response='the response']")
|
26
33
|
end
|
27
34
|
|
35
|
+
it "should accept the prompt with a response when there is a default" do
|
36
|
+
@session.accept_prompt with: 'the response' do
|
37
|
+
@session.click_link('Open defaulted prompt')
|
38
|
+
end
|
39
|
+
expect(@session).to have_xpath("//a[@id='open-prompt-with-default' and @response='the response']")
|
40
|
+
end
|
41
|
+
|
42
|
+
it "should accept the prompt with a blank response when there is a default" do
|
43
|
+
pending "Geckodriver doesn't set a blank response currently" if marionette?(@session)
|
44
|
+
@session.accept_prompt with: '' do
|
45
|
+
@session.click_link('Open defaulted prompt')
|
46
|
+
end
|
47
|
+
expect(@session).to have_xpath("//a[@id='open-prompt-with-default' and @response='']")
|
48
|
+
end
|
49
|
+
|
50
|
+
it "should allow special characters in the reponse" do
|
51
|
+
@session.accept_prompt with: '\'the\' \b "response"' do
|
52
|
+
@session.click_link('Open prompt')
|
53
|
+
end
|
54
|
+
expect(@session).to have_xpath(%{//a[@id='open-prompt' and @response=concat("'the' ", '\\b "response"')]})
|
55
|
+
end
|
56
|
+
|
28
57
|
it "should accept the prompt if the message matches" do
|
29
58
|
@session.accept_prompt 'Prompt opened', with: 'matched' do
|
30
59
|
@session.click_link('Open prompt')
|
@@ -40,7 +69,6 @@ Capybara::SpecHelper.spec '#accept_prompt', requires: [:modals] do
|
|
40
69
|
end.to raise_error(Capybara::ModalNotFound)
|
41
70
|
end
|
42
71
|
|
43
|
-
|
44
72
|
it "should return the message presented" do
|
45
73
|
message = @session.accept_prompt with: 'the response' do
|
46
74
|
@session.click_link('Open prompt')
|
@@ -16,7 +16,8 @@ Capybara::SpecHelper.spec "#all" do
|
|
16
16
|
|
17
17
|
it "should accept an XPath instance" do
|
18
18
|
@session.visit('/form')
|
19
|
-
@xpath =
|
19
|
+
@xpath = Capybara::Selector.all[:fillable_field].call('Name')
|
20
|
+
expect(@xpath).to be_a(::XPath::Union)
|
20
21
|
@result = @session.all(@xpath).map { |r| r.value }
|
21
22
|
expect(@result).to include('Smith', 'John', 'John Smith')
|
22
23
|
end
|
@@ -66,6 +67,17 @@ Capybara::SpecHelper.spec "#all" do
|
|
66
67
|
Capybara.ignore_hidden_elements = false
|
67
68
|
expect(@session.all(:css, "a.simple").size).to eq(2)
|
68
69
|
end
|
70
|
+
|
71
|
+
context "with per session config", requires: [:psc] do
|
72
|
+
it "should use the sessions ignore_hidden_elements", psc: true do
|
73
|
+
Capybara.ignore_hidden_elements = true
|
74
|
+
@session.config.ignore_hidden_elements = false
|
75
|
+
expect(Capybara.ignore_hidden_elements).to eq(true)
|
76
|
+
expect(@session.all(:css, "a.simple").size).to eq(2)
|
77
|
+
@session.config.ignore_hidden_elements = true
|
78
|
+
expect(@session.all(:css, "a.simple").size).to eq(1)
|
79
|
+
end
|
80
|
+
end
|
69
81
|
end
|
70
82
|
|
71
83
|
context 'with element count filters' do
|
@@ -0,0 +1,85 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
Capybara::SpecHelper.spec '#ancestor' 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 ancestor element using the given locator" do
|
12
|
+
el = @session.find(:css, '#first_image')
|
13
|
+
expect(el.ancestor('//p')).to have_text('Lorem ipsum dolor')
|
14
|
+
expect(el.ancestor("//a")[:'aria-label']).to eq('Go to simple')
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should find the ancestor element using the given locator and options" do
|
18
|
+
el = @session.find(:css, '#child')
|
19
|
+
expect(el.ancestor('//div', text: 'Ancestor Ancestor Ancestor')[:id]).to eq('ancestor3')
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should raise an error if there are multiple matches" do
|
23
|
+
el = @session.find(:css, '#child')
|
24
|
+
expect { el.ancestor('//div') }.to raise_error(Capybara::Ambiguous)
|
25
|
+
expect { el.ancestor('//div', text: 'Ancestor') }.to raise_error(Capybara::Ambiguous)
|
26
|
+
end
|
27
|
+
|
28
|
+
context "with css selectors" do
|
29
|
+
it "should find the first element using the given locator" do
|
30
|
+
el = @session.find(:css, '#first_image')
|
31
|
+
expect(el.ancestor(:css, 'p')).to have_text('Lorem ipsum dolor')
|
32
|
+
expect(el.ancestor(:css, 'a')[:'aria-label']).to eq('Go to simple')
|
33
|
+
end
|
34
|
+
|
35
|
+
it "should support pseudo selectors" do
|
36
|
+
el = @session.find(:css, '#button_img')
|
37
|
+
expect(el.ancestor(:css, 'button:disabled')[:id]).to eq('ancestor_button')
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
context "with xpath selectors" do
|
42
|
+
it "should find the first element using the given locator" do
|
43
|
+
el = @session.find(:css, '#first_image')
|
44
|
+
expect(el.ancestor(:xpath, '//p')).to have_text('Lorem ipsum dolor')
|
45
|
+
expect(el.ancestor(:xpath, "//a")[:'aria-label']).to eq('Go to simple')
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
context "with custom selector" do
|
50
|
+
it "should use the custom selector" do
|
51
|
+
Capybara.add_selector(:level) do
|
52
|
+
xpath { |num| ".//*[@id='ancestor#{num}']" }
|
53
|
+
end
|
54
|
+
el = @session.find(:css, '#child')
|
55
|
+
expect(el.ancestor(:level, 1).text).to eq('Ancestor Child')
|
56
|
+
expect(el.ancestor(:level, 3).text).to eq('Ancestor Ancestor Ancestor Child')
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
|
61
|
+
it "should raise ElementNotFound with a useful default message if nothing was found" do
|
62
|
+
el = @session.find(:css, '#child')
|
63
|
+
expect do
|
64
|
+
el.ancestor(:xpath, '//div[@id="nosuchthing"]')
|
65
|
+
end.to raise_error(Capybara::ElementNotFound, "Unable to find xpath \"//div[@id=\\\"nosuchthing\\\"]\" that is an ancestor of visible css \"#child\"")
|
66
|
+
end
|
67
|
+
|
68
|
+
|
69
|
+
|
70
|
+
context "within a scope" do
|
71
|
+
it "should limit the ancestors to inside the scope" do
|
72
|
+
@session.within(:css, '#ancestor2') do
|
73
|
+
el = @session.find(:css, '#child')
|
74
|
+
expect(el.ancestor(:css,'div', text: 'Ancestor')[:id]).to eq('ancestor1')
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
it "should raise if selector type is unknown" do
|
80
|
+
el = @session.find(:css, '#child')
|
81
|
+
expect do
|
82
|
+
el.ancestor(:unknown, '//h1')
|
83
|
+
end.to raise_error(ArgumentError)
|
84
|
+
end
|
85
|
+
end
|
@@ -18,10 +18,18 @@ Capybara::SpecHelper.spec '#assert_all_of_selectors' do
|
|
18
18
|
@session.assert_all_of_selectors("p a#foo", "h2#h2two", "h2#h2one" )
|
19
19
|
end
|
20
20
|
|
21
|
-
|
22
|
-
|
23
|
-
@session.
|
24
|
-
|
21
|
+
context "should respect scopes" do
|
22
|
+
it "when used with `within`" do
|
23
|
+
@session.within "//p[@id='first']" do
|
24
|
+
@session.assert_all_of_selectors(".//a[@id='foo']")
|
25
|
+
expect { @session.assert_all_of_selectors(".//a[@id='red']") }.to raise_error(Capybara::ElementNotFound)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
it "when called on elements" do
|
30
|
+
el = @session.find "//p[@id='first']"
|
31
|
+
el.assert_all_of_selectors(".//a[@id='foo']")
|
32
|
+
expect { el.assert_all_of_selectors(".//a[@id='red']") }.to raise_error(Capybara::ElementNotFound)
|
25
33
|
end
|
26
34
|
end
|
27
35
|
|
@@ -65,10 +73,18 @@ Capybara::SpecHelper.spec '#assert_none_of_selectors' do
|
|
65
73
|
expect { @session.assert_none_of_selectors("abbr", "p a#foo") }.to raise_error(Capybara::ElementNotFound)
|
66
74
|
end
|
67
75
|
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
76
|
+
context "should respect scopes" do
|
77
|
+
it "when used with `within`" do
|
78
|
+
@session.within "//p[@id='first']" do
|
79
|
+
expect { @session.assert_none_of_selectors(".//a[@id='foo']") }.to raise_error(Capybara::ElementNotFound)
|
80
|
+
@session.assert_none_of_selectors(".//a[@id='red']")
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
it "when called on an element" do
|
85
|
+
el = @session.find "//p[@id='first']"
|
86
|
+
expect { el.assert_none_of_selectors(".//a[@id='foo']") }.to raise_error(Capybara::ElementNotFound)
|
87
|
+
el.assert_none_of_selectors(".//a[@id='red']")
|
72
88
|
end
|
73
89
|
end
|
74
90
|
|
@@ -65,7 +65,7 @@ Capybara::SpecHelper.spec '#assert_selector' do
|
|
65
65
|
Capybara.using_wait_time(0.1) do
|
66
66
|
@session.visit('/with_js')
|
67
67
|
@session.click_link('Click me')
|
68
|
-
@session.assert_selector(:css, "a#has-been-clicked", text: "Has been clicked", wait:
|
68
|
+
@session.assert_selector(:css, "a#has-been-clicked", text: "Has been clicked", wait: 2)
|
69
69
|
end
|
70
70
|
end
|
71
71
|
end
|
@@ -52,6 +52,14 @@ Capybara::SpecHelper.spec '#assert_text' do
|
|
52
52
|
end.to raise_error(Capybara::ExpectationNotMet, /it was found 1 time using a case insensitive search/)
|
53
53
|
end
|
54
54
|
|
55
|
+
it "should raise error with helpful message if requested text is present but invisible and with incorrect case", requires: [:js] do
|
56
|
+
@session.visit('/with_html')
|
57
|
+
el = @session.find(:css, '#uppercase')
|
58
|
+
expect do
|
59
|
+
el.assert_text('text here')
|
60
|
+
end.to raise_error(Capybara::ExpectationNotMet, /it was found 1 time using a case insensitive search and it was found 1 time including non-visible text/)
|
61
|
+
end
|
62
|
+
|
55
63
|
it "should raise the correct error if requested text is missing but contains regex special characters" do
|
56
64
|
@session.visit('/with_html')
|
57
65
|
expect do
|
@@ -4,16 +4,23 @@ Capybara::SpecHelper.spec '#assert_title' do
|
|
4
4
|
@session.visit('/with_js')
|
5
5
|
end
|
6
6
|
|
7
|
-
it "should
|
8
|
-
expect
|
7
|
+
it "should not raise if the page's title contains the given string" do
|
8
|
+
expect do
|
9
|
+
@session.assert_title('js')
|
10
|
+
end.not_to raise_error
|
9
11
|
end
|
10
12
|
|
11
|
-
it "should
|
12
|
-
expect
|
13
|
+
it "should not raise when given an empty string" do
|
14
|
+
expect do
|
15
|
+
@session.assert_title('')
|
16
|
+
end.not_to raise_error
|
13
17
|
end
|
14
18
|
|
15
19
|
it "should allow regexp matches" do
|
16
|
-
expect
|
20
|
+
expect do
|
21
|
+
@session.assert_title(/w[a-z]{3}_js/)
|
22
|
+
end.not_to raise_error
|
23
|
+
|
17
24
|
expect do
|
18
25
|
@session.assert_title(/w[a-z]{10}_js/)
|
19
26
|
end.to raise_error(Capybara::ExpectationNotMet, 'expected "with_js" to match /w[a-z]{10}_js/')
|
@@ -21,7 +28,9 @@ Capybara::SpecHelper.spec '#assert_title' do
|
|
21
28
|
|
22
29
|
it "should wait for title", requires: [:js] do
|
23
30
|
@session.click_link("Change title")
|
24
|
-
expect
|
31
|
+
expect do
|
32
|
+
@session.assert_title("changed title", wait: 3)
|
33
|
+
end.not_to raise_error
|
25
34
|
end
|
26
35
|
|
27
36
|
it "should raise error if the title doesn't contain the given string" do
|
@@ -61,10 +70,14 @@ Capybara::SpecHelper.spec '#assert_no_title' do
|
|
61
70
|
|
62
71
|
it "should wait for title to disappear", requires: [:js] do
|
63
72
|
@session.click_link("Change title")
|
64
|
-
expect
|
73
|
+
expect do
|
74
|
+
@session.assert_no_title('with_js', wait: 3)
|
75
|
+
end.not_to raise_error
|
65
76
|
end
|
66
77
|
|
67
|
-
it "should
|
68
|
-
expect
|
78
|
+
it "should not raise if the title doesn't contain the given string" do
|
79
|
+
expect do
|
80
|
+
@session.assert_no_title('monkey')
|
81
|
+
end.not_to raise_error
|
69
82
|
end
|
70
83
|
end
|
@@ -4,6 +4,7 @@ Capybara::SpecHelper.spec "#attach_file" do
|
|
4
4
|
@test_file_path = File.expand_path('../fixtures/test_file.txt', File.dirname(__FILE__))
|
5
5
|
@another_test_file_path = File.expand_path('../fixtures/another_test_file.txt', File.dirname(__FILE__))
|
6
6
|
@test_jpg_file_path = File.expand_path('../fixtures/capybara.jpg', File.dirname(__FILE__))
|
7
|
+
@no_extension_file_path = File.expand_path('../fixtures/no_extension', File.dirname(__FILE__))
|
7
8
|
@session.visit('/form')
|
8
9
|
end
|
9
10
|
|
@@ -57,6 +58,12 @@ Capybara::SpecHelper.spec "#attach_file" do
|
|
57
58
|
expect(@session).to have_content('image/jpeg')
|
58
59
|
end
|
59
60
|
|
61
|
+
it "should not break when uploading a file without extension" do
|
62
|
+
@session.attach_file "Single Document", @no_extension_file_path
|
63
|
+
@session.click_button 'Upload Single'
|
64
|
+
expect(@session).to have_content(File.read(@no_extension_file_path))
|
65
|
+
end
|
66
|
+
|
60
67
|
it "should not break when using HTML5 multiple file input" do
|
61
68
|
@session.attach_file "Multiple Documents", @test_file_path
|
62
69
|
@session.click_button('Upload Multiple')
|
@@ -81,7 +88,7 @@ Capybara::SpecHelper.spec "#attach_file" do
|
|
81
88
|
|
82
89
|
context "with a locator that doesn't exist" do
|
83
90
|
it "should raise an error" do
|
84
|
-
msg = "Unable to find file field \"does not exist\""
|
91
|
+
msg = "Unable to find visible file field \"does not exist\" that is not disabled"
|
85
92
|
expect do
|
86
93
|
@session.attach_file('does not exist', @test_file_path)
|
87
94
|
end.to raise_error(Capybara::ElementNotFound, msg)
|
@@ -69,7 +69,7 @@ Capybara::SpecHelper.spec "#check" do
|
|
69
69
|
|
70
70
|
context "with a locator that doesn't exist" do
|
71
71
|
it "should raise an error" do
|
72
|
-
msg = "Unable to find checkbox \"does not exist\""
|
72
|
+
msg = "Unable to find visible checkbox \"does not exist\" that is not disabled"
|
73
73
|
expect do
|
74
74
|
@session.check('does not exist')
|
75
75
|
end.to raise_error(Capybara::ElementNotFound, msg)
|
@@ -142,11 +142,11 @@ Capybara::SpecHelper.spec "#check" do
|
|
142
142
|
end
|
143
143
|
|
144
144
|
it "should raise original error when no label available" do
|
145
|
-
expect { @session.check('form_cars_ariel') }.to raise_error(Capybara::ElementNotFound, 'Unable to find checkbox "form_cars_ariel"')
|
145
|
+
expect { @session.check('form_cars_ariel') }.to raise_error(Capybara::ElementNotFound, 'Unable to find visible checkbox "form_cars_ariel" that is not disabled')
|
146
146
|
end
|
147
147
|
|
148
148
|
it "should raise error if not allowed to click label" do
|
149
|
-
expect{@session.check('form_cars_mclaren', allow_label_click: false)}.to raise_error(Capybara::ElementNotFound, 'Unable to find checkbox "form_cars_mclaren"')
|
149
|
+
expect{@session.check('form_cars_mclaren', allow_label_click: false)}.to raise_error(Capybara::ElementNotFound, 'Unable to find visible checkbox "form_cars_mclaren" that is not disabled')
|
150
150
|
end
|
151
151
|
end
|
152
152
|
|
@@ -158,7 +158,7 @@ Capybara::SpecHelper.spec "#check" do
|
|
158
158
|
end
|
159
159
|
|
160
160
|
it "should raise error if checkbox not visible" do
|
161
|
-
expect{@session.check('form_cars_mclaren')}.to raise_error(Capybara::ElementNotFound, 'Unable to find checkbox "form_cars_mclaren"')
|
161
|
+
expect{@session.check('form_cars_mclaren')}.to raise_error(Capybara::ElementNotFound, 'Unable to find visible checkbox "form_cars_mclaren" that is not disabled')
|
162
162
|
end
|
163
163
|
|
164
164
|
context "with allow_label_click == true" do
|
@@ -24,7 +24,7 @@ Capybara::SpecHelper.spec "#choose" do
|
|
24
24
|
|
25
25
|
context "with a locator that doesn't exist" do
|
26
26
|
it "should raise an error" do
|
27
|
-
msg = "Unable to find radio button \"does not exist\""
|
27
|
+
msg = "Unable to find visible radio button \"does not exist\" that is not disabled"
|
28
28
|
expect do
|
29
29
|
@session.choose('does not exist')
|
30
30
|
end.to raise_error(Capybara::ElementNotFound, msg)
|
@@ -82,7 +82,7 @@ Capybara::SpecHelper.spec "#choose" do
|
|
82
82
|
end
|
83
83
|
|
84
84
|
it "should raise error if not allowed to click label" do
|
85
|
-
expect{@session.choose("party_democrat", allow_label_click: false)}.to raise_error(Capybara::ElementNotFound, 'Unable to find radio button "party_democrat"')
|
85
|
+
expect{@session.choose("party_democrat", allow_label_click: false)}.to raise_error(Capybara::ElementNotFound, 'Unable to find visible radio button "party_democrat" that is not disabled')
|
86
86
|
end
|
87
87
|
end
|
88
88
|
end
|
@@ -353,7 +353,7 @@ Capybara::SpecHelper.spec '#click_button' do
|
|
353
353
|
|
354
354
|
context "with a locator that doesn't exist" do
|
355
355
|
it "should raise an error" do
|
356
|
-
msg = "Unable to find button \"does not exist\""
|
356
|
+
msg = "Unable to find visible button \"does not exist\""
|
357
357
|
expect do
|
358
358
|
@session.click_button('does not exist')
|
359
359
|
end.to raise_error(Capybara::ElementNotFound, msg)
|
@@ -54,7 +54,7 @@ Capybara::SpecHelper.spec '#click_link_or_button' do
|
|
54
54
|
context "when `false`" do
|
55
55
|
it "does not click on link which matches approximately" do
|
56
56
|
@session.visit('/with_html')
|
57
|
-
msg = "Unable to find link or button \"abore\""
|
57
|
+
msg = "Unable to find visible link or button \"abore\""
|
58
58
|
expect do
|
59
59
|
@session.click_link_or_button('abore', exact: true)
|
60
60
|
end.to raise_error(Capybara::ElementNotFound, msg)
|
@@ -62,7 +62,7 @@ Capybara::SpecHelper.spec '#click_link_or_button' do
|
|
62
62
|
|
63
63
|
it "does not click on approximately matching button" do
|
64
64
|
@session.visit('/form')
|
65
|
-
msg = "Unable to find link or button \"awe\""
|
65
|
+
msg = "Unable to find visible link or button \"awe\""
|
66
66
|
|
67
67
|
expect do
|
68
68
|
@session.click_link_or_button('awe', exact: true)
|
@@ -74,7 +74,7 @@ Capybara::SpecHelper.spec '#click_link_or_button' do
|
|
74
74
|
context "with a locator that doesn't exist" do
|
75
75
|
it "should raise an error" do
|
76
76
|
@session.visit('/with_html')
|
77
|
-
msg = "Unable to find link or button \"does not exist\""
|
77
|
+
msg = "Unable to find visible link or button \"does not exist\""
|
78
78
|
expect do
|
79
79
|
@session.click_link_or_button('does not exist')
|
80
80
|
end.to raise_error(Capybara::ElementNotFound, msg)
|
@@ -67,7 +67,7 @@ Capybara::SpecHelper.spec '#click_link' do
|
|
67
67
|
|
68
68
|
context "with a locator that doesn't exist" do
|
69
69
|
it "should raise an error" do
|
70
|
-
msg = "Unable to find link \"does not exist\""
|
70
|
+
msg = "Unable to find visible link \"does not exist\""
|
71
71
|
expect do
|
72
72
|
@session.click_link('does not exist')
|
73
73
|
end.to raise_error(Capybara::ElementNotFound, msg)
|
@@ -3,7 +3,7 @@ require "capybara/spec/test_app"
|
|
3
3
|
|
4
4
|
Capybara::SpecHelper.spec '#current_url, #current_path, #current_host' do
|
5
5
|
before :all do
|
6
|
-
@servers = 2.times.map { Capybara::Server.new(TestApp.
|
6
|
+
@servers = 2.times.map { Capybara::Server.new(TestApp.new).boot }
|
7
7
|
# sanity check
|
8
8
|
expect(@servers[0].port).not_to eq(@servers[1].port)
|
9
9
|
expect(@servers.map { |s| s.port }).not_to include 80
|
@@ -98,9 +98,9 @@ Capybara::SpecHelper.spec '#current_url, #current_path, #current_host' do
|
|
98
98
|
end
|
99
99
|
|
100
100
|
it "doesn't raise exception on a nil current_url" do
|
101
|
+
skip "Only makes sense when there is a real driver" unless @session.respond_to?(:driver)
|
102
|
+
allow(@session.driver).to receive(:current_url) { nil }
|
101
103
|
@session.visit("/")
|
102
|
-
allow_any_instance_of(Capybara::Session).to receive(:current_url) { nil }
|
103
|
-
|
104
104
|
expect { @session.current_url }.not_to raise_exception
|
105
105
|
expect { @session.current_path }.not_to raise_exception
|
106
106
|
end
|
@@ -10,14 +10,14 @@ Capybara::SpecHelper.spec '#dismiss_confirm', requires: [:modals] do
|
|
10
10
|
end
|
11
11
|
expect(@session).to have_xpath("//a[@id='open-confirm' and @confirmed='false']")
|
12
12
|
end
|
13
|
-
|
13
|
+
|
14
14
|
it "should dismiss the confirm if the message matches" do
|
15
15
|
@session.dismiss_confirm 'Confirm opened' do
|
16
16
|
@session.click_link('Open confirm')
|
17
17
|
end
|
18
18
|
expect(@session).to have_xpath("//a[@id='open-confirm' and @confirmed='false']")
|
19
19
|
end
|
20
|
-
|
20
|
+
|
21
21
|
it "should not dismiss the confirm if the message doesn't match" do
|
22
22
|
expect do
|
23
23
|
@session.dismiss_confirm 'Incorrect Text' do
|
@@ -25,7 +25,7 @@ Capybara::SpecHelper.spec '#dismiss_confirm', requires: [:modals] do
|
|
25
25
|
end
|
26
26
|
end.to raise_error(Capybara::ModalNotFound)
|
27
27
|
end
|
28
|
-
|
28
|
+
|
29
29
|
|
30
30
|
it "should return the message presented" do
|
31
31
|
message = @session.dismiss_confirm do
|
@@ -10,7 +10,7 @@ Capybara::SpecHelper.spec '#dismiss_prompt', requires: [:modals] do
|
|
10
10
|
end
|
11
11
|
expect(@session).to have_xpath("//a[@id='open-prompt' and @response='dismissed']")
|
12
12
|
end
|
13
|
-
|
13
|
+
|
14
14
|
it "should return the message presented" do
|
15
15
|
message = @session.dismiss_prompt do
|
16
16
|
@session.click_link('Open prompt')
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
Capybara::SpecHelper.spec "#evaluate_async_script", requires: [:js] do
|
3
|
+
it "should evaluate the given script and return whatever it produces" do
|
4
|
+
@session.visit('/with_js')
|
5
|
+
expect(@session.evaluate_async_script("arguments[0](4)")).to eq(4)
|
6
|
+
end
|
7
|
+
|
8
|
+
it "should support passing elements as arguments to the script", requires: [:js, :es_args] do
|
9
|
+
@session.visit('/with_js')
|
10
|
+
el = @session.find(:css, '#drag p')
|
11
|
+
result = @session.evaluate_async_script("arguments[2]([arguments[0].innerText, arguments[1]])", el, "Doodle Funk")
|
12
|
+
expect(result).to eq ["This is a draggable element.", "Doodle Funk"]
|
13
|
+
end
|
14
|
+
|
15
|
+
it "should support returning elements after asynchronous operation", requires: [:js, :es_args] do
|
16
|
+
@session.visit('/with_js')
|
17
|
+
@session.find(:css, '#change') # ensure page has loaded and element is available
|
18
|
+
el = @session.evaluate_async_script("var cb = arguments[0]; setTimeout(function(){ cb(document.getElementById('change')) }, 100)")
|
19
|
+
expect(el).to be_instance_of(Capybara::Node::Element)
|
20
|
+
expect(el).to eq(@session.find(:css, '#change'))
|
21
|
+
end
|
22
|
+
end
|
@@ -20,7 +20,7 @@ Capybara::SpecHelper.spec "#evaluate_script", requires: [:js] do
|
|
20
20
|
|
21
21
|
it "should support returning elements", requires: [:js, :es_args] do
|
22
22
|
@session.visit('/with_js')
|
23
|
-
|
23
|
+
@session.find(:css, '#change') # ensure page has loaded and element is available
|
24
24
|
el = @session.evaluate_script("document.getElementById('change')")
|
25
25
|
expect(el).to be_instance_of(Capybara::Node::Element)
|
26
26
|
expect(el).to eq(@session.find(:css, '#change'))
|
@@ -106,6 +106,12 @@ Capybara::SpecHelper.spec "#fill_in" do
|
|
106
106
|
expect(extract_results(@session)['first_name']).to eq('Thomas')
|
107
107
|
end
|
108
108
|
|
109
|
+
it "should fill in a field based on type" do
|
110
|
+
@session.fill_in(type: 'schmooo', with: 'Schmooo for all')
|
111
|
+
@session.click_button('awesome')
|
112
|
+
expect(extract_results(@session)['schmooo']).to eq('Schmooo for all')
|
113
|
+
end
|
114
|
+
|
109
115
|
it "should throw an exception if a hash containing 'with' is not provided" do
|
110
116
|
expect {@session.fill_in 'Name', 'ignu'}.to raise_error(RuntimeError, /with/)
|
111
117
|
end
|
@@ -150,7 +156,7 @@ Capybara::SpecHelper.spec "#fill_in" do
|
|
150
156
|
before { Capybara.ignore_hidden_elements = true }
|
151
157
|
after { Capybara.ignore_hidden_elements = false }
|
152
158
|
it "should not find a hidden field" do
|
153
|
-
msg = "Unable to find field \"Super Secret\""
|
159
|
+
msg = "Unable to find visible field \"Super Secret\" that is not disabled"
|
154
160
|
expect do
|
155
161
|
@session.fill_in('Super Secret', with: '777')
|
156
162
|
end.to raise_error(Capybara::ElementNotFound, msg)
|
@@ -159,7 +165,7 @@ Capybara::SpecHelper.spec "#fill_in" do
|
|
159
165
|
|
160
166
|
context "with a locator that doesn't exist" do
|
161
167
|
it "should raise an error" do
|
162
|
-
msg = "Unable to find field \"does not exist\""
|
168
|
+
msg = "Unable to find visible field \"does not exist\" that is not disabled"
|
163
169
|
expect do
|
164
170
|
@session.fill_in('does not exist', with: 'Blah blah')
|
165
171
|
end.to raise_error(Capybara::ElementNotFound, msg)
|
@@ -8,6 +8,7 @@ Capybara::SpecHelper.spec '#find_field' do
|
|
8
8
|
expect(@session.find_field('Dog').value).to eq('dog')
|
9
9
|
expect(@session.find_field('form_description').text).to eq('Descriptive text goes here')
|
10
10
|
expect(@session.find_field('Region')[:name]).to eq('form[region]')
|
11
|
+
expect(@session.find_field('With Asterisk*')).to be
|
11
12
|
end
|
12
13
|
|
13
14
|
context "aria_label attribute with Capybara.enable_aria_label" do
|
@@ -54,7 +54,7 @@ Capybara::SpecHelper.spec '#find' do
|
|
54
54
|
it "should find element if it appears before given wait duration" do
|
55
55
|
@session.visit('/with_js')
|
56
56
|
@session.click_link('Click me')
|
57
|
-
expect(@session.find(:css, "a#has-been-clicked", wait: 0
|
57
|
+
expect(@session.find(:css, "a#has-been-clicked", wait: 2.0).text).to include('Has been clicked')
|
58
58
|
end
|
59
59
|
end
|
60
60
|
|
@@ -205,12 +205,13 @@ Capybara::SpecHelper.spec '#find' do
|
|
205
205
|
it "should raise ElementNotFound with a useful default message if nothing was found" do
|
206
206
|
expect do
|
207
207
|
@session.find(:xpath, '//div[@id="nosuchthing"]').to be_nil
|
208
|
-
end.to raise_error(Capybara::ElementNotFound, "Unable to find xpath \"//div[@id=\\\"nosuchthing\\\"]\"")
|
208
|
+
end.to raise_error(Capybara::ElementNotFound, "Unable to find visible xpath \"//div[@id=\\\"nosuchthing\\\"]\"")
|
209
209
|
end
|
210
210
|
|
211
211
|
it "should accept an XPath instance" do
|
212
212
|
@session.visit('/form')
|
213
|
-
@xpath =
|
213
|
+
@xpath = Capybara::Selector.all[:fillable_field].call('First Name')
|
214
|
+
expect(@xpath).to be_a(::XPath::Union)
|
214
215
|
expect(@session.find(@xpath).value).to eq('John')
|
215
216
|
end
|
216
217
|
|
@@ -421,8 +422,9 @@ Capybara::SpecHelper.spec '#find' do
|
|
421
422
|
end
|
422
423
|
end
|
423
424
|
|
424
|
-
it "should
|
425
|
-
|
426
|
-
|
425
|
+
it "should raise if selector type is unknown" do
|
426
|
+
expect do
|
427
|
+
@session.find(:unknown, '//h1')
|
428
|
+
end.to raise_error(ArgumentError)
|
427
429
|
end
|
428
430
|
end
|
@@ -15,7 +15,8 @@ Capybara::SpecHelper.spec '#first' do
|
|
15
15
|
|
16
16
|
it "should accept an XPath instance" do
|
17
17
|
@session.visit('/form')
|
18
|
-
@xpath =
|
18
|
+
@xpath = Capybara::Selector.all[:fillable_field].call('First Name')
|
19
|
+
expect(@xpath).to be_a(::XPath::Union)
|
19
20
|
expect(@session.first(@xpath).value).to eq('John')
|
20
21
|
end
|
21
22
|
|
@@ -110,14 +111,18 @@ Capybara::SpecHelper.spec '#first' do
|
|
110
111
|
|
111
112
|
it "should wait for at least one match if true" do
|
112
113
|
Capybara.wait_on_first_by_default = true
|
113
|
-
|
114
|
-
|
114
|
+
Capybara.using_wait_time(3) do
|
115
|
+
@session.click_link('clickable')
|
116
|
+
expect(@session.first(:css, 'a#has-been-clicked')).not_to be_nil
|
117
|
+
end
|
115
118
|
end
|
116
119
|
|
117
120
|
it "should return nil after waiting if no match" do
|
118
121
|
Capybara.wait_on_first_by_default = true
|
119
|
-
|
120
|
-
|
122
|
+
Capybara.using_wait_time(3) do
|
123
|
+
@session.click_link('clickable')
|
124
|
+
expect(@session.first(:css, 'a#not-a-real-link')).to be_nil
|
125
|
+
end
|
121
126
|
end
|
122
127
|
end
|
123
128
|
end
|