capybara 2.6.2 → 2.7.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (163) hide show
  1. checksums.yaml +4 -4
  2. data/History.md +40 -15
  3. data/README.md +45 -38
  4. data/lib/capybara.rb +86 -10
  5. data/lib/capybara/cucumber.rb +1 -0
  6. data/lib/capybara/driver/base.rb +5 -2
  7. data/lib/capybara/driver/node.rb +1 -0
  8. data/lib/capybara/dsl.rb +1 -0
  9. data/lib/capybara/helpers.rb +3 -2
  10. data/lib/capybara/node/actions.rb +6 -0
  11. data/lib/capybara/node/base.rb +1 -0
  12. data/lib/capybara/node/document.rb +1 -0
  13. data/lib/capybara/node/document_matchers.rb +1 -0
  14. data/lib/capybara/node/element.rb +1 -0
  15. data/lib/capybara/node/finders.rb +3 -2
  16. data/lib/capybara/node/matchers.rb +72 -2
  17. data/lib/capybara/node/simple.rb +6 -3
  18. data/lib/capybara/queries/base_query.rb +1 -0
  19. data/lib/capybara/queries/current_path_query.rb +1 -0
  20. data/lib/capybara/queries/match_query.rb +21 -0
  21. data/lib/capybara/queries/selector_query.rb +138 -0
  22. data/lib/capybara/queries/text_query.rb +1 -0
  23. data/lib/capybara/queries/title_query.rb +1 -0
  24. data/lib/capybara/query.rb +3 -131
  25. data/lib/capybara/rack_test/browser.rb +1 -0
  26. data/lib/capybara/rack_test/css_handlers.rb +1 -0
  27. data/lib/capybara/rack_test/driver.rb +6 -4
  28. data/lib/capybara/rack_test/form.rb +1 -0
  29. data/lib/capybara/rack_test/node.rb +1 -0
  30. data/lib/capybara/rails.rb +2 -1
  31. data/lib/capybara/result.rb +1 -0
  32. data/lib/capybara/rspec.rb +1 -0
  33. data/lib/capybara/rspec/features.rb +1 -0
  34. data/lib/capybara/rspec/matchers.rb +54 -3
  35. data/lib/capybara/selector.rb +175 -75
  36. data/lib/capybara/selector/filter.rb +48 -0
  37. data/lib/capybara/selenium/driver.rb +24 -7
  38. data/lib/capybara/selenium/node.rb +1 -0
  39. data/lib/capybara/server.rb +38 -6
  40. data/lib/capybara/session.rb +30 -14
  41. data/lib/capybara/session/matchers.rb +2 -1
  42. data/lib/capybara/spec/public/test.js +6 -0
  43. data/lib/capybara/spec/session/accept_alert_spec.rb +2 -1
  44. data/lib/capybara/spec/session/accept_confirm_spec.rb +2 -1
  45. data/lib/capybara/spec/session/accept_prompt_spec.rb +2 -1
  46. data/lib/capybara/spec/session/all_spec.rb +1 -0
  47. data/lib/capybara/spec/session/assert_current_path.rb +1 -0
  48. data/lib/capybara/spec/session/assert_selector.rb +1 -0
  49. data/lib/capybara/spec/session/assert_text.rb +1 -0
  50. data/lib/capybara/spec/session/assert_title.rb +1 -0
  51. data/lib/capybara/spec/session/attach_file_spec.rb +1 -0
  52. data/lib/capybara/spec/session/body_spec.rb +1 -0
  53. data/lib/capybara/spec/session/check_spec.rb +1 -0
  54. data/lib/capybara/spec/session/choose_spec.rb +1 -0
  55. data/lib/capybara/spec/session/click_button_spec.rb +1 -0
  56. data/lib/capybara/spec/session/click_link_or_button_spec.rb +1 -0
  57. data/lib/capybara/spec/session/click_link_spec.rb +1 -0
  58. data/lib/capybara/spec/session/current_scope_spec.rb +2 -1
  59. data/lib/capybara/spec/session/current_url_spec.rb +1 -0
  60. data/lib/capybara/spec/session/dismiss_confirm_spec.rb +2 -1
  61. data/lib/capybara/spec/session/dismiss_prompt_spec.rb +2 -1
  62. data/lib/capybara/spec/session/element/assert_match_selector.rb +31 -0
  63. data/lib/capybara/spec/session/element/match_css_spec.rb +17 -0
  64. data/lib/capybara/spec/session/element/match_xpath_spec.rb +23 -0
  65. data/lib/capybara/spec/session/element/matches_selector_spec.rb +63 -0
  66. data/lib/capybara/spec/session/evaluate_script_spec.rb +1 -0
  67. data/lib/capybara/spec/session/execute_script_spec.rb +1 -0
  68. data/lib/capybara/spec/session/fill_in_spec.rb +1 -0
  69. data/lib/capybara/spec/session/find_button_spec.rb +1 -0
  70. data/lib/capybara/spec/session/find_by_id_spec.rb +1 -0
  71. data/lib/capybara/spec/session/find_field_spec.rb +1 -0
  72. data/lib/capybara/spec/session/find_link_spec.rb +1 -0
  73. data/lib/capybara/spec/session/find_spec.rb +1 -0
  74. data/lib/capybara/spec/session/first_spec.rb +1 -0
  75. data/lib/capybara/spec/session/go_back_spec.rb +1 -0
  76. data/lib/capybara/spec/session/go_forward_spec.rb +1 -0
  77. data/lib/capybara/spec/session/has_button_spec.rb +1 -0
  78. data/lib/capybara/spec/session/has_css_spec.rb +1 -0
  79. data/lib/capybara/spec/session/has_current_path_spec.rb +1 -0
  80. data/lib/capybara/spec/session/has_field_spec.rb +13 -0
  81. data/lib/capybara/spec/session/has_link_spec.rb +1 -0
  82. data/lib/capybara/spec/session/has_select_spec.rb +19 -0
  83. data/lib/capybara/spec/session/has_selector_spec.rb +6 -0
  84. data/lib/capybara/spec/session/has_table_spec.rb +1 -0
  85. data/lib/capybara/spec/session/has_text_spec.rb +1 -0
  86. data/lib/capybara/spec/session/has_title_spec.rb +1 -0
  87. data/lib/capybara/spec/session/has_xpath_spec.rb +1 -0
  88. data/lib/capybara/spec/session/headers.rb +1 -0
  89. data/lib/capybara/spec/session/html_spec.rb +1 -0
  90. data/lib/capybara/spec/session/node_spec.rb +29 -0
  91. data/lib/capybara/spec/session/reset_session_spec.rb +35 -1
  92. data/lib/capybara/spec/session/response_code.rb +1 -0
  93. data/lib/capybara/spec/session/save_and_open_page_spec.rb +1 -0
  94. data/lib/capybara/spec/session/save_and_open_screenshot_spec.rb +3 -2
  95. data/lib/capybara/spec/session/save_page_spec.rb +34 -2
  96. data/lib/capybara/spec/session/save_screenshot_spec.rb +31 -1
  97. data/lib/capybara/spec/session/screenshot_spec.rb +3 -1
  98. data/lib/capybara/spec/session/select_spec.rb +1 -0
  99. data/lib/capybara/spec/session/selectors_spec.rb +35 -0
  100. data/lib/capybara/spec/session/text_spec.rb +1 -0
  101. data/lib/capybara/spec/session/title_spec.rb +2 -1
  102. data/lib/capybara/spec/session/uncheck_spec.rb +1 -0
  103. data/lib/capybara/spec/session/unselect_spec.rb +1 -0
  104. data/lib/capybara/spec/session/visit_spec.rb +1 -0
  105. data/lib/capybara/spec/session/window/become_closed_spec.rb +1 -0
  106. data/lib/capybara/spec/session/window/current_window_spec.rb +1 -0
  107. data/lib/capybara/spec/session/window/open_new_window_spec.rb +1 -0
  108. data/lib/capybara/spec/session/window/switch_to_window_spec.rb +1 -0
  109. data/lib/capybara/spec/session/window/window_opened_by_spec.rb +1 -0
  110. data/lib/capybara/spec/session/window/window_spec.rb +1 -8
  111. data/lib/capybara/spec/session/window/windows_spec.rb +1 -0
  112. data/lib/capybara/spec/session/window/within_window_spec.rb +2 -3
  113. data/lib/capybara/spec/session/within_frame_spec.rb +1 -0
  114. data/lib/capybara/spec/session/within_spec.rb +1 -0
  115. data/lib/capybara/spec/spec_helper.rb +2 -0
  116. data/lib/capybara/spec/test_app.rb +1 -0
  117. data/lib/capybara/spec/views/buttons.erb +1 -0
  118. data/lib/capybara/spec/views/fieldsets.erb +2 -1
  119. data/lib/capybara/spec/views/form.erb +24 -0
  120. data/lib/capybara/spec/views/frame_child.erb +2 -1
  121. data/lib/capybara/spec/views/frame_one.erb +2 -1
  122. data/lib/capybara/spec/views/frame_parent.erb +2 -1
  123. data/lib/capybara/spec/views/frame_two.erb +2 -1
  124. data/lib/capybara/spec/views/header_links.erb +1 -0
  125. data/lib/capybara/spec/views/host_links.erb +1 -0
  126. data/lib/capybara/spec/views/path.erb +1 -0
  127. data/lib/capybara/spec/views/popup_one.erb +1 -0
  128. data/lib/capybara/spec/views/popup_two.erb +1 -0
  129. data/lib/capybara/spec/views/postback.erb +2 -1
  130. data/lib/capybara/spec/views/tables.erb +1 -0
  131. data/lib/capybara/spec/views/with_base_tag.erb +1 -0
  132. data/lib/capybara/spec/views/with_count.erb +2 -1
  133. data/lib/capybara/spec/views/with_hover.erb +2 -1
  134. data/lib/capybara/spec/views/with_html.erb +3 -0
  135. data/lib/capybara/spec/views/with_html_entities.erb +1 -0
  136. data/lib/capybara/spec/views/with_js.erb +5 -0
  137. data/lib/capybara/spec/views/with_scope.erb +1 -0
  138. data/lib/capybara/spec/views/with_simple_html.erb +2 -1
  139. data/lib/capybara/spec/views/with_slow_unload.erb +17 -0
  140. data/lib/capybara/spec/views/with_title.erb +2 -1
  141. data/lib/capybara/spec/views/with_unload_alert.erb +12 -0
  142. data/lib/capybara/spec/views/with_windows.erb +1 -0
  143. data/lib/capybara/spec/views/within_frames.erb +2 -1
  144. data/lib/capybara/version.rb +2 -1
  145. data/lib/capybara/window.rb +1 -0
  146. data/spec/basic_node_spec.rb +1 -0
  147. data/spec/capybara_spec.rb +28 -1
  148. data/spec/dsl_spec.rb +1 -0
  149. data/spec/fixtures/selenium_driver_rspec_failure.rb +1 -0
  150. data/spec/fixtures/selenium_driver_rspec_success.rb +1 -0
  151. data/spec/rack_test_spec.rb +1 -0
  152. data/spec/result_spec.rb +1 -0
  153. data/spec/rspec/features_spec.rb +1 -0
  154. data/spec/rspec/matchers_spec.rb +1 -0
  155. data/spec/rspec/scenarios_spec.rb +1 -0
  156. data/spec/rspec/views_spec.rb +1 -0
  157. data/spec/rspec_spec.rb +1 -0
  158. data/spec/selector_spec.rb +55 -1
  159. data/spec/selenium_spec.rb +6 -2
  160. data/spec/selenium_spec_chrome.rb +1 -0
  161. data/spec/server_spec.rb +101 -13
  162. data/spec/spec_helper.rb +1 -0
  163. metadata +16 -6
