capybara 2.6.2 → 2.7.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 (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