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,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  Capybara::SpecHelper.spec '#reset_session!' do
2
3
  it "removes cookies" do
3
4
  @session.visit('/set_cookie')
@@ -32,12 +33,27 @@ Capybara::SpecHelper.spec '#reset_session!' do
32
33
  end
33
34
 
34
35
  it "is synchronous" do
35
- @session.visit("/with_html")
36
+ @session.visit("/with_slow_unload")
37
+ expect(@session).to have_selector(:css, 'div')
36
38
  @session.reset_session!
37
39
  expect(@session).to have_no_selector :xpath, "/html/body/*", wait: false
38
40
  end
39
41
 
40
- it "raises any standard errors caught inside the server", :requires => [:server] do
42
+ it "handles modals during unload", requires: [:modals] do
43
+ @session.visit('/with_unload_alert')
44
+ expect(@session).to have_selector(:css, 'div')
45
+ expect { @session.reset_session! }.not_to raise_error
46
+ expect(@session).to have_no_selector :xpath, "/html/body/*", wait: false
47
+ end
48
+
49
+ it "handles already open modals", requires: [:modals] do
50
+ @session.visit('/with_unload_alert')
51
+ @session.click_link('Go away')
52
+ expect { @session.reset_session! }.not_to raise_error
53
+ expect(@session).to have_no_selector :xpath, "/html/body/*", wait: false
54
+ end
55
+
56
+ it "raises any standard errors caught inside the server", requires: [:server] do
41
57
  quietly { @session.visit("/error") }
42
58
  expect do
43
59
  @session.reset_session!
@@ -46,8 +62,33 @@ Capybara::SpecHelper.spec '#reset_session!' do
46
62
  expect(@session.current_path).to eq("/")
47
63
  end
48
64
 
49
- it "raises configured errors caught inside the server", :requires => [:server] do
50
- prev_errors = Capybara.server_errors
65
+ context "When reuse_server == false" do
66
+ before do
67
+ @reuse_server = Capybara.reuse_server
68
+ Capybara.reuse_server = false
69
+ end
70
+
71
+ it "raises any standard errors caught inside the server during a second session", requires: [:server] do
72
+ Capybara.using_driver(@session.mode) do
73
+ Capybara.using_session(:another_session) do
74
+ @another_session = Capybara.current_session
75
+ quietly { @another_session.visit("/error") }
76
+ expect do
77
+ @another_session.reset_session!
78
+ end.to raise_error(TestApp::TestAppError)
79
+ @another_session.visit("/")
80
+ expect(@another_session.current_path).to eq("/")
81
+ end
82
+ end
83
+ end
84
+
85
+ after do
86
+ Capybara.reuse_server = @reuse_server
87
+ end
88
+ end
89
+
90
+ it "raises configured errors caught inside the server", requires: [:server] do
91
+ prev_errors = Capybara.server_errors.dup
51
92
 
52
93
  Capybara.server_errors = [LoadError]
53
94
  quietly { @session.visit("/error") }
@@ -63,7 +104,7 @@ Capybara::SpecHelper.spec '#reset_session!' do
63
104
  Capybara.server_errors = prev_errors
64
105
  end
65
106
 
66
- it "ignores server errors when `Capybara.raise_server_errors = false`", :requires => [:server] do
107
+ it "ignores server errors when `Capybara.raise_server_errors = false`", requires: [:server] do
67
108
  Capybara.raise_server_errors = false
68
109
  quietly { @session.visit("/error") }
69
110
  @session.reset_session!
@@ -1,5 +1,6 @@
1
+ # frozen_string_literal: true
1
2
  Capybara::SpecHelper.spec '#status_code' do
2
- it "should return response codes", :requires => [:status_code] do
3
+ it "should return response codes", requires: [:status_code] do
3
4
  @session.visit('/with_simple_html')
4
5
  expect(@session.status_code).to eq(200)
5
6
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'launchy'
2
3
 
3
4
  Capybara::SpecHelper.spec '#save_and_open_page' do
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'launchy'
2
3
 
3
4
  Capybara::SpecHelper.spec '#save_and_open_screenshot' do