@@ -1,3 +1,4 @@
1
+ <%# frozen_string_literal: true %>
1
2
  <html>
2
3
  <head>
3
4
  <title>This is the title of frame two</title>
@@ -5,4 +6,4 @@
5
6
  <body>
6
7
  <div id="divInFrameTwo">This is the text of divInFrameTwo</div>
7
8
  </body>
8
- </html>
9
+ </html>
@@ -1,3 +1,4 @@
1
+ <%# frozen_string_literal: true %>
1
2
  <p>
2
3
  <a href="/get_header">Link</a>
3
4
  </p>
@@ -1,3 +1,4 @@
1
+ <%# frozen_string_literal: true %>
1
2
  <p>
2
3
  <a href="/host">Relative Host</a>
3
4
  <a href="<%= params[:absolute_host] %>/host">Absolute Host</a>
@@ -1,3 +1,4 @@
1
+ <%# frozen_string_literal: true %>
1
2
  <html xmlns="http://www.w3.org/1999/xhtml" lang="en">
2
3
  <body>
3
4
  <div>
@@ -1,3 +1,4 @@
1
+ <%# frozen_string_literal: true %>
1
2
  <html>
2
3
  <head>
3
4
  <title>Title of the first popup</title>
@@ -1,3 +1,4 @@
1
+ <%# frozen_string_literal: true %>
1
2
  <html>
