capybara 2.5.0 → 2.18.0

Sign up to get free protection for your applications and to get access to all the features.
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 "#uncheck" do
2
3
  before do
3
4
  @session.visit('/form')
@@ -26,15 +27,54 @@ Capybara::SpecHelper.spec "#uncheck" do
26
27
 
27
28
  context "with :exact option" do
28
29
  it "should accept partial matches when false" do
29
- @session.uncheck('Ham', :exact => false)
30
+ @session.uncheck('Ham', exact: false)
30
31
  @session.click_button('awesome')
31
32
  expect(extract_results(@session)['pets']).not_to include('hamster')
32
33
  end
33
34
 
34
35
  it "should not accept partial matches when true" do
35
36
  expect do
36
- @session.uncheck('Ham', :exact => true)
37
+ @session.uncheck('Ham', exact: true)
37
38
  end.to raise_error(Capybara::ElementNotFound)
38
39
  end
39
40
  end
41
+
42
+ context "when checkbox hidden" do
43
+ context "with Capybara.automatic_label_click == true" do
44
+ around do |spec|
45
+ old_click_label, Capybara.automatic_label_click = Capybara.automatic_label_click, true
46
+ spec.run
47
+ Capybara.automatic_label_click = old_click_label
48
+ end
49
+
50
+ it "should uncheck via clicking the label with :for attribute if possible" do
51
+ expect(@session.find(:checkbox, 'form_cars_jaguar', checked: true, visible: :hidden)).to be
52
+ @session.uncheck('form_cars_jaguar')
53
+ @session.click_button('awesome')
54
+ expect(extract_results(@session)['cars']).not_to include('jaguar')
55
+ end
56
+
57
+ it "should uncheck via clicking the wrapping label if possible" do
58
+ expect(@session.find(:checkbox, 'form_cars_koenigsegg', checked: true, visible: :hidden)).to be
59
+ @session.uncheck('form_cars_koenigsegg')
60
+ @session.click_button('awesome')
61
+ expect(extract_results(@session)['cars']).not_to include('koenigsegg')
62
+ end
63
+
64
+ it "should not click the label if unneeded" do
65
+ expect(@session.find(:checkbox, 'form_cars_tesla', unchecked: true, visible: :hidden)).to be
66
+ @session.uncheck('form_cars_tesla')
67
+ @session.click_button('awesome')
68
+ expect(extract_results(@session)['cars']).not_to include('tesla')
69
+ end
70
+
71
+ 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
+ end
74
+
75
+ 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
+ end
78
+ end
79
+ end
40
80
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  Capybara::SpecHelper.spec "#unselect" do
2
3
  before do
3
4
  @session.visit('/form')
@@ -5,7 +6,7 @@ Capybara::SpecHelper.spec "#unselect" do
5
6
 
6
7
  context "with multiple select" do
7
8
  it "should unselect an option from a select box by id" do
8
- @session.unselect('Commando', :from => 'form_underwear')
9
+ @session.unselect('Commando', from: 'form_underwear')
9
10
  @session.click_button('awesome')
10
11
  expect(extract_results(@session)['underwear']).to include('Briefs', 'Boxerbriefs')
11
12
  expect(extract_results(@session)['underwear']).not_to include('Commando')
@@ -19,27 +20,27 @@ Capybara::SpecHelper.spec "#unselect" do
19
20
  end
20
21
 
21
22
  it "should unselect an option from a select box by label" do
22
- @session.unselect('Commando', :from => 'Underwear')
23
+ @session.unselect('Commando', from: 'Underwear')
23
24
  @session.click_button('awesome')
24
25
  expect(extract_results(@session)['underwear']).to include('Briefs', 'Boxerbriefs')
25
26
  expect(extract_results(@session)['underwear']).not_to include('Commando')
26
27
  end
27
28
 
28
29
  it "should favour exact matches to option labels" do
29
- @session.unselect("Briefs", :from => 'Underwear')
30
+ @session.unselect("Briefs", from: 'Underwear')
30
31
  @session.click_button('awesome')
31
32
  expect(extract_results(@session)['underwear']).to include('Commando', 'Boxerbriefs')
32
33
  expect(extract_results(@session)['underwear']).not_to include('Briefs')
33
34
  end
34
35
 
35
36
  it "should escape quotes" do
36
- @session.unselect("Frenchman's Pantalons", :from => 'Underwear')
37
+ @session.unselect("Frenchman's Pantalons", from: 'Underwear')
37
38
  @session.click_button('awesome')
