capybara 2.15.1 → 2.15.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/History.md +10 -0
- data/README.md +6 -0
- data/lib/capybara/minitest.rb +1 -1
- data/lib/capybara/node/element.rb +2 -2
- data/lib/capybara/node/finders.rb +1 -0
- data/lib/capybara/queries/ancestor_query.rb +2 -2
- data/lib/capybara/queries/selector_query.rb +8 -0
- data/lib/capybara/queries/sibling_query.rb +3 -3
- data/lib/capybara/selenium/driver.rb +4 -2
- data/lib/capybara/selenium/node.rb +1 -1
- data/lib/capybara/session.rb +18 -6
- data/lib/capybara/spec/public/test.js +3 -0
- data/lib/capybara/spec/session/current_url_spec.rb +3 -3
- data/lib/capybara/spec/session/select_spec.rb +1 -1
- data/lib/capybara/spec/session/unselect_spec.rb +1 -1
- data/lib/capybara/spec/session/visit_spec.rb +17 -0
- data/lib/capybara/spec/session/within_spec.rb +1 -1
- data/lib/capybara/version.rb +1 -1
- data/spec/capybara_spec.rb +4 -18
- data/spec/selenium_spec_chrome.rb +3 -3
- data/spec/selenium_spec_marionette.rb +13 -3
- data/spec/shared_selenium_session.rb +28 -2
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4eb9fd96f4bd71cd4b6f610b7dae3d0b6da6fe21
|
4
|
+
data.tar.gz: 615cf0e0fb68f9d6792338470bdd9dd277c4c673
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 48a0d0f5c133fbfd57a424410943830b1ce28cfe21784b4e085f9a2cfcf0f6bf207dca0cda824875a140aaf103d54c6e76ed3f821fe3700e33348bf1aaca9e22
|
7
|
+
data.tar.gz: a9b0cbed365316d646d66cce8c11912631bd9c2214e90eea6d81ebec289cec5e5a66428a57a6e85d68ee936e1a9570193fc7982b85e5bb89ac5461812523d631
|
data/History.md
CHANGED
@@ -1,3 +1,13 @@
|
|
1
|
+
# Version 2.15.2
|
2
|
+
Release date: 2017-10-02
|
3
|
+
|
4
|
+
### Fixed
|
5
|
+
|
6
|
+
* Include within scope description in element not found/ambiguous errors [Thomas Walpole]
|
7
|
+
* Raise error when no activation block is passed to modal methods if using headless chrome [Thomas Walpole]
|
8
|
+
* Don't retry element access when inspecting [Ivan Neverov]
|
9
|
+
* Don't override a specified port (even if it is default port) in visited url [Thomas Walpole]
|
10
|
+
|
1
11
|
# Version 2.15.1
|
2
12
|
|
3
13
|
Release date: 2017-08-04
|
data/README.md
CHANGED
@@ -10,6 +10,12 @@ interact with your app. It is agnostic about the driver running your tests and
|
|
10
10
|
comes with Rack::Test and Selenium support built in. WebKit is supported
|
11
11
|
through an external gem.
|
12
12
|
|
13
|
+
## Support Capybara
|
14
|
+
|
15
|
+
If you and/or your company find value in Capybara and would like to contribute financially to its ongoing maintenance and development, please visit
|
16
|
+
<a href="https://www.patreon.com/capybara">Patreon</a>
|
17
|
+
|
18
|
+
|
13
19
|
**Need help?** Ask on the mailing list (please do not open an issue on
|
14
20
|
GitHub): http://groups.google.com/group/ruby-capybara
|
15
21
|
|
data/lib/capybara/minitest.rb
CHANGED
@@ -371,9 +371,9 @@ module Capybara
|
|
371
371
|
end
|
372
372
|
|
373
373
|
def inspect
|
374
|
-
%(#<Capybara::Node::Element tag="#{tag_name}" path="#{path}">)
|
374
|
+
%(#<Capybara::Node::Element tag="#{base.tag_name}" path="#{base.path}">)
|
375
375
|
rescue NotSupportedByDriverError
|
376
|
-
%(#<Capybara::Node::Element tag="#{tag_name}">)
|
376
|
+
%(#<Capybara::Node::Element tag="#{base.tag_name}">)
|
377
377
|
rescue => e
|
378
378
|
if session.driver.invalid_element_errors.any? { |et| e.is_a?(et)}
|
379
379
|
%(Obsolete #<Capybara::Node::Element>)
|
@@ -306,6 +306,7 @@ module Capybara
|
|
306
306
|
else
|
307
307
|
result = query.resolve_for(self)
|
308
308
|
end
|
309
|
+
|
309
310
|
if query.match == :one or query.match == :smart and result.size > 1
|
310
311
|
raise Capybara::Ambiguous.new("Ambiguous match, found #{result.size} elements matching #{query.description}")
|
311
312
|
end
|
@@ -4,7 +4,7 @@ module Capybara
|
|
4
4
|
class AncestorQuery < MatchQuery
|
5
5
|
# @api private
|
6
6
|
def resolve_for(node, exact = nil)
|
7
|
-
@
|
7
|
+
@child_node = node
|
8
8
|
node.synchronize do
|
9
9
|
match_results = super(node.session.current_scope, exact)
|
10
10
|
node.all(:xpath, XPath.ancestor) do |el|
|
@@ -15,7 +15,7 @@ module Capybara
|
|
15
15
|
|
16
16
|
def description
|
17
17
|
desc = super
|
18
|
-
if @
|
18
|
+
if @child_node && (child_query = @child_node.instance_variable_get(:@query))
|
19
19
|
desc += " that is an ancestor of #{child_query.description}"
|
20
20
|
end
|
21
21
|
desc
|
@@ -8,6 +8,7 @@ module Capybara
|
|
8
8
|
VALID_MATCH = [:first, :smart, :prefer_exact, :one]
|
9
9
|
|
10
10
|
def initialize(*args, &filter_block)
|
11
|
+
@resolved_node = nil
|
11
12
|
@options = if args.last.is_a?(Hash) then args.pop.dup else {} end
|
12
13
|
super(@options)
|
13
14
|
|
@@ -53,6 +54,7 @@ module Capybara
|
|
53
54
|
@description << " with classes [#{Array(options[:class]).join(',')}]" if options[:class]
|
54
55
|
@description << selector.description(options)
|
55
56
|
@description << " that also matches the custom filter block" if @filter_block
|
57
|
+
@description << " within #{@resolved_node.inspect}" if describe_within?
|
56
58
|
@description
|
57
59
|
end
|
58
60
|
|
@@ -140,6 +142,7 @@ module Capybara
|
|
140
142
|
|
141
143
|
# @api private
|
142
144
|
def resolve_for(node, exact = nil)
|
145
|
+
@resolved_node = node
|
143
146
|
node.synchronize do
|
144
147
|
children = if selector.format == :css
|
145
148
|
node.find_css(self.css)
|
@@ -239,6 +242,11 @@ module Capybara
|
|
239
242
|
def exact_text
|
240
243
|
options.fetch(:exact_text, session_options.exact_text)
|
241
244
|
end
|
245
|
+
|
246
|
+
def describe_within?
|
247
|
+
@resolved_node && !(@resolved_node.is_a?(::Capybara::Node::Document) ||
|
248
|
+
(@resolved_node.is_a?(::Capybara::Node::Simple) && @resolved_node.path == '/'))
|
249
|
+
end
|
242
250
|
end
|
243
251
|
end
|
244
252
|
end
|
@@ -4,7 +4,7 @@ module Capybara
|
|
4
4
|
class SiblingQuery < MatchQuery
|
5
5
|
# @api private
|
6
6
|
def resolve_for(node, exact = nil)
|
7
|
-
@
|
7
|
+
@sibling_node = node
|
8
8
|
node.synchronize do
|
9
9
|
match_results = super(node.session.current_scope, exact)
|
10
10
|
node.all(:xpath, XPath.preceding_sibling.union(XPath.following_sibling)) do |el|
|
@@ -15,8 +15,8 @@ module Capybara
|
|
15
15
|
|
16
16
|
def description
|
17
17
|
desc = super
|
18
|
-
if @
|
19
|
-
desc += " that is a sibling of #{
|
18
|
+
if @sibling_node && (sibling_query = @sibling_node.instance_variable_get(:@query))
|
19
|
+
desc += " that is a sibling of #{sibling_query.description}"
|
20
20
|
end
|
21
21
|
desc
|
22
22
|
end
|
@@ -245,8 +245,9 @@ class Capybara::Selenium::Driver < Capybara::Driver::Base
|
|
245
245
|
|
246
246
|
def accept_modal(_type, options={})
|
247
247
|
if headless_chrome?
|
248
|
+
raise ArgumentError, "Block that triggers the system modal is missing" unless block_given?
|
248
249
|
insert_modal_handlers(true, options[:with], options[:text])
|
249
|
-
yield
|
250
|
+
yield
|
250
251
|
find_headless_modal(options)
|
251
252
|
else
|
252
253
|
yield if block_given?
|
@@ -260,8 +261,9 @@ class Capybara::Selenium::Driver < Capybara::Driver::Base
|
|
260
261
|
|
261
262
|
def dismiss_modal(_type, options={})
|
262
263
|
if headless_chrome?
|
264
|
+
raise ArgumentError, "Block that triggers the system modal is missing" unless block_given?
|
263
265
|
insert_modal_handlers(false, options[:with], options[:text])
|
264
|
-
yield
|
266
|
+
yield
|
265
267
|
find_headless_modal(options)
|
266
268
|
else
|
267
269
|
yield if block_given?
|
@@ -209,7 +209,7 @@ private
|
|
209
209
|
def set_text(value, options)
|
210
210
|
if readonly?
|
211
211
|
warn "Attempt to set readonly element with value: #{value} \n *This will raise an exception in a future version of Capybara"
|
212
|
-
elsif value.to_s.empty?
|
212
|
+
elsif value.to_s.empty? && options[:clear].nil?
|
213
213
|
native.clear
|
214
214
|
else
|
215
215
|
if options[:clear] == :backspace
|
data/lib/capybara/session.rb
CHANGED
@@ -247,15 +247,16 @@ module Capybara
|
|
247
247
|
raise_server_error!
|
248
248
|
@touched = true
|
249
249
|
|
250
|
-
visit_uri = URI.parse(visit_uri.to_s)
|
250
|
+
visit_uri = ::Addressable::URI.parse(visit_uri.to_s)
|
251
251
|
|
252
252
|
uri_base = if @server
|
253
|
-
|
254
|
-
URI.parse(config.app_host || "http://#{@server.host}:#{@server.port}")
|
253
|
+
::Addressable::URI.parse(config.app_host || "http://#{@server.host}:#{@server.port}")
|
255
254
|
else
|
256
|
-
config.app_host && URI.parse(config.app_host)
|
255
|
+
config.app_host && ::Addressable::URI.parse(config.app_host)
|
257
256
|
end
|
258
257
|
|
258
|
+
uri_base.port ||= @server.port if @server && config.always_include_port
|
259
|
+
|
259
260
|
# TODO - this is only for compatability with previous 2.x behavior that concatenated
|
260
261
|
# Capybara.app_host and a "relative" path - Consider removing in 3.0
|
261
262
|
# @abotalov brought up a good point about this behavior potentially being useful to people
|
@@ -264,7 +265,9 @@ module Capybara
|
|
264
265
|
visit_uri.path = uri_base.path + visit_uri.path
|
265
266
|
end
|
266
267
|
|
267
|
-
|
268
|
+
if uri_base && [nil, 'http', 'https'].include?(visit_uri.scheme)
|
269
|
+
visit_uri = uri_base.merge(visit_uri.to_hash.delete_if { |k,v| v.nil? })
|
270
|
+
end
|
268
271
|
|
269
272
|
driver.visit(visit_uri.to_s)
|
270
273
|
end
|
@@ -640,13 +643,22 @@ module Capybara
|
|
640
643
|
# Execute the block, accepting a alert.
|
641
644
|
#
|
642
645
|
# @!macro modal_params
|
646
|
+
# Expects a block whose actions will trigger the display modal to appear
|
647
|
+
# @example
|
648
|
+
# $0 do
|
649
|
+
# click_link('link that triggers appearance of system modal')
|
650
|
+
# end
|
643
651
|
# @overload $0(text, options = {}, &blk)
|
644
652
|
# @param text [String, Regexp] Text or regex to match against the text in the modal. If not provided any modal is matched
|
653
|
+
# @option options [Numeric] :wait (Capybara.default_max_wait_time) Maximum time to wait for the modal to appear after executing the block.
|
654
|
+
# @yield Block whose actions will trigger the system modal
|
645
655
|
# @overload $0(options = {}, &blk)
|
646
|
-
#
|
656
|
+
# @option options [Numeric] :wait (Capybara.default_max_wait_time) Maximum time to wait for the modal to appear after executing the block.
|
657
|
+
# @yield Block whose actions will trigger the system modal
|
647
658
|
# @return [String] the message shown in the modal
|
648
659
|
# @raise [Capybara::ModalNotFound] if modal dialog hasn't been found
|
649
660
|
#
|
661
|
+
#
|
650
662
|
def accept_alert(text_or_options=nil, options={}, &blk)
|
651
663
|
accept_modal(:alert, text_or_options, options, &blk)
|
652
664
|
end
|
@@ -37,6 +37,9 @@ $(function() {
|
|
37
37
|
$('#with_change_event').change(function() {
|
38
38
|
$('body').append($('<p class="change_event_triggered"></p>').text(this.value));
|
39
39
|
});
|
40
|
+
$('#with_change_event').on('input', function() {
|
41
|
+
$('body').append($('<p class="input_event_triggered"></p>').text(this.value));
|
42
|
+
});
|
40
43
|
$('#checkbox_with_event').click(function() {
|
41
44
|
$('body').append('<p id="checkbox_event_triggered">Checkbox event triggered</p>');
|
42
45
|
});
|
@@ -3,7 +3,7 @@ require "capybara/spec/test_app"
|
|
3
3
|
|
4
4
|
Capybara::SpecHelper.spec '#current_url, #current_path, #current_host' do
|
5
5
|
before :all do
|
6
|
-
@servers = 2.times.map { Capybara::Server.new(TestApp.
|
6
|
+
@servers = 2.times.map { Capybara::Server.new(TestApp.new).boot }
|
7
7
|
# sanity check
|
8
8
|
expect(@servers[0].port).not_to eq(@servers[1].port)
|
9
9
|
expect(@servers.map { |s| s.port }).not_to include 80
|
@@ -98,9 +98,9 @@ Capybara::SpecHelper.spec '#current_url, #current_path, #current_host' do
|
|
98
98
|
end
|
99
99
|
|
100
100
|
it "doesn't raise exception on a nil current_url" do
|
101
|
+
skip "Only makes sense when there is a real driver" unless @session.respond_to?(:driver)
|
102
|
+
allow(@session.driver).to receive(:current_url) { nil }
|
101
103
|
@session.visit("/")
|
102
|
-
allow_any_instance_of(Capybara::Session).to receive(:current_url) { nil }
|
103
|
-
|
104
104
|
expect { @session.current_url }.not_to raise_exception
|
105
105
|
expect { @session.current_path }.not_to raise_exception
|
106
106
|
end
|
@@ -94,7 +94,7 @@ Capybara::SpecHelper.spec "#select" do
|
|
94
94
|
|
95
95
|
context "with an option that doesn't exist" do
|
96
96
|
it "should raise an error" do
|
97
|
-
msg =
|
97
|
+
msg = /^Unable to find visible option "Does not Exist" within/
|
98
98
|
expect do
|
99
99
|
@session.select('Does not Exist', from: 'form_locale')
|
100
100
|
end.to raise_error(Capybara::ElementNotFound, msg)
|
@@ -64,7 +64,7 @@ Capybara::SpecHelper.spec "#unselect" do
|
|
64
64
|
|
65
65
|
context "with an option that doesn't exist" do
|
66
66
|
it "should raise an error" do
|
67
|
-
msg =
|
67
|
+
msg = /^Unable to find visible option "Does not Exist" within/
|
68
68
|
expect do
|
69
69
|
@session.unselect('Does not Exist', from: 'form_underwear')
|
70
70
|
end.to raise_error(Capybara::ElementNotFound, msg)
|
@@ -63,6 +63,23 @@ Capybara::SpecHelper.spec '#visit' do
|
|
63
63
|
expect(URI.parse(@session.current_url).port).to eq(root_uri.port)
|
64
64
|
expect(@session).to have_content('Another World')
|
65
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
|
+
|
66
83
|
end
|
67
84
|
|
68
85
|
context "without a server", requires: [:server] do
|
@@ -101,7 +101,7 @@ Capybara::SpecHelper.spec '#within' do
|
|
101
101
|
expect do
|
102
102
|
@session.within(".//div[@id='doesnotexist']") do
|
103
103
|
end
|
104
|
-
end.to raise_error(Capybara::ElementNotFound)
|
104
|
+
end.to raise_error(Capybara::ElementNotFound, %Q{Unable to find visible xpath ".//div[@id='doesnotexist']" within #<Capybara::Node::Element tag="div" path="/html/body/div[1]">})
|
105
105
|
end.to_not change { @session.has_xpath?(".//div[@id='another_foo']") }.from(false)
|
106
106
|
end
|
107
107
|
end.to_not change { @session.has_xpath?(".//div[@id='another_foo']") }.from(true)
|
data/lib/capybara/version.rb
CHANGED
data/spec/capybara_spec.rb
CHANGED
@@ -35,27 +35,13 @@ RSpec.describe Capybara do
|
|
35
35
|
end
|
36
36
|
|
37
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
38
|
it "should add a new server" do
|
49
|
-
|
50
|
-
|
51
|
-
require 'rack/handler/webrick'
|
39
|
+
handler = double("handler")
|
52
40
|
Capybara.register_server :blob do |app, port, host|
|
53
|
-
|
41
|
+
handler.run
|
54
42
|
end
|
55
|
-
|
56
|
-
|
57
|
-
session.visit('/')
|
58
|
-
expect(session.body).to include("Hello world!")
|
43
|
+
|
44
|
+
expect(Capybara.servers).to have_key(:blob)
|
59
45
|
end
|
60
46
|
end
|
61
47
|
|
@@ -5,9 +5,9 @@ require 'shared_selenium_session'
|
|
5
5
|
|
6
6
|
CHROME_DRIVER = if ENV['HEADLESS'] then :selenium_chrome_headless else :selenium_chrome end
|
7
7
|
|
8
|
-
if ENV['HEADLESS'] && ENV['TRAVIS']
|
9
|
-
|
10
|
-
end
|
8
|
+
# if ENV['HEADLESS'] && ENV['TRAVIS']
|
9
|
+
# Selenium::WebDriver::Chrome.path='/usr/bin/google-chrome-beta'
|
10
|
+
# end
|
11
11
|
|
12
12
|
Capybara.register_driver :selenium_chrome_clear_storage do |app|
|
13
13
|
chrome_options = {
|
@@ -4,13 +4,20 @@ require "selenium-webdriver"
|
|
4
4
|
require 'shared_selenium_session'
|
5
5
|
require 'rspec/shared_spec_matchers'
|
6
6
|
|
7
|
-
|
7
|
+
browser_options = ::Selenium::WebDriver::Firefox::Options.new()
|
8
|
+
browser_options.args << '--headless' if ENV['HEADLESS']
|
9
|
+
browser_options.add_preference 'dom.file.createInChild', true
|
10
|
+
# browser_options.add_option("log", {"level": "trace"})
|
8
11
|
|
9
12
|
Capybara.register_driver :selenium_marionette do |app|
|
13
|
+
# ::Selenium::WebDriver.logger.level = "debug"
|
10
14
|
Capybara::Selenium::Driver.new(
|
11
15
|
app,
|
12
16
|
browser: :firefox,
|
13
|
-
desired_capabilities: {marionette
|
17
|
+
desired_capabilities: {:marionette => true},
|
18
|
+
options: browser_options
|
19
|
+
# Get a trace level log from geckodriver
|
20
|
+
# :driver_opts => { args: ['-vv'] }
|
14
21
|
)
|
15
22
|
end
|
16
23
|
|
@@ -20,10 +27,13 @@ Capybara.register_driver :selenium_marionette_clear_storage do |app|
|
|
20
27
|
browser: :firefox,
|
21
28
|
desired_capabilities: {marionette: true},
|
22
29
|
clear_local_storage: true,
|
23
|
-
clear_session_storage: true
|
30
|
+
clear_session_storage: true,
|
31
|
+
options: browser_options
|
24
32
|
)
|
25
33
|
end
|
26
34
|
|
35
|
+
|
36
|
+
|
27
37
|
module TestSessions
|
28
38
|
SeleniumMarionette = Capybara::Session.new(:selenium_marionette, TestApp)
|
29
39
|
end
|
@@ -57,12 +57,28 @@ RSpec.shared_examples "Capybara::Session" do |session, mode|
|
|
57
57
|
|
58
58
|
describe "#accept_alert" do
|
59
59
|
it "supports a blockless mode" do
|
60
|
-
skip "Headless Chrome doesn't support blockless modal methods" if @session.driver.send(:headless_chrome?)
|
61
60
|
@session.visit('/with_js')
|
61
|
+
skip "Headless Chrome doesn't support blockless modal methods" if @session.driver.send(:headless_chrome?)
|
62
62
|
@session.click_link('Open alert')
|
63
63
|
@session.accept_alert
|
64
64
|
expect{@session.driver.browser.switch_to.alert}.to raise_error(Selenium::WebDriver::Error::NoAlertPresentError)
|
65
65
|
end
|
66
|
+
|
67
|
+
it "raises if block is missing" do
|
68
|
+
@session.visit('/with_js')
|
69
|
+
skip "Only Headless Chrome requires the block due to system modal JS injection" unless @session.driver.send(:headless_chrome?)
|
70
|
+
expect { @session.accept_alert }.to raise_error(ArgumentError)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
context '#fill_in_with empty string and no options' do
|
75
|
+
it 'should trigger change when clearing a field' do
|
76
|
+
@session.visit('/with_js')
|
77
|
+
@session.fill_in('with_change_event', with: '')
|
78
|
+
# click outside the field to trigger the change event
|
79
|
+
@session.find(:css, 'body').click
|
80
|
+
expect(@session).to have_selector(:css, '.change_event_triggered', match: :one)
|
81
|
+
end
|
66
82
|
end
|
67
83
|
|
68
84
|
context "#fill_in with { :clear => :backspace } fill_option", requires: [:js] do
|
@@ -90,6 +106,15 @@ RSpec.shared_examples "Capybara::Session" do |session, mode|
|
|
90
106
|
@session.find(:css, 'body').click
|
91
107
|
expect(@session).to have_selector(:css, '.change_event_triggered', match: :one)
|
92
108
|
end
|
109
|
+
|
110
|
+
it 'should trigger input event field_value.length times' do
|
111
|
+
@session.visit('/with_js')
|
112
|
+
@session.fill_in('with_change_event', with: '',
|
113
|
+
fill_options: { :clear => :backspace })
|
114
|
+
# click outside the field to trigger the change event
|
115
|
+
@session.find(:css, 'body').click
|
116
|
+
expect(@session).to have_xpath('//p[@class="input_event_triggered"]', count: 13)
|
117
|
+
end
|
93
118
|
end
|
94
119
|
|
95
120
|
context "#fill_in with { clear: :none } fill_options" do
|
@@ -161,7 +186,8 @@ RSpec.shared_examples "Capybara::Session" do |session, mode|
|
|
161
186
|
it "outputs obsolete elements" do
|
162
187
|
@session.visit('/form')
|
163
188
|
el = @session.find(:button, 'Click me!').click
|
164
|
-
|
189
|
+
expect(@session).to have_no_button('Click me!')
|
190
|
+
expect(el).not_to receive(:synchronize)
|
165
191
|
expect(el.inspect).to eq "Obsolete #<Capybara::Node::Element>"
|
166
192
|
end
|
167
193
|
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.15.
|
4
|
+
version: 2.15.2
|
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-
|
13
|
+
date: 2017-10-02 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: nokogiri
|
@@ -506,7 +506,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
506
506
|
version: '0'
|
507
507
|
requirements: []
|
508
508
|
rubyforge_project:
|
509
|
-
rubygems_version: 2.6.
|
509
|
+
rubygems_version: 2.6.13
|
510
510
|
signing_key:
|
511
511
|
specification_version: 4
|
512
512
|
summary: Capybara aims to simplify the process of integration testing Rack applications,
|