capybara 2.5.0 → 2.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (205) hide show
  1. checksums.yaml +5 -5
  2. data/.yard/templates_custom/default/class/html/selectors.erb +38 -0
  3. data/.yard/templates_custom/default/class/html/setup.rb +17 -0
  4. data/.yard/yard_extensions.rb +78 -0
  5. data/.yardopts +1 -0
  6. data/History.md +413 -10
  7. data/License.txt +1 -1
  8. data/README.md +237 -130
  9. data/lib/capybara/config.rb +132 -0
  10. data/lib/capybara/cucumber.rb +3 -1
  11. data/lib/capybara/driver/base.rb +27 -6
  12. data/lib/capybara/driver/node.rb +14 -5
  13. data/lib/capybara/dsl.rb +2 -3
  14. data/lib/capybara/helpers.rb +13 -65
  15. data/lib/capybara/minitest/spec.rb +177 -0
  16. data/lib/capybara/minitest.rb +278 -0
  17. data/lib/capybara/node/actions.rb +180 -24
  18. data/lib/capybara/node/base.rb +17 -5
  19. data/lib/capybara/node/document.rb +5 -0
  20. data/lib/capybara/node/document_matchers.rb +15 -14
  21. data/lib/capybara/node/element.rb +55 -7
  22. data/lib/capybara/node/finders.rb +179 -67
  23. data/lib/capybara/node/matchers.rb +301 -105
  24. data/lib/capybara/node/simple.rb +15 -4
  25. data/lib/capybara/queries/ancestor_query.rb +25 -0
  26. data/lib/capybara/queries/base_query.rb +69 -3
  27. data/lib/capybara/queries/current_path_query.rb +17 -8
  28. data/lib/capybara/queries/match_query.rb +19 -0
  29. data/lib/capybara/queries/selector_query.rb +251 -0
  30. data/lib/capybara/queries/sibling_query.rb +25 -0
  31. data/lib/capybara/queries/text_query.rb +67 -16
  32. data/lib/capybara/queries/title_query.rb +4 -2
  33. data/lib/capybara/query.rb +3 -131
  34. data/lib/capybara/rack_test/browser.rb +14 -5
  35. data/lib/capybara/rack_test/css_handlers.rb +1 -0
  36. data/lib/capybara/rack_test/driver.rb +15 -8
  37. data/lib/capybara/rack_test/form.rb +34 -12
  38. data/lib/capybara/rack_test/node.rb +29 -12
  39. data/lib/capybara/rails.rb +3 -3
  40. data/lib/capybara/result.rb +104 -9
  41. data/lib/capybara/rspec/compound.rb +95 -0
  42. data/lib/capybara/rspec/features.rb +17 -6
  43. data/lib/capybara/rspec/matcher_proxies.rb +45 -0
  44. data/lib/capybara/rspec/matchers.rb +199 -80
  45. data/lib/capybara/rspec.rb +4 -2
  46. data/lib/capybara/selector/css.rb +30 -0
  47. data/lib/capybara/selector/filter.rb +20 -0
  48. data/lib/capybara/selector/filter_set.rb +74 -0
  49. data/lib/capybara/selector/filters/base.rb +33 -0
  50. data/lib/capybara/selector/filters/expression_filter.rb +40 -0
  51. data/lib/capybara/selector/filters/node_filter.rb +27 -0
  52. data/lib/capybara/selector/selector.rb +276 -0
  53. data/lib/capybara/selector.rb +452 -157
  54. data/lib/capybara/selenium/driver.rb +282 -81
  55. data/lib/capybara/selenium/node.rb +144 -46
  56. data/lib/capybara/server.rb +59 -16
  57. data/lib/capybara/session/config.rb +114 -0
  58. data/lib/capybara/session/matchers.rb +29 -19
  59. data/lib/capybara/session.rb +378 -143
  60. data/lib/capybara/spec/fixtures/no_extension +1 -0
  61. data/lib/capybara/spec/public/jquery-ui.js +13 -791
  62. data/lib/capybara/spec/public/jquery.js +4 -9045
  63. data/lib/capybara/spec/public/test.js +45 -11
  64. data/lib/capybara/spec/session/accept_alert_spec.rb +30 -7
  65. data/lib/capybara/spec/session/accept_confirm_spec.rb +14 -2
  66. data/lib/capybara/spec/session/accept_prompt_spec.rb +35 -6
  67. data/lib/capybara/spec/session/all_spec.rb +45 -32
  68. data/lib/capybara/spec/session/ancestor_spec.rb +85 -0
  69. data/lib/capybara/spec/session/assert_all_of_selectors_spec.rb +110 -0
  70. data/lib/capybara/spec/session/assert_current_path.rb +15 -2
  71. data/lib/capybara/spec/session/assert_selector.rb +29 -28
  72. data/lib/capybara/spec/session/assert_text.rb +59 -20
  73. data/lib/capybara/spec/session/assert_title.rb +25 -11
  74. data/lib/capybara/spec/session/attach_file_spec.rb +42 -4
  75. data/lib/capybara/spec/session/body_spec.rb +1 -0
  76. data/lib/capybara/spec/session/check_spec.rb +90 -14
  77. data/lib/capybara/spec/session/choose_spec.rb +31 -5
  78. data/lib/capybara/spec/session/click_button_spec.rb +20 -9
  79. data/lib/capybara/spec/session/click_link_or_button_spec.rb +15 -9
  80. data/lib/capybara/spec/session/click_link_spec.rb +39 -15
  81. data/lib/capybara/spec/session/current_scope_spec.rb +2 -1
  82. data/lib/capybara/spec/session/current_url_spec.rb +12 -3
  83. data/lib/capybara/spec/session/dismiss_confirm_spec.rb +6 -5
  84. data/lib/capybara/spec/session/dismiss_prompt_spec.rb +4 -3
  85. data/lib/capybara/spec/session/element/assert_match_selector.rb +36 -0
  86. data/lib/capybara/spec/session/element/match_css_spec.rb +23 -0
  87. data/lib/capybara/spec/session/element/match_xpath_spec.rb +23 -0
  88. data/lib/capybara/spec/session/element/matches_selector_spec.rb +106 -0
  89. data/lib/capybara/spec/session/evaluate_async_script_spec.rb +22 -0
  90. data/lib/capybara/spec/session/evaluate_script_spec.rb +23 -1
  91. data/lib/capybara/spec/session/execute_script_spec.rb +22 -3
  92. data/lib/capybara/spec/session/fill_in_spec.rb +50 -32
  93. data/lib/capybara/spec/session/find_button_spec.rb +43 -2
  94. data/lib/capybara/spec/session/find_by_id_spec.rb +3 -2
  95. data/lib/capybara/spec/session/find_field_spec.rb +42 -6
  96. data/lib/capybara/spec/session/find_link_spec.rb +22 -3
  97. data/lib/capybara/spec/session/find_spec.rb +103 -57
  98. data/lib/capybara/spec/session/first_spec.rb +34 -18
  99. data/lib/capybara/spec/session/frame/switch_to_frame_spec.rb +103 -0
  100. data/lib/capybara/spec/session/{within_frame_spec.rb → frame/within_frame_spec.rb} +44 -2
  101. data/lib/capybara/spec/session/go_back_spec.rb +2 -1
  102. data/lib/capybara/spec/session/go_forward_spec.rb +2 -1
  103. data/lib/capybara/spec/session/has_all_selectors_spec.rb +69 -0
  104. data/lib/capybara/spec/session/has_button_spec.rb +17 -8
  105. data/lib/capybara/spec/session/has_css_spec.rb +85 -73
  106. data/lib/capybara/spec/session/has_current_path_spec.rb +91 -7
  107. data/lib/capybara/spec/session/has_field_spec.rb +93 -58
  108. data/lib/capybara/spec/session/has_link_spec.rb +9 -8
  109. data/lib/capybara/spec/session/has_none_selectors_spec.rb +76 -0
  110. data/lib/capybara/spec/session/has_select_spec.rb +159 -59
  111. data/lib/capybara/spec/session/has_selector_spec.rb +64 -28
  112. data/lib/capybara/spec/session/has_table_spec.rb +1 -0
  113. data/lib/capybara/spec/session/has_text_spec.rb +27 -12
  114. data/lib/capybara/spec/session/has_title_spec.rb +22 -4
  115. data/lib/capybara/spec/session/has_xpath_spec.rb +32 -29
  116. data/lib/capybara/spec/session/headers.rb +2 -1
  117. data/lib/capybara/spec/session/html_spec.rb +4 -3
  118. data/lib/capybara/spec/session/node_spec.rb +198 -38
  119. data/lib/capybara/spec/session/refresh_spec.rb +28 -0
  120. data/lib/capybara/spec/session/reset_session_spec.rb +46 -5
  121. data/lib/capybara/spec/session/response_code.rb +2 -1
  122. data/lib/capybara/spec/session/save_and_open_page_spec.rb +1 -0
  123. data/lib/capybara/spec/session/save_and_open_screenshot_spec.rb +6 -5
  124. data/lib/capybara/spec/session/save_page_spec.rb +34 -2
  125. data/lib/capybara/spec/session/save_screenshot_spec.rb +31 -1
  126. data/lib/capybara/spec/session/screenshot_spec.rb +4 -2
  127. data/lib/capybara/spec/session/select_spec.rb +34 -32
  128. data/lib/capybara/spec/session/selectors_spec.rb +65 -0
  129. data/lib/capybara/spec/session/sibling_spec.rb +52 -0
  130. data/lib/capybara/spec/session/text_spec.rb +4 -4
  131. data/lib/capybara/spec/session/title_spec.rb +2 -1
  132. data/lib/capybara/spec/session/uncheck_spec.rb +42 -2
  133. data/lib/capybara/spec/session/unselect_spec.rb +17 -16
  134. data/lib/capybara/spec/session/visit_spec.rb +77 -2
  135. data/lib/capybara/spec/session/window/become_closed_spec.rb +12 -11
  136. data/lib/capybara/spec/session/window/current_window_spec.rb +1 -0
  137. data/lib/capybara/spec/session/window/open_new_window_spec.rb +1 -0
  138. data/lib/capybara/spec/session/window/switch_to_window_spec.rb +16 -11
  139. data/lib/capybara/spec/session/window/window_opened_by_spec.rb +7 -4
  140. data/lib/capybara/spec/session/window/window_spec.rb +36 -29
  141. data/lib/capybara/spec/session/window/windows_spec.rb +1 -0
  142. data/lib/capybara/spec/session/window/within_window_spec.rb +31 -7
  143. data/lib/capybara/spec/session/within_spec.rb +14 -6
  144. data/lib/capybara/spec/spec_helper.rb +37 -4
  145. data/lib/capybara/spec/test_app.rb +15 -3
  146. data/lib/capybara/spec/views/buttons.erb +1 -0
  147. data/lib/capybara/spec/views/fieldsets.erb +2 -1
  148. data/lib/capybara/spec/views/form.erb +169 -9
  149. data/lib/capybara/spec/views/frame_child.erb +10 -2
  150. data/lib/capybara/spec/views/frame_one.erb +2 -1
  151. data/lib/capybara/spec/views/frame_parent.erb +3 -2
  152. data/lib/capybara/spec/views/frame_two.erb +2 -1
  153. data/lib/capybara/spec/views/header_links.erb +1 -0
  154. data/lib/capybara/spec/views/host_links.erb +1 -0
  155. data/lib/capybara/spec/views/initial_alert.erb +10 -0
  156. data/lib/capybara/spec/views/path.erb +1 -0
  157. data/lib/capybara/spec/views/popup_one.erb +1 -0
  158. data/lib/capybara/spec/views/popup_two.erb +1 -0
  159. data/lib/capybara/spec/views/postback.erb +2 -1
  160. data/lib/capybara/spec/views/tables.erb +1 -0
  161. data/lib/capybara/spec/views/with_base_tag.erb +1 -0
  162. data/lib/capybara/spec/views/with_count.erb +2 -1
  163. data/lib/capybara/spec/views/with_fixed_header_footer.erb +17 -0
  164. data/lib/capybara/spec/views/with_hover.erb +7 -1
  165. data/lib/capybara/spec/views/with_html.erb +40 -2
  166. data/lib/capybara/spec/views/with_html_entities.erb +1 -0
  167. data/lib/capybara/spec/views/with_js.erb +32 -1
  168. data/lib/capybara/spec/views/with_scope.erb +1 -0
  169. data/lib/capybara/spec/views/with_simple_html.erb +2 -1
  170. data/lib/capybara/spec/views/with_slow_unload.erb +17 -0
  171. data/lib/capybara/spec/views/with_title.erb +2 -1
  172. data/lib/capybara/spec/views/with_unload_alert.erb +14 -0
  173. data/lib/capybara/spec/views/with_windows.erb +7 -0
  174. data/lib/capybara/spec/views/within_frames.erb +3 -2
  175. data/lib/capybara/version.rb +2 -1
  176. data/lib/capybara/window.rb +20 -3
  177. data/lib/capybara.rb +189 -93
  178. data/spec/basic_node_spec.rb +7 -6
  179. data/spec/capybara_spec.rb +90 -4
  180. data/spec/dsl_spec.rb +3 -1
  181. data/spec/filter_set_spec.rb +28 -0
  182. data/spec/fixtures/capybara.csv +1 -0
  183. data/spec/fixtures/selenium_driver_rspec_failure.rb +5 -1
  184. data/spec/fixtures/selenium_driver_rspec_success.rb +5 -1
  185. data/spec/minitest_spec.rb +130 -0
  186. data/spec/minitest_spec_spec.rb +135 -0
  187. data/spec/per_session_config_spec.rb +67 -0
  188. data/spec/rack_test_spec.rb +50 -7
  189. data/spec/result_spec.rb +76 -0
  190. data/spec/rspec/features_spec.rb +21 -8
  191. data/spec/rspec/scenarios_spec.rb +21 -0
  192. data/spec/rspec/{matchers_spec.rb → shared_spec_matchers.rb} +160 -54
  193. data/spec/rspec/views_spec.rb +5 -0
  194. data/spec/rspec_matchers_spec.rb +46 -0
  195. data/spec/rspec_spec.rb +79 -1
  196. data/spec/selector_spec.rb +199 -0
  197. data/spec/selenium_spec_chrome.rb +54 -9
  198. data/spec/selenium_spec_firefox.rb +68 -0
  199. data/spec/selenium_spec_marionette.rb +127 -0
  200. data/spec/server_spec.rb +102 -14
  201. data/spec/session_spec.rb +54 -0
  202. data/spec/shared_selenium_session.rb +215 -0
  203. data/spec/spec_helper.rb +7 -0
  204. metadata +140 -15
  205. data/spec/selenium_spec.rb +0 -128
