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 "#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