38
39
  expect(extract_results(@session)['underwear']).not_to include("Frenchman's Pantalons")
39
40
  end
40
41
 
41
42
  it "casts to string" do
42
- @session.unselect(:"Briefs", :from => :'Underwear')
43
+ @session.unselect(:"Briefs", from: :'Underwear')
43
44
  @session.click_button('awesome')
44
45
  expect(extract_results(@session)['underwear']).to include('Commando', 'Boxerbriefs')
45
46
  expect(extract_results(@session)['underwear']).not_to include('Briefs')
@@ -48,24 +49,24 @@ Capybara::SpecHelper.spec "#unselect" do
48
49
 
49
50
  context "with single select" do
50
51
  it "should raise an error" do
51
- expect { @session.unselect("English", :from => 'form_locale') }.to raise_error(Capybara::UnselectNotAllowed)
52
+ expect { @session.unselect("English", from: 'form_locale') }.to raise_error(Capybara::UnselectNotAllowed)
52
53
  end
53
54
  end
54
55
 
55
56
  context "with a locator that doesn't exist" do
56
57
  it "should raise an error" do
57
- msg = "Unable to find select box \"does not exist\""
58
+ msg = "Unable to find visible select box \"does not exist\" that is not disabled"
58
59
  expect do
59
- @session.unselect('foo', :from => 'does not exist')
60
+ @session.unselect('foo', from: 'does not exist')
60
61
  end.to raise_error(Capybara::ElementNotFound, msg)
61
62
  end
62
63
  end
63
64
 
64
65
  context "with an option that doesn't exist" do
65
66
  it "should raise an error" do
66
- msg = "Unable to find option \"Does not Exist\""
67
+ msg = /^Unable to find visible option "Does not Exist" within/
67
68
  expect do
68
- @session.unselect('Does not Exist', :from => 'form_underwear')
69
+ @session.unselect('Does not Exist', from: 'form_underwear')
69
70
  end.to raise_error(Capybara::ElementNotFound, msg)
70
71
  end
71
72
  end
@@ -73,19 +74,19 @@ Capybara::SpecHelper.spec "#unselect" do
73
74
  context "with :exact option" do
74
75
  context "when `false`" do
75
76
  it "can match select box approximately" do
76
- @session.unselect("Boxerbriefs", :from => "Under", :exact => false)
77
+ @session.unselect("Boxerbriefs", from: "Under", exact: false)
77
78
  @session.click_button("awesome")
78
79
  expect(extract_results(@session)["underwear"]).not_to include("Boxerbriefs")
79
80
  end
80
81
 
81
82
  it "can match option approximately" do
82
- @session.unselect("Boxerbr", :from => "Underwear", :exact => false)
83
+ @session.unselect("Boxerbr", from: "Underwear", exact: false)
83
84
  @session.click_button("awesome")
84
85
  expect(extract_results(@session)["underwear"]).not_to include("Boxerbriefs")
85
86
  end
86
87
 
87
88
  it "can match option approximately when :from not given" do
88
- @session.unselect("Boxerbr", :exact => false)
89
+ @session.unselect("Boxerbr", exact: false)
89
90
  @session.click_button("awesome")
90
91
  expect(extract_results(@session)["underwear"]).not_to include("Boxerbriefs")
91
92
  end
@@ -94,19 +95,19 @@ Capybara::SpecHelper.spec "#unselect" do
94
95
  context "when `true`" do
95
96
  it "can match select box approximately" do
96
97
  expect do
97
- @session.unselect("Boxerbriefs", :from => "Under", :exact => true)
98
+ @session.unselect("Boxerbriefs", from: "Under", exact: true)
98
99
  end.to raise_error(Capybara::ElementNotFound)
99
100
  end
100
101
 
101
102
  it "can match option approximately" do
102
103
  expect do
103
- @session.unselect("Boxerbr", :from => "Underwear", :exact => true)
104
+ @session.unselect("Boxerbr", from: "Underwear", exact: true)
104
105
  end.to raise_error(Capybara::ElementNotFound)
105
106
  end
106
107
 
107
108
  it "can match option approximately when :from not given" do
108
109
  expect do
109
- @session.unselect("Boxerbr", :exact => true)
110
+ @session.unselect("Boxerbr", exact: true)
110
111
  end.to raise_error(Capybara::ElementNotFound)