2
3
  <head>
3
4
  <title>Title of popup two</title>
@@ -1,3 +1,4 @@
1
+ <%# frozen_string_literal: true %>
1
2
  <h1>Postback</h1>
2
3
 
3
4
  <form method="get">
@@ -10,4 +11,4 @@
10
11
  <p>
11
12
  <input type="submit" value="With blank action">
12
13
  </p>
13
- </form>
14
+ </form>
@@ -1,3 +1,4 @@
1
+ <%# frozen_string_literal: true %>
1
2
  <form action="/form" method="post">
2
3
  <table id="agent_table">
3
4
  <caption>Agent</caption>
@@ -1,3 +1,4 @@
1
+ <%# frozen_string_literal: true %>
1
2
  <html xmlns="http://www.w3.org/1999/xhtml" lang="en">
2
3
  <head>
3
4
  <meta http-equiv="Content-type" content="text/html; charset=utf-8"/>
@@ -1,7 +1,8 @@
1
+ <%# frozen_string_literal: true %>
1
2
  <h1>This page is used for testing number options of has_text?</h1>
2
3
 
3
4
  <p>count1</p>
4
5
  <div>
5
6
  <p>2 count</p>
6
7
  <p>Count</p>
7
- </div>
8
+ </div>
@@ -1,3 +1,4 @@
1
+ <%# frozen_string_literal: true %>
1
2
  <html xmlns="http://www.w3.org/1999/xhtml" lang="en">
