capybara 2.13.0 → 2.14.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 (54) hide show
  1. checksums.yaml +4 -4
  2. data/History.md +82 -17
  3. data/README.md +29 -0
  4. data/lib/capybara.rb +81 -116
  5. data/lib/capybara/config.rb +121 -0
  6. data/lib/capybara/cucumber.rb +1 -0
  7. data/lib/capybara/driver/base.rb +6 -0
  8. data/lib/capybara/dsl.rb +1 -3
  9. data/lib/capybara/helpers.rb +3 -3
  10. data/lib/capybara/node/actions.rb +2 -2
  11. data/lib/capybara/node/base.rb +7 -2
  12. data/lib/capybara/node/element.rb +7 -1
  13. data/lib/capybara/node/finders.rb +13 -3
  14. data/lib/capybara/node/matchers.rb +15 -4
  15. data/lib/capybara/node/simple.rb +5 -0
  16. data/lib/capybara/queries/base_query.rb +8 -3
  17. data/lib/capybara/queries/selector_query.rb +11 -9
  18. data/lib/capybara/queries/text_query.rb +9 -4
  19. data/lib/capybara/rack_test/browser.rb +8 -5
  20. data/lib/capybara/rspec.rb +3 -1
  21. data/lib/capybara/rspec/matcher_proxies.rb +41 -0
  22. data/lib/capybara/rspec/matchers.rb +19 -5
  23. data/lib/capybara/selector.rb +13 -4
  24. data/lib/capybara/selector/selector.rb +3 -3
  25. data/lib/capybara/selenium/driver.rb +20 -6
  26. data/lib/capybara/selenium/node.rb +6 -2
  27. data/lib/capybara/server.rb +6 -5
  28. data/lib/capybara/session.rb +71 -14
  29. data/lib/capybara/session/config.rb +100 -0
  30. data/lib/capybara/spec/public/test.js +1 -1
  31. data/lib/capybara/spec/session/all_spec.rb +11 -0
  32. data/lib/capybara/spec/session/assert_all_of_selectors_spec.rb +24 -8
  33. data/lib/capybara/spec/session/fill_in_spec.rb +6 -0
  34. data/lib/capybara/spec/session/find_field_spec.rb +1 -0
  35. data/lib/capybara/spec/session/find_spec.rb +4 -3
  36. data/lib/capybara/spec/session/has_selector_spec.rb +1 -3
  37. data/lib/capybara/spec/session/node_spec.rb +23 -17
  38. data/lib/capybara/spec/session/reset_session_spec.rb +1 -1
  39. data/lib/capybara/spec/session/window/become_closed_spec.rb +4 -4
  40. data/lib/capybara/spec/spec_helper.rb +22 -0
  41. data/lib/capybara/spec/views/form.erb +6 -1
  42. data/lib/capybara/spec/views/with_html.erb +1 -0
  43. data/lib/capybara/version.rb +1 -1
  44. data/lib/capybara/window.rb +1 -1
  45. data/spec/capybara_spec.rb +14 -2
  46. data/spec/dsl_spec.rb +1 -0
  47. data/spec/per_session_config_spec.rb +67 -0
  48. data/spec/rspec/shared_spec_matchers.rb +2 -2
  49. data/spec/rspec/views_spec.rb +4 -0
  50. data/spec/rspec_spec.rb +77 -0
  51. data/spec/session_spec.rb +44 -0
  52. data/spec/shared_selenium_session.rb +9 -0
  53. data/spec/spec_helper.rb +4 -0
  54. metadata +7 -3
