capybara 3.1.1 → 3.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/History.md +19 -0
- data/README.md +1 -1
- data/lib/capybara.rb +2 -0
- data/lib/capybara/config.rb +2 -1
- data/lib/capybara/driver/base.rb +1 -1
- data/lib/capybara/driver/node.rb +3 -3
- data/lib/capybara/node/actions.rb +90 -92
- data/lib/capybara/node/base.rb +2 -2
- data/lib/capybara/node/document_matchers.rb +5 -5
- data/lib/capybara/node/element.rb +47 -16
- data/lib/capybara/node/finders.rb +13 -13
- data/lib/capybara/node/matchers.rb +18 -17
- data/lib/capybara/node/simple.rb +6 -2
- data/lib/capybara/queries/ancestor_query.rb +1 -1
- data/lib/capybara/queries/base_query.rb +3 -3
- data/lib/capybara/queries/current_path_query.rb +1 -1
- data/lib/capybara/queries/match_query.rb +8 -0
- data/lib/capybara/queries/selector_query.rb +97 -42
- data/lib/capybara/queries/sibling_query.rb +1 -1
- data/lib/capybara/queries/text_query.rb +12 -7
- data/lib/capybara/rack_test/browser.rb +9 -7
- data/lib/capybara/rack_test/form.rb +15 -17
- data/lib/capybara/rack_test/node.rb +12 -12
- data/lib/capybara/result.rb +26 -15
- data/lib/capybara/rspec.rb +1 -2
- data/lib/capybara/rspec/compound.rb +4 -4
- data/lib/capybara/rspec/matchers.rb +2 -2
- data/lib/capybara/selector.rb +75 -225
- data/lib/capybara/selector/css.rb +2 -2
- data/lib/capybara/selector/filter_set.rb +17 -21
- data/lib/capybara/selector/filters/base.rb +24 -1
- data/lib/capybara/selector/filters/expression_filter.rb +3 -5
- data/lib/capybara/selector/filters/node_filter.rb +4 -4
- data/lib/capybara/selector/selector.rb +221 -69
- data/lib/capybara/selenium/driver.rb +15 -88
- data/lib/capybara/selenium/node.rb +25 -28
- data/lib/capybara/server.rb +10 -54
- data/lib/capybara/server/animation_disabler.rb +43 -0
- data/lib/capybara/server/middleware.rb +55 -0
- data/lib/capybara/session.rb +29 -30
- data/lib/capybara/session/config.rb +11 -1
- data/lib/capybara/session/matchers.rb +5 -5
- data/lib/capybara/spec/session/assert_text_spec.rb +1 -1
- data/lib/capybara/spec/session/body_spec.rb +10 -12
- data/lib/capybara/spec/session/click_link_spec.rb +3 -3
- data/lib/capybara/spec/session/element/assert_match_selector_spec.rb +1 -1
- data/lib/capybara/spec/session/fill_in_spec.rb +9 -0
- data/lib/capybara/spec/session/find_field_spec.rb +1 -1
- data/lib/capybara/spec/session/find_spec.rb +8 -3
- data/lib/capybara/spec/session/has_link_spec.rb +2 -2
- data/lib/capybara/spec/session/node_spec.rb +50 -0
- data/lib/capybara/spec/session/node_wrapper_spec.rb +5 -5
- data/lib/capybara/spec/session/save_and_open_screenshot_spec.rb +1 -1
- data/lib/capybara/spec/session/window/windows_spec.rb +3 -5
- data/lib/capybara/spec/spec_helper.rb +4 -2
- data/lib/capybara/spec/views/with_animation.erb +46 -0
- data/lib/capybara/version.rb +1 -1
- data/lib/capybara/window.rb +3 -2
- data/spec/filter_set_spec.rb +19 -2
- data/spec/result_spec.rb +33 -1
- data/spec/rspec/features_spec.rb +6 -10
- data/spec/rspec/shared_spec_matchers.rb +4 -4
- data/spec/selector_spec.rb +74 -4
- data/spec/selenium_spec_marionette.rb +2 -0
- data/spec/server_spec.rb +1 -1
- data/spec/session_spec.rb +12 -0
- data/spec/shared_selenium_session.rb +30 -0
- metadata +8 -9
- data/.yard/templates_custom/default/class/html/selectors.erb +0 -38
- data/.yard/templates_custom/default/class/html/setup.rb +0 -17
- data/.yard/yard_extensions.rb +0 -78
- data/.yardopts +0 -1
data/spec/server_spec.rb
CHANGED
@@ -35,7 +35,7 @@ RSpec.describe Capybara::Server do
|
|
35
35
|
ensure
|
36
36
|
Capybara.server_host = nil
|
37
37
|
end
|
38
|
-
end unless ENV['TRAVIS'] && (RUBY_ENGINE == 'jruby')
|
38
|
+
end unless (ENV['TRAVIS'] && (RUBY_ENGINE == 'jruby')) || Gem.win_platform?
|
39
39
|
|
40
40
|
it "should use specified port" do
|
41
41
|
Capybara.server_port = 22789
|
data/spec/session_spec.rb
CHANGED
@@ -18,6 +18,12 @@ RSpec.describe Capybara::Session do
|
|
18
18
|
end
|
19
19
|
|
20
20
|
context "current_driver" do
|
21
|
+
around do |example|
|
22
|
+
orig_driver = Capybara.current_driver
|
23
|
+
example.run
|
24
|
+
Capybara.current_driver = orig_driver
|
25
|
+
end
|
26
|
+
|
21
27
|
it "is global when threadsafe false" do
|
22
28
|
Capybara.threadsafe = false
|
23
29
|
Capybara.current_driver = :selenium
|
@@ -40,6 +46,12 @@ RSpec.describe Capybara::Session do
|
|
40
46
|
end
|
41
47
|
|
42
48
|
context "session_name" do
|
49
|
+
around do |example|
|
50
|
+
orig_name = Capybara.session_name
|
51
|
+
example.run
|
52
|
+
Capybara.session_name = orig_name
|
53
|
+
end
|
54
|
+
|
43
55
|
it "is global when threadsafe false" do
|
44
56
|
Capybara.threadsafe = false
|
45
57
|
Capybara.session_name = "sess1"
|
@@ -88,6 +88,13 @@ RSpec.shared_examples "Capybara::Session" do |session, mode|
|
|
88
88
|
expect(session.find(:fillable_field, 'form_first_name').value).to eq('Harry')
|
89
89
|
end
|
90
90
|
|
91
|
+
it 'should fill in if the option is set via global option' do
|
92
|
+
Capybara.default_set_options = { clear: :backspace }
|
93
|
+
session.visit('/form')
|
94
|
+
session.fill_in('form_first_name', with: 'Thomas')
|
95
|
+
expect(session.find(:fillable_field, 'form_first_name').value).to eq('Thomas')
|
96
|
+
end
|
97
|
+
|
91
98
|
it 'should only trigger onchange once' do
|
92
99
|
session.visit('/with_js')
|
93
100
|
session.fill_in('with_change_event',
|
@@ -249,6 +256,29 @@ RSpec.shared_examples "Capybara::Session" do |session, mode|
|
|
249
256
|
end.to raise_error(ArgumentError, 'Not allowed to close the primary window')
|
250
257
|
end
|
251
258
|
end
|
259
|
+
|
260
|
+
context "AnimationDisabler" do
|
261
|
+
before(:context) do # rubocop:disable RSpec/BeforeAfterAll
|
262
|
+
Capybara.disable_animation = true
|
263
|
+
@animation_session = Capybara::Session.new(session.mode, TestApp.new)
|
264
|
+
end
|
265
|
+
|
266
|
+
after(:context) do # rubocop:disable RSpec/BeforeAfterAll
|
267
|
+
Capybara.disable_animation = false
|
268
|
+
end
|
269
|
+
|
270
|
+
it "should disable CSS transitions" do
|
271
|
+
@animation_session.visit('with_animation')
|
272
|
+
@animation_session.click_link('transition me away')
|
273
|
+
expect(@animation_session).to have_no_link('transition me away', wait: 0.5)
|
274
|
+
end
|
275
|
+
|
276
|
+
it "should disable CSS animations", :focus_ do
|
277
|
+
@animation_session.visit('with_animation')
|
278
|
+
@animation_session.click_link('animate me away')
|
279
|
+
expect(@animation_session).to have_no_link('animate me away', wait: 0.5)
|
280
|
+
end
|
281
|
+
end
|
252
282
|
end
|
253
283
|
|
254
284
|
def headless_or_remote?
|
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: 3.
|
4
|
+
version: 3.2.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: 2018-
|
13
|
+
date: 2018-06-01 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: addressable
|
@@ -88,14 +88,14 @@ dependencies:
|
|
88
88
|
requirements:
|
89
89
|
- - "~>"
|
90
90
|
- !ruby/object:Gem::Version
|
91
|
-
version: '3.
|
91
|
+
version: '3.1'
|
92
92
|
type: :runtime
|
93
93
|
prerelease: false
|
94
94
|
version_requirements: !ruby/object:Gem::Requirement
|
95
95
|
requirements:
|
96
96
|
- - "~>"
|
97
97
|
- !ruby/object:Gem::Version
|
98
|
-
version: '3.
|
98
|
+
version: '3.1'
|
99
99
|
- !ruby/object:Gem::Dependency
|
100
100
|
name: cucumber
|
101
101
|
requirement: !ruby/object:Gem::Requirement
|
@@ -271,10 +271,6 @@ executables: []
|
|
271
271
|
extensions: []
|
272
272
|
extra_rdoc_files: []
|
273
273
|
files:
|
274
|
-
- ".yard/templates_custom/default/class/html/selectors.erb"
|
275
|
-
- ".yard/templates_custom/default/class/html/setup.rb"
|
276
|
-
- ".yard/yard_extensions.rb"
|
277
|
-
- ".yardopts"
|
278
274
|
- History.md
|
279
275
|
- License.txt
|
280
276
|
- README.md
|
@@ -326,6 +322,8 @@ files:
|
|
326
322
|
- lib/capybara/selenium/driver.rb
|
327
323
|
- lib/capybara/selenium/node.rb
|
328
324
|
- lib/capybara/server.rb
|
325
|
+
- lib/capybara/server/animation_disabler.rb
|
326
|
+
- lib/capybara/server/middleware.rb
|
329
327
|
- lib/capybara/session.rb
|
330
328
|
- lib/capybara/session/config.rb
|
331
329
|
- lib/capybara/session/matchers.rb
|
@@ -437,6 +435,7 @@ files:
|
|
437
435
|
- lib/capybara/spec/views/popup_two.erb
|
438
436
|
- lib/capybara/spec/views/postback.erb
|
439
437
|
- lib/capybara/spec/views/tables.erb
|
438
|
+
- lib/capybara/spec/views/with_animation.erb
|
440
439
|
- lib/capybara/spec/views/with_base_tag.erb
|
441
440
|
- lib/capybara/spec/views/with_count.erb
|
442
441
|
- lib/capybara/spec/views/with_fixed_header_footer.erb
|
@@ -495,7 +494,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
495
494
|
requirements:
|
496
495
|
- - ">="
|
497
496
|
- !ruby/object:Gem::Version
|
498
|
-
version: 2.
|
497
|
+
version: 2.3.0
|
499
498
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
500
499
|
requirements:
|
501
500
|
- - ">="
|
@@ -1,38 +0,0 @@
|
|
1
|
-
<div id="selectors">
|
2
|
-
<h2>Built-in Selectors</h2>
|
3
|
-
<ul>
|
4
|
-
<% @selectors.each do |name, selector| %>
|
5
|
-
<li>
|
6
|
-
<h3>:<%= name %></h3>
|
7
|
-
<div class="docstring">
|
8
|
-
<div class="discussion">
|
9
|
-
<p><%= h(selector.docstring) %></p>
|
10
|
-
</div>
|
11
|
-
</div>
|
12
|
-
<div class="tags">
|
13
|
-
<p class="inline">Locator:</p>
|
14
|
-
<% if locator=selector.tag('locator') %>
|
15
|
-
<p class="inline"><%= h locator.text %></p>
|
16
|
-
<% end %>
|
17
|
-
<% if selector.has_tag?('filter') %>
|
18
|
-
<p>Filters:</p>
|
19
|
-
<ul class="param">
|
20
|
-
<% selector.tags('filter').each do |filter| %>
|
21
|
-
<li>
|
22
|
-
<span class="name"><%= filter.name %></span>
|
23
|
-
<% if filter.types %>
|
24
|
-
<span class="type">(<tt><%= h(filter.types.join(', ')) %></tt>)</span>
|
25
|
-
<% end %>
|
26
|
-
<% if filter.text %>
|
27
|
-
—
|
28
|
-
<div class="inline"><p><%= h filter.text %></p></div>
|
29
|
-
<% end %>
|
30
|
-
</li>
|
31
|
-
<% end %>
|
32
|
-
</ul>
|
33
|
-
<% end %>
|
34
|
-
</div
|
35
|
-
</li>
|
36
|
-
<% end %>
|
37
|
-
</ul>
|
38
|
-
</div>
|
@@ -1,17 +0,0 @@
|
|
1
|
-
def init
|
2
|
-
super
|
3
|
-
sections.place(:builtins).before(:subclasses)
|
4
|
-
end
|
5
|
-
|
6
|
-
def builtins
|
7
|
-
return if object.path != "Capybara::Selector" # only show built-in selectors for Selector class
|
8
|
-
|
9
|
-
@selectors = Registry.all(:selector)
|
10
|
-
return if @selectors.nil? || @selectors.empty?
|
11
|
-
|
12
|
-
@selectors = @selectors.map do |selector|
|
13
|
-
[selector.name, selector]
|
14
|
-
end
|
15
|
-
|
16
|
-
erb(:selectors)
|
17
|
-
end
|
data/.yard/yard_extensions.rb
DELETED
@@ -1,78 +0,0 @@
|
|
1
|
-
YARD::Templates::Engine.register_template_path Pathname.new('./.yard/templates_custom')
|
2
|
-
|
3
|
-
YARD::Tags::Library.define_tag "Locator", :locator
|
4
|
-
YARD::Tags::Library.define_tag "Filter", :filter, :with_types_and_name
|
5
|
-
|
6
|
-
class SelectorObject < YARD::CodeObjects::Base
|
7
|
-
def path
|
8
|
-
"__Capybara" + sep + super
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
12
|
-
class AddSelectorHandler < YARD::Handlers::Ruby::Base
|
13
|
-
handles method_call(:add_selector)
|
14
|
-
namespace_only
|
15
|
-
process do
|
16
|
-
name = statement.parameters.first.jump(:tstring_content, :ident).source
|
17
|
-
# object = YARD::CodeObjects::MethodObject.new(namespace, name.to_sym)
|
18
|
-
# object = SelectorObject.new(YARD::Registry.resolve(P("Capybara"), "#add_selector", false, true), name.to_sym)
|
19
|
-
object = SelectorObject.new(namespace, name)
|
20
|
-
register(object)
|
21
|
-
parse_block(statement.last.last, :owner => object)
|
22
|
-
|
23
|
-
# modify the object
|
24
|
-
object.dynamic = true
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
class AddExpressionFilterHandler < YARD::Handlers::Ruby::Base
|
29
|
-
handles method_call(:xpath)
|
30
|
-
handles method_call(:css)
|
31
|
-
|
32
|
-
process do
|
33
|
-
return unless owner.is_a?(SelectorObject)
|
34
|
-
return if statement.parameters.empty?
|
35
|
-
# names = statement.parameters.children.map { |p| p.jump(:tstring_content, :ident).source.sub(/^:/, '') }
|
36
|
-
names = statement.parameters.children.map &:source
|
37
|
-
current_names = owner.tags(:filter).map(&:name)
|
38
|
-
(names-current_names).each do |name|
|
39
|
-
owner.add_tag(YARD::Tags::Tag.new(:filter, nil, nil, name))
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
class AddFilterHandler < YARD::Handlers::Ruby::Base
|
45
|
-
handles method_call(:filter)
|
46
|
-
|
47
|
-
process do
|
48
|
-
return unless owner.is_a?(SelectorObject)
|
49
|
-
return if statement.parameters.empty?
|
50
|
-
name = statement.parameters.first.source
|
51
|
-
type = if statement.parameters[1] && statement.parameters[1].source == ':boolean'
|
52
|
-
'Boolean'
|
53
|
-
else
|
54
|
-
nil
|
55
|
-
end
|
56
|
-
if owner.tags(:filter).none? {|tag| tag.name == name }
|
57
|
-
filter_tag = YARD::Tags::Tag.new(:filter, nil, type, name)
|
58
|
-
owner.add_tag(filter_tag)
|
59
|
-
end
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|
63
|
-
class FilterSetHandler < YARD::Handlers::Ruby::Base
|
64
|
-
handles method_call(:filter_set)
|
65
|
-
|
66
|
-
process do
|
67
|
-
return unless owner.is_a?(SelectorObject)
|
68
|
-
return if statement.parameters.empty? || !statement.parameters[1]
|
69
|
-
|
70
|
-
names = statement.parameters[1].flatten.map { |name| ":#{name}" }
|
71
|
-
names.each do |name|
|
72
|
-
if owner.tags(:filter).none? {|tag| tag.name == name }
|
73
|
-
filter_tag = YARD::Tags::Tag.new(:filter, nil, nil, name)
|
74
|
-
owner.add_tag(filter_tag)
|
75
|
-
end
|
76
|
-
end
|
77
|
-
end
|
78
|
-
end
|
data/.yardopts
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
--load ./.yard/yard_extensions.rb
|