2
3
  <head>
3
4
  <meta http-equiv="Content-type" content="text/html; charset=utf-8"/>
@@ -14,4 +15,4 @@
14
15
  <div class="hidden_until_hover">Here I am</div>
15
16
  </div>
16
17
  </body>
17
- </html>
18
+ </html>
@@ -1,3 +1,4 @@
1
+ <%# frozen_string_literal: true %>
1
2
  <div id="referrer"><%= referrer %></div>
2
3
  <h1>This is a test</h1>
3
4
 
@@ -10,6 +11,7 @@
10
11
  <h2 class="head">Header Class Test Five</h2>
11
12
 
12
13
  <span class="number">42</span>
14
+ <span>Other span</span>
13
15
 
14
16
  <p class="para" id="first">
15
17
  Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
@@ -109,6 +111,7 @@ banana</textarea>
109
111
  </div>
110
112
 
111
113
  <input type="text" disabled="disabled" name="disabled_text" value="This is disabled"/>
114
+ <input type="hidden" id="hidden_input" name="hidden_input" value="This is a hidden input"/>
112
115
 
113
116
  <div>
114
117
  <a id="link_placeholder">No href</a>
@@ -1 +1,2 @@
1
+ <%# frozen_string_literal: true %>
1
2
  Encoding with &mdash; html entities &raquo;