@@ -1,8 +1,12 @@
1
+ # frozen_string_literal: true
1
2
  require 'spec_helper'
3
+ require 'selenium-webdriver'
2
4
 
3
5
  RSpec.describe Capybara::Selenium::Driver do
4
6
  it "should exit with a non-zero exit status" do
5
- browser = Capybara::Selenium::Driver.new(TestApp).browser
7
+ options = { browser: (ENV['SELENIUM_BROWSER'] || :firefox).to_sym }
8
+ options[:desired_capabilities] = Selenium::WebDriver::Remote::Capabilities.firefox(marionette: false) if ENV['LEGACY_FIREFOX']
9
+ browser = Capybara::Selenium::Driver.new(TestApp, options).browser
6
10
  expect(true).to eq(false)
7
11
  end
8
12
  end
@@ -1,8 +1,12 @@
1
+ # frozen_string_literal: true
1
2
  require 'spec_helper'
3
+ require 'selenium-webdriver'
2
4
 
3
5
  RSpec.describe Capybara::Selenium::Driver do
4
6
  it "should exit with a zero exit status" do
5
- browser = Capybara::Selenium::Driver.new(TestApp).browser
7
+ options = { browser: (ENV['SELENIUM_BROWSER'] || :firefox).to_sym }
8
+ options[:desired_capabilities] = Selenium::WebDriver::Remote::Capabilities.firefox(marionette: false) if ENV['LEGACY_FIREFOX']
9
+ browser = Capybara::Selenium::Driver.new(TestApp, options ).browser
6
10
  expect(true).to eq(true)