111
112
  end
112
113
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  Capybara::SpecHelper.spec '#visit' do
2
3
  it "should fetch a response from the driver with a relative url" do
3
4
  @session.visit('/')
@@ -26,7 +27,7 @@ Capybara::SpecHelper.spec '#visit' do
26
27
  expect(@session).to have_content('Hello world!')
27
28
  end
28
29
 
29
- it "raises any errors caught inside the server", :requires => [:server] do
30
+ it "raises any errors caught inside the server", requires: [:server] do
30
31
  quietly { @session.visit("/error") }
31
32
  expect do
32
33
  @session.visit("/")
@@ -62,9 +63,59 @@ Capybara::SpecHelper.spec '#visit' do
62
63
  expect(URI.parse(@session.current_url).port).to eq(root_uri.port)
63
64
  expect(@session).to have_content('Another World')
64
65
  end
66
+
67
+ it "should add the server port to a visited url if no port specified", requires: [:server] do
68
+ expect(@session.driver).to receive(:visit).with("http://www.example.com:#{@session.server.port}")
69
+ @session.visit("http://www.example.com")
70
+ end
71
+
72
+ it "should not override the visit specified port even if default for scheme", requires: [:server] do
73
+ expect(@session.driver).to receive(:visit).with("http://www.example.com:80")
74
+ @session.visit('http://www.example.com:80')
75
+ end
76
+
77
+ it "should give preference to app_host port if specified", requires: [:server] do
78
+ Capybara.app_host = "http://www.example.com:6666"
79
+ expect(@session.driver).to receive(:visit).with("http://www.example.com:6666/random")
80
+ @session.visit('/random')
81
+ end
82
+
83
+ it "shouldn't override port if no server", requires: [:server] do
84
+ session = Capybara::Session.new(@session.mode, nil)
85
+ expect(session.driver).to receive(:visit).with("http://www.google.com")
86
+ session.visit("http://www.google.com")
87
+ end
88
+
89
+ it "shouldn't override port if no server but app_host is set", requires: [:server] do
90
+ session = Capybara::Session.new(@session.mode, nil)
91
+ Capybara.app_host = "http://www.example.com:6666"
92
+ expect(session.driver).to receive(:visit).with("http://www.google.com")
93
+ session.visit("http://www.google.com")
94
+ end
95
+ end
96
+
97
+ context "when Capybara.always_include_port is false" do
98
+ before(:each) do
99
+ Capybara.always_include_port = false
100
+ end
101
+
102
+ it "shouldn't overwrite port if app_host is set", requires: [:server] do
103
+ session = Capybara::Session.new(@session.mode, nil)
104
+ Capybara.app_host = "http://www.example.com:6666"
105
+ expect(session.driver).to receive(:visit).with("http://www.google.com")
106
+ session.visit("http://www.google.com")
107
+ end
108
+
109
+ it "shouldn't overwrite port if port specfified", requires: [:server] do
110
+ session = Capybara::Session.new(@session.mode, nil)
111
+ Capybara.app_host = "http://www.example.com:6666"
112
+ expect(session.driver).to receive(:visit).with("http://www.google.com:99")
113
+ session.visit("http://www.google.com:99")
114
+ end
65
115
  end
66
116
 
67
- context "without a server", :requires => [:server] do
117
+
118
+ context "without a server", requires: [:server] do
68
119
  it "should respect `app_host`" do
69
120
  serverless_session = Capybara::Session.new(@session.mode, nil)
70
121
  Capybara.app_host = "http://#{@session.server.host}:#{@session.server.port}"
@@ -79,6 +130,30 @@ Capybara::SpecHelper.spec '#visit' do
79
130
  end
80
131
  end
81
132
 
133
+ context "with Capybara.app_host set" do
134
+ it "should override server", requires: [:server] do
135
+ another_session = Capybara::Session.new(@session.mode, @session.app.dup)
136
+ Capybara.app_host = "http://#{@session.server.host}:#{@session.server.port}"
137
+ another_session.visit('/foo')
138
+ expect(another_session).to have_content("Another World")
139
+ expect(another_session.current_url).to start_with(Capybara.app_host)
140
+ expect(URI.parse(another_session.current_url).port).not_to eq another_session.server.port
141
+ expect(URI.parse(another_session.current_url).port).to eq @session.server.port
142
+ end
143
+
144
+ it "should append relative path", requires: [:server] do
145
+ Capybara.app_host = "http://#{@session.server.host}:#{@session.server.port}/redirect/0"
146
+ @session.visit('/times')
147
+ expect(@session).to have_content('redirection complete')
148
+ end
149
+
150
+ it "should work if `app_host` has a trailing /", requires: [:server] do
151
+ Capybara.app_host = "http://#{@session.server.host}:#{@session.server.port}/"
152
+ @session.visit('/')
153
+ expect(@session).to have_content('Hello world!')
154
+ end
155
+ end
156
+
82
157
  it "should send no referer when visiting a page" do