@@ -1,3 +1,4 @@
1
+ <%# frozen_string_literal: true %>
1
2
  <html xmlns="http://www.w3.org/1999/xhtml" lang="en">
2
3
  <head>
3
4
  <meta http-equiv="Content-type" content="text/html; charset=utf-8"/>
@@ -93,6 +94,10 @@
93
94
  <a href="#" id="open-prompt">Open prompt</a>
94
95
  </p>
95
96
 
97
+ <p>
98
+ <input id="disable-on-click"/>
99
+ </p>
100
+
96
101
  <p>
97
102
  <a href="#" id="delayed-page-change">Change page</a>
98
103
  <a href="/with_html?options[]=things">Non-escaped query options</a>
@@ -1,3 +1,4 @@
1
+ <%# frozen_string_literal: true %>
1
2
  <h1>This page is used for testing various scopes</h1>
2
3
 
3
4
  <p id="for_foo">
@@ -1 +1,2 @@
1
- Bar
1
+ <%# frozen_string_literal: true %>
2
+ Bar
@@ -0,0 +1,17 @@
1
+ <html>
2
+ <head>
3
+ <script>
4
+ function delay_unload() {
5
+ var start = new Date();
6
+ var i = 0;
7
+ while ((new Date()) - start < 1000){ i = i + 1; };
8
+ return null;
9
+ }
10
+ window.onbeforeunload = delay_unload;
11
+ window.onunload = delay_unload;
12
+ </script>
13
+ </head>
14
+ <body>
15
+ <div>This delays unload by 2 seconds</div>
16
+ </body>
17
+ </html>
@@ -1,4 +1,5 @@
1
+ <%# frozen_string_literal: true %>
1
2
  <title>Test Title</title>
2
3
  <body>
3
4
  <svg><title>abcdefg</title></svg>
4
- </body>
5
+ </body>
@@ -0,0 +1,12 @@
1
+ <html>
2
+ <head>
3
+ <script>
4
+ window.onbeforeunload = function(e) {
5
+ return 'Unload?';
6
+ };
7
+ </script>
8
+ </head>
9
+ <body>
10
+ <div>This triggers an alert on unload</div>
11
+ </body>
12
+ </html>
@@ -1,3 +1,4 @@
1
+ <%# frozen_string_literal: true %>
1
2
  <html>
2
3
  <head>
3
4
  <title>With Windows</title>
@@ -1,3 +1,4 @@
1
+ <%# frozen_string_literal: true %>
1
2
  <html>
2
3
  <head>
3
4
  <title>With Frames</title>
@@ -8,4 +9,4 @@
8
9
  <iframe src="/frame_two" id="frameTwo"></iframe>
9
10
  <iframe src="/frame_parent" id="parentFrame"></iframe>
10
11
  </body>
11
- </html>
12
+ </html>
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Capybara
2
- VERSION = '2.6.2'
3
+ VERSION = '2.7.0'
3
4
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Capybara
2
3
  ##
3
4
  # The Window class represents a browser window.
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'spec_helper'
2
3
 
3
4
  RSpec.describe Capybara do
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'spec_helper'
2
3
 
3
4
  RSpec.describe Capybara do
@@ -33,9 +34,35 @@ RSpec.describe Capybara do
33
34
  end
34
35
  end
35
36
 
37
+ describe '.register_server' do
38
+ before do
39
+ Capybara.reuse_server = false
40
+ @old_server = Capybara.server
41
+ end
42
+
43
+ after do
44
+ Capybara.server(&@old_server)
45
+ Capybara.reuse_server = true
46
+ end
47
+
48
+ it "should add a new server" do
49
+ Capybara.register_server :blob do |app, port, host|
50
+ Rack::Handler::WEBrick.run(app, :Host => host, :Port => port, :AccessLog => [], :Logger => WEBrick::Log::new(nil, 0))
51
+ end
52
+ Capybara.server = :blob
53
+ session = Capybara::Session.new(:selenium, TestApp.dup)
54
+ session.visit('/')
55
+ expect(session.body).to include("Hello world!")
56
+ end
57
+ end
58
+
36
59
  describe ".server" do