7
11
  end
8
12
  end
@@ -0,0 +1,130 @@
1
+ # frozen_string_literal: true
2
+ require 'spec_helper'
3
+ require 'capybara/minitest'
4
+
5
+ class MinitestTest < Minitest::Test
6
+ include Capybara::DSL
7
+ include Capybara::Minitest::Assertions
8
+
9
+ def setup
10
+ visit('/form')
11
+ end
12
+
13
+ def teardown
14
+ Capybara.reset_sessions!
15
+ end
16
+
17
+ def test_assert_text
18
+ assert_text('Form')
19
+ assert_no_text('Not on the page')
20
+ refute_text('Also Not on the page')
21
+ end
22
+
23
+ def test_assert_title
24
+ visit('/with_title')
25
+ assert_title('Test Title')
26
+ assert_no_title('Not the title')
27
+ refute_title('Not the title')
28
+ end
29
+
30
+ def test_assert_current_path
31
+ assert_current_path('/form')
32
+ assert_no_current_path('/not_form')
33
+ refute_current_path('/not_form')
34
+ end
35
+
36
+ def test_assert_xpath
37
+ assert_xpath('.//select[@id="form_title"]')
38
+ assert_xpath('.//select', count: 1) { |el| el[:id] == "form_title" }
39
+ assert_no_xpath('.//select[@id="not_form_title"]')
40
+ assert_no_xpath('.//select') { |el| el[:id] == "not_form_title"}
41
+ refute_xpath('.//select[@id="not_form_title"]')
42
+ end
43
+
44
+ def test_assert_css
45
+ assert_css('select#form_title')
46
+ assert_no_css('select#not_form_title')
47
+ end
48
+
49
+ def test_assert_link
50
+ visit('/with_html')
51
+ assert_link('A link')
52
+ assert_link(count: 1){ |el| el.text == 'A link'}
53
+ assert_no_link('Not on page')
54
+ end
55
+
56
+ def test_assert_button
57
+ assert_button('fresh_btn')
58
+ assert_button(count: 1){ |el| el[:id] == 'fresh_btn' }
59
+ assert_no_button('not_btn')
60
+ end
61
+
62
+ def test_assert_field
63
+ assert_field('customer_email')
64
+ assert_no_field('not_on_the_form')
65
+ end
66
+
67
+ def test_assert_select
68
+ assert_select('form_title')
69
+ assert_no_select('not_form_title')
70
+ end
71
+
72
+ def test_assert_checked_field
73
+ assert_checked_field('form_pets_dog')
74
+ assert_no_checked_field('form_pets_cat')
75
+ refute_checked_field('form_pets_snake')
76
+ end
77
+
78
+ def test_assert_unchecked_field
79
+ assert_unchecked_field('form_pets_cat')
80
+ assert_no_unchecked_field('form_pets_dog')
81
+ refute_unchecked_field('form_pets_snake')
82
+ end
83
+
84
+ def test_assert_table
85
+ visit('/tables')
86
+ assert_table('agent_table')
87
+ assert_no_table('not_on_form')
88
+ refute_table('not_on_form')
89
+ end
90
+
91
+ def test_assert_all_of_selectors
92
+ assert_all_of_selectors(:css, 'select#form_other_title', 'input#form_last_name')
93
+ end
94
+
95
+ def test_assert_none_of_selectors
96
+ assert_none_of_selectors(:css, 'input#not_on_page', 'input#also_not_on_page')
97
+ end
98
+
99
+ def test_assert_matches_selector
100
+ assert_matches_selector(find(:field, 'customer_email'), :field, 'customer_email')
101
+ assert_not_matches_selector(find(:select, 'form_title'), :field, 'customer_email')
102
+ refute_matches_selector(find(:select, 'form_title'), :field, 'customer_email')
103
+ end
104
+
105
+ def test_assert_matches_css
106
+ assert_matches_css(find(:select, 'form_title'), 'select#form_title')
107
+ refute_matches_css(find(:select, 'form_title'), 'select#form_other_title')
108
+ end
109
+
110
+ def test_assert_matches_xpath
111
+ assert_matches_xpath(find(:select, 'form_title'), './/select[@id="form_title"]')
112
+ refute_matches_xpath(find(:select, 'form_title'), './/select[@id="form_other_title"]')
113
+ end
114
+ end
115
+
116
+ RSpec.describe 'capybara/minitest' do
117
+ before do
118
+ Capybara.current_driver = :rack_test
119
+ Capybara.app = TestApp
120
+ end
121
+
122
+ it "should support minitest" do
123
+ output = StringIO.new
124
+ reporter = Minitest::SummaryReporter.new(output)
125
+ reporter.start
126
+ MinitestTest.run reporter, {}
127
+ reporter.report
128
+ expect(output.string).to include("17 runs, 44 assertions, 0 failures, 0 errors, 0 skips")
129
+ end
130
+ end
@@ -0,0 +1,135 @@
1
+ # frozen_string_literal: true
2
+ require 'spec_helper'
3
+ require 'capybara/minitest'
4
+ require 'capybara/minitest/spec'
5
+
6
+ class MinitestSpecTest < Minitest::Spec
7
+ include ::Capybara::DSL
8
+ include ::Capybara::Minitest::Assertions
9
+
10
+ before do
11
+ visit('/form')
12
+ end
13
+ after do
14
+ Capybara.reset_sessions!
15
+ end
16
+
17
+ it "supports text expectations" do
18
+ page.must_have_text('Form', minimum: 1)
19
+ page.wont_have_text('Not a form')
20
+ form = find(:css, 'form', text: 'Title')
21
+ form.must_have_text('Customer Email')
22
+ form.wont_have_text('Some other email')
23
+ end
24
+
25
+ it "supports current_path expectations" do
26
+ page.must_have_current_path('/form')
27
+ page.wont_have_current_path('/form2')
28
+ end
29
+
30
+ it "supports title expectations" do
31
+ visit('/with_title')
32
+ page.must_have_title('Test Title')
33
+ page.wont_have_title('Not the title')
34
+ end
35
+
36
+ it "supports xpath expectations" do
37
+ page.must_have_xpath('.//input[@id="customer_email"]')
38
+ page.wont_have_xpath('.//select[@id="not_form_title"]')
39
+ page.wont_have_xpath('.//input[@id="customer_email"]') { |el| el[:id] == "not_customer_email" }
40
+ select = find(:select, 'form_title')
41
+ select.must_have_xpath('.//option[@class="title"]')
42
+ select.must_have_xpath('.//option', count: 1) { |option| option[:class] != 'title' && !option.disabled?}
43
+ select.wont_have_xpath('.//input[@id="customer_email"]')
44
+ end
45
+
46
+ it "support css expectations" do
47
+ page.must_have_css('input#customer_email')
48
+ page.wont_have_css('select#not_form_title')
49
+ el = find(:select, 'form_title')
50
+ el.must_have_css('option.title')
51
+ el.wont_have_css('input#customer_email')
52
+ end
53
+
54
+ it "supports link expectations" do
55
+ visit('/with_html')
56
+ page.must_have_link('A link')
57
+ page.wont_have_link('Not on page')
58
+ end
59
+
60
+ it "supports button expectations" do
61
+ page.must_have_button('fresh_btn')
62
+ page.wont_have_button('not_btn')
63
+ end
64
+
65
+ it "supports field expectations" do
66
+ page.must_have_field('customer_email')
67
+ page.wont_have_field('not_on_the_form')
68
+ end
69
+
70
+ it "supports select expectations" do
71
+ page.must_have_select('form_title')
72
+ page.wont_have_select('not_form_title')
73
+ end
74
+
75
+ it "supports checked_field expectations" do
76
+ page.must_have_checked_field('form_pets_dog')
77
+ page.wont_have_checked_field('form_pets_cat')
78
+ end
79
+
80
+ it "supports unchecked_field expectations" do
81
+ page.must_have_unchecked_field('form_pets_cat')
82
+ page.wont_have_unchecked_field('form_pets_dog')
83
+ end
84
+
85
+ it "supports table expectations" do
86
+ visit('/tables')
87
+ page.must_have_table('agent_table')
88
+ page.wont_have_table('not_on_form')
89
+ end
90
+
91
+ it "supports all_of_selectors expectations" do
92
+ page.must_have_all_of_selectors(:css, 'select#form_other_title', 'input#form_last_name')
93
+ end
94
+
95
+ it "supports none_of_selectors expectations" do
96
+ page.must_have_none_of_selectors(:css, 'input#not_on_page', 'input#also_not_on_page')
97
+ end
98
+
99
+ it "supports match_selector expectations" do
100
+ find(:field, 'customer_email').must_match_selector(:field, 'customer_email')
101
+ find(:select, 'form_title').wont_match_selector(:field, 'customer_email')
102
+ end
103
+
104
+ it "supports match_css expectations" do
105
+ find(:select, 'form_title').must_match_css('select#form_title')
106
+ find(:select, 'form_title').wont_match_css('select#form_other_title')
107
+ end
108
+
109
+ it "supports match_xpath expectations" do
110
+ find(:select, 'form_title').must_match_xpath('.//select[@id="form_title"]')
111
+ find(:select, 'form_title').wont_match_xpath('.//select[@id="not_on_page"]')
112
+ end
113
+
114
+ it "handles failures" do
115
+ page.must_have_select('non_existing_form_title')
116
+ end
117
+ end
118
+
119
+ RSpec.describe 'capybara/minitest/spec' do
120
+ before do
121
+ Capybara.current_driver = :rack_test
122
+ Capybara.app = TestApp
123
+ end
124
+
125
+ it "should support minitest spec" do
126
+ output = StringIO.new
127
+ reporter = Minitest::SummaryReporter.new(output)
128
+ reporter.start
129
+ MinitestSpecTest.run reporter, {}
130
+ reporter.report
131
+ expect(output.string).to include("18 runs, 41 assertions, 1 failures, 0 errors, 0 skips")
132
+ #Make sure error messages are displayed
133
+ expect(output.string).to include('expected to find visible select box "non_existing_form_title" that is not disabled but there were no matches')
134
+ end
135
+ end
@@ -0,0 +1,67 @@
1
+ # frozen_string_literal: true
2
+ require 'spec_helper'
3
+ require 'capybara/dsl'
4
+
5
+ RSpec.describe Capybara::SessionConfig do
6
+ describe "threadsafe" do
7
+ it "defaults to global session options" do
8
+ Capybara.threadsafe = true
9
+ session = Capybara::Session.new(:rack_test, TestApp)
10
+ [:default_host, :app_host, :save_and_open_page_path,
11
+ :always_include_port, :run_server, :default_selector, :default_max_wait_time, :ignore_hidden_elements,
12
+ :automatic_reload, :match, :exact, :raise_server_errors, :visible_text_only, :wait_on_first_by_default,
13
+ :automatic_label_click, :enable_aria_label,
14
+ :save_path, :exact_options, :asset_host].each do |m|
15
+ expect(session.config.public_send(m)).to eq Capybara.public_send(m)
16
+ end
17
+ end
18
+
19
+ it "doesn't change global session when changed" do
20
+ Capybara.threadsafe = true
21
+ host = "http://my.example.com"
22
+ session = Capybara::Session.new(:rack_test, TestApp) do |config|
23
+ config.default_host = host
24
+ config.automatic_label_click = !config.automatic_label_click
25
+ config.server_errors << ArgumentError
26
+ end
27
+ expect(Capybara.default_host).not_to eq host
28
+ expect(session.config.default_host).to eq host
29
+ expect(Capybara.automatic_label_click).not_to eq session.config.automatic_label_click
30
+ expect(Capybara.server_errors).not_to eq session.config.server_errors
31
+ end
32
+
33
+ it "doesn't allow session configuration block when false" do
34
+ Capybara.threadsafe = false
35
+ expect do
36
+ Capybara::Session.new(:rack_test, TestApp) { |config| }
37
+ end.to raise_error "A configuration block is only accepted when Capybara.threadsafe == true"
38
+ end
39
+
40
+ it "doesn't allow session config when false" do
41
+ Capybara.threadsafe = false
42
+ session = Capybara::Session.new(:rack_test, TestApp)
43
+ expect { session.config.default_selector = :title }.to raise_error(/Per session settings are only supported when Capybara.threadsafe == true/)
44
+ expect do
45
+ session.configure do |config|
46
+ config.exact = true
47
+ end
48
+ end.to raise_error(/Session configuration is only supported when Capybara.threadsafe == true/)
49
+ end
50
+
51
+ it "uses the config from the session" do
52
+ Capybara.threadsafe = true
53
+ session = Capybara::Session.new(:rack_test, TestApp) do |config|
54
+ config.default_selector = :link
55
+ end
56
+ session.visit('/with_html')
57
+ expect(session.find('foo').tag_name).to eq 'a'
58
+ end
59
+
60
+ it "won't change threadsafe once a session is created" do
61
+ Capybara.threadsafe = true
62
+ Capybara.threadsafe = false
63
+ Capybara::Session.new(:rack_test, TestApp)
64
+ expect { Capybara.threadsafe = true }.to raise_error(/Threadsafe setting cannot be changed once a session is created/)
65
+ end
66
+ end
67
+ end
@@ -1,10 +1,11 @@
1
+ # frozen_string_literal: true
1
2
  require 'spec_helper'