@@ -0,0 +1,67 @@
1
+ # frozen_string_literal: true
2
+ require 'spec_helper'
3
+ require 'capybara/dsl'
4
+
5
+ RSpec.describe Capybara::SessionConfig do
6
+ describe "threadsafe" do
7
+ it "defaults to global session options" do
8
+ Capybara.threadsafe = true
9
+ session = Capybara::Session.new(:rack_test, TestApp)
10
+ [:default_host, :app_host, :save_and_open_page_path,
11
+ :always_include_port, :run_server, :default_selector, :default_max_wait_time, :ignore_hidden_elements,
12
+ :automatic_reload, :match, :exact, :raise_server_errors, :visible_text_only, :wait_on_first_by_default,
13
+ :automatic_label_click, :enable_aria_label,
14
+ :save_path, :exact_options, :asset_host].each do |m|
15
+ expect(session.config.public_send(m)).to eq Capybara.public_send(m)
16
+ end
17
+ end
18
+
19
+ it "doesn't change global session when changed" do
20
+ Capybara.threadsafe = true
21
+ host = "http://my.example.com"
22
+ session = Capybara::Session.new(:rack_test, TestApp) do |config|
23
+ config.default_host = host
24
+ config.automatic_label_click = !config.automatic_label_click
25
+ config.server_errors << ArgumentError
26
+ end
27
+ expect(Capybara.default_host).not_to eq host
28
+ expect(session.config.default_host).to eq host
29
+ expect(Capybara.automatic_label_click).not_to eq session.config.automatic_label_click
30
+ expect(Capybara.server_errors).not_to eq session.config.server_errors
31
+ end
32
+
33
+ it "doesn't allow session configuration block when false" do
34
+ Capybara.threadsafe = false
35
+ expect do
36
+ Capybara::Session.new(:rack_test, TestApp) { |config| }
37
+ end.to raise_error "A configuration block is only accepted when Capybara.threadsafe == true"
38
+ end
39
+
40
+ it "doesn't allow session config when false" do
41
+ Capybara.threadsafe = false
42
+ session = Capybara::Session.new(:rack_test, TestApp)
43
+ expect { session.config.default_selector = :title }.to raise_error /Per session settings are only supported when Capybara.threadsafe == true/
44
+ expect do
45
+ session.configure do |config|
46
+ config.exact = true
47
+ end
48
+ end.to raise_error /Session configuration is only supported when Capybara.threadsafe == true/
49
+ end
50
+
51
+ it "uses the config from the session" do
52
+ Capybara.threadsafe = true
53
+ session = Capybara::Session.new(:rack_test, TestApp) do |config|
54
+ config.default_selector = :link
55
+ end
56
+ session.visit('/with_html')
57
+ expect(session.find('foo').tag_name).to eq 'a'
58
+ end
59
+
60
+ it "won't change threadsafe once a session is created" do
61
+ Capybara.threadsafe = true
62
+ Capybara.threadsafe = false
63
+ session = Capybara::Session.new(:rack_test, TestApp)
64
+ expect { Capybara.threadsafe = true }.to raise_error /Threadsafe setting cannot be changed once a session is created/
65
+ end
66
+ end
67
+ end
@@ -555,8 +555,8 @@ RSpec.shared_examples Capybara::RSpecMatchers do |session, mode|
555
555
 
556
556
  it "doesn't wait if wait time is less than timeout" do
557
557
  @session.click_link("Change title")
558
- using_wait_time 0 do
559
- expect(@session).not_to have_title('changed title')
558
+ using_wait_time 3 do
559
+ expect(@session).not_to have_title('changed title', wait: 0)
560
560
  end
561
561
  end
562
562
  end
@@ -5,4 +5,8 @@ RSpec.describe "capybara/rspec", type: :view do
5
5
  it "allows matchers to be used on strings" do
6
6
  expect(%{<h1>Test header</h1>}).to have_css("h1", text: "Test header")
7
7
  end
8
+
9
+ it "doesn't include RSpecMatcherProxies" do
10
+ expect(self.class.ancestors).not_to include(Capybara::RSpecMatcherProxies)
11
+ end
8
12
  end
@@ -7,6 +7,10 @@ RSpec.describe 'capybara/rspec', :type => :feature do
7
7
  expect(page.body).to include('Another World')
8
8
  end
9
9
 
10
+ it "should include RSpec matcher proxies" do
11
+ expect(self.class.ancestors).to include Capybara::RSpecMatcherProxies
12
+ end
13
+
10
14
  context "resetting session" do
11
15
  it "sets a cookie in one example..." do
12
16
  visit('/set_cookie')
@@ -36,6 +40,79 @@ RSpec.describe 'capybara/rspec', :type => :feature do
36
40
  it "switches to the given driver when giving it as metadata", :driver => :culerity do