60
+ before do
61
+ @old_server = Capybara.server
62
+ end
63
+
37
64
  after do
38
- Capybara.server {|app, port| Capybara.run_default_server(app, port)}
65
+ Capybara.server(&@old_server)
39
66
  end
40
67
 
41
68
  it "should default to a proc that calls run_default_server" do
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'spec_helper'
2
3
  require 'capybara/dsl'
3
4
 
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'spec_helper'
2
3
 
3
4
  RSpec.describe Capybara::Selenium::Driver do
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'spec_helper'
2
3
 
3
4
  RSpec.describe Capybara::Selenium::Driver do
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'spec_helper'
2
3
 
3
4
  module TestSessions
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'spec_helper'
2
3
 
3
4
  RSpec.describe Capybara::Result do
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'spec_helper'
2
3
  require 'capybara/rspec'
3
4
 
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'spec_helper'
2
3
  require 'capybara/dsl'
3
4
  require 'capybara/rspec/matchers'
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'spec_helper'
2
3
  require 'capybara/rspec'
3
4
 
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'spec_helper'
2
3
 
3
4
  RSpec.describe "capybara/rspec", type: :view do
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'spec_helper'
2
3
 
3
4
  RSpec.describe 'capybara/rspec', :type => :feature do
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'spec_helper'
2
3
 
3
4
  RSpec.describe Capybara do
@@ -17,6 +18,20 @@ RSpec.describe Capybara do
17
18
  <p class="b">Some Content</p>
18
19
  <p class="b"></p>
19
20
  </div>
21
+ <input type="checkbox"/>
22
+ <input type="radio"/>
23
+ <input type="text"/>
24
+ <input type="file"/>
25
+ <a href="#">link</a>
26
+ <fieldset></fieldset>
27
+ <select>
28
+ <option value="a">A</option>
29
+ <option value="b" disabled>B</option>
30
+ <option value="c" selected>C</option>
31
+ </select>
32
+ <table>
33
+ <tr><td></td></tr>
34
+ </table
20
35
  </body>
21
36
  </html>
22
37
  STRING
@@ -29,7 +44,7 @@ RSpec.describe Capybara do
29
44
  end
30
45
  end
31
46
 
32
- describe "modfiy_selector" do
47
+ describe "modify_selector" do
33
48
  it "allows modifying a selector" do
34
49
  el = string.find(:custom_selector, 'a')
35
50
  expect(el.tag_name).to eq 'div'
@@ -49,5 +64,44 @@ RSpec.describe Capybara do
49
64
  expect(string).to have_selector(:custom_selector, 'b', not_empty: :all, count: 2)
50
65
  end
51
66
  end
67
+
68
+ describe "builtin selectors" do
69
+ context "when locator is nil" do
70
+ it "devolves to just finding element types" do
71
+ selectors = {
72
+ field: ".//*[self::input | self::textarea | self::select][not(./@type = 'submit' or ./@type = 'image' or ./@type = 'hidden')]",
73
+ fieldset: ".//fieldset",
74
+ link: ".//a[./@href]",
75
+ link_or_button: ".//a[./@href] | .//input[./@type = 'submit' or ./@type = 'reset' or ./@type = 'image' or ./@type = 'button'] | .//button" ,
76
+ fillable_field: ".//*[self::input | self::textarea][not(./@type = 'submit' or ./@type = 'image' or ./@type = 'radio' or ./@type = 'checkbox' or ./@type = 'hidden' or ./@type = 'file')]",
77
+ radio_button: ".//input[./@type = 'radio']",
78
+ checkbox: ".//input[./@type = 'checkbox']",
79
+ select: ".//select",
80
+ option: ".//option",
81
+ file_field: ".//input[./@type = 'file']",
82
+ table: ".//table"
83
+ }
84
+ selectors.each do |selector, xpath|
85
+ results = string.all(selector,nil).to_a.map &:native
86
+ expect(results.size).to be > 0
87
+ expect(results).to eq string.all(:xpath, xpath).to_a.map(&:native)
88
+ end
89
+ end
90
+ end
91
+
92
+ describe ":option selector" do
93
+ it "finds disabled options" do
94
+ expect(string.find(:option, disabled: true).value).to eq 'b'
95
+ end
96
+
97
+ it "finds selected options" do
98
+ expect(string.find(:option, selected: true).value).to eq 'c'
99
+ end
100
+
101
+ it "finds not selected and not disabled options" do
102
+ expect(string.find(:option, disabled: false, selected: false).value).to eq 'a'
103
+ end
104
+ end
105
+ end
52
106
  end
