capybara 2.15.0 → 3.0.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 (177) hide show
  1. checksums.yaml +5 -5
  2. data/History.md +137 -2
  3. data/README.md +36 -25
  4. data/lib/capybara/config.rb +11 -57
  5. data/lib/capybara/cucumber.rb +2 -3
  6. data/lib/capybara/driver/base.rb +19 -16
  7. data/lib/capybara/driver/node.rb +5 -4
  8. data/lib/capybara/dsl.rb +1 -0
  9. data/lib/capybara/helpers.rb +19 -29
  10. data/lib/capybara/minitest/spec.rb +16 -13
  11. data/lib/capybara/minitest.rb +140 -137
  12. data/lib/capybara/node/actions.rb +68 -89
  13. data/lib/capybara/node/base.rb +11 -18
  14. data/lib/capybara/node/document.rb +2 -2
  15. data/lib/capybara/node/document_matchers.rb +8 -8
  16. data/lib/capybara/node/element.rb +32 -42
  17. data/lib/capybara/node/finders.rb +64 -71
  18. data/lib/capybara/node/matchers.rb +50 -71
  19. data/lib/capybara/node/simple.rb +11 -17
  20. data/lib/capybara/queries/ancestor_query.rb +12 -8
  21. data/lib/capybara/queries/base_query.rb +22 -18
  22. data/lib/capybara/queries/current_path_query.rb +12 -25
  23. data/lib/capybara/queries/match_query.rb +3 -7
  24. data/lib/capybara/queries/selector_query.rb +100 -96
  25. data/lib/capybara/queries/sibling_query.rb +5 -5
  26. data/lib/capybara/queries/text_query.rb +35 -35
  27. data/lib/capybara/queries/title_query.rb +8 -11
  28. data/lib/capybara/rack_test/browser.rb +15 -18
  29. data/lib/capybara/rack_test/css_handlers.rb +6 -4
  30. data/lib/capybara/rack_test/driver.rb +6 -10
  31. data/lib/capybara/rack_test/form.rb +52 -39
  32. data/lib/capybara/rack_test/node.rb +93 -63
  33. data/lib/capybara/rails.rb +2 -6
  34. data/lib/capybara/result.rb +22 -22
  35. data/lib/capybara/rspec/compound.rb +5 -10
  36. data/lib/capybara/rspec/features.rb +17 -48
  37. data/lib/capybara/rspec/matcher_proxies.rb +31 -15
  38. data/lib/capybara/rspec/matchers.rb +116 -58
  39. data/lib/capybara/rspec.rb +5 -10
  40. data/lib/capybara/selector/css.rb +6 -11
  41. data/lib/capybara/selector/filter.rb +1 -17
  42. data/lib/capybara/selector/filter_set.rb +18 -15
  43. data/lib/capybara/selector/filters/base.rb +7 -6
  44. data/lib/capybara/selector/filters/expression_filter.rb +6 -23
  45. data/lib/capybara/selector/filters/node_filter.rb +2 -12
  46. data/lib/capybara/selector/selector.rb +28 -34
  47. data/lib/capybara/selector.rb +129 -117
  48. data/lib/capybara/selenium/driver.rb +172 -163
  49. data/lib/capybara/selenium/node.rb +218 -104
  50. data/lib/capybara/server.rb +3 -2
  51. data/lib/capybara/session/config.rb +47 -59
  52. data/lib/capybara/session/matchers.rb +23 -14
  53. data/lib/capybara/session.rb +175 -229
  54. data/lib/capybara/spec/fixtures/no_extension +1 -0
  55. data/lib/capybara/spec/public/test.js +38 -6
  56. data/lib/capybara/spec/session/accept_alert_spec.rb +1 -0
  57. data/lib/capybara/spec/session/accept_confirm_spec.rb +3 -2
  58. data/lib/capybara/spec/session/accept_prompt_spec.rb +30 -1
  59. data/lib/capybara/spec/session/all_spec.rb +31 -18
  60. data/lib/capybara/spec/session/ancestor_spec.rb +6 -8
  61. data/lib/capybara/spec/session/assert_all_of_selectors_spec.rb +6 -5
  62. data/lib/capybara/spec/session/assert_current_path.rb +12 -11
  63. data/lib/capybara/spec/session/assert_selector.rb +1 -0
  64. data/lib/capybara/spec/session/assert_text.rb +31 -23
  65. data/lib/capybara/spec/session/assert_title.rb +13 -3
  66. data/lib/capybara/spec/session/attach_file_spec.rb +57 -29
  67. data/lib/capybara/spec/session/body_spec.rb +1 -0
  68. data/lib/capybara/spec/session/check_spec.rb +7 -6
  69. data/lib/capybara/spec/session/choose_spec.rb +5 -4
  70. data/lib/capybara/spec/session/click_button_spec.rb +24 -32
  71. data/lib/capybara/spec/session/click_link_or_button_spec.rb +8 -7
  72. data/lib/capybara/spec/session/click_link_spec.rb +8 -7
  73. data/lib/capybara/spec/session/current_scope_spec.rb +4 -3
  74. data/lib/capybara/spec/session/current_url_spec.rb +19 -8
  75. data/lib/capybara/spec/session/dismiss_confirm_spec.rb +1 -1
  76. data/lib/capybara/spec/session/dismiss_prompt_spec.rb +1 -0
  77. data/lib/capybara/spec/session/element/assert_match_selector.rb +1 -1
  78. data/lib/capybara/spec/session/element/match_xpath_spec.rb +1 -1
  79. data/lib/capybara/spec/session/element/matches_selector_spec.rb +5 -5
  80. data/lib/capybara/spec/session/evaluate_async_script_spec.rb +23 -0
  81. data/lib/capybara/spec/session/evaluate_script_spec.rb +5 -4
  82. data/lib/capybara/spec/session/execute_script_spec.rb +4 -3
  83. data/lib/capybara/spec/session/fill_in_spec.rb +30 -5
  84. data/lib/capybara/spec/session/find_button_spec.rb +4 -3
  85. data/lib/capybara/spec/session/find_by_id_spec.rb +2 -1
  86. data/lib/capybara/spec/session/find_field_spec.rb +9 -15
  87. data/lib/capybara/spec/session/find_link_spec.rb +6 -5
  88. data/lib/capybara/spec/session/find_spec.rb +37 -31
  89. data/lib/capybara/spec/session/first_spec.rb +60 -33
  90. data/lib/capybara/spec/session/frame/frame_title_spec.rb +23 -0
  91. data/lib/capybara/spec/session/frame/frame_url_spec.rb +23 -0
  92. data/lib/capybara/spec/session/frame/switch_to_frame_spec.rb +2 -1
  93. data/lib/capybara/spec/session/frame/within_frame_spec.rb +9 -16
  94. data/lib/capybara/spec/session/go_back_spec.rb +1 -0
  95. data/lib/capybara/spec/session/go_forward_spec.rb +1 -0
  96. data/lib/capybara/spec/session/has_all_selectors_spec.rb +69 -0
  97. data/lib/capybara/spec/session/has_button_spec.rb +2 -1
  98. data/lib/capybara/spec/session/has_css_spec.rb +3 -2
  99. data/lib/capybara/spec/session/has_current_path_spec.rb +49 -22
  100. data/lib/capybara/spec/session/has_field_spec.rb +4 -3
  101. data/lib/capybara/spec/session/has_link_spec.rb +5 -4
  102. data/lib/capybara/spec/session/has_none_selectors_spec.rb +76 -0
  103. data/lib/capybara/spec/session/has_select_spec.rb +32 -31
  104. data/lib/capybara/spec/session/has_selector_spec.rb +5 -4
  105. data/lib/capybara/spec/session/has_table_spec.rb +2 -1
  106. data/lib/capybara/spec/session/has_text_spec.rb +9 -13
  107. data/lib/capybara/spec/session/has_title_spec.rb +1 -0
  108. data/lib/capybara/spec/session/has_xpath_spec.rb +1 -0
  109. data/lib/capybara/spec/session/headers.rb +2 -1
  110. data/lib/capybara/spec/session/html_spec.rb +1 -0
  111. data/lib/capybara/spec/session/node_spec.rb +107 -58
  112. data/lib/capybara/spec/session/node_wrapper_spec.rb +36 -0
  113. data/lib/capybara/spec/session/refresh_spec.rb +6 -2
  114. data/lib/capybara/spec/session/reset_session_spec.rb +19 -0
  115. data/lib/capybara/spec/session/response_code.rb +1 -0
  116. data/lib/capybara/spec/session/save_and_open_page_spec.rb +1 -0
  117. data/lib/capybara/spec/session/save_and_open_screenshot_spec.rb +6 -11
  118. data/lib/capybara/spec/session/save_page_spec.rb +1 -17
  119. data/lib/capybara/spec/session/save_screenshot_spec.rb +3 -3
  120. data/lib/capybara/spec/session/select_spec.rb +21 -20
  121. data/lib/capybara/spec/session/selectors_spec.rb +2 -2
  122. data/lib/capybara/spec/session/sibling_spec.rb +1 -1
  123. data/lib/capybara/spec/session/text_spec.rb +17 -3
  124. data/lib/capybara/spec/session/title_spec.rb +11 -1
  125. data/lib/capybara/spec/session/uncheck_spec.rb +4 -3
  126. data/lib/capybara/spec/session/unselect_spec.rb +7 -6
  127. data/lib/capybara/spec/session/visit_spec.rb +64 -3
  128. data/lib/capybara/spec/session/window/become_closed_spec.rb +2 -1
  129. data/lib/capybara/spec/session/window/current_window_spec.rb +1 -0
  130. data/lib/capybara/spec/session/window/open_new_window_spec.rb +1 -0
  131. data/lib/capybara/spec/session/window/switch_to_window_spec.rb +2 -1
  132. data/lib/capybara/spec/session/window/window_opened_by_spec.rb +2 -1
  133. data/lib/capybara/spec/session/window/window_spec.rb +12 -12
  134. data/lib/capybara/spec/session/window/windows_spec.rb +2 -3
  135. data/lib/capybara/spec/session/window/within_window_spec.rb +15 -71
  136. data/lib/capybara/spec/session/within_spec.rb +1 -0
  137. data/lib/capybara/spec/spec_helper.rb +36 -18
  138. data/lib/capybara/spec/test_app.rb +17 -9
  139. data/lib/capybara/spec/views/form.erb +7 -0
  140. data/lib/capybara/spec/views/initial_alert.erb +10 -0
  141. data/lib/capybara/spec/views/with_fixed_header_footer.erb +17 -0
  142. data/lib/capybara/spec/views/with_hover.erb +5 -0
  143. data/lib/capybara/spec/views/with_html.erb +27 -1
  144. data/lib/capybara/spec/views/with_js.erb +11 -0
  145. data/lib/capybara/spec/views/within_frames.erb +4 -1
  146. data/lib/capybara/version.rb +2 -1
  147. data/lib/capybara/window.rb +6 -10
  148. data/lib/capybara.rb +29 -26
  149. data/spec/basic_node_spec.rb +1 -0
  150. data/spec/capybara_spec.rb +16 -69
  151. data/spec/dsl_spec.rb +5 -13
  152. data/spec/filter_set_spec.rb +5 -4
  153. data/spec/fixtures/selenium_driver_rspec_failure.rb +2 -1
  154. data/spec/fixtures/selenium_driver_rspec_success.rb +3 -2
  155. data/spec/minitest_spec.rb +13 -4
  156. data/spec/minitest_spec_spec.rb +12 -3
  157. data/spec/per_session_config_spec.rb +9 -8
  158. data/spec/rack_test_spec.rb +21 -20
  159. data/spec/result_spec.rb +17 -16
  160. data/spec/rspec/features_spec.rb +17 -14
  161. data/spec/rspec/scenarios_spec.rb +5 -7
  162. data/spec/rspec/shared_spec_matchers.rb +96 -99
  163. data/spec/rspec/views_spec.rb +2 -1
  164. data/spec/rspec_matchers_spec.rb +18 -2
  165. data/spec/rspec_spec.rb +11 -15
  166. data/spec/selector_spec.rb +5 -6
  167. data/spec/selenium_spec_chrome.rb +20 -11
  168. data/spec/selenium_spec_edge.rb +27 -0
  169. data/spec/selenium_spec_ie.rb +31 -0
  170. data/spec/selenium_spec_marionette.rb +38 -12
  171. data/spec/server_spec.rb +33 -33
  172. data/spec/session_spec.rb +2 -1
  173. data/spec/shared_selenium_session.rb +82 -22
  174. data/spec/spec_helper.rb +3 -6
  175. metadata +76 -81
  176. data/lib/capybara/query.rb +0 -7
  177. data/spec/selenium_spec_firefox.rb +0 -68
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ Capybara::SpecHelper.spec "#to_capybara_node" do
4
+ before do
5
+ @session.visit('/with_html')
6
+ end
7
+
8
+ class NodeWrapper
9
+ def initialize(element); @element = element end
10
+ def to_capybara_node(); @element end
11
+ end
12
+
13
+ it "should support have_xxx expectations" do
14
+ para = NodeWrapper.new(@session.find(:css, '#first'))
15
+ expect(para).to have_link("ullamco")
16
+ end
17
+
18
+ it "should support within" do
19
+ para = NodeWrapper.new(@session.find(:css, '#first'))
20
+ expect(@session).to have_css('#second')
21
+ @session.within(para) do
22
+ expect(@session).to have_link('ullamco')
23
+ expect(@session).not_to have_css('#second')
24
+ end
25
+ end
26
+
27
+ it "should generate correct errors" do
28
+ para = NodeWrapper.new(@session.find(:css, '#first'))
29
+ expect do
30
+ expect(para).to have_text("Header Class Test One")
31
+ end.to raise_error(/^expected to find text "Header Class Test One" in "Lore/)
32
+ expect do
33
+ expect(para).to have_css('#second')
34
+ end.to raise_error(/^expected to find visible css "#second" within #<Capybara::Node::Element/)
35
+ end
36
+ end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  Capybara::SpecHelper.spec '#refresh' do
3
4
  it "reload the page" do
4
5
  @session.visit('/form')
@@ -17,12 +18,15 @@ Capybara::SpecHelper.spec '#refresh' do
17
18
  end
18
19
 
19
20
  it "it reposts" do
21
+ if marionette?(@session) || edge?(@session) || ie?(@session)
22
+ skip "Firefox and Edge insist on prompting without providing a way to suppress"
23
+ end
20
24
  @session.visit('/form')
21
25
  @session.select('Sweden', from: 'form_region')
22
26
  @session.click_button('awesome')
23
- expect {
27
+ expect do
24
28
  @session.refresh
25
29
  sleep 2
26
- }.to change{ extract_results(@session)['post_count'] }.by(1)
30
+ end.to change { extract_results(@session)['post_count'] }.by(1)
27
31
  end
28
32
  end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  Capybara::SpecHelper.spec '#reset_session!' do
3
4
  it "removes cookies" do
4
5
  @session.visit('/set_cookie')
@@ -62,6 +63,24 @@ Capybara::SpecHelper.spec '#reset_session!' do
62
63
  expect(@session.current_path).to eq("/")
63
64
  end
64
65
 
66
+ it "closes extra windows", requires: [:windows] do
67
+ @session.visit('/with_html')
68
+ @session.open_new_window
69
+ @session.open_new_window
70
+ expect(@session.windows.size).to eq 3
71
+ @session.reset_session!
72
+ expect(@session.windows.size).to eq 1
73
+ end
74
+
75
+ it "closes extra windows when not on the first window", requires: [:windows] do
76
+ @session.visit('/with_html')
77
+ @session.switch_to_window(@session.open_new_window)
78
+ @session.open_new_window
79
+ expect(@session.windows.size).to eq 3
80
+ @session.reset_session!
81
+ expect(@session.windows.size).to eq 1
82
+ end
83
+
65
84
  context "When reuse_server == false" do
66
85
  before do
67
86
  @reuse_server = Capybara.reuse_server
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  Capybara::SpecHelper.spec '#status_code' do
3
4
  it "should return response codes", requires: [:status_code] do
4
5
  @session.visit('/with_simple_html')
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'launchy'
3
4
 
4
5
  Capybara::SpecHelper.spec '#save_and_open_page' do
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'launchy'
3
4
 
4
5
  Capybara::SpecHelper.spec '#save_and_open_screenshot' do
@@ -13,8 +14,8 @@ Capybara::SpecHelper.spec '#save_and_open_screenshot' do
13
14
 
14
15
  @session.save_and_open_screenshot
15
16
 
16
- expect(@session.driver).to have_received(:save_screenshot).
17
- with(expected_file_regex, {})
17
+ expect(@session.driver).to have_received(:save_screenshot)
18
+ .with(expected_file_regex, {})
18
19
  expect(Launchy).to have_received(:open).with(expected_file_regex)
19
20
  end
20
21
 
@@ -25,8 +26,8 @@ Capybara::SpecHelper.spec '#save_and_open_screenshot' do
25
26
 
26
27
  @session.save_and_open_screenshot(custom_path)
27
28
 
28
- expect(@session.driver).to have_received(:save_screenshot).
29
- with(/#{custom_path}$/, {})
29
+ expect(@session.driver).to have_received(:save_screenshot)
30
+ .with(/#{custom_path}$/, {})
30
31
  expect(Launchy).to have_received(:open).with(/#{custom_path}$/)
31
32
  end
32
33
 
@@ -34,14 +35,8 @@ Capybara::SpecHelper.spec '#save_and_open_screenshot' do
34
35
  it 'prints out a correct warning message', requires: [:screenshot] do
35
36
  file_path = File.join(Dir.tmpdir, 'test.png')
36
37
  allow(@session).to receive(:require).with('launchy').and_raise(LoadError)
37
- allow(@session).to receive(:warn)
38
-
38
+ expect(@session).to receive(:warn).with("File saved to #{file_path}.\nPlease install the launchy gem to open the file automatically.")
39
39
  @session.save_and_open_screenshot(file_path)
40
-
41
- expect(@session).to have_received(:warn).
42
- with("File saved to #{file_path}.")
43
- expect(@session).to have_received(:warn).
44
- with('Please install the launchy gem to open the file automatically.')
45
40
  end
46
41
  end
47
42
  end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  Capybara::SpecHelper.spec '#save_page' do
3
4
  let(:alternative_path) { File.join(Dir.pwd, "save_and_open_page_tmp") }
4
5
  before do
@@ -6,7 +7,6 @@ Capybara::SpecHelper.spec '#save_page' do
6
7
  end
7
8
 
8
9
  after do
9
- Capybara.save_and_open_page_path = nil
10
10
  Capybara.save_path = nil
11
11
  Dir.glob("capybara-*.html").each do |file|
12
12
  FileUtils.rm(file)
@@ -104,20 +104,4 @@ Capybara::SpecHelper.spec '#save_page' do
104
104
  expect(result).to include("Bar")
105
105
  end
106
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
123
107
  end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  Capybara::SpecHelper.spec '#save_screenshot', requires: [:screenshot] do
3
4
  let(:alternative_path) { File.join(Dir.pwd, "save_screenshot_tmp") }
4
5
  before do
@@ -6,7 +7,6 @@ Capybara::SpecHelper.spec '#save_screenshot', requires: [:screenshot] do
6
7
  end
7
8
 
8
9
  after do
9
- Capybara.save_and_open_page_path = nil
10
10
  Capybara.save_path = nil
11
11
  FileUtils.rm_rf alternative_path
12
12
  end
@@ -16,7 +16,7 @@ Capybara::SpecHelper.spec '#save_screenshot', requires: [:screenshot] do
16
16
 
17
17
  @session.save_screenshot
18
18
 
19
- regexp = Regexp.new(File.expand_path('capybara-\d+\.png'))
19
+ regexp = Regexp.new(File.join(Dir.pwd, 'capybara-\d+\.png'))
20
20
  expect(@session.driver).to have_received(:save_screenshot).with(regexp, {})
21
21
  end
22
22
 
@@ -36,7 +36,7 @@ Capybara::SpecHelper.spec '#save_screenshot', requires: [:screenshot] do
36
36
 
37
37
  @session.save_screenshot
38
38
 
39
- regexp = Regexp.new(File.expand_path('capybara-\d+\.png', alternative_path))
39
+ regexp = Regexp.new(File.join(alternative_path, 'capybara-\d+\.png'))
40
40
  expect(@session.driver).to have_received(:save_screenshot).with(regexp, {})
41
41
  end
42
42
 
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  Capybara::SpecHelper.spec "#select" do
3
4
  before do
4
5
  @session.visit('/form')
@@ -13,24 +14,24 @@ Capybara::SpecHelper.spec "#select" do
13
14
  expect(@session.find_field('Title').value).to eq('Miss')
14
15
  end
15
16
 
16
- it "should allow selecting options where there are inexact matches" do
17
+ it "should allow selecting exact options where there are inexact matches", :exact_false do
17
18
  @session.select("Mr", from: 'Title')
18
19
  expect(@session.find_field('Title').value).to eq('Mr')
19
20
  end
20
21
 
21
- it "should allow selecting options where they are the only inexact match" do
22
+ it "should allow selecting options where they are the only inexact match", :exact_false do
22
23
  @session.select("Mis", from: 'Title')
23
24
  expect(@session.find_field('Title').value).to eq('Miss')
24
25
  end
25
26
 
26
- it "should not allow selecting options where they are the only inexact match if `Capybara.exact_options = true`" do
27
- Capybara.exact_options = true
27
+ it "should not allow selecting options where they are the only inexact match if `exact: true` is specified" do
28
+ sel = @session.find(:select, 'Title')
28
29
  expect do
29
- @session.select("Mis", from: 'Title')
30
+ sel.select("Mis", exact: true)
30
31
  end.to raise_error(Capybara::ElementNotFound)
31
32
  end
32
33
 
33
- it "should not allow selecting an option if the match is ambiguous" do
34
+ it "should not allow selecting an option if the match is ambiguous", :exact_false do
34
35
  expect do
35
36
  @session.select("M", from: 'Title')
36
37
  end.to raise_error(Capybara::Ambiguous)
@@ -79,7 +80,7 @@ Capybara::SpecHelper.spec "#select" do
79
80
  end
80
81
 
81
82
  it "casts to string" do
82
- @session.select(:"Miss", from: :'Title')
83
+ @session.select(:Miss, from: :Title)
83
84
  expect(@session.find_field('Title').value).to eq('Miss')
84
85
  end
85
86
 
@@ -94,7 +95,7 @@ Capybara::SpecHelper.spec "#select" do
94
95
 
95
96
  context "with an option that doesn't exist" do
96
97
  it "should raise an error" do
97
- msg = "Unable to find visible option \"Does not Exist\""
98
+ msg = /^Unable to find visible option "Does not Exist" within/
98
99
  expect do
99
100
  @session.select('Does not Exist', from: 'form_locale')
100
101
  end.to raise_error(Capybara::ElementNotFound, msg)
@@ -123,32 +124,32 @@ Capybara::SpecHelper.spec "#select" do
123
124
 
124
125
  context "with multiple select" do
125
126
  it "should return an empty value" do
126
- expect(@session.find_field('Language').value).to eq([])
127
+ expect(@session.find_field('Languages').value).to eq([])
127
128
  end
128
129
 
129
130
  it "should return value of the selected options" do
130
- @session.select("Ruby", from: 'Language')
131
- @session.select("Javascript", from: 'Language')
132
- expect(@session.find_field('Language').value).to include('Ruby', 'Javascript')
131
+ @session.select("Ruby", from: 'Languages')
132
+ @session.select("Javascript", from: 'Languages')
133
+ expect(@session.find_field('Languages').value).to include('Ruby', 'Javascript')
133
134
  end
134
135
 
135
136
  it "should select one option" do
136
- @session.select("Ruby", from: 'Language')
137
+ @session.select("Ruby", from: 'Languages')
137
138
  @session.click_button('awesome')
138
139
  expect(extract_results(@session)['languages']).to eq(['Ruby'])
139
140
  end
140
141
 
141
142
  it "should select multiple options" do
142
- @session.select("Ruby", from: 'Language')
143
- @session.select("Javascript", from: 'Language')
143
+ @session.select("Ruby", from: 'Languages')
144
+ @session.select("Javascript", from: 'Languages')
144
145
  @session.click_button('awesome')
145
146
  expect(extract_results(@session)['languages']).to include('Ruby', 'Javascript')
146
147
  end
147
148
 
148
149
  it "should remain selected if already selected" do
149
- @session.select("Ruby", from: 'Language')
150
- @session.select("Javascript", from: 'Language')
151
- @session.select("Ruby", from: 'Language')
150
+ @session.select("Ruby", from: 'Languages')
151
+ @session.select("Javascript", from: 'Languages')
152
+ @session.select("Ruby", from: 'Languages')
152
153
  @session.click_button('awesome')
153
154
  expect(extract_results(@session)['languages']).to include('Ruby', 'Javascript')
154
155
  end
@@ -161,7 +162,7 @@ Capybara::SpecHelper.spec "#select" do
161
162
  context "with :exact option" do
162
163
  context "when `false`" do
163
164
  it "can match select box approximately" do
164
- @session.select("Finish", from: "Loc", exact: false)
165
+ @session.select("Finish", from: "Loc", exact: false)
165
166
  @session.click_button("awesome")
166
167
  expect(extract_results(@session)["locale"]).to eq("fi")
167
168
  end
@@ -194,7 +195,7 @@ Capybara::SpecHelper.spec "#select" do
194
195
 
195
196
  it "can match option approximately when :from not given" do
196
197
  expect do
197
- @session.select("made-up language", exact: true)
198
+ @session.select("made-up language", exact: true)
198
199
  end.to raise_error(Capybara::ElementNotFound)
199
200
  end
200
201
  end
@@ -59,7 +59,7 @@ Capybara::SpecHelper.spec Capybara::Selector do
59
59
  it "can find by class" do
60
60
  expect(@session.find(:field, class: 'confusion-checkbox')['id']).to eq 'confusion_checkbox'
61
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'
62
+ expect(@session.find(:field, class: ['confusion', 'confusion-textarea'])['id']).to eq 'confusion_textarea'
63
63
  end
64
64
  end
65
- end
65
+ end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  Capybara::SpecHelper.spec '#sibling' do
3
4
  before do
4
5
  @session.visit('/with_html')
@@ -42,7 +43,6 @@ Capybara::SpecHelper.spec '#sibling' do
42
43
  end
43
44
  end
44
45
 
45
-
46
46
  it "should raise ElementNotFound with a useful default message if nothing was found" do
47
47
  el = @session.find(:css, '#child')
48
48
  expect do
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  Capybara::SpecHelper.spec '#text' do
3
4
  it "should print the text of the page" do
4
5
  @session.visit('/with_simple_html')
@@ -50,9 +51,22 @@ Capybara::SpecHelper.spec '#text' do
50
51
  after { Capybara.default_selector = :xpath }
51
52
  end
52
53
 
53
- it "should strip whitespace" do
54
+ it "should be correctly normalized when visible" do
55
+ @session.visit('/with_html')
56
+ el = @session.find(:css, '#normalized')
57
+ expect(el.text).to eq "Some text\nMore text\nAnd more text\nEven more text on multiple lines"
58
+ end
59
+
60
+ it "should be a textContent with irrelevant whitespace collapsed when non-visible" do
61
+ @session.visit('/with_html')
62
+ el = @session.find(:css, '#non_visible_normalized', visible: false)
63
+ expect(el.text(:all)).to eq "Some textMore text And more text Even more text on multiple lines"
64
+ end
65
+
66
+ it "should strip correctly" do
54
67
  @session.visit('/with_html')
55
- @session.find(:css, '#second')
56
- expect(@session.find(:css, '#second').text).to match(/\ADuis aute .* text with whitespace .* est laborum\.\z/)
68
+ el = @session.find(:css, '#ws')
69
+ expect(el.text).to eq " "
70
+ expect(el.text(:all)).to eq " "
57
71
  end
58
72
  end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
- Capybara::SpecHelper.spec '#title' do
3
2
 
3
+ Capybara::SpecHelper.spec '#title' do
4
4
  it "should get the title of the page" do
5
5
  @session.visit('/with_title')
6
6
  expect(@session.title).to eq('Test Title')
@@ -14,4 +14,14 @@ Capybara::SpecHelper.spec '#title' do
14
14
  end
15
15
  after { Capybara.default_selector = :xpath }
16
16
  end
17
+
18
+ context "within iframe", requires: [:frames] do
19
+ it "should get the title of the top level browsing context" do
20
+ @session.visit('/within_frames')
21
+ expect(@session.title).to eq('With Frames')
22
+ @session.within_frame('frameOne') do
23
+ expect(@session.title).to eq('With Frames')
24
+ end
25
+ end
26
+ end
17
27
  end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  Capybara::SpecHelper.spec "#uncheck" do
3
4
  before do
4
5
  @session.visit('/form')
@@ -19,7 +20,7 @@ Capybara::SpecHelper.spec "#uncheck" do
19
20
  end
20
21
 
21
22
  it "casts to string" do
22
- @session.uncheck(:"form_pets_hamster")
23
+ @session.uncheck(:form_pets_hamster)
23
24
  @session.click_button('awesome')
24
25
  expect(extract_results(@session)['pets']).to include('dog')
25
26
  expect(extract_results(@session)['pets']).not_to include('hamster')
@@ -69,11 +70,11 @@ Capybara::SpecHelper.spec "#uncheck" do
69
70
  end
70
71
 
71
72
  it "should raise original error when no label available" do
72
- expect { @session.uncheck('form_cars_ariel') }.to raise_error(Capybara::ElementNotFound, 'Unable to find visible checkbox "form_cars_ariel" that is not disabled')
73
+ expect { @session.uncheck('form_cars_porsche') }.to raise_error(Capybara::ElementNotFound, 'Unable to find visible checkbox "form_cars_porsche" that is not disabled')
73
74
  end
74
75
 
75
76
  it "should raise error if not allowed to click label" do
76
- expect{@session.uncheck('form_cars_jaguar', allow_label_click: false)}.to raise_error(Capybara::ElementNotFound, 'Unable to find visible checkbox "form_cars_jaguar" that is not disabled')
77
+ expect { @session.uncheck('form_cars_jaguar', allow_label_click: false) }.to raise_error(Capybara::ElementNotFound, 'Unable to find visible checkbox "form_cars_jaguar" that is not disabled')
77
78
  end
78
79
  end
79
80
  end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  Capybara::SpecHelper.spec "#unselect" do
3
4
  before do
4
5
  @session.visit('/form')
@@ -40,7 +41,7 @@ Capybara::SpecHelper.spec "#unselect" do
40
41
  end
41
42
 
42
43
  it "casts to string" do
43
- @session.unselect(:"Briefs", from: :'Underwear')
44
+ @session.unselect(:Briefs, from: :Underwear)
44
45
  @session.click_button('awesome')
45
46
  expect(extract_results(@session)['underwear']).to include('Commando', 'Boxerbriefs')
46
47
  expect(extract_results(@session)['underwear']).not_to include('Briefs')
@@ -64,7 +65,7 @@ Capybara::SpecHelper.spec "#unselect" do
64
65
 
65
66
  context "with an option that doesn't exist" do
66
67
  it "should raise an error" do
67
- msg = 'Unable to find visible option "Does not Exist"'
68
+ msg = /^Unable to find visible option "Does not Exist" within/
68
69
  expect do
69
70
  @session.unselect('Does not Exist', from: 'form_underwear')
70
71
  end.to raise_error(Capybara::ElementNotFound, msg)
@@ -74,19 +75,19 @@ Capybara::SpecHelper.spec "#unselect" do
74
75
  context "with :exact option" do
75
76
  context "when `false`" do
76
77
  it "can match select box approximately" do
77
- @session.unselect("Boxerbriefs", from: "Under", exact: false)
78
+ @session.unselect("Boxerbriefs", from: "Under", exact: false)
78
79
  @session.click_button("awesome")
79
80
  expect(extract_results(@session)["underwear"]).not_to include("Boxerbriefs")
80
81
  end
81
82
 
82
83
  it "can match option approximately" do
83
- @session.unselect("Boxerbr", from: "Underwear", exact: false)
84
+ @session.unselect("Boxerbr", from: "Underwear", exact: false)
84
85
  @session.click_button("awesome")
85
86
  expect(extract_results(@session)["underwear"]).not_to include("Boxerbriefs")
86
87
  end
87
88
 
88
89
  it "can match option approximately when :from not given" do
89
- @session.unselect("Boxerbr", exact: false)
90
+ @session.unselect("Boxerbr", exact: false)
90
91
  @session.click_button("awesome")
91
92
  expect(extract_results(@session)["underwear"]).not_to include("Boxerbriefs")
92
93
  end
@@ -107,7 +108,7 @@ Capybara::SpecHelper.spec "#unselect" do
107
108
 
108
109
  it "can match option approximately when :from not given" do
109
110
  expect do
110
- @session.unselect("Boxerbr", exact: true)
111
+ @session.unselect("Boxerbr", exact: true)
111
112
  end.to raise_error(Capybara::ElementNotFound)
112
113
  end
113
114
  end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  Capybara::SpecHelper.spec '#visit' do
3
4
  it "should fetch a response from the driver with a relative url" do
4
5
  @session.visit('/')
@@ -27,6 +28,14 @@ Capybara::SpecHelper.spec '#visit' do
27
28
  expect(@session).to have_content('Hello world!')
28
29
  end
29
30
 
31
+ it "should fetch a response when sequentially visiting same destination with a target" do
32
+ skip "Chrome/chromedriver has an issue visiting URL with target after visiting same URL without target" if chrome_lt?(65.0, @session)
33
+ @session.visit('/form')
34
+ expect(@session).to have_css('#form_title')
35
+ @session.visit('/form#form_title')
36
+ expect(@session).to have_css('#form_title')
37
+ end
38
+
30
39
  it "raises any errors caught inside the server", requires: [:server] do
31
40
  quietly { @session.visit("/error") }
32
41
  expect do
@@ -40,7 +49,6 @@ Capybara::SpecHelper.spec '#visit' do
40
49
  end
41
50
 
42
51
  context "when Capybara.always_include_port is true" do
43
-
44
52
  let(:root_uri) do
45
53
  @session.visit('/')
46
54
  URI.parse(@session.current_url)
@@ -63,6 +71,55 @@ Capybara::SpecHelper.spec '#visit' do
63
71
  expect(URI.parse(@session.current_url).port).to eq(root_uri.port)
64
72
  expect(@session).to have_content('Another World')
65
73
  end
74
+
75
+ it "should add the server port to a visited url if no port specified", requires: [:server] do
76
+ expect(@session.driver).to receive(:visit).with("http://www.example.com:#{@session.server.port}")
77
+ @session.visit("http://www.example.com")
78
+ end
79
+
80
+ it "should not override the visit specified port even if default for scheme", requires: [:server] do
81
+ expect(@session.driver).to receive(:visit).with("http://www.example.com:80")
82
+ @session.visit('http://www.example.com:80')
83
+ end
84
+
85
+ it "should give preference to app_host port if specified", requires: [:server] do
86
+ Capybara.app_host = "http://www.example.com:6666"
87
+ expect(@session.driver).to receive(:visit).with("http://www.example.com:6666/random")
88
+ @session.visit('/random')
89
+ end
90
+
91
+ it "shouldn't override port if no server", requires: [:server] do
92
+ session = Capybara::Session.new(@session.mode, nil)
93
+ expect(session.driver).to receive(:visit).with("http://www.google.com")
94
+ session.visit("http://www.google.com")
95
+ end
96
+
97
+ it "shouldn't override port if no server but app_host is set", requires: [:server] do
98
+ session = Capybara::Session.new(@session.mode, nil)
99
+ Capybara.app_host = "http://www.example.com:6666"
100
+ expect(session.driver).to receive(:visit).with("http://www.google.com")
101
+ session.visit("http://www.google.com")
102
+ end
103
+ end
104
+
105
+ context "when Capybara.always_include_port is false" do
106
+ before(:each) do
107
+ Capybara.always_include_port = false
108
+ end
109
+
110
+ it "shouldn't overwrite port if app_host is set", requires: [:server] do
111
+ session = Capybara::Session.new(@session.mode, nil)
112
+ Capybara.app_host = "http://www.example.com:6666"
113
+ expect(session.driver).to receive(:visit).with("http://www.google.com")
114
+ session.visit("http://www.google.com")
115
+ end
116
+
117
+ it "shouldn't overwrite port if port specfified", requires: [:server] do
118
+ session = Capybara::Session.new(@session.mode, nil)
119
+ Capybara.app_host = "http://www.example.com:6666"
120
+ expect(session.driver).to receive(:visit).with("http://www.google.com:99")
121
+ session.visit("http://www.google.com:99")
122
+ end
66
123
  end
67
124
 
68
125
  context "without a server", requires: [:server] do
@@ -96,8 +153,13 @@ Capybara::SpecHelper.spec '#visit' do
96
153
  @session.visit('/times')
97
154
  expect(@session).to have_content('redirection complete')
98
155
  end
99
- end
100
156
 
157
+ it "should work if `app_host` has a trailing /", requires: [:server] do
158
+ Capybara.app_host = "http://#{@session.server.host}:#{@session.server.port}/"
159
+ @session.visit('/')
160
+ expect(@session).to have_content('Hello world!')
161
+ end
162
+ end
101
163
 
102
164
  it "should send no referer when visiting a page" do
103
165
  @session.visit '/get_referer'
@@ -133,5 +195,4 @@ Capybara::SpecHelper.spec '#visit' do
133
195
  @session.visit('/get_cookie')
134
196
  expect(@session).to have_content('root cookie')
135
197
  end
136
-
137
198
  end
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
- Capybara::SpecHelper.spec '#become_closed', requires: [:windows, :js] do
2
+
3
+ Capybara::SpecHelper.spec '#become_closed', requires: %i[windows js] do
3
4
  before(:each) do
4
5
  @window = @session.current_window
5
6
  @session.visit('/with_windows')
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  Capybara::SpecHelper.spec '#current_window', requires: [:windows] do
3
4
  before(:each) do
4
5
  @window = @session.current_window
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  Capybara::SpecHelper.spec '#open_new_window', requires: [:windows] do
3
4
  before(:each) do
4
5
  @window = @session.current_window
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  Capybara::SpecHelper.spec '#switch_to_window', requires: [:windows] do
3
4
  before(:each) do
4
5
  @window = @session.current_window
@@ -121,7 +122,7 @@ Capybara::SpecHelper.spec '#switch_to_window', requires: [:windows] do
121
122
  it "should wait for window to appear" do
122
123
  @session.find(:css, '#openWindowWithTimeout').click
123
124
  expect do
124
- @session.switch_to_window(wait: 5) { @session.title == 'Title of the first popup'}
125
+ @session.switch_to_window(wait: 5) { @session.title == 'Title of the first popup' }
125
126
  end.not_to raise_error
126
127
  end
127
128
  end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  Capybara::SpecHelper.spec '#window_opened_by', requires: [:windows] do
3
4
  before(:each) do
4
5
  @window = @session.current_window
@@ -20,7 +21,7 @@ Capybara::SpecHelper.spec '#window_opened_by', requires: [:windows] do
20
21
  it 'should raise error if value of :wait is less than timeout' do
21
22
  # So large value is used as `driver.window_handles` takes up to 800 ms on Travis
22
23
  Capybara.using_wait_time 2 do
23
- button=@session.find(:css, '#openWindowWithLongerTimeout')
24
+ button = @session.find(:css, '#openWindowWithLongerTimeout')
24
25
  expect do
25
26
  @session.window_opened_by(wait: 0.3) do
26
27
  button.click