37
41
  expect(Capybara.current_driver).to eq(:culerity)
38
42
  end
43
+
44
+ context "#all" do
45
+ it "allows access to the Capybara finder" do
46
+ visit('/with_html')
47
+ expect(all(:css, 'h2.head').size).to eq(5)
48
+ end
49
+
50
+ it "allows access to the RSpec matcher" do
51
+ skip "RSpec < 3 doesn't have an `all` matcher" if rspec2?
52
+
53
+ visit('/with_html')
54
+ expect(["test1", "test2"]).to all(be_a(String))
55
+ end
56
+ end
57
+
58
+ context "#within" do
59
+ it "allows access to the Capybara scoper" do
60
+ visit('/with_html')
61
+ expect do
62
+ within(:css, "#does_not_exist") { click_link "Go to simple" }
63
+ end.to raise_error(Capybara::ElementNotFound)
64
+ end
65
+
66
+ it "allows access to the RSpec matcher" do
67
+ skip "RSpec version doesn't have a 'within' matcher" unless ::RSpec::Matchers.instance_methods.include?(:within)
68
+ visit('/with_html')
69
+ # This reads terribly, but must call #within
70
+ expect(find(:css, 'span.number').text.to_i).to within(1).of(41)
71
+ end
72
+ end
73
+ end
74
+
75
+ RSpec.describe 'capybara/rspec', :type => :other do
76
+ context "when RSpec::Matchers is included after Capybara::DSL" do
77
+ before do
78
+ class DSL_MatchersTest
79
+ include Capybara::DSL
80
+ include RSpec::Matchers
81
+ end
82
+
83
+ @test_class_instance = DSL_MatchersTest.new
84
+ end
85
+
86
+ context "#all" do
87
+ it "allows access to the Capybara finder" do
88
+ @test_class_instance.visit('/with_html')
89
+ expect(@test_class_instance.all(:css, 'h2.head').size).to eq(5)
90
+ end
91
+
92
+ it "allows access to the RSpec matcher" do
93
+ skip "RSpec < 3 doesn't have an `all` matcher" if rspec2?
94
+
95
+ @test_class_instance.visit('/with_html')
96
+ expect(["test1", "test2"]).to @test_class_instance.all(be_a(String))
97
+ end
98
+ end
99
+
100
+ context "#within" do
101
+ it "allows access to the Capybara scoper" do
102
+ @test_class_instance.visit('/with_html')
103
+ expect do
104
+ @test_class_instance.within(:css, "#does_not_exist") { @test_class_instance.click_link "Go to simple" }
105
+ end.to raise_error(Capybara::ElementNotFound)
106
+ end
107
+
108
+ it "allows access to the RSpec matcher" do
109
+ skip "RSpec version doesn't have a 'within' matcher" unless ::RSpec::Matchers.instance_methods.include?(:within)
110
+ @test_class_instance.visit('/with_html')
111
+ # This reads terribly, but must call #within
112
+ expect(@test_class_instance.find(:css, 'span.number').text.to_i).to @test_class_instance.within(1).of(41)
113
+ end
114
+ end
115
+ end
39
116
  end
40
117
 
41
118
  RSpec.describe 'capybara/rspec', :type => :other do
@@ -7,4 +7,48 @@ RSpec.describe Capybara::Session do
7
7
  Capybara::Session.new(:unknown, { random: "hash"})
8
8
  end.to raise_error TypeError, "The second parameter to Session::new should be a rack app if passed."
9
9
  end