53
107
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'spec_helper'
2
3
  require "selenium-webdriver"
3
4
 
@@ -11,11 +12,14 @@ module TestSessions
11
12
  Selenium = Capybara::Session.new(:selenium_focus, TestApp)
12
13
  end
13
14
 
14
- Capybara::SpecHelper.run_specs TestSessions::Selenium, "selenium", :capybara_skip => [
15
+ skipped_tests = [
15
16
  :response_headers,
16
17
  :status_code,
17
18
  :trigger
18
19
  ]
20
+ skipped_tests << :windows if ENV['TRAVIS'] && !ENV['WINDOW_TEST']
21
+
22
+ Capybara::SpecHelper.run_specs TestSessions::Selenium, "selenium", :capybara_skip => skipped_tests
19
23
 
20
24
  RSpec.describe Capybara::Session do
21
25
  context 'with selenium driver' do
@@ -110,7 +114,7 @@ RSpec.describe Capybara::Session do
110
114
  end
111
115
 
112
116
  context "#fill_in with { clear: Array } fill_options" do
113
- it 'should pass the array through to the element', tw: true do
117
+ it 'should pass the array through to the element' do
114
118
  #this is mainly for use with [[:ctrl, 'a'], :backspace] - however since that is platform dependant I'm testing with something less useful
115
119
  @session.visit('/form')
116
120
  @session.fill_in('form_first_name', :with => 'Harry',
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'spec_helper'
2
3
  require 'selenium-webdriver'
3
4
 
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'spec_helper'
2
3
 
3
4
  RSpec.describe Capybara::Server do
@@ -71,23 +72,102 @@ RSpec.describe Capybara::Server do
71
72
  expect(@res2.body).to include('Hello Second Server')
72
73
  end
73
74
 
74
- it "should use the server if it already running" do
75
- @app1 = proc { |env| [200, {}, ["Hello Server!"]]}
76
- @app2 = proc { |env| [200, {}, ["Hello Second Server!"]]}
75
+ context "When Capybara.reuse_server is true" do
76
+ before do
77
+ @old_reuse_server = Capybara.reuse_server
78
+ Capybara.reuse_server = true
79
+ end
77
80
 
78
- @server1a = Capybara::Server.new(@app1).boot
79
- @server1b = Capybara::Server.new(@app1).boot
80
- @server2a = Capybara::Server.new(@app2).boot
81
- @server2b = Capybara::Server.new(@app2).boot
81
+ after do
82
+ Capybara.reuse_server = @old_reuse_server
83
+ end
82
84
 
83
- @res1 = Net::HTTP.start(@server1b.host, @server1b.port) { |http| http.get('/') }
84
- expect(@res1.body).to include('Hello Server')
85
+ it "should use the existing server if it already running" do
86
+ @app = proc { |env| [200, {}, ["Hello Server!"]]}
85
87
 
86
- @res2 = Net::HTTP.start(@server2b.host, @server2b.port) { |http| http.get('/') }
87
- expect(@res2.body).to include('Hello Second Server')
88
+ @server1 = Capybara::Server.new(@app).boot
89
+ @server2 = Capybara::Server.new(@app).boot
90
+
91
+ res = Net::HTTP.start(@server1.host, @server1.port) { |http| http.get('/') }
92
+ expect(res.body).to include('Hello Server')
93
+
94
+ res = Net::HTTP.start(@server2.host, @server2.port) { |http| http.get('/') }
95
+ expect(res.body).to include('Hello Server')
96
+
97
+ expect(@server1.port).to eq(@server2.port)
98
+ end
99
+
100
+ it "detects and waits for all reused server sessions pending requests" do
101
+ done = false
102
+
103
+ app = proc do |env|
104
+ request = Rack::Request.new(env)
105
+ sleep request.params['wait_time'].to_f
106
+ done = true
107
+ [200, {}, ["Hello Server!"]]
108
+ end
109
+
110
+ server1 = Capybara::Server.new(app).boot
111
+ server2 = Capybara::Server.new(app).boot
112
+
113
+ start_request(server1, 0.5)
114
+ start_request(server2, 1.0)
115
+
116
+ expect {
117
+ server1.wait_for_pending_requests
118
+ }.to change{done}.from(false).to(true)
119
+ expect(server2.instance_variable_get('@middleware').pending_requests?).to eq(false)
120
+ end
121
+
122
+ end
123
+
124
+ context "When Capybara.reuse_server is false" do
125
+ before do
126
+ @old_reuse_server = Capybara.reuse_server
127
+ Capybara.reuse_server = false
128
+ end
129
+
130
+ after do
131
+ Capybara.reuse_server = @old_reuse_server
132
+ end
133
+
134
+ it "should not reuse an already running server" do
135
+ @app = proc { |env| [200, {}, ["Hello Server!"]]}
136
+
137
+ @server1 = Capybara::Server.new(@app).boot
138
+ @server2 = Capybara::Server.new(@app).boot
139
+
140
+ res = Net::HTTP.start(@server1.host, @server1.port) { |http| http.get('/') }
141
+ expect(res.body).to include('Hello Server')
142
+
143
+ res = Net::HTTP.start(@server2.host, @server2.port) { |http| http.get('/') }
144
+ expect(res.body).to include('Hello Server')
145
+
146
+ expect(@server1.port).not_to eq(@server2.port)
147
+ end
148
+
149
+ it "detects and waits for only one sessions pending requests" do
150
+ done = false
151
+
152
+ app = proc do |env|
153
+ request = Rack::Request.new(env)
154
+ sleep request.params['wait_time'].to_f
155
+ done = true
156
+ [200, {}, ["Hello Server!"]]
157
+ end
158
+
159
+ server1 = Capybara::Server.new(app).boot
160
+ server2 = Capybara::Server.new(app).boot
161
+
162
+ start_request(server1, 0.5)
163
+ start_request(server2, 1.0)
164
+
165
+ expect {
166
+ server1.wait_for_pending_requests
167
+ }.to change{done}.from(false).to(true)
168
+ expect(server2.instance_variable_get('@middleware').pending_requests?).to eq(true)
169
+ end
88
170
 
89
- expect(@server1a.port).to eq(@server1b.port)
90
- expect(@server2a.port).to eq(@server2b.port)
91
171
  end
92
172
 
93
173
  it "should raise server errors when the server errors before the timeout" do
@@ -113,4 +193,12 @@ RSpec.describe Capybara::Server do
113
193
  expect(Net::HTTP).to receive(:start).and_raise(SystemCallError.allocate)
114
194
  expect(server.responsive?).to eq false
115
195
  end
196
+
197
+ def start_request(server, wait_time)
198
+ # Start request, but don't wait for it to finish
199
+ socket = TCPSocket.new(server.host, server.port)
200
+ socket.write "GET /?wait_time=#{wait_time.to_s} HTTP/1.0\r\n\r\n"
201
+ socket.close
202
+ sleep 0.1
203
+ end
116
204
  end