@@ -5,7 +6,7 @@ Capybara::SpecHelper.spec '#save_and_open_screenshot' do
5
6
  @session.visit '/'
6
7
  end
7
8
 
8
- it 'opens file from the default directory', :requires => [:screenshot] do
9
+ it 'opens file from the default directory', requires: [:screenshot] do
9
10
  expected_file_regex = %r{capybara-\d+\.png}
10
11
  allow(@session.driver).to receive(:save_screenshot)
11
12
  allow(Launchy).to receive(:open)
@@ -17,7 +18,7 @@ Capybara::SpecHelper.spec '#save_and_open_screenshot' do
17
18
  expect(Launchy).to have_received(:open).with(expected_file_regex)
18
19
  end
19
20
 
20
- it 'opens file from the provided directory', :requires => [:screenshot] do
21
+ it 'opens file from the provided directory', requires: [:screenshot] do
21
22
  custom_path = 'screenshots/1.png'
22
23
  allow(@session.driver).to receive(:save_screenshot)
23
24
  allow(Launchy).to receive(:open)
@@ -25,12 +26,12 @@ Capybara::SpecHelper.spec '#save_and_open_screenshot' do
25
26
  @session.save_and_open_screenshot(custom_path)
26
27
 
27
28
  expect(@session.driver).to have_received(:save_screenshot).