10
+
11
+ context "current_driver" do
12
+ it "is global when threadsafe false" do
13
+ Capybara.threadsafe = false
14
+ Capybara.current_driver = :selenium
15
+ thread = Thread.new do
16
+ Capybara.current_driver = :random
17
+ end
18
+ thread.join
19
+ expect(Capybara.current_driver).to eq :random
20
+ end
21
+
22
+ it "is thread specific threadsafe true" do
23
+ Capybara.threadsafe = true
24
+ Capybara.current_driver = :selenium
25
+ thread = Thread.new do
26
+ Capybara.current_driver = :random
27
+ end
28
+ thread.join
29
+ expect(Capybara.current_driver).to eq :selenium
30
+ end
31
+ end
32
+
33
+ context "session_name" do
34
+ it "is global when threadsafe false" do
35
+ Capybara.threadsafe = false
36
+ Capybara.session_name = "sess1"
37
+ thread = Thread.new do
38
+ Capybara.session_name = "sess2"
39
+ end
40
+ thread.join
41
+ expect(Capybara.session_name).to eq "sess2"
42
+ end
43
+
44
+ it "is thread specific when threadsafe true" do
45
+ Capybara.threadsafe = true
46
+ Capybara.session_name = "sess1"
47
+ thread = Thread.new do
48
+ Capybara.session_name = "sess2"
49
+ end
50
+ thread.join
51
+ expect(Capybara.session_name).to eq "sess1"
52
+ end
53
+ end
10
54
  end
@@ -147,5 +147,14 @@ RSpec.shared_examples "Capybara::Session" do |session, mode|
147
147
  })
148
148
  end
149
149
  end
150
+
151
+ describe "Element#inspect" do
152
+ it "outputs obsolete elements" do
153
+ @session.visit('/form')
154
+ el = @session.find(:button, 'Click me!').click
155
+ sleep 2
156
+ expect(el.inspect).to eq "Obsolete #<Capybara::Node::Element>"
157
+ end
158
+ end
150
159
  end
151
160
  end
@@ -8,3 +8,7 @@ RSpec.configure do |config|
8
8
  config.filter_run_including focus_: true unless ENV['TRAVIS']
9
9
  config.run_all_when_everything_filtered = true
10
10
  end
11
+
12
+ def rspec2?
13
+ !defined?(::RSpec::Expectations::Version) || (Gem::Version.new(RSpec::Expectations::Version::STRING) < Gem::Version.new('3.0'))
14
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: capybara
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.13.0
4
+ version: 2.14.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Thomas Walpole
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain:
12
12
  - gem-public_cert.pem
13
- date: 2017-03-16 00:00:00.000000000 Z
13
+ date: 2017-05-01 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: nokogiri
@@ -273,6 +273,7 @@ files:
273
273
  - License.txt
274
274
  - README.md
275
275
  - lib/capybara.rb
276
+ - lib/capybara/config.rb
276
277
  - lib/capybara/cucumber.rb
277
278
  - lib/capybara/driver/base.rb
278
279
  - lib/capybara/driver/node.rb
@@ -304,6 +305,7 @@ files:
304
305
  - lib/capybara/result.rb
305
306
  - lib/capybara/rspec.rb
306
307
  - lib/capybara/rspec/features.rb
308
+ - lib/capybara/rspec/matcher_proxies.rb
307
309
  - lib/capybara/rspec/matchers.rb
308
310
  - lib/capybara/selector.rb
309
311
  - lib/capybara/selector/css.rb
@@ -314,6 +316,7 @@ files:
314
316
  - lib/capybara/selenium/node.rb
315
317
  - lib/capybara/server.rb
316
318
  - lib/capybara/session.rb
319
+ - lib/capybara/session/config.rb
317
320
  - lib/capybara/session/matchers.rb
318
321
  - lib/capybara/spec/fixtures/another_test_file.txt
319
322
  - lib/capybara/spec/fixtures/capybara.jpg
@@ -435,6 +438,7 @@ files:
435
438
  - spec/fixtures/selenium_driver_rspec_success.rb
436
439
  - spec/minitest_spec.rb
437
440
  - spec/minitest_spec_spec.rb
441
+ - spec/per_session_config_spec.rb
438
442
  - spec/rack_test_spec.rb
439
443
  - spec/result_spec.rb
440
444
  - spec/rspec/features_spec.rb
@@ -470,7 +474,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
470
474
  version: '0'
471
475
  requirements: []
472
476
  rubyforge_project:
473
- rubygems_version: 2.5.2
477
+ rubygems_version: 2.6.11
474
478
  signing_key:
475
479
  specification_version: 4
476
480
  summary: Capybara aims to simplify the process of integration testing Rack applications,