capybara 2.4.4 → 2.5.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 +32 -5
- data/README.md +69 -8
- data/lib/capybara.rb +50 -29
- data/lib/capybara/driver/base.rb +4 -0
- data/lib/capybara/driver/node.rb +4 -0
- data/lib/capybara/helpers.rb +17 -5
- data/lib/capybara/node/actions.rb +16 -11
- data/lib/capybara/node/base.rb +7 -7
- data/lib/capybara/node/document_matchers.rb +1 -1
- data/lib/capybara/node/element.rb +82 -7
- data/lib/capybara/node/finders.rb +62 -22
- data/lib/capybara/node/matchers.rb +3 -3
- data/lib/capybara/node/simple.rb +6 -1
- data/lib/capybara/queries/base_query.rb +1 -1
- data/lib/capybara/queries/current_path_query.rb +58 -0
- data/lib/capybara/queries/text_query.rb +2 -11
- data/lib/capybara/rack_test/browser.rb +7 -2
- data/lib/capybara/rack_test/driver.rb +4 -0
- data/lib/capybara/rack_test/form.rb +2 -1
- data/lib/capybara/rack_test/node.rb +1 -0
- data/lib/capybara/result.rb +2 -2
- data/lib/capybara/rspec.rb +1 -0
- data/lib/capybara/rspec/features.rb +1 -1
- data/lib/capybara/rspec/matchers.rb +42 -3
- data/lib/capybara/selector.rb +7 -2
- data/lib/capybara/selenium/driver.rb +26 -12
- data/lib/capybara/selenium/node.rb +42 -6
- data/lib/capybara/server.rb +1 -1
- data/lib/capybara/session.rb +78 -50
- data/lib/capybara/session/matchers.rb +69 -0
- data/lib/capybara/spec/public/test.js +8 -0
- data/lib/capybara/spec/session/all_spec.rb +5 -0
- data/lib/capybara/spec/session/assert_current_path.rb +59 -0
- data/lib/capybara/spec/session/assert_text.rb +1 -1
- data/lib/capybara/spec/session/attach_file_spec.rb +2 -2
- data/lib/capybara/spec/session/body_spec.rb +2 -0
- data/lib/capybara/spec/session/click_button_spec.rb +17 -8
- data/lib/capybara/spec/session/click_link_spec.rb +32 -1
- data/lib/capybara/spec/session/current_url_spec.rb +5 -0
- data/lib/capybara/spec/session/fill_in_spec.rb +1 -1
- data/lib/capybara/spec/session/find_field_spec.rb +17 -0
- data/lib/capybara/spec/session/find_spec.rb +14 -5
- data/lib/capybara/spec/session/first_spec.rb +24 -0
- data/lib/capybara/spec/session/has_current_path_spec.rb +68 -0
- data/lib/capybara/spec/session/has_link_spec.rb +3 -0
- data/lib/capybara/spec/session/has_text_spec.rb +7 -0
- data/lib/capybara/spec/session/node_spec.rb +45 -6
- data/lib/capybara/spec/session/reset_session_spec.rb +18 -1
- data/lib/capybara/spec/session/save_and_open_page_spec.rb +19 -0
- data/lib/capybara/spec/session/save_page_spec.rb +12 -3
- data/lib/capybara/spec/session/save_screenshot_spec.rb +23 -0
- data/lib/capybara/spec/session/select_spec.rb +12 -0
- data/lib/capybara/spec/session/title_spec.rb +2 -2
- data/lib/capybara/spec/session/window/become_closed_spec.rb +4 -4
- data/lib/capybara/spec/session/window/switch_to_window_spec.rb +8 -0
- data/lib/capybara/spec/session/window/window_opened_by_spec.rb +14 -8
- data/lib/capybara/spec/session/window/window_spec.rb +24 -4
- data/lib/capybara/spec/spec_helper.rb +3 -1
- data/lib/capybara/spec/test_app.rb +10 -1
- data/lib/capybara/spec/views/form.erb +7 -1
- data/lib/capybara/spec/views/path.erb +12 -0
- data/lib/capybara/spec/views/with_html.erb +2 -0
- data/lib/capybara/spec/views/with_js.erb +9 -1
- data/lib/capybara/spec/views/with_title.erb +4 -1
- data/lib/capybara/spec/views/with_windows.erb +2 -2
- data/lib/capybara/version.rb +1 -1
- data/spec/basic_node_spec.rb +1 -0
- data/spec/capybara_spec.rb +12 -3
- data/spec/dsl_spec.rb +18 -6
- data/spec/rack_test_spec.rb +6 -5
- data/spec/rspec/matchers_spec.rb +62 -16
- data/spec/rspec/views_spec.rb +7 -0
- data/spec/selenium_spec.rb +38 -3
- data/spec/selenium_spec_chrome.rb +3 -7
- metadata +13 -4
data/lib/capybara/session.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'capybara/session/matchers'
|
2
|
+
|
1
3
|
module Capybara
|
2
4
|
|
3
5
|
##
|
@@ -24,10 +26,12 @@ module Capybara
|
|
24
26
|
# When using capybara/dsl, the Session is initialized automatically for you.
|
25
27
|
#
|
26
28
|
class Session
|
29
|
+
include Capybara::SessionMatchers
|
30
|
+
|
27
31
|
NODE_METHODS = [
|
28
32
|
:all, :first, :attach_file, :text, :check, :choose,
|
29
33
|
:click_link_or_button, :click_button, :click_link, :field_labeled,
|
30
|
-
:fill_in, :find, :find_button, :find_by_id, :find_field, :find_link,
|
34
|
+
:fill_in, :find, :find_all, :find_button, :find_by_id, :find_field, :find_link,
|
31
35
|
:has_content?, :has_text?, :has_css?, :has_no_content?, :has_no_text?,
|
32
36
|
:has_no_css?, :has_no_xpath?, :resolve, :has_xpath?, :select, :uncheck,
|
33
37
|
:has_link?, :has_no_link?, :has_button?, :has_no_button?, :has_field?,
|
@@ -48,7 +52,8 @@ module Capybara
|
|
48
52
|
:windows, :open_new_window, :switch_to_window, :within_window, :window_opened_by,
|
49
53
|
:save_page, :save_and_open_page, :save_screenshot,
|
50
54
|
:save_and_open_screenshot, :reset_session!, :response_headers,
|
51
|
-
:status_code, :current_scope
|
55
|
+
:status_code, :current_scope,
|
56
|
+
:assert_current_path, :assert_no_current_path, :has_current_path?, :has_no_current_path?
|
52
57
|
] + DOCUMENT_METHODS
|
53
58
|
MODAL_METHODS = [
|
54
59
|
:accept_alert, :accept_confirm, :dismiss_confirm, :accept_prompt,
|
@@ -101,7 +106,7 @@ module Capybara
|
|
101
106
|
def reset!
|
102
107
|
if @touched
|
103
108
|
driver.reset!
|
104
|
-
assert_no_selector :xpath, "/html/body/*"
|
109
|
+
assert_no_selector :xpath, "/html/body/*" if driver.browser_initialized?
|
105
110
|
@touched = false
|
106
111
|
end
|
107
112
|
raise_server_error!
|
@@ -380,7 +385,11 @@ module Capybara
|
|
380
385
|
# `within_frame` or `within_window` methods
|
381
386
|
# @raise [ArgumentError] if both or neither arguments were provided
|
382
387
|
#
|
383
|
-
def switch_to_window(window = nil)
|
388
|
+
def switch_to_window(window = nil, options= {})
|
389
|
+
if window.is_a? Hash
|
390
|
+
options = window
|
391
|
+
window = nil
|
392
|
+
end
|
384
393
|
block_given = block_given?
|
385
394
|
if window && block_given
|
386
395
|
raise ArgumentError, "`switch_to_window` can take either a block or a window, not both"
|
@@ -395,20 +404,23 @@ module Capybara
|
|
395
404
|
driver.switch_to_window(window.handle)
|
396
405
|
window
|
397
406
|
else
|
398
|
-
|
399
|
-
|
400
|
-
driver.
|
401
|
-
|
402
|
-
|
403
|
-
|
407
|
+
wait_time = Capybara::Query.new(options).wait
|
408
|
+
document.synchronize(wait_time, errors: [Capybara::WindowError]) do
|
409
|
+
original_window_handle = driver.current_window_handle
|
410
|
+
begin
|
411
|
+
driver.window_handles.each do |handle|
|
412
|
+
driver.switch_to_window handle
|
413
|
+
if yield
|
414
|
+
return Window.new(self, handle)
|
415
|
+
end
|
404
416
|
end
|
417
|
+
rescue => e
|
418
|
+
driver.switch_to_window(original_window_handle)
|
419
|
+
raise e
|
420
|
+
else
|
421
|
+
driver.switch_to_window(original_window_handle)
|
422
|
+
raise Capybara::WindowError, "Could not find a window matching block/lambda"
|
405
423
|
end
|
406
|
-
rescue => e
|
407
|
-
driver.switch_to_window(original_window_handle)
|
408
|
-
raise e
|
409
|
-
else
|
410
|
-
driver.switch_to_window(original_window_handle)
|
411
|
-
raise Capybara::WindowError, "Could not find a window matching block/lambda"
|
412
424
|
end
|
413
425
|
end
|
414
426
|
end
|
@@ -480,7 +492,7 @@ module Capybara
|
|
480
492
|
# {https://dvcs.w3.org/hg/webdriver/raw-file/default/webdriver-spec.html#h_note_10 as order of windows isn't defined in some drivers}
|
481
493
|
#
|
482
494
|
# @param options [Hash]
|
483
|
-
# @option options [Numeric] :wait (Capybara.
|
495
|
+
# @option options [Numeric] :wait (Capybara.default_max_wait_time) maximum wait time
|
484
496
|
# @return [Capybara::Window] the window that has been opened within a block
|
485
497
|
# @raise [Capybara::WindowError] if block passed to window hasn't opened window
|
486
498
|
# or opened more than one window
|
@@ -561,7 +573,7 @@ module Capybara
|
|
561
573
|
else
|
562
574
|
options[:text]=text_or_options
|
563
575
|
end
|
564
|
-
|
576
|
+
|
565
577
|
driver.accept_modal(:confirm, options, &blk)
|
566
578
|
end
|
567
579
|
|
@@ -577,7 +589,7 @@ module Capybara
|
|
577
589
|
else
|
578
590
|
options[:text]=text_or_options
|
579
591
|
end
|
580
|
-
|
592
|
+
|
581
593
|
driver.dismiss_modal(:confirm, options, &blk)
|
582
594
|
end
|
583
595
|
|
@@ -594,7 +606,7 @@ module Capybara
|
|
594
606
|
else
|
595
607
|
options[:text]=text_or_options
|
596
608
|
end
|
597
|
-
|
609
|
+
|
598
610
|
driver.accept_modal(:prompt, options, &blk)
|
599
611
|
end
|
600
612
|
|
@@ -610,60 +622,70 @@ module Capybara
|
|
610
622
|
else
|
611
623
|
options[:text]=text_or_options
|
612
624
|
end
|
613
|
-
|
625
|
+
|
614
626
|
driver.dismiss_modal(:prompt, options, &blk)
|
615
627
|
end
|
616
628
|
|
617
629
|
##
|
618
630
|
#
|
619
|
-
# Save a snapshot of the page.
|
631
|
+
# Save a snapshot of the page. If `Capybara.asset_host` is set it will inject `base` tag
|
632
|
+
# pointing to `asset_host`.
|
620
633
|
#
|
621
|
-
#
|
634
|
+
# If invoked without arguments it will save file to `Capybara.save_and_open_page_path`
|
635
|
+
# and file will be given randomly generated filename.
|
622
636
|
#
|
623
|
-
|
624
|
-
path
|
625
|
-
|
626
|
-
|
627
|
-
|
628
|
-
File.
|
637
|
+
# @param [String] path the path to where it should be saved
|
638
|
+
# @return [String] the path to which the file was saved
|
639
|
+
#
|
640
|
+
def save_page(path = nil)
|
641
|
+
path = prepare_path(path, 'html')
|
642
|
+
File.write(path, Capybara::Helpers.inject_asset_host(body), mode: 'wb')
|
629
643
|
path
|
630
644
|
end
|
631
645
|
|
632
646
|
##
|
633
647
|
#
|
634
|
-
# Save a snapshot of the page and open it in a browser for inspection
|
648
|
+
# Save a snapshot of the page and open it in a browser for inspection.
|
649
|
+
#
|
650
|
+
# If invoked without arguments it will save file to `Capybara.save_and_open_page_path`
|
651
|
+
# and file will be given randomly generated filename.
|
635
652
|
#
|
636
|
-
# @param
|
653
|
+
# @param [String] path the path to where it should be saved
|
637
654
|
#
|
638
|
-
def save_and_open_page(
|
639
|
-
|
640
|
-
open_file(
|
655
|
+
def save_and_open_page(path = nil)
|
656
|
+
path = save_page(path)
|
657
|
+
open_file(path)
|
641
658
|
end
|
642
659
|
|
643
660
|
##
|
644
661
|
#
|
645
|
-
# Save a screenshot of page
|
662
|
+
# Save a screenshot of page.
|
646
663
|
#
|
647
|
-
#
|
648
|
-
#
|
649
|
-
|
650
|
-
|
651
|
-
|
652
|
-
|
653
|
-
|
664
|
+
# If invoked without `path` argument it will save file to `Capybara.save_and_open_page_path`
|
665
|
+
# and file will be given randomly generated filename.
|
666
|
+
#
|
667
|
+
# @param [String] path the path to where it should be saved
|
668
|
+
# @param [Hash] options a customizable set of options
|
669
|
+
# @return [String] the path to which the file was saved
|
670
|
+
def save_screenshot(path = nil, options = {})
|
671
|
+
path = prepare_path(path, 'png')
|
654
672
|
driver.save_screenshot(path, options)
|
655
673
|
path
|
656
674
|
end
|
657
675
|
|
658
676
|
##
|
659
677
|
#
|
660
|
-
# Save a screenshot of the page and open it for inspection
|
678
|
+
# Save a screenshot of the page and open it for inspection.
|
661
679
|
#
|
662
|
-
#
|
680
|
+
# If invoked without `path` argument it will save file to `Capybara.save_and_open_page_path`
|
681
|
+
# and file will be given randomly generated filename.
|
663
682
|
#
|
664
|
-
|
665
|
-
|
666
|
-
|
683
|
+
# @param [String] path the path to where it should be saved
|
684
|
+
# @param [Hash] options a customizable set of options
|
685
|
+
#
|
686
|
+
def save_and_open_screenshot(path = nil, options = {})
|
687
|
+
path = save_screenshot(path, options)
|
688
|
+
open_file(path)
|
667
689
|
end
|
668
690
|
|
669
691
|
def document
|
@@ -693,16 +715,22 @@ module Capybara
|
|
693
715
|
|
694
716
|
private
|
695
717
|
|
696
|
-
def open_file(
|
718
|
+
def open_file(path)
|
697
719
|
begin
|
698
720
|
require "launchy"
|
699
|
-
Launchy.open(
|
721
|
+
Launchy.open(path)
|
700
722
|
rescue LoadError
|
701
|
-
warn "File saved to #{
|
723
|
+
warn "File saved to #{path}."
|
702
724
|
warn "Please install the launchy gem to open the file automatically."
|
703
725
|
end
|
704
726
|
end
|
705
727
|
|
728
|
+
def prepare_path(path, extension)
|
729
|
+
path = default_path(extension) if path.nil?
|
730
|
+
FileUtils.mkdir_p(File.dirname(path))
|
731
|
+
path
|
732
|
+
end
|
733
|
+
|
706
734
|
def default_path(extension)
|
707
735
|
timestamp = Time.new.strftime("%Y%m%d%H%M%S")
|
708
736
|
path = "capybara-#{timestamp}#{rand(10**10)}.#{extension}"
|
@@ -0,0 +1,69 @@
|
|
1
|
+
module Capybara
|
2
|
+
module SessionMatchers
|
3
|
+
##
|
4
|
+
# Asserts that the page has the given path.
|
5
|
+
# By default this will compare against the path+query portion of the full url
|
6
|
+
#
|
7
|
+
# @!macro current_path_query_params
|
8
|
+
# @overload $0(string, options = {})
|
9
|
+
# @param string [String] The string that the current 'path' should equal
|
10
|
+
# @overload $0(regexp, options = {})
|
11
|
+
# @param regexp [Regexp] The regexp that the current 'path' should match to
|
12
|
+
# @option options [Numeric] :wait (Capybara.default_max_wait_time) Maximum time that Capybara will wait for the current path to eq/match given string/regexp argument
|
13
|
+
# @option options [Boolean] :url (false) Whether the compare should be done against the full url
|
14
|
+
# @option options [Boolean] :only_path (false) Whether the compare should be done against just the path protion of the url
|
15
|
+
# @raise [Capybara::ExpectationNotMet] if the assertion hasn't succeeded during wait time
|
16
|
+
# @return [true]
|
17
|
+
#
|
18
|
+
def assert_current_path(path, options={})
|
19
|
+
query = Capybara::Queries::CurrentPathQuery.new(path, options)
|
20
|
+
document.synchronize(query.wait) do
|
21
|
+
unless query.resolves_for?(self)
|
22
|
+
raise Capybara::ExpectationNotMet, query.failure_message
|
23
|
+
end
|
24
|
+
end
|
25
|
+
return true
|
26
|
+
end
|
27
|
+
|
28
|
+
##
|
29
|
+
# Asserts that the page doesn't have the given path.
|
30
|
+
#
|
31
|
+
# @macro current_path_query_params
|
32
|
+
# @raise [Capybara::ExpectationNotMet] if the assertion hasn't succeeded during wait time
|
33
|
+
# @return [true]
|
34
|
+
#
|
35
|
+
def assert_no_current_path(path, options={})
|
36
|
+
query = Capybara::Queries::CurrentPathQuery.new(path, options)
|
37
|
+
document.synchronize(query.wait) do
|
38
|
+
if query.resolves_for?(self)
|
39
|
+
raise Capybara::ExpectationNotMet, query.negative_failure_message
|
40
|
+
end
|
41
|
+
end
|
42
|
+
return true
|
43
|
+
end
|
44
|
+
|
45
|
+
##
|
46
|
+
# Checks if the page has the given path.
|
47
|
+
#
|
48
|
+
# @macro current_path_query_params
|
49
|
+
# @return [Boolean]
|
50
|
+
#
|
51
|
+
def has_current_path?(path, options={})
|
52
|
+
assert_current_path(path, options)
|
53
|
+
rescue Capybara::ExpectationNotMet
|
54
|
+
return false
|
55
|
+
end
|
56
|
+
|
57
|
+
##
|
58
|
+
# Checks if the page doesn't have the given path.
|
59
|
+
#
|
60
|
+
# @macro current_path_query_params
|
61
|
+
# @return [Boolean]
|
62
|
+
#
|
63
|
+
def has_no_current_path?(path, options={})
|
64
|
+
assert_no_current_path(path, options)
|
65
|
+
rescue Capybara::ExpectationNotMet
|
66
|
+
return false
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
@@ -100,4 +100,12 @@ $(function() {
|
|
100
100
|
$(this).attr('response', response);
|
101
101
|
}
|
102
102
|
});
|
103
|
+
$('#delayed-page-change').click(function() {
|
104
|
+
setTimeout(function() {
|
105
|
+
window.location.pathname = '/with_html'
|
106
|
+
}, 500)
|
107
|
+
})
|
108
|
+
$('#with-key-events').keydown(function(e){
|
109
|
+
$('#key-events-output').append('keydown:'+e.which+' ')
|
110
|
+
});
|
103
111
|
});
|
@@ -149,4 +149,9 @@ Capybara::SpecHelper.spec "#all" do
|
|
149
149
|
end
|
150
150
|
end
|
151
151
|
end
|
152
|
+
|
153
|
+
it "should have #find_all as an alias" do
|
154
|
+
expect(Capybara::Node::Finders.instance_method(:all)).to eq Capybara::Node::Finders.instance_method(:find_all)
|
155
|
+
expect(@session.find_all('//p').size).to eq(3)
|
156
|
+
end
|
152
157
|
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
Capybara::SpecHelper.spec '#assert_current_path' do
|
2
|
+
before do
|
3
|
+
@session.visit('/with_js')
|
4
|
+
end
|
5
|
+
|
6
|
+
it "should not raise if the page has the given current path" do
|
7
|
+
expect {@session.assert_current_path('/with_js')}.not_to raise_error
|
8
|
+
end
|
9
|
+
|
10
|
+
it "should allow regexp matches" do
|
11
|
+
expect { @session.assert_current_path(/w[a-z]{3}_js/) }.not_to raise_error
|
12
|
+
end
|
13
|
+
|
14
|
+
it "should wait for current_path", :requires => [:js] do
|
15
|
+
@session.click_link("Change page")
|
16
|
+
expect { @session.assert_current_path("/with_html") }.not_to raise_error
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should raise if the page has not the given current_path" do
|
20
|
+
expect{@session.assert_current_path('/with_html')}.to raise_error(Capybara::ExpectationNotMet, 'expected "/with_js" to equal "/with_html"')
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should check query options" do
|
24
|
+
@session.visit('/with_js?test=test')
|
25
|
+
expect{@session.assert_current_path('/with_js?test=test')}.not_to raise_error
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should compare the full url" do
|
29
|
+
expect{@session.assert_current_path(%r{\Ahttp://[^/]*/with_js\Z}, url: true)}.not_to raise_error
|
30
|
+
end
|
31
|
+
|
32
|
+
it "should ignore the query" do
|
33
|
+
@session.visit('/with_js?test=test')
|
34
|
+
expect{@session.assert_current_path('/with_js', only_path: true)}.not_to raise_error
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
Capybara::SpecHelper.spec '#assert_no_current_path?' do
|
39
|
+
before do
|
40
|
+
@session.visit('/with_js')
|
41
|
+
end
|
42
|
+
|
43
|
+
it "should raise if the page has the given current_path" do
|
44
|
+
expect{@session.assert_no_current_path('/with_js')}.to raise_error(Capybara::ExpectationNotMet)
|
45
|
+
end
|
46
|
+
|
47
|
+
it "should allow regexp matches" do
|
48
|
+
expect{@session.assert_no_current_path(/monkey/)}.not_to raise_error
|
49
|
+
end
|
50
|
+
|
51
|
+
it "should wait for current_path to disappear", :requires => [:js] do
|
52
|
+
@session.click_link("Change page")
|
53
|
+
expect{@session.assert_no_current_path('/with_js')}.not_to raise_error
|
54
|
+
end
|
55
|
+
|
56
|
+
it "should not raise if the page has not the given current_path" do
|
57
|
+
expect{@session.assert_no_current_path('/with_html')}.not_to raise_error
|
58
|
+
end
|
59
|
+
end
|
@@ -189,7 +189,7 @@ Capybara::SpecHelper.spec '#assert_no_text' do
|
|
189
189
|
@session.visit('/with_js')
|
190
190
|
@session.click_link('Click me')
|
191
191
|
@session.find(:css, '#reload-list').click
|
192
|
-
@session.find(:css, '#the-list').assert_no_text('Foo Bar', :wait => 0.
|
192
|
+
@session.find(:css, '#the-list').assert_no_text('Foo Bar', :wait => 0.3)
|
193
193
|
end
|
194
194
|
end
|
195
195
|
end
|
@@ -59,8 +59,8 @@ Capybara::SpecHelper.spec "#attach_file" do
|
|
59
59
|
it "should not break when using HTML5 multiple file input" do
|
60
60
|
@session.attach_file "Multiple Documents", @test_file_path
|
61
61
|
@session.click_button('Upload Multiple')
|
62
|
-
expect(@session.body).to include("1 | ")#number of files
|
63
62
|
expect(@session).to have_content(File.read(@test_file_path))
|
63
|
+
expect(@session.body).to include("1 | ")#number of files
|
64
64
|
end
|
65
65
|
|
66
66
|
it "should not break when using HTML5 multiple file input uploading multiple files" do
|
@@ -74,7 +74,7 @@ Capybara::SpecHelper.spec "#attach_file" do
|
|
74
74
|
|
75
75
|
it "should not send anything when attaching no files to a multiple upload field" do
|
76
76
|
@session.click_button('Upload Empty Multiple')
|
77
|
-
expect(@session
|
77
|
+
expect(@session).to have_content("Successfully ignored empty file field")
|
78
78
|
end
|
79
79
|
end
|
80
80
|
|
@@ -9,11 +9,13 @@ Capybara::SpecHelper.spec '#body' do
|
|
9
9
|
context "encoding of response between ascii and utf8" do
|
10
10
|
it "should be valid with html entities" do
|
11
11
|
@session.visit('/with_html_entities')
|
12
|
+
expect(@session).to have_content('Encoding') # wait for content to appear if visit is async
|
12
13
|
expect { @session.body.encode!("UTF-8") }.not_to raise_error
|
13
14
|
end
|
14
15
|
|
15
16
|
it "should be valid without html entities" do
|
16
17
|
@session.visit('/with_html')
|
18
|
+
expect(@session).to have_content('This is a test') # wait for content to appear if visit is async
|
17
19
|
expect { @session.body.encode!("UTF-8") }.not_to raise_error
|
18
20
|
end
|
19
21
|
end
|
@@ -11,8 +11,8 @@ Capybara::SpecHelper.spec '#click_button' do
|
|
11
11
|
|
12
12
|
it "casts to string" do
|
13
13
|
@session.click_button(:'Relative Action')
|
14
|
-
expect(@session.current_path).to eq('/relative')
|
15
14
|
expect(extract_results(@session)['relative']).to eq('Relative Action')
|
15
|
+
expect(@session.current_path).to eq('/relative')
|
16
16
|
end
|
17
17
|
|
18
18
|
context "with multiple values with the same name" do
|
@@ -26,16 +26,16 @@ Capybara::SpecHelper.spec '#click_button' do
|
|
26
26
|
context "with a form that has a relative url as an action" do
|
27
27
|
it "should post to the correct url" do
|
28
28
|
@session.click_button('Relative Action')
|
29
|
-
expect(@session.current_path).to eq('/relative')
|
30
29
|
expect(extract_results(@session)['relative']).to eq('Relative Action')
|
30
|
+
expect(@session.current_path).to eq('/relative')
|
31
31
|
end
|
32
32
|
end
|
33
33
|
|
34
34
|
context "with a form that has no action specified" do
|
35
35
|
it "should post to the correct url" do
|
36
36
|
@session.click_button('No Action')
|
37
|
-
expect(@session.current_path).to eq('/form')
|
38
37
|
expect(extract_results(@session)['no_action']).to eq('No Action')
|
38
|
+
expect(@session.current_path).to eq('/form')
|
39
39
|
end
|
40
40
|
end
|
41
41
|
|
@@ -110,7 +110,7 @@ Capybara::SpecHelper.spec '#click_button' do
|
|
110
110
|
expect(@results['pets']).to include('dog', 'hamster')
|
111
111
|
expect(@results['pets']).not_to include('cat')
|
112
112
|
end
|
113
|
-
|
113
|
+
|
114
114
|
it "should default checkbox value to 'on' if none specififed" do
|
115
115
|
expect(@results['valueless_checkbox']).to eq('on')
|
116
116
|
end
|
@@ -134,11 +134,11 @@ Capybara::SpecHelper.spec '#click_button' do
|
|
134
134
|
it "should not serialize a select tag without options" do
|
135
135
|
expect(@results['tendency']).to be_nil
|
136
136
|
end
|
137
|
-
|
137
|
+
|
138
138
|
it "should convert lf to cr/lf in submitted textareas" do
|
139
139
|
expect(@results['newline']).to eq("\r\nNew line after and before textarea tag\r\n")
|
140
140
|
end
|
141
|
-
|
141
|
+
|
142
142
|
it "should not submit disabled fields" do
|
143
143
|
expect(@results['disabled_text_field']).to be_nil
|
144
144
|
expect(@results['disabled_textarea']).to be_nil
|
@@ -254,7 +254,7 @@ Capybara::SpecHelper.spec '#click_button' do
|
|
254
254
|
expect(extract_results(@session)['first_name']).to eq('John')
|
255
255
|
end
|
256
256
|
end
|
257
|
-
|
257
|
+
|
258
258
|
|
259
259
|
context "with value given on an image button" do
|
260
260
|
it "should submit the associated form" do
|
@@ -349,8 +349,17 @@ Capybara::SpecHelper.spec '#click_button' do
|
|
349
349
|
context "with formaction attribute on button" do
|
350
350
|
it "should submit to the formaction attribute" do
|
351
351
|
@session.click_button('Formaction button')
|
352
|
+
@results = extract_results(@session)
|
352
353
|
expect(@session.current_path).to eq '/form'
|
354
|
+
expect(@results['which_form']).to eq 'formaction form'
|
355
|
+
end
|
356
|
+
end
|
357
|
+
|
358
|
+
context "with formmethod attribute on button" do
|
359
|
+
it "should submit to the formethod attribute" do
|
360
|
+
@session.click_button('Formmethod button')
|
353
361
|
@results = extract_results(@session)
|
362
|
+
expect(@session.current_path).to eq '/form/get'
|
354
363
|
expect(@results['which_form']).to eq 'formaction form'
|
355
364
|
end
|
356
365
|
end
|
@@ -377,8 +386,8 @@ Capybara::SpecHelper.spec '#click_button' do
|
|
377
386
|
|
378
387
|
it "should follow redirects" do
|
379
388
|
@session.click_button('Go FAR')
|
380
|
-
expect(@session.current_url).to match(%r{/landed$})
|
381
389
|
expect(@session).to have_content('You landed')
|
390
|
+
expect(@session.current_url).to match(%r{/landed$})
|
382
391
|
end
|
383
392
|
|
384
393
|
it "should post pack to the same URL when no action given" do
|