28
- with(custom_path, {})
29
- expect(Launchy).to have_received(:open).with(custom_path)
29
+ with(/#{custom_path}$/, {})
30
+ expect(Launchy).to have_received(:open).with(/#{custom_path}$/)
30
31
  end
31
32
 
32
33
  context 'when launchy cannot be required' do
33
- it 'prints out a correct warning message', :requires => [:screenshot] do
34
+ it 'prints out a correct warning message', requires: [:screenshot] do
34
35
  file_path = File.join(Dir.tmpdir, 'test.png')
35
36
  allow(@session).to receive(:require).with('launchy').and_raise(LoadError)
36
37
  allow(@session).to receive(:warn)
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  Capybara::SpecHelper.spec '#save_page' do
2
3
  let(:alternative_path) { File.join(Dir.pwd, "save_and_open_page_tmp") }
3
4
  before do
@@ -6,6 +7,7 @@ Capybara::SpecHelper.spec '#save_page' do
6
7
 
7
8
  after do
8
9
  Capybara.save_and_open_page_path = nil
10
+ Capybara.save_path = nil
9
11
  Dir.glob("capybara-*.html").each do |file|
10
12
  FileUtils.rm(file)
11
13
  end
@@ -25,7 +27,7 @@ Capybara::SpecHelper.spec '#save_page' do
25
27
  end
26
28
 
27
29
  it "can store files in a specified directory" do
28
- Capybara.save_and_open_page_path = alternative_path
30
+ Capybara.save_path = alternative_path
29
31
  @session.save_page
30
32
  path = Dir.glob(alternative_path + "/capybara-*.html").first
31
33
  expect(File.read(path)).to include("Another World")
@@ -36,6 +38,20 @@ Capybara::SpecHelper.spec '#save_page' do
36
38
  expect(File.read("capybara-001122.html")).to include("Another World")
37
39
  end
38
40
 
41
+ it "can store files in a specified directory with a given filename" do
42
+ Capybara.save_path = alternative_path
43
+ @session.save_page("capybara-001133.html")
44
+ path = alternative_path + "/capybara-001133.html"
45
+ expect(File.read(path)).to include("Another World")
46
+ end
47
+
48
+ it "can store files in a specified directory with a given relative filename" do
49
+ Capybara.save_path = alternative_path
50
+ @session.save_page("tmp/capybara-001144.html")
51
+ path = alternative_path + "/tmp/capybara-001144.html"
52
+ expect(File.read(path)).to include("Another World")
53
+ end
54
+
39
55
  it "returns an absolute path in pwd" do
40
56
  result = @session.save_page
41
57
  path = File.expand_path(Dir.glob("capybara-*.html").first, Dir.pwd)
@@ -43,7 +59,7 @@ Capybara::SpecHelper.spec '#save_page' do
43
59
  end
44
60
 
45
61
  it "returns an absolute path in given directory" do
46
- Capybara.save_and_open_page_path = alternative_path
62
+ Capybara.save_path = alternative_path
47
63
  result = @session.save_page
48
64
  path = File.expand_path(Dir.glob(alternative_path + "/capybara-*.html").first, alternative_path)
49
65
  expect(result).to eq(path)
@@ -88,4 +104,20 @@ Capybara::SpecHelper.spec '#save_page' do
88
104
  expect(result).to include("Bar")
89
105
  end
90
106
  end
107
+
108
+ context "with deprecated save_and_open_page_path" do
109
+ it "can store files in a specified directory" do
110
+ Capybara.save_and_open_page_path = alternative_path
111
+ @session.save_page
112
+ path = Dir.glob(alternative_path + "/capybara-*.html").first
113
+ expect(File.read(path)).to include("Another World")
114
+ end
115
+
116
+ it "returns an absolute path in given directory" do
117
+ Capybara.save_and_open_page_path = alternative_path
118
+ result = @session.save_page
119
+ path = File.expand_path(Dir.glob(alternative_path + "/capybara-*.html").first, alternative_path)
120
+ expect(result).to eq(path)
121
+ end
122
+ end
91
123
  end
@@ -1,8 +1,16 @@
1
+ # frozen_string_literal: true
1
2
  Capybara::SpecHelper.spec '#save_screenshot', requires: [:screenshot] do
3
+ let(:alternative_path) { File.join(Dir.pwd, "save_screenshot_tmp") }
2
4
  before do
3
5
  @session.visit '/foo'
4
6
  end
5
7
 
8
+ after do
9
+ Capybara.save_and_open_page_path = nil
10
+ Capybara.save_path = nil
11
+ FileUtils.rm_rf alternative_path
12
+ end
13
+
6
14
  it "generates sensible filename" do
7
15
  allow(@session.driver).to receive(:save_screenshot)
8
16
 
@@ -18,6 +26,28 @@ Capybara::SpecHelper.spec '#save_screenshot', requires: [:screenshot] do
18
26
  custom_path = 'screenshots/1.png'
19
27
  @session.save_screenshot(custom_path)
20
28
 
21
- expect(@session.driver).to have_received(:save_screenshot).with(custom_path, {})
29
+ expect(@session.driver).to have_received(:save_screenshot).with(/#{custom_path}$/, {})
30
+ end
31
+
32
+ context "with Capybara.save_path" do
33
+ it "file is generated in the correct location" do
34
+ Capybara.save_path = alternative_path
35
+ allow(@session.driver).to receive(:save_screenshot)
36
+
37
+ @session.save_screenshot
38
+
39
+ regexp = Regexp.new(File.expand_path('capybara-\d+\.png', alternative_path))
40
+ expect(@session.driver).to have_received(:save_screenshot).with(regexp, {})
41
+ end
42
+
43
+ it "relative paths are relative to save_path" do
44
+ Capybara.save_path = alternative_path
45
+ allow(@session.driver).to receive(:save_screenshot)
46
+
47
+ custom_path = 'screenshots/2.png'
48
+ @session.save_screenshot(custom_path)
49
+
50
+ expect(@session.driver).to have_received(:save_screenshot).with(File.expand_path(custom_path, alternative_path), {})
51
+ end
22
52
  end
23
53
  end
@@ -1,4 +1,6 @@
1
- #coding: US-ASCII
1
+ # coding: US-ASCII
2
+ # frozen_string_literal: true
3
+
2
4
  Capybara::SpecHelper.spec "#save_screenshot" do
3
5
  let(:image_path) { File.join(Dir.tmpdir, 'capybara-screenshot.png') }
4
6
 
@@ -6,7 +8,7 @@ Capybara::SpecHelper.spec "#save_screenshot" do
6
8
  @session.visit '/'
7
9
  end
8
10
 
9
- it "should generate PNG file", :requires => [:screenshot] do
11
+ it "should generate PNG file", requires: [:screenshot] do
10
12
  path = @session.save_screenshot image_path
11
13
 
12
14
  magic = File.read(image_path, 4)
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  Capybara::SpecHelper.spec "#select" do
2
3
  before do
3
4
  @session.visit('/form')
@@ -8,30 +9,31 @@ Capybara::SpecHelper.spec "#select" do
8
9
  end
9
10
 
10
11
  it "should return value of the selected option" do
11
- @session.select("Miss", :from => 'Title')
12
+ @session.select("Miss", from: 'Title')
12
13
  expect(@session.find_field('Title').value).to eq('Miss')
13
14
  end
14
15
 
15
16
  it "should allow selecting options where there are inexact matches" do
16
- @session.select("Mr", :from => 'Title')
17
+ @session.select("Mr", from: 'Title')
17
18
  expect(@session.find_field('Title').value).to eq('Mr')
18
19
  end
19
20
 
20
21
  it "should allow selecting options where they are the only inexact match" do
21
- @session.select("Mis", :from => 'Title')
22
+ @session.select("Mis", from: 'Title')
22
23
  expect(@session.find_field('Title').value).to eq('Miss')
23
24
  end
24
25
 
25
26
  it "should not allow selecting options where they are the only inexact match if `Capybara.exact_options = true`" do
27
+ expect_any_instance_of(Kernel).to receive(:warn).with(/^DEPRECATED:/)
26
28
  Capybara.exact_options = true
27
29
  expect do
28
- @session.select("Mis", :from => 'Title')
30
+ @session.select("Mis", from: 'Title')
29
31
  end.to raise_error(Capybara::ElementNotFound)
30
32
  end
31
33
 
32
34
  it "should not allow selecting an option if the match is ambiguous" do
33
35
  expect do
34
- @session.select("M", :from => 'Title')
36
+ @session.select("M", from: 'Title')
35
37
  end.to raise_error(Capybara::Ambiguous)
36
38
  end
37
39
 
@@ -40,13 +42,13 @@ Capybara::SpecHelper.spec "#select" do
40
42
  end
41
43
 
42
44
  it "should select an option from a select box by id" do
43
- @session.select("Finish", :from => 'form_locale')
45
+ @session.select("Finish", from: 'form_locale')
44
46
  @session.click_button('awesome')
45
47
  expect(extract_results(@session)['locale']).to eq('fi')
46
48
  end
47
49
 
48
50
  it "should select an option from a select box by label" do
49
- @session.select("Finish", :from => 'Locale')
51
+ @session.select("Finish", from: 'Locale')
50
52
  @session.click_button('awesome')
51
53
  expect(extract_results(@session)['locale']).to eq('fi')
52
54
  end
@@ -58,13 +60,13 @@ Capybara::SpecHelper.spec "#select" do
58
60
  end
59
61
 
60
62
  it "should escape quotes" do
61
- @session.select("John's made-up language", :from => 'Locale')
63
+ @session.select("John's made-up language", from: 'Locale')
62
64
  @session.click_button('awesome')
63
65
  expect(extract_results(@session)['locale']).to eq('jo')
64
66
  end
65
67
 
66
68
  it "should obey from" do
67
- @session.select("Miss", :from => "Other title")
69
+ @session.select("Miss", from: "Other title")
68
70
  @session.click_button('awesome')
69
71
  results = extract_results(@session)
70
72
  expect(results['other_title']).to eq("Miss")
@@ -72,30 +74,30 @@ Capybara::SpecHelper.spec "#select" do
72
74
  end
73
75
 
74
76
  it "show match labels with preceding or trailing whitespace" do
75
- @session.select("Lojban", :from => 'Locale')
77
+ @session.select("Lojban", from: 'Locale')
76
78
  @session.click_button('awesome')
77
79
  expect(extract_results(@session)['locale']).to eq('jbo')
78
80
  end
79
81
 
80
82
  it "casts to string" do
81
- @session.select(:"Miss", :from => :'Title')
83
+ @session.select(:"Miss", from: :'Title')
82
84
  expect(@session.find_field('Title').value).to eq('Miss')
83
85
  end
84
86
 
85
87
  context "with a locator that doesn't exist" do
86
88
  it "should raise an error" do
87
- msg = "Unable to find select box \"does not exist\""
89
+ msg = "Unable to find visible select box \"does not exist\" that is not disabled"
88
90
  expect do
89
- @session.select('foo', :from => 'does not exist')
91
+ @session.select('foo', from: 'does not exist')
90
92
  end.to raise_error(Capybara::ElementNotFound, msg)
91
93
  end
92
94
  end
93
95
 
94
96
  context "with an option that doesn't exist" do
95
97
  it "should raise an error" do
96
- msg = "Unable to find option \"Does not Exist\""
98
+ msg = /^Unable to find visible option "Does not Exist" within/
97
99
  expect do
98
- @session.select('Does not Exist', :from => 'form_locale')
100
+ @session.select('Does not Exist', from: 'form_locale')
99
101
  end.to raise_error(Capybara::ElementNotFound, msg)
100
102
  end
101
103
  end
@@ -103,20 +105,20 @@ Capybara::SpecHelper.spec "#select" do
103
105
  context "on a disabled select" do
104
106
  it "should raise an error" do
105
107
  expect do
106
- @session.select('Should not see me', :from => 'Disabled Select')
108
+ @session.select('Should not see me', from: 'Disabled Select')
107
109
  end.to raise_error(Capybara::ElementNotFound)
108
110
  end
109
111
  end
110
112
 
111
113
  context "on a disabled option" do
112
114
  it "should not select" do
113
- @session.select('Other', :from => 'form_title')
115
+ @session.select('Other', from: 'form_title')
114
116
  expect(@session.find_field('form_title').value).not_to eq 'Other'
115
117
  end
116
118
 
117
119
  it "should warn" do
118
120
  expect_any_instance_of(Capybara::Node::Element).to receive(:warn).once
119
- @session.select('Other', :from => 'form_title')
121
+ @session.select('Other', from: 'form_title')
120
122
  end
121
123
  end
122
124
 
@@ -126,28 +128,28 @@ Capybara::SpecHelper.spec "#select" do
126
128
  end
127
129
 
128
130
  it "should return value of the selected options" do
129
- @session.select("Ruby", :from => 'Language')
130
- @session.select("Javascript", :from => 'Language')
131
+ @session.select("Ruby", from: 'Language')
132
+ @session.select("Javascript", from: 'Language')
131
133
  expect(@session.find_field('Language').value).to include('Ruby', 'Javascript')
132
134
  end
133
135
 
134
136
  it "should select one option" do
135
- @session.select("Ruby", :from => 'Language')
137
+ @session.select("Ruby", from: 'Language')
136
138
  @session.click_button('awesome')
137
139
  expect(extract_results(@session)['languages']).to eq(['Ruby'])
138
140
  end
139
141
 
140
142
  it "should select multiple options" do
141
- @session.select("Ruby", :from => 'Language')
142
- @session.select("Javascript", :from => 'Language')
143
+ @session.select("Ruby", from: 'Language')
144
+ @session.select("Javascript", from: 'Language')
143
145
  @session.click_button('awesome')
144
146
  expect(extract_results(@session)['languages']).to include('Ruby', 'Javascript')
145
147
  end
146
148
 
147
149
  it "should remain selected if already selected" do
148
- @session.select("Ruby", :from => 'Language')
149
- @session.select("Javascript", :from => 'Language')
150
- @session.select("Ruby", :from => 'Language')
150
+ @session.select("Ruby", from: 'Language')
151
+ @session.select("Javascript", from: 'Language')
152
+ @session.select("Ruby", from: 'Language')
151
153
  @session.click_button('awesome')
152
154
  expect(extract_results(@session)['languages']).to include('Ruby', 'Javascript')
153
155
  end
@@ -160,19 +162,19 @@ Capybara::SpecHelper.spec "#select" do
160
162
  context "with :exact option" do
161
163
  context "when `false`" do
162
164
  it "can match select box approximately" do
163
- @session.select("Finish", :from => "Loc", :exact => false)
165
+ @session.select("Finish", from: "Loc", exact: false)
164
166
  @session.click_button("awesome")
165
167
  expect(extract_results(@session)["locale"]).to eq("fi")
166
168
  end
167
169
 
168
170
  it "can match option approximately" do
169
- @session.select("Fin", :from => "Locale", :exact => false)
171
+ @session.select("Fin", from: "Locale", exact: false)
170
172
  @session.click_button("awesome")
171
173
  expect(extract_results(@session)["locale"]).to eq("fi")
172
174
  end
173
175
 
174
176
  it "can match option approximately when :from not given" do
175
- @session.select("made-up language", :exact => false)
177
+ @session.select("made-up language", exact: false)
176
178
  @session.click_button("awesome")
177
179
  expect(extract_results(@session)["locale"]).to eq("jo")
178
180
  end
@@ -181,19 +183,19 @@ Capybara::SpecHelper.spec "#select" do
181
183
  context "when `true`" do
182
184
  it "can match select box approximately" do
183
185
  expect do
184
- @session.select("Finish", :from => "Loc", :exact => true)
186
+ @session.select("Finish", from: "Loc", exact: true)
185
187
  end.to raise_error(Capybara::ElementNotFound)
186
188
  end
187
189
 
188
190
  it "can match option approximately" do
189
191
  expect do
190
- @session.select("Fin", :from => "Locale", :exact => true)
192
+ @session.select("Fin", from: "Locale", exact: true)
191
193
  end.to raise_error(Capybara::ElementNotFound)
192
194
  end
193
195
 
194
196
  it "can match option approximately when :from not given" do
195
197
  expect do
196
- @session.select("made-up language", :exact => true)
198
+ @session.select("made-up language", exact: true)
197
199
  end.to raise_error(Capybara::ElementNotFound)
198
200
  end
199
201
  end
@@ -0,0 +1,65 @@
1
+ Capybara::SpecHelper.spec Capybara::Selector do
2
+ before do
3
+ @session.visit('/form')
4
+ end
5
+
6
+ describe ":label selector" do
7
+ it "finds a label by text" do
8
+ expect(@session.find(:label, 'Customer Name').text).to eq 'Customer Name'
9
+ end
10
+
11
+ it "finds a label by for attribute string" do
12
+ expect(@session.find(:label, for: 'form_other_title')['for']).to eq 'form_other_title'
13
+ end
14
+
15
+ it "finds a label from nested input using :for filter with id string" do
16
+ expect(@session.find(:label, for: 'nested_label').text).to eq 'Nested Label'
17
+ end
18
+
19
+ it "finds a label from nested input using :for filter with element" do
20
+ input = @session.find(:id, 'nested_label')
21
+ expect(@session.find(:label, for: input).text).to eq 'Nested Label'
22
+ end
23
+
24
+ it "finds the label for an non-nested element when using :for filter" do
25
+ select = @session.find(:id, 'form_other_title')
26
+ expect(@session.find(:label, for: select)['for']).to eq 'form_other_title'
27
+ end
28
+
29
+ context "with exact option" do
30
+ it "matches substrings" do
31
+ expect(@session.find(:label, 'Customer Na', exact: false).text).to eq 'Customer Name'
32
+ end
33
+
34
+ it "doesn't match substrings" do
35
+ expect { @session.find(:label, 'Customer Na', exact: true) }.to raise_error(Capybara::ElementNotFound)
36
+ end
37
+ end
38
+ end
39
+
40
+ describe "field selectors" do
41
+ it "can find specifically by id" do
42
+ expect(@session.find(:field, id: 'customer_email').value).to eq "ben@ben.com"
43
+ end
44
+
45
+ it "can find specifically by name" do
46
+ expect(@session.find(:field, name: 'form[other_title]')['id']).to eq "form_other_title"
47
+ end
48
+
49
+ it "can find specifically by placeholder" do
50
+ expect(@session.find(:field, placeholder: 'FirstName')['id']).to eq "form_first_name"
51
+ end
52
+
53
+ it "can find by type" do
54
+ expect(@session.find(:field, 'Confusion', type: 'checkbox')['id']).to eq 'confusion_checkbox'
55
+ expect(@session.find(:field, 'Confusion', type: 'text')['id']).to eq 'confusion_text'
56
+ expect(@session.find(:field, 'Confusion', type: 'textarea')['id']).to eq 'confusion_textarea'
57
+ end
58
+
59
+ it "can find by class" do
60
+ expect(@session.find(:field, class: 'confusion-checkbox')['id']).to eq 'confusion_checkbox'
61
+ expect(@session).to have_selector(:field, class: 'confusion', count: 3)
62
+ expect(@session.find(:field, class: ['confusion','confusion-textarea'])['id']).to eq 'confusion_textarea'
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,52 @@
1
+ # frozen_string_literal: true
2
+ Capybara::SpecHelper.spec '#sibling' 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 a prior sibling element using the given locator" do
12
+ el = @session.find(:css, '#mid_sibling')
13
+ expect(el.sibling('//div[@data-pre]')[:id]).to eq('pre_sibling')
14
+ end
15
+
16
+ it "should find a following sibling element using the given locator" do
17
+ el = @session.find(:css, '#mid_sibling')
18
+ expect(el.sibling('//div[@data-post]')[:id]).to eq('post_sibling')
19
+ end
20
+
21
+ it "should raise an error if there are multiple matches" do
22
+ el = @session.find(:css, '#mid_sibling')
23
+ expect { el.sibling('//div') }.to raise_error(Capybara::Ambiguous)
24
+ end
25
+
26
+ context "with css selectors" do
27
+ it "should find the first element using the given locator" do
28
+ el = @session.find(:css, '#mid_sibling')
29
+ expect(el.sibling(:css, '#pre_sibling')).to have_text('Pre Sibling')
30
+ expect(el.sibling(:css, '#post_sibling')).to have_text('Post Sibling')
31
+ end
32
+ end
33
+
34
+ context "with custom selector" do
35
+ it "should use the custom selector" do
36
+ Capybara.add_selector(:data_attribute) do
37
+ xpath { |attr| ".//*[@data-#{attr}]" }
38
+ end
39
+ el = @session.find(:css, '#mid_sibling')
40
+ expect(el.sibling(:data_attribute, 'pre').text).to eq('Pre Sibling')
41
+ expect(el.sibling(:data_attribute, 'post').text).to eq('Post Sibling')
42
+ end
43
+ end
44
+
45
+
46
+ it "should raise ElementNotFound with a useful default message if nothing was found" do
47
+ el = @session.find(:css, '#child')
48
+ expect do
49
+ el.sibling(:xpath, '//div[@id="nosuchthing"]')
50
+ end.to raise_error(Capybara::ElementNotFound, "Unable to find xpath \"//div[@id=\\\"nosuchthing\\\"]\" that is a sibling of visible css \"#child\"")
51
+ end
52
+ end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  Capybara::SpecHelper.spec '#text' do
2
3
  it "should print the text of the page" do
3
4
  @session.visit('/with_simple_html')
@@ -34,7 +35,7 @@ Capybara::SpecHelper.spec '#text' do
34
35
  Capybara.ignore_hidden_elements = false
35
36
  expect(@session.find(:id, "hidden-text").text).to eq('Some of this text is')
36
37
  end
37
-
38
+
38
39
  it "ignores invisible text if ancestor is invisible" do
39
40
  @session.visit('/with_html')
40
41
  expect(@session.find(:id, "hidden_via_ancestor", visible: false).text).to eq('')
@@ -51,8 +52,7 @@ Capybara::SpecHelper.spec '#text' do
51
52
 
52
53
  it "should strip whitespace" do
53
54
  @session.visit('/with_html')
54
- n = @session.find(:css, '#second')
55
- expect(@session.find(:css, '#second').text).to match \
56
- /\ADuis aute .* text with whitespace .* est laborum\.\z/
55
+ @session.find(:css, '#second')
56
+ expect(@session.find(:css, '#second').text).to match(/\ADuis aute .* text with whitespace .* est laborum\.\z/)
57
57
  end
58
58
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  Capybara::SpecHelper.spec '#title' do
2
3
 
3
4
  it "should get the title of the page" do
@@ -13,4 +14,4 @@ Capybara::SpecHelper.spec '#title' do
13
14
  end
14
15
  after { Capybara.default_selector = :xpath }
15
16
  end
16
- end
17
+ end