capybara 2.13.0 → 2.14.0

Sign up to get free protection for your applications and to get access to all the features.
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,