2
3
 
3
4
  module TestSessions
4
5
  RackTest = Capybara::Session.new(:rack_test, TestApp)
5
6
  end
6
7
 
7
- Capybara::SpecHelper.run_specs TestSessions::RackTest, "RackTest", :capybara_skip => [
8
+ Capybara::SpecHelper.run_specs TestSessions::RackTest, "RackTest", capybara_skip: [
8
9
  :js,
9
10
  :modals,
10
11
  :screenshot,
@@ -78,6 +79,48 @@ RSpec.describe Capybara::Session do
78
79
  expect(@session.html).to include('Successfully ignored empty file field.')
79
80
  end
80
81
  end
82
+
83
+ it "should not submit an obsolete mime type" do
84
+ @test_jpg_file_path = File.expand_path('fixtures/capybara.csv', File.dirname(__FILE__))
85
+ @session.visit("/form")
86
+ @session.attach_file "form_document", @test_jpg_file_path
87
+ @session.click_button('Upload Single')
88
+ expect(@session).to have_content("Content-type: text/csv")
89
+ end
90
+ end
91
+
92
+ describe "#click" do
93
+ context "on a label" do
94
+ it "should toggle the associated checkbox" do
95
+ @session.visit("/form")
96
+ expect(@session).to have_unchecked_field('form_pets_cat')
97
+ @session.find(:label, 'Cat').click
98
+ expect(@session).to have_checked_field('form_pets_cat')
99
+ @session.find(:label, 'Cat').click
100
+ expect(@session).to have_unchecked_field('form_pets_cat')
101
+ @session.find(:label, 'McLaren').click
102
+ expect(@session).to have_checked_field('form_cars_mclaren', visible: :hidden)
103
+ end
104
+
105
+ it "should toggle the associated radio" do
106
+ @session.visit("/form")
107
+ expect(@session).to have_unchecked_field('gender_male')
108
+ @session.find(:label, 'Male').click
109
+ expect(@session).to have_checked_field('gender_male')
110
+ @session.find(:label, 'Female').click
111
+ expect(@session).to have_unchecked_field('gender_male')
112
+ end
113
+ end
114
+ end
115
+
116
+ describe '#text' do
117
+ it "should return original text content for textareas" do
118
+ @session.visit('/with_html')
119
+ @session.find_field('normal', type: 'textarea', with: 'banana').set('hello')
120
+ normal = @session.find(:css, '#normal')
121
+ expect(normal.value).to eq 'hello'
122
+ expect(normal.text).to eq 'banana'
123
+ end
81
124
  end
82
125
  end
83
126
  end
@@ -89,27 +132,27 @@ RSpec.describe Capybara::RackTest::Driver do
89
132
 
90
133
  describe ':headers option' do
91
134
  it 'should always set headers' do
92
- @driver = Capybara::RackTest::Driver.new(TestApp, :headers => {'HTTP_FOO' => 'foobar'})
135
+ @driver = Capybara::RackTest::Driver.new(TestApp, headers: {'HTTP_FOO' => 'foobar'})
93
136
  @driver.visit('/get_header')
94
137
  expect(@driver.html).to include('foobar')
95
138
  end
96
139
 
97
140
  it 'should keep headers on link clicks' do
98
- @driver = Capybara::RackTest::Driver.new(TestApp, :headers => {'HTTP_FOO' => 'foobar'})
141
+ @driver = Capybara::RackTest::Driver.new(TestApp, headers: {'HTTP_FOO' => 'foobar'})
99
142
  @driver.visit('/header_links')
100
143
  @driver.find_xpath('.//a').first.click
101
144
  expect(@driver.html).to include('foobar')
102
145
  end
103
146
 
104
147
  it 'should keep headers on form submit' do
105
- @driver = Capybara::RackTest::Driver.new(TestApp, :headers => {'HTTP_FOO' => 'foobar'})
148
+ @driver = Capybara::RackTest::Driver.new(TestApp, headers: {'HTTP_FOO' => 'foobar'})
106
149
  @driver.visit('/header_links')
107
150
  @driver.find_xpath('.//input').first.click
108
151
  expect(@driver.html).to include('foobar')
109
152
  end
110
153
 
111
154
  it 'should keep headers on redirects' do
112
- @driver = Capybara::RackTest::Driver.new(TestApp, :headers => {'HTTP_FOO' => 'foobar'})
155
+ @driver = Capybara::RackTest::Driver.new(TestApp, headers: {'HTTP_FOO' => 'foobar'})
113
156
  @driver.visit('/get_header_via_redirect')
114
157
  expect(@driver.html).to include('foobar')
115
158
  end
@@ -125,7 +168,7 @@ RSpec.describe Capybara::RackTest::Driver do
125
168
  end
126
169
 
127
170
  it "is possible to not follow redirects" do
128
- @driver = Capybara::RackTest::Driver.new(TestApp, :follow_redirects => false)
171
+ @driver = Capybara::RackTest::Driver.new(TestApp, follow_redirects: false)
129
172
 
130
173
  @driver.visit('/redirect')
131
174
  expect(@driver.response.header['Location']).to match %r{/redirect_again$}
@@ -153,7 +196,7 @@ RSpec.describe Capybara::RackTest::Driver do
153
196
 
154
197
  context "with 21 redirect limit" do
155
198
  before do
156
- @driver = Capybara::RackTest::Driver.new(TestApp, :redirect_limit => 21)
199
+ @driver = Capybara::RackTest::Driver.new(TestApp, redirect_limit: 21)
157
200
  end
158
201
 
159
202
  it "should follow 21 redirects" do
data/spec/result_spec.rb CHANGED
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'spec_helper'
2
3
 
3
4
  RSpec.describe Capybara::Result do
@@ -62,4 +63,79 @@ RSpec.describe Capybara::Result do
62
63
  el.text == 'Gamma'
63
64
  end).to eq(2)
64
65
  end
66
+
67
+ it 'supports all modes of []' do
68
+ expect(result[1].text).to eq 'Beta'
69
+ expect(result[0,2].map(&:text)).to eq ['Alpha', 'Beta']
70
+ expect(result[1..3].map(&:text)).to eq ['Beta', 'Gamma', 'Delta']
71
+ expect(result[-1].text).to eq 'Delta'
72
+ end
73
+
74
+ it 'works with filter blocks' do
75
+ result = string.all('//li') { |node| node.text == 'Alpha' }
76
+ expect(result.size).to eq 1
77
+ end
78
+
79
+ it 'should catch invalid element errors during filtering' do
80
+ allow_any_instance_of(Capybara::Node::Simple).to receive(:text).and_raise(StandardError)
81
+ allow_any_instance_of(Capybara::Node::Simple).to receive(:session).and_return(double("session", driver: double("driver", invalid_element_errors: [StandardError] )))
82
+ result = string.all('//li', text: 'Alpha')
83
+ expect(result.size).to eq 0
84
+ end
85
+
86
+ it 'should return non-invalid element errors during filtering' do
87
+ allow_any_instance_of(Capybara::Node::Simple).to receive(:text).and_raise(StandardError)
88
+ allow_any_instance_of(Capybara::Node::Simple).to receive(:session).and_return(double("session", driver: double("driver", invalid_element_errors: [ArgumentError] )))
89
+ expect do
90
+ string.all('//li', text: 'Alpha').to_a
91
+ end.to raise_error(StandardError)
92
+ end
93
+
94
+ #Not a great test but it indirectly tests what is needed
95
+ it "should evaluate filters lazily" do
96
+ skip 'JRuby has an issue with lazy enumerator evaluation' if RUBY_PLATFORM == 'java'
97
+ #Not processed until accessed
98
+ expect(result.instance_variable_get('@result_cache').size).to be 0
99
+
100
+ #Only one retrieved when needed
101
+ result.first
102
+ expect(result.instance_variable_get('@result_cache').size).to be 1
103
+
104
+ #works for indexed access
105
+ result[0]
106
+ expect(result.instance_variable_get('@result_cache').size).to be 1
107
+
108
+ result[2]
109
+ expect(result.instance_variable_get('@result_cache').size).to be 3
110
+
111
+ #All cached when converted to array
112
+ result.to_a
113
+ expect(result.instance_variable_get('@result_cache').size).to eq 4
114
+ end
115
+
116
+ context '#each' do
117
+ it 'lazily evaluates' do
118
+ skip 'JRuby has an issue with lazy enumerator evaluation' if RUBY_PLATFORM == 'java'
119
+ results=[]
120
+ result.each do |el|
121
+ results << el
122
+ expect(result.instance_variable_get('@result_cache').size).to eq results.size
123
+ end
124
+
125
+ expect(results.size).to eq 4
126
+ end
127
+
128
+ context 'without a block' do
129
+ it 'returns an iterator' do
130
+ expect(result.each).to be_a(Enumerator)
131
+ end
132
+
133
+ it 'lazily evaluates' do
134
+ skip 'JRuby has an issue with lazy enumerator evaluation' if RUBY_PLATFORM == 'java'
135
+ result.each.with_index do |el, idx|
136
+ expect(result.instance_variable_get('@result_cache').size).to eq(idx+1) # 0 indexing
137
+ end
138
+ end
139
+ end
140
+ end
65
141
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'spec_helper'
2
3
  require 'capybara/rspec'
3
4
 
@@ -5,11 +6,11 @@ RSpec.configuration.before(:each, { file_path: "./spec/rspec/features_spec.rb" }
5
6
  @in_filtered_hook = true
6
7
  end
7
8
 
8
- feature "Capybara's feature DSL" do
9
+ feature "Capybara's feature DSL" do
9
10
  background do
10
11
  @in_background = true
11
12
  end
12
-
13
+
13
14
  def current_example(context)
14
15
  RSpec.respond_to?(:current_example) ? RSpec.current_example : context.example
15
16
  end
@@ -19,7 +20,7 @@ feature "Capybara's feature DSL" do
19
20
  expect(page).to have_content('Hello world!')
20
21
  end
21
22
 
22
- scenario "preserves description" do
23
+ scenario "preserves description" do
23
24
  expect(current_example(self).metadata[:full_description])
24
25
  .to eq("Capybara's feature DSL preserves description")
25
26
  end
@@ -70,13 +71,25 @@ feature "given and given! aliases to let and let!" do
70
71
  end
71
72
  end
72
73
 
73
- feature "if xscenario aliases to pending then" do
74
- xscenario "this test should be 'temporarily disabled with xscenario'" do
75
- end
76
- end
77
-
78
74
  feature "Capybara's feature DSL with driver", :driver => :culerity do
79
75
  scenario "switches driver" do
80
76
  expect(Capybara.current_driver).to eq(:culerity)
81
77
  end
82
78
  end
79
+
80
+ if RSpec::Core::Version::STRING.to_f >= 3.0
81
+ xfeature "if xfeature aliases to pending then" do
82
+ scenario "this should be 'temporarily disabled with xfeature'" do; end
83
+ scenario "this also should be 'temporarily disabled with xfeature'" do; end
84
+ end
85
+
86
+ ffeature "if ffeature aliases focused tag then" do
87
+ scenario "scenario inside this feature has metatag focus tag" do |example|
88
+ expect(example.metadata[:focus]).to eq true
89
+ end
90
+
91
+ scenario "other scenarios also has metatag focus tag " do |example|
92
+ expect(example.metadata[:focus]).to eq true
93
+ end
94
+ end
95
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+ require 'spec_helper'
3
+ require 'capybara/rspec'
4
+
5
+ RSpec.configuration.before(:each, { file_path: "./spec/rspec/scenarios_spec.rb" } ) do
6
+ @in_filtered_hook = true
7
+ end
8
+
9
+ if RSpec::Core::Version::STRING.to_f >= 3.0
10
+ feature "if fscenario aliases focused tag then" do
11
+ fscenario "scenario should have focused meta tag" do |example|
12
+ expect(example.metadata[:focus]).to eq true
13
+ end
14
+ end
15
+ end
16
+
17
+ feature "if xscenario aliases to pending then" do
18
+ xscenario "this test should be 'temporarily disabled with xscenario'" do
19
+ end
20
+ end
21
+