83
158
  @session.visit '/get_referer'
84
159
  expect(@session).to have_content 'No referer'
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  Capybara::SpecHelper.spec '#become_closed', requires: [:windows, :js] do
2
3
  before(:each) do
3
4
  @window = @session.current_window
@@ -20,18 +21,18 @@ Capybara::SpecHelper.spec '#become_closed', requires: [:windows, :js] do
20
21
  @session.execute_script('setTimeout(function(){ window.close(); }, 500);')
21
22
  end
22
23
  Capybara.using_wait_time 0.1 do
23
- expect(@other_window).to become_closed(wait: 2)
24
+ expect(@other_window).to become_closed(wait: 5)
24
25
  end
25
26
  end
26
27
 
27
28
  it 'should raise error if value of :wait is less than timeout' do
28
29
  @session.within_window @other_window do
29
- @session.execute_script('setTimeout(function(){ window.close(); }, 700);')
30
+ @session.execute_script('setTimeout(function(){ window.close(); }, 1000);')
30
31
  end
31
32
  Capybara.using_wait_time 2 do
32
33
  expect do
33
- expect(@other_window).to become_closed(wait: 0.4)
34
- end.to raise_error(RSpec::Expectations::ExpectationNotMetError, /\Aexpected #<Window @handle=".+"> to become closed after 0.4 seconds\Z/)
34
+ expect(@other_window).to become_closed(wait: 0.2)
35
+ end.to raise_error(RSpec::Expectations::ExpectationNotMetError, /\Aexpected #<Window @handle=".+"> to become closed after 0.2 seconds\Z/)
35
36
  end
36
37
  end
37
38
  end
@@ -41,7 +42,7 @@ Capybara::SpecHelper.spec '#become_closed', requires: [:windows, :js] do
41
42
  @session.within_window @other_window do
42
43
  @session.execute_script('setTimeout(function(){ window.close(); }, 500);')
43
44
  end
44
- Capybara.using_wait_time 1.5 do
45
+ Capybara.using_wait_time 5 do
45
46
  expect(@other_window).to become_closed
46
47
  end
47
48
  end
@@ -59,25 +60,25 @@ Capybara::SpecHelper.spec '#become_closed', requires: [:windows, :js] do
59
60
  end
60
61
 
61
62
  context 'with not_to' do
62
- it 'should raise error if default_max_wait_time is more than timeout' do
63
+ it "should not raise error if window doesn't close before default_max_wait_time" do
63
64
  @session.within_window @other_window do
64
- @session.execute_script('setTimeout(function(){ window.close(); }, 700);')
65
+ @session.execute_script('setTimeout(function(){ window.close(); }, 1000);')
65
66
  end
66
- Capybara.using_wait_time 0.4 do
67
+ Capybara.using_wait_time 0.3 do
67
68
  expect do
68
69
  expect(@other_window).not_to become_closed
69
70
  end
70
71
  end
71
72
  end
72
73
 
73
- it 'should raise error if default_max_wait_time is more than timeout' do
74
+ it 'should raise error if window closes before default_max_wait_time' do
74
75
  @session.within_window @other_window do
75
76
  @session.execute_script('setTimeout(function(){ window.close(); }, 700);')
76
77
  end
77
- Capybara.using_wait_time 1.1 do
78
+ Capybara.using_wait_time 3.1 do
78
79
  expect do
79
80
  expect(@other_window).not_to become_closed
80
- end.to raise_error(RSpec::Expectations::ExpectationNotMetError, /\Aexpected #<Window @handle=".+"> not to become closed after 1.1 seconds\Z/)
81
+ end.to raise_error(RSpec::Expectations::ExpectationNotMetError, /\Aexpected #<Window @handle=".+"> not to become closed after 3.1 seconds\Z/)
81
82
  end
82
83
  end
83
84
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  Capybara::SpecHelper.spec '#current_window', requires: [:windows] do
2
3
  before(:each) do
3
4
  @window = @session.current_window
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  Capybara::SpecHelper.spec '#open_new_window', requires: [:windows] do
2
3
  before(:each) do
3
4
  @window = @session.current_window
@@ -1,8 +1,11 @@
1
+ # frozen_string_literal: true
1
2
  Capybara::SpecHelper.spec '#switch_to_window', requires: [:windows] do
2
3
  before(:each) do
3
4
  @window = @session.current_window
4
5
  @session.visit('/with_windows')
6
+ expect(@session).to have_css('body.loaded')
5
7
  end
8
+
6
9
  after(:each) do
7
10
  (@session.windows - [@window]).each do |w|
8
11
  @session.switch_to_window w
@@ -46,7 +49,7 @@ Capybara::SpecHelper.spec '#switch_to_window', requires: [:windows] do
46
49
  context "with block" do
47
50
  before(:each) do
48
51
  @session.find(:css, '#openTwoWindows').click
49
- sleep(0.2) # wait for the windows to open
52
+ sleep(1) # wait for the windows to open
50
53
  end
51
54
 
52
55
  it "should be able to switch to current window" do
@@ -76,7 +79,7 @@ Capybara::SpecHelper.spec '#switch_to_window', requires: [:windows] do
76
79
  @session.within(:css, '#doesNotOpenWindows') do
77
80
  @session.switch_to_window { @session.title == 'With Windows' }
78
81
  end
79
- end.to raise_error(Capybara::ScopeError, "`switch_to_window` is not supposed to be invoked from `within`'s, `within_frame`'s' or `within_window`'s' block.")
82
+ end.to raise_error(Capybara::ScopeError, /`switch_to_window` is not supposed to be invoked/)
80
83
  end
81
84
 
82
85
  it "should raise error when invoked inside `within_frame` as it's nonsense" do
@@ -84,16 +87,18 @@ Capybara::SpecHelper.spec '#switch_to_window', requires: [:windows] do
84
87
  @session.within_frame('frameOne') do
85
88
  @session.switch_to_window { @session.title == 'With Windows' }
86
89
  end
87
- end.to raise_error(Capybara::ScopeError, "`switch_to_window` is not supposed to be invoked from `within`'s, `within_frame`'s' or `within_window`'s' block.")
90
+ end.to raise_error(Capybara::ScopeError, /`switch_to_window` is not supposed to be invoked from/)
88
91
  end
89
92
 
90
- it "should raise error when invoked inside `within_window` as it's nonsense" do
91
- window = (@session.windows - [@window]).first
92
- expect do
93
- @session.within_window window do
94
- @session.switch_to_window { @session.title == 'With Windows' }
95
- end
96
- end.to raise_error(Capybara::ScopeError, "`switch_to_window` is not supposed to be invoked from `within`'s, `within_frame`'s' or `within_window`'s' block.")
93
+ it "should allow to be called inside within_window and within_window will still return to original" do
94
+ other_windows = (@session.windows - [@window])
95
+ expect(@session.current_window).to eq(@window)
96
+ @session.within_window other_windows[0] do
97
+ expect(@session.current_window).to eq(other_windows[0])
98
+ @session.switch_to_window other_windows[1]
99
+ expect(@session.current_window).to eq(other_windows[1])
100
+ end
101
+ expect(@session.current_window).to eq(@window)
97
102
  end
98
103
 
99
104
  it "should raise error if window matching block wasn't found" do
@@ -116,7 +121,7 @@ Capybara::SpecHelper.spec '#switch_to_window', requires: [:windows] do
116
121
  it "should wait for window to appear" do
117
122
  @session.find(:css, '#openWindowWithTimeout').click
118
123
  expect do
119
- @session.switch_to_window { @session.title == 'Title of the first popup'}
124
+ @session.switch_to_window(wait: 5) { @session.title == 'Title of the first popup'}
120
125
  end.not_to raise_error
121
126
  end
122
127
  end
@@ -1,7 +1,9 @@
1
+ # frozen_string_literal: true
1
2
  Capybara::SpecHelper.spec '#window_opened_by', requires: [:windows] do
2
3
  before(:each) do
3
4
  @window = @session.current_window
4
5
  @session.visit('/with_windows')
6
+ expect(@session).to have_css('body.loaded')
5
7
  end
6
8
  after(:each) do
7
9
  (@session.windows - [@window]).each do |w|
@@ -20,12 +22,12 @@ Capybara::SpecHelper.spec '#window_opened_by', requires: [:windows] do
20
22
  Capybara.using_wait_time 2 do
21
23
  button=@session.find(:css, '#openWindowWithLongerTimeout')
22
24
  expect do
23
- @session.window_opened_by(wait: 0.8) do
25
+ @session.window_opened_by(wait: 0.3) do
24
26
  button.click
25
27
  end
26
28
  end.to raise_error(Capybara::WindowError, zero_windows_message)
27
29
  end
28
- @session.document.synchronize(2, errors: [Capybara::CapybaraError]) do
30
+ @session.document.synchronize(5, errors: [Capybara::CapybaraError]) do
29
31
  raise Capybara::CapybaraError if @session.windows.size != 2
30
32
  end
31
33
  end
@@ -44,7 +46,7 @@ Capybara::SpecHelper.spec '#window_opened_by', requires: [:windows] do
44
46
  context 'without :wait option' do
45
47
  it 'should raise error if default_max_wait_time is less than timeout' do
46
48
  button = @session.find(:css, '#openWindowWithTimeout')
47
- Capybara.using_wait_time 0.4 do
49
+ Capybara.using_wait_time 0.1 do
48
50
  expect do
49
51
  @session.window_opened_by do
50
52
  button.click
@@ -58,7 +60,7 @@ Capybara::SpecHelper.spec '#window_opened_by', requires: [:windows] do
58
60
 
59
61
  it 'should find window if default_max_wait_time is more than timeout' do
60
62
  button = @session.find(:css, '#openWindowWithTimeout')
61
- Capybara.using_wait_time 1.5 do
63
+ Capybara.using_wait_time 5 do
62
64
  window = @session.window_opened_by do
63
65
  button.click
64
66
  end
@@ -72,6 +74,7 @@ Capybara::SpecHelper.spec '#window_opened_by', requires: [:windows] do
72
74
  expect do
73
75
  @session.window_opened_by do
74
76
  button.click
77
+ sleep 1 # It's possible for window_opened_by to be fullfilled before the second window opens
75
78
  end
76
79
  end.to raise_error(Capybara::WindowError, two_windows_message)
77
80
  @session.document.synchronize(2, errors: [Capybara::CapybaraError]) do
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  Capybara::SpecHelper.spec Capybara::Window, requires: [:windows] do
2
3
  before(:each) do
3
4
  @window = @session.current_window
@@ -85,22 +86,22 @@ Capybara::SpecHelper.spec Capybara::Window, requires: [:windows] do
85
86
  end
86
87
 
87
88
  describe '#size' do
88
- it 'should return size of whole window', requires: [:windows, :js] do
89
- skip "Chromedriver returns a size larger than outerWidth, outerHeight???" if ENV['TRAVIS'] && @session.respond_to?(:mode) && (@session.mode == :selenium_chrome)
89
+ def win_size
90
+ @session.evaluate_script("[window.outerWidth || window.innerWidth, window.outerHeight || window.innerHeight]")
91
+ end
90
92
 
91
- expect(@session.current_window.size).to eq @session.evaluate_script("[window.outerWidth, window.outerHeight];")
93
+ it 'should return size of whole window', requires: [:windows, :js] do
94
+ expect(@session.current_window.size).to eq win_size
92
95
  end
93
96
 
94
97
  it 'should switch to original window if invoked not for current window' do
95
- skip "Chromedriver returns a size larger than outerWidth, outerHeight???" if ENV['TRAVIS'] && @session.respond_to?(:mode) && (@session.mode == :selenium_chrome)
96
-
97
98
  @other_window = @session.window_opened_by do
98
99
  @session.find(:css, '#openWindow').click
99
100
  end
100
- size =
101
- @session.within_window @other_window do
102
- @session.evaluate_script("[window.outerWidth, window.outerHeight];")
103
- end
101
+ sleep 1
102
+ size = @session.within_window(@other_window) do
103
+ win_size
104
+ end
104
105
  expect(@other_window.size).to eq(size)
105
106
  expect(@session.current_window).to eq(@window)
106
107
  end
@@ -108,10 +109,10 @@ Capybara::SpecHelper.spec Capybara::Window, requires: [:windows] do
108
109
 
109
110
  describe '#resize_to' do
110
111
  it 'should be able to resize window', requires: [:windows, :js] do
111
-
112
- width, height = @session.evaluate_script("[window.outerWidth, window.outerHeight];")
113
- @session.current_window.resize_to(width-10, height-10)
114
- expect(@session.evaluate_script("[window.outerWidth, window.outerHeight];")).to eq([width-10, height-10])
112
+ width, height = @session.current_window.size
113
+ @session.current_window.resize_to(width-100, height-100)
114
+ sleep 1
115
+ expect(@session.current_window.size).to eq([width-100, height-100])
115
116
  end
116
117
 
117
118
  it 'should stay on current window if invoked not for current window', requires: [:windows, :js] do
@@ -123,40 +124,46 @@ Capybara::SpecHelper.spec Capybara::Window, requires: [:windows] do
123
124
  expect(@session.current_window).to eq(@window)
124
125
 
125
126
  # #size returns values larger than availWidth, availHeight with Chromedriver
126
- # expect(@other_window.size).to eq([400, 300])
127
127
  @session.within_window(@other_window) do
128
- expect(@session.evaluate_script("[window.outerWidth, window.outerHeight]")).to eq([400,300])
128
+ expect(@session.current_window.size).to eq([400,300])
129
+ # expect(@session.evaluate_script("[window.outerWidth, window.outerHeight]")).to eq([400,300])
129
130
  end
130
131
  end
131
132
  end
132
133
 
133
134
  describe '#maximize' do
134
135
  it 'should be able to maximize window', requires: [:windows, :js] do
135
- skip "This test fails when run with Firefox on Travis - see issue #1493 - skipping for now" if ENV['TRAVIS'] && @session.respond_to?(:mode) && (@session.mode == :selenium_focus)
136
+ start_width, start_height = 400, 300
137
+ @session.current_window.resize_to(start_width, start_height)
138
+ sleep 0.5
136
139
 
137
- screen_width, screen_height = @session.evaluate_script("[window.screen.availWidth, window.screen.availHeight];")
138
- window = @session.current_window
139
- window.resize_to(screen_width-100, screen_height-100)
140
- expect(@session.evaluate_script("[window.outerWidth, window.outerHeight];")).to eq([screen_width-100, screen_height-100])
141
- window.maximize
140
+ @session.current_window.maximize
142
141
  sleep 0.5 # The timing on maximize is finicky on Travis -- wait a bit for maximize to occur
143
- expect(@session.evaluate_script("[window.outerWidth, window.outerHeight];")).to eq([screen_width, screen_height])
142
+
143
+ max_width, max_height = @session.current_window.size
144
+
145
+ #maximize behavior is window manage dependant, so just make sure it increases in size
146
+ expect(max_width).to be > start_width
147
+ expect(max_height).to be > start_height
144
148
  end
145
149
 
146
150
  it 'should stay on current window if invoked not for current window', requires: [:windows, :js] do
147
- skip "This test fails when run with Firefox on Travis - see issue #1493 - skipping for now" if ENV['TRAVIS'] && @session.respond_to?(:mode) && (@session.mode == :selenium_focus)
148
-
151
+ cur_window_size = @session.current_window.size
149
152
  @other_window = @session.window_opened_by do
150
153
  @session.find(:css, '#openWindow').click
151
154
  end
155
+
156
+ @other_window.resize_to(400,300)
157
+ sleep 0.5
152
158
  @other_window.maximize
153
159
  sleep 0.5 # The timing on maximize is finicky on Travis -- wait a bit for maximize to occur
160
+
154
161
  expect(@session.current_window).to eq(@window)
155
- # #size returns values larger than availWidth, availHeight with Chromedriver
156
- # expect(@other_window.size).to eq(@session.evaluate_script("[window.screen.availWidth, window.screen.availHeight];"))
157
- @session.within_window(@other_window) do
158
- expect(@session.evaluate_script("[window.outerWidth, window.outerHeight]")).to eq(@session.evaluate_script("[window.screen.availWidth, window.screen.availHeight];"))
159
- end
162
+ expect(@session.current_window.size).to eq(cur_window_size)
163
+
164
+ ow_width, ow_height = @other_window.size
165
+ expect(ow_width).to be > 400
166
+ expect(ow_height).to be > 300
160
167
  end
161
168
  end
162
169
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  Capybara::SpecHelper.spec '#windows', requires: [:windows] do
2
3
  before(:each) do
3
4
  @window = @session.current_window