capybara 3.3.1 → 3.4.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 (159) hide show
  1. checksums.yaml +4 -4
  2. data/History.md +16 -0
  3. data/README.md +5 -7
  4. data/lib/capybara.rb +7 -6
  5. data/lib/capybara/config.rb +1 -1
  6. data/lib/capybara/dsl.rb +2 -2
  7. data/lib/capybara/helpers.rb +3 -3
  8. data/lib/capybara/minitest/spec.rb +3 -3
  9. data/lib/capybara/node/actions.rb +18 -18
  10. data/lib/capybara/node/base.rb +1 -1
  11. data/lib/capybara/node/element.rb +2 -2
  12. data/lib/capybara/node/finders.rb +6 -6
  13. data/lib/capybara/node/matchers.rb +5 -5
  14. data/lib/capybara/node/simple.rb +2 -2
  15. data/lib/capybara/queries/ancestor_query.rb +1 -1
  16. data/lib/capybara/queries/base_query.rb +12 -11
  17. data/lib/capybara/queries/current_path_query.rb +1 -1
  18. data/lib/capybara/queries/selector_query.rb +39 -15
  19. data/lib/capybara/queries/sibling_query.rb +1 -1
  20. data/lib/capybara/queries/text_query.rb +1 -1
  21. data/lib/capybara/rack_test/browser.rb +7 -7
  22. data/lib/capybara/rack_test/driver.rb +1 -1
  23. data/lib/capybara/rack_test/form.rb +7 -7
  24. data/lib/capybara/rack_test/node.rb +16 -16
  25. data/lib/capybara/rails.rb +1 -1
  26. data/lib/capybara/result.rb +8 -4
  27. data/lib/capybara/rspec/features.rb +4 -4
  28. data/lib/capybara/rspec/matchers.rb +6 -6
  29. data/lib/capybara/selector.rb +106 -90
  30. data/lib/capybara/selector/css.rb +4 -4
  31. data/lib/capybara/selector/filter_set.rb +52 -8
  32. data/lib/capybara/selector/selector.rb +39 -15
  33. data/lib/capybara/selenium/driver.rb +10 -10
  34. data/lib/capybara/selenium/driver_specializations/chrome_driver.rb +8 -0
  35. data/lib/capybara/selenium/node.rb +9 -10
  36. data/lib/capybara/selenium/nodes/chrome_node.rb +18 -0
  37. data/lib/capybara/selenium/nodes/marionette_node.rb +32 -7
  38. data/lib/capybara/server.rb +3 -3
  39. data/lib/capybara/server/animation_disabler.rb +1 -1
  40. data/lib/capybara/server/middleware.rb +1 -1
  41. data/lib/capybara/session.rb +23 -19
  42. data/lib/capybara/session/config.rb +18 -3
  43. data/lib/capybara/spec/public/test.js +1 -1
  44. data/lib/capybara/spec/session/accept_alert_spec.rb +10 -10
  45. data/lib/capybara/spec/session/accept_confirm_spec.rb +3 -3
  46. data/lib/capybara/spec/session/accept_prompt_spec.rb +9 -10
  47. data/lib/capybara/spec/session/all_spec.rb +33 -32
  48. data/lib/capybara/spec/session/ancestor_spec.rb +19 -19
  49. data/lib/capybara/spec/session/assert_all_of_selectors_spec.rb +38 -38
  50. data/lib/capybara/spec/session/assert_current_path_spec.rb +16 -16
  51. data/lib/capybara/spec/session/assert_selector_spec.rb +53 -53
  52. data/lib/capybara/spec/session/assert_style_spec.rb +3 -3
  53. data/lib/capybara/spec/session/assert_text_spec.rb +31 -30
  54. data/lib/capybara/spec/session/assert_title_spec.rb +12 -12
  55. data/lib/capybara/spec/session/attach_file_spec.rb +51 -52
  56. data/lib/capybara/spec/session/body_spec.rb +6 -6
  57. data/lib/capybara/spec/session/check_spec.rb +52 -47
  58. data/lib/capybara/spec/session/choose_spec.rb +32 -32
  59. data/lib/capybara/spec/session/click_button_spec.rb +103 -103
  60. data/lib/capybara/spec/session/click_link_or_button_spec.rb +24 -23
  61. data/lib/capybara/spec/session/click_link_spec.rb +49 -48
  62. data/lib/capybara/spec/session/current_scope_spec.rb +7 -7
  63. data/lib/capybara/spec/session/current_url_spec.rb +26 -27
  64. data/lib/capybara/spec/session/dismiss_confirm_spec.rb +3 -3
  65. data/lib/capybara/spec/session/dismiss_prompt_spec.rb +2 -2
  66. data/lib/capybara/spec/session/element/assert_match_selector_spec.rb +8 -8
  67. data/lib/capybara/spec/session/element/match_css_spec.rb +10 -10
  68. data/lib/capybara/spec/session/element/match_xpath_spec.rb +6 -6
  69. data/lib/capybara/spec/session/element/matches_selector_spec.rb +51 -51
  70. data/lib/capybara/spec/session/evaluate_async_script_spec.rb +7 -7
  71. data/lib/capybara/spec/session/evaluate_script_spec.rb +15 -8
  72. data/lib/capybara/spec/session/execute_script_spec.rb +7 -7
  73. data/lib/capybara/spec/session/fill_in_spec.rb +43 -42
  74. data/lib/capybara/spec/session/find_button_spec.rb +23 -23
  75. data/lib/capybara/spec/session/find_by_id_spec.rb +7 -7
  76. data/lib/capybara/spec/session/find_field_spec.rb +32 -30
  77. data/lib/capybara/spec/session/find_link_spec.rb +21 -21
  78. data/lib/capybara/spec/session/find_spec.rb +153 -135
  79. data/lib/capybara/spec/session/first_spec.rb +41 -41
  80. data/lib/capybara/spec/session/frame/frame_title_spec.rb +5 -5
  81. data/lib/capybara/spec/session/frame/frame_url_spec.rb +5 -5
  82. data/lib/capybara/spec/session/frame/switch_to_frame_spec.rb +17 -17
  83. data/lib/capybara/spec/session/frame/within_frame_spec.rb +31 -17
  84. data/lib/capybara/spec/session/go_back_spec.rb +1 -1
  85. data/lib/capybara/spec/session/go_forward_spec.rb +1 -1
  86. data/lib/capybara/spec/session/has_all_selectors_spec.rb +17 -17
  87. data/lib/capybara/spec/session/has_button_spec.rb +13 -13
  88. data/lib/capybara/spec/session/has_css_spec.rb +133 -131
  89. data/lib/capybara/spec/session/has_current_path_spec.rb +29 -29
  90. data/lib/capybara/spec/session/has_field_spec.rb +58 -58
  91. data/lib/capybara/spec/session/has_link_spec.rb +4 -4
  92. data/lib/capybara/spec/session/has_none_selectors_spec.rb +24 -24
  93. data/lib/capybara/spec/session/has_select_spec.rb +43 -43
  94. data/lib/capybara/spec/session/has_selector_spec.rb +71 -71
  95. data/lib/capybara/spec/session/has_style_spec.rb +3 -3
  96. data/lib/capybara/spec/session/has_table_spec.rb +4 -4
  97. data/lib/capybara/spec/session/has_text_spec.rb +53 -52
  98. data/lib/capybara/spec/session/has_title_spec.rb +14 -14
  99. data/lib/capybara/spec/session/has_xpath_spec.rb +39 -38
  100. data/lib/capybara/spec/session/headers_spec.rb +1 -1
  101. data/lib/capybara/spec/session/html_spec.rb +6 -6
  102. data/lib/capybara/spec/session/node_spec.rb +129 -123
  103. data/lib/capybara/spec/session/node_wrapper_spec.rb +10 -7
  104. data/lib/capybara/spec/session/refresh_spec.rb +4 -7
  105. data/lib/capybara/spec/session/reset_session_spec.rb +28 -28
  106. data/lib/capybara/spec/session/response_code_spec.rb +1 -1
  107. data/lib/capybara/spec/session/save_and_open_page_spec.rb +2 -2
  108. data/lib/capybara/spec/session/save_page_spec.rb +37 -37
  109. data/lib/capybara/spec/session/save_screenshot_spec.rb +6 -6
  110. data/lib/capybara/spec/session/screenshot_spec.rb +2 -2
  111. data/lib/capybara/spec/session/select_spec.rb +81 -81
  112. data/lib/capybara/spec/session/selectors_spec.rb +17 -17
  113. data/lib/capybara/spec/session/sibling_spec.rb +9 -9
  114. data/lib/capybara/spec/session/text_spec.rb +23 -23
  115. data/lib/capybara/spec/session/title_spec.rb +5 -5
  116. data/lib/capybara/spec/session/uncheck_spec.rb +24 -20
  117. data/lib/capybara/spec/session/unselect_spec.rb +37 -37
  118. data/lib/capybara/spec/session/visit_spec.rb +48 -49
  119. data/lib/capybara/spec/session/window/current_window_spec.rb +1 -1
  120. data/lib/capybara/spec/session/window/switch_to_window_spec.rb +16 -16
  121. data/lib/capybara/spec/session/window/window_opened_by_spec.rb +2 -2
  122. data/lib/capybara/spec/session/window/window_spec.rb +4 -4
  123. data/lib/capybara/spec/session/window/within_window_spec.rb +14 -14
  124. data/lib/capybara/spec/session/within_spec.rb +41 -41
  125. data/lib/capybara/spec/spec_helper.rb +11 -9
  126. data/lib/capybara/spec/test_app.rb +18 -17
  127. data/lib/capybara/spec/views/form.erb +29 -31
  128. data/lib/capybara/spec/views/with_html.erb +2 -2
  129. data/lib/capybara/version.rb +1 -1
  130. data/spec/basic_node_spec.rb +23 -23
  131. data/spec/capybara_spec.rb +20 -20
  132. data/spec/css_splitter_spec.rb +7 -7
  133. data/spec/dsl_spec.rb +37 -32
  134. data/spec/filter_set_spec.rb +4 -4
  135. data/spec/fixtures/selenium_driver_rspec_failure.rb +1 -1
  136. data/spec/fixtures/selenium_driver_rspec_success.rb +1 -1
  137. data/spec/minitest_spec.rb +4 -4
  138. data/spec/minitest_spec_spec.rb +23 -23
  139. data/spec/per_session_config_spec.rb +5 -5
  140. data/spec/rack_test_spec.rb +44 -44
  141. data/spec/result_spec.rb +14 -14
  142. data/spec/rspec/features_spec.rb +13 -13
  143. data/spec/rspec/scenarios_spec.rb +4 -4
  144. data/spec/rspec/shared_spec_matchers.rb +282 -281
  145. data/spec/rspec/views_spec.rb +3 -3
  146. data/spec/rspec_matchers_spec.rb +10 -10
  147. data/spec/rspec_spec.rb +29 -29
  148. data/spec/selector_spec.rb +64 -64
  149. data/spec/selenium_spec_chrome.rb +14 -22
  150. data/spec/selenium_spec_chrome_remote.rb +28 -8
  151. data/spec/selenium_spec_edge.rb +9 -4
  152. data/spec/selenium_spec_firefox_remote.rb +87 -0
  153. data/spec/selenium_spec_ie.rb +9 -4
  154. data/spec/selenium_spec_marionette.rb +42 -18
  155. data/spec/server_spec.rb +29 -27
  156. data/spec/session_spec.rb +17 -17
  157. data/spec/shared_selenium_session.rb +70 -52
  158. data/spec/spec_helper.rb +1 -1
  159. metadata +4 -2
@@ -5,128 +5,128 @@ Capybara::SpecHelper.spec '#first' do
5
5
  @session.visit('/with_html')
6
6
  end
7
7
 
8
- it "should find the first element using the given locator" do
8
+ it 'should find the first element using the given locator' do
9
9
  expect(@session.first('//h1').text).to eq('This is a test')
10
10
  expect(@session.first("//input[@id='test_field']").value).to eq('monkey')
11
11
  end
12
12
 
13
- it "should raise ElementNotFound when nothing was found" do
13
+ it 'should raise ElementNotFound when nothing was found' do
14
14
  expect do
15
15
  @session.first('//div[@id="nosuchthing"]')
16
16
  end.to raise_error Capybara::ElementNotFound
17
17
  end
18
18
 
19
- it "should return nil when nothing was found if count options allow no results" do
19
+ it 'should return nil when nothing was found if count options allow no results' do
20
20
  expect(@session.first('//div[@id="nosuchthing"]', minimum: 0)).to be_nil
21
21
  expect(@session.first('//div[@id="nosuchthing"]', count: 0)).to be_nil
22
22
  expect(@session.first('//div[@id="nosuchthing"]', between: (0..3))).to be_nil
23
23
  end
24
24
 
25
- it "should accept an XPath instance" do
25
+ it 'should accept an XPath instance' do
26
26
  @session.visit('/form')
27
27
  @xpath = Capybara::Selector.all[:fillable_field].call('First Name')
28
28
  expect(@xpath).to be_a(::XPath::Union)
29
29
  expect(@session.first(@xpath).value).to eq('John')
30
30
  end
31
31
 
32
- it "should raise when unused parameters are passed" do
32
+ it 'should raise when unused parameters are passed' do
33
33
  expect do
34
34
  @session.first(:css, 'h1', 'unused text')
35
35
  end.to raise_error ArgumentError, /Unused parameters passed.*unused text/
36
36
  end
37
37
 
38
- context "with css selectors" do
39
- it "should find the first element using the given selector" do
38
+ context 'with css selectors' do
39
+ it 'should find the first element using the given selector' do
40
40
  expect(@session.first(:css, 'h1').text).to eq('This is a test')
41
41
  expect(@session.first(:css, "input[id='test_field']").value).to eq('monkey')
42
42
  end
43
43
  end
44
44
 
45
- context "with xpath selectors" do
46
- it "should find the first element using the given locator" do
45
+ context 'with xpath selectors' do
46
+ it 'should find the first element using the given locator' do
47
47
  expect(@session.first(:xpath, '//h1').text).to eq('This is a test')
48
48
  expect(@session.first(:xpath, "//input[@id='test_field']").value).to eq('monkey')
49
49
  end
50
50
  end
51
51
 
52
- context "with css as default selector" do
52
+ context 'with css as default selector' do
53
53
  before { Capybara.default_selector = :css }
54
54
 
55
- it "should find the first element using the given locator" do
55
+ it 'should find the first element using the given locator' do
56
56
  expect(@session.first('h1').text).to eq('This is a test')
57
57
  expect(@session.first("input[id='test_field']").value).to eq('monkey')
58
58
  end
59
59
  end
60
60
 
61
- context "with visible filter" do
62
- it "should only find visible nodes when true" do
61
+ context 'with visible filter' do
62
+ it 'should only find visible nodes when true' do
63
63
  expect do
64
- @session.first(:css, "a#invisible", visible: true)
64
+ @session.first(:css, 'a#invisible', visible: true)
65
65
  end.to raise_error Capybara::ElementNotFound
66
66
  end
67
67
 
68
- it "should find nodes regardless of whether they are invisible when false" do
69
- expect(@session.first(:css, "a#invisible", visible: false)).to be_truthy
70
- expect(@session.first(:css, "a#invisible", visible: false, text: 'hidden link')).to be_truthy
71
- expect(@session.first(:css, "a#visible", visible: false)).to be_truthy
68
+ it 'should find nodes regardless of whether they are invisible when false' do
69
+ expect(@session.first(:css, 'a#invisible', visible: false)).to be_truthy
70
+ expect(@session.first(:css, 'a#invisible', visible: false, text: 'hidden link')).to be_truthy
71
+ expect(@session.first(:css, 'a#visible', visible: false)).to be_truthy
72
72
  end
73
73
 
74
- it "should find nodes regardless of whether they are invisible when :all" do
75
- expect(@session.first(:css, "a#invisible", visible: :all)).to be_truthy
76
- expect(@session.first(:css, "a#invisible", visible: :all, text: 'hidden link')).to be_truthy
77
- expect(@session.first(:css, "a#visible", visible: :all)).to be_truthy
74
+ it 'should find nodes regardless of whether they are invisible when :all' do
75
+ expect(@session.first(:css, 'a#invisible', visible: :all)).to be_truthy
76
+ expect(@session.first(:css, 'a#invisible', visible: :all, text: 'hidden link')).to be_truthy
77
+ expect(@session.first(:css, 'a#visible', visible: :all)).to be_truthy
78
78
  end
79
79
 
80
- it "should find only hidden nodes when :hidden" do
81
- expect(@session.first(:css, "a#invisible", visible: :hidden)).to be_truthy
82
- expect(@session.first(:css, "a#invisible", visible: :hidden, text: 'hidden link')).to be_truthy
80
+ it 'should find only hidden nodes when :hidden' do
81
+ expect(@session.first(:css, 'a#invisible', visible: :hidden)).to be_truthy
82
+ expect(@session.first(:css, 'a#invisible', visible: :hidden, text: 'hidden link')).to be_truthy
83
83
  expect do
84
- @session.first(:css, "a#invisible", visible: :hidden, text: 'not hidden link')
84
+ @session.first(:css, 'a#invisible', visible: :hidden, text: 'not hidden link')
85
85
  end.to raise_error Capybara::ElementNotFound
86
86
  expect do
87
- @session.first(:css, "a#visible", visible: :hidden)
87
+ @session.first(:css, 'a#visible', visible: :hidden)
88
88
  end.to raise_error Capybara::ElementNotFound
89
89
  end
90
90
 
91
- it "should find only visible nodes when :visible" do
91
+ it 'should find only visible nodes when :visible' do
92
92
  expect do
93
- @session.first(:css, "a#invisible", visible: :visible)
93
+ @session.first(:css, 'a#invisible', visible: :visible)
94
94
  end.to raise_error Capybara::ElementNotFound
95
95
  expect do
96
- @session.first(:css, "a#invisible", visible: :visible, text: 'hidden link')
96
+ @session.first(:css, 'a#invisible', visible: :visible, text: 'hidden link')
97
97
  end.to raise_error Capybara::ElementNotFound
98
- expect(@session.first(:css, "a#visible", visible: :visible)).to be_truthy
98
+ expect(@session.first(:css, 'a#visible', visible: :visible)).to be_truthy
99
99
  end
100
100
 
101
- it "should default to Capybara.ignore_hidden_elements" do
101
+ it 'should default to Capybara.ignore_hidden_elements' do
102
102
  Capybara.ignore_hidden_elements = true
103
103
  expect do
104
- @session.first(:css, "a#invisible")
104
+ @session.first(:css, 'a#invisible')
105
105
  end.to raise_error Capybara::ElementNotFound
106
106
  Capybara.ignore_hidden_elements = false
107
- expect(@session.first(:css, "a#invisible")).to be_truthy
108
- expect(@session.first(:css, "a")).to be_truthy
107
+ expect(@session.first(:css, 'a#invisible')).to be_truthy
108
+ expect(@session.first(:css, 'a')).to be_truthy
109
109
  end
110
110
  end
111
111
 
112
- context "within a scope" do
112
+ context 'within a scope' do
113
113
  before do
114
114
  @session.visit('/with_scope')
115
115
  end
116
116
 
117
- it "should find the first element using the given locator" do
117
+ it 'should find the first element using the given locator' do
118
118
  @session.within(:xpath, "//div[@id='for_bar']") do
119
119
  expect(@session.first('.//form')).to be_truthy
120
120
  end
121
121
  end
122
122
  end
123
123
 
124
- context "waiting behavior", requires: [:js] do
124
+ context 'waiting behavior', requires: [:js] do
125
125
  before do
126
126
  @session.visit('/with_js')
127
127
  end
128
128
 
129
- it "should not wait if minimum: 0" do
129
+ it 'should not wait if minimum: 0' do
130
130
  @session.click_link('clickable')
131
131
  Capybara.using_wait_time(3) do
132
132
  start_time = Time.now
@@ -135,14 +135,14 @@ Capybara::SpecHelper.spec '#first' do
135
135
  end
136
136
  end
137
137
 
138
- it "should wait for at least one match by default" do
138
+ it 'should wait for at least one match by default' do
139
139
  Capybara.using_wait_time(3) do
140
140
  @session.click_link('clickable')
141
141
  expect(@session.first(:css, 'a#has-been-clicked')).not_to be_nil
142
142
  end
143
143
  end
144
144
 
145
- it "should raise an error after waiting if no match" do
145
+ it 'should raise an error after waiting if no match' do
146
146
  @session.click_link('clickable')
147
147
  Capybara.using_wait_time(3) do
148
148
  start_time = Time.now
@@ -5,19 +5,19 @@ Capybara::SpecHelper.spec '#frame_title', requires: [:frames] do
5
5
  @session.visit('/within_frames')
6
6
  end
7
7
 
8
- it "should return the title in a frame" do
9
- @session.within_frame("frameOne") do
8
+ it 'should return the title in a frame' do
9
+ @session.within_frame('frameOne') do
10
10
  expect(@session.driver.frame_title).to eq 'This is the title of frame one'
11
11
  end
12
12
  end
13
13
 
14
- it "should return the title in FrameTwo" do
15
- @session.within_frame("frameTwo") do
14
+ it 'should return the title in FrameTwo' do
15
+ @session.within_frame('frameTwo') do
16
16
  expect(@session.driver.frame_title).to eq 'This is the title of frame two'
17
17
  end
18
18
  end
19
19
 
20
- it "should return the title in the main frame" do
20
+ it 'should return the title in the main frame' do
21
21
  expect(@session.driver.frame_title).to eq 'With Frames'
22
22
  end
23
23
  end
@@ -5,19 +5,19 @@ Capybara::SpecHelper.spec '#frame_url', requires: [:frames] do
5
5
  @session.visit('/within_frames')
6
6
  end
7
7
 
8
- it "should return the url in a frame" do
9
- @session.within_frame("frameOne") do
8
+ it 'should return the url in a frame' do
9
+ @session.within_frame('frameOne') do
10
10
  expect(@session.driver.frame_url).to end_with '/frame_one'
11
11
  end
12
12
  end
13
13
 
14
- it "should return the url in FrameTwo" do
15
- @session.within_frame("frameTwo") do
14
+ it 'should return the url in FrameTwo' do
15
+ @session.within_frame('frameTwo') do
16
16
  expect(@session.driver.frame_url).to end_with '/frame_two'
17
17
  end
18
18
  end
19
19
 
20
- it "should return the url in the main frame" do
20
+ it 'should return the url in the main frame' do
21
21
  expect(@session.driver.frame_url).to end_with('/within_frames')
22
22
  end
23
23
  end
@@ -10,45 +10,45 @@ Capybara::SpecHelper.spec '#switch_to_frame', requires: [:frames] do
10
10
  @session.switch_to_frame(:top)
11
11
  end
12
12
 
13
- it "should find the div in frameOne" do
14
- frame = @session.find(:frame, "frameOne")
13
+ it 'should find the div in frameOne' do
14
+ frame = @session.find(:frame, 'frameOne')
15
15
  @session.switch_to_frame(frame)
16
16
  expect(@session.find("//*[@id='divInFrameOne']").text).to eql 'This is the text of divInFrameOne'
17
17
  end
18
18
 
19
- it "should find the div in FrameTwo" do
20
- frame = @session.find(:frame, "frameTwo")
19
+ it 'should find the div in FrameTwo' do
20
+ frame = @session.find(:frame, 'frameTwo')
21
21
  @session.switch_to_frame(frame)
22
22
  expect(@session.find("//*[@id='divInFrameTwo']").text).to eql 'This is the text of divInFrameTwo'
23
23
  end
24
24
 
25
- it "should return to the parent frame when told to" do
26
- frame = @session.find(:frame, "frameOne")
25
+ it 'should return to the parent frame when told to' do
26
+ frame = @session.find(:frame, 'frameOne')
27
27
  @session.switch_to_frame(frame)
28
28
  @session.switch_to_frame(:parent)
29
29
  expect(@session.find("//*[@id='divInMainWindow']").text).to eql 'This is the text for divInMainWindow'
30
30
  end
31
31
 
32
- it "should be able to switch to nested frames" do
33
- frame = @session.find(:frame, "parentFrame")
32
+ it 'should be able to switch to nested frames' do
33
+ frame = @session.find(:frame, 'parentFrame')
34
34
  @session.switch_to_frame frame
35
- frame = @session.find(:frame, "childFrame")
35
+ frame = @session.find(:frame, 'childFrame')
36
36
  @session.switch_to_frame frame
37
- frame = @session.find(:frame, "grandchildFrame1")
37
+ frame = @session.find(:frame, 'grandchildFrame1')
38
38
  @session.switch_to_frame frame
39
39
  expect(@session).to have_selector(:css, '#divInFrameOne', text: 'This is the text of divInFrameOne')
40
40
  end
41
41
 
42
- it "should reset scope when changing frames" do
42
+ it 'should reset scope when changing frames' do
43
43
  frame = @session.find(:frame, 'parentFrame')
44
44
  @session.within(:css, '#divInMainWindow') do
45
45
  @session.switch_to_frame(frame)
46
- expect(@session.has_selector?(:css, "iframe#childFrame")).to be true
46
+ expect(@session.has_selector?(:css, 'iframe#childFrame')).to be true
47
47
  @session.switch_to_frame(:parent)
48
48
  end
49
49
  end
50
50
 
51
- it "works if the frame is closed", requires: %i[frames js] do
51
+ it 'works if the frame is closed', requires: %i[frames js] do
52
52
  frame = @session.find(:frame, 'parentFrame')
53
53
  @session.switch_to_frame frame
54
54
  frame = @session.find(:frame, 'childFrame')
@@ -61,10 +61,10 @@ Capybara::SpecHelper.spec '#switch_to_frame', requires: [:frames] do
61
61
  @session.switch_to_frame :parent # Go back to top
62
62
  end
63
63
 
64
- it "can return to the top frame", requires: [:frames] do
65
- frame = @session.find(:frame, "parentFrame")
64
+ it 'can return to the top frame', requires: [:frames] do
65
+ frame = @session.find(:frame, 'parentFrame')
66
66
  @session.switch_to_frame frame
67
- frame = @session.find(:frame, "childFrame")
67
+ frame = @session.find(:frame, 'childFrame')
68
68
  @session.switch_to_frame frame
69
69
  @session.switch_to_frame :top
70
70
  expect(@session.find("//*[@id='divInMainWindow']").text).to eql 'This is the text for divInMainWindow'
@@ -94,7 +94,7 @@ Capybara::SpecHelper.spec '#switch_to_frame', requires: [:frames] do
94
94
  frame = @session.find(:frame, 'parentFrame')
95
95
  @session.switch_to_frame(frame)
96
96
  @session.within(:css, '#parentBody') do
97
- @session.switch_to_frame(@session.find(:frame, "childFrame"))
97
+ @session.switch_to_frame(@session.find(:frame, 'childFrame'))
98
98
  expect do
99
99
  @session.switch_to_frame(:top)
100
100
  end.to raise_error(Capybara::ScopeError, "`switch_to_frame(:top)` cannot be called from inside a descendant frame's `within` block.")
@@ -5,56 +5,70 @@ Capybara::SpecHelper.spec '#within_frame', requires: [:frames] do
5
5
  @session.visit('/within_frames')
6
6
  end
7
7
 
8
- it "should find the div in frameOne" do
9
- @session.within_frame("frameOne") do
8
+ it 'should find the div in frameOne' do
9
+ @session.within_frame('frameOne') do
10
10
  expect(@session.find("//*[@id='divInFrameOne']").text).to eql 'This is the text of divInFrameOne'
11
11
  end
12
12
  end
13
13
 
14
- it "should find the div in FrameTwo" do
15
- @session.within_frame("frameTwo") do
14
+ it 'should find the div in FrameTwo' do
15
+ @session.within_frame('frameTwo') do
16
16
  expect(@session.find("//*[@id='divInFrameTwo']").text).to eql 'This is the text of divInFrameTwo'
17
17
  end
18
18
  end
19
19
 
20
- it "should find the text div in the main window after finding text in frameOne" do
21
- @session.within_frame("frameOne") do
20
+ it 'should find the text div in the main window after finding text in frameOne' do
21
+ @session.within_frame('frameOne') do
22
22
  expect(@session.find("//*[@id='divInFrameOne']").text).to eql 'This is the text of divInFrameOne'
23
23
  end
24
24
  expect(@session.find("//*[@id='divInMainWindow']").text).to eql 'This is the text for divInMainWindow'
25
25
  end
26
26
 
27
- it "should find the text div in the main window after finding text in frameTwo" do
28
- @session.within_frame("frameTwo") do
27
+ it 'should find the text div in the main window after finding text in frameTwo' do
28
+ @session.within_frame('frameTwo') do
29
29
  expect(@session.find("//*[@id='divInFrameTwo']").text).to eql 'This is the text of divInFrameTwo'
30
30
  end
31
31
  expect(@session.find("//*[@id='divInMainWindow']").text).to eql 'This is the text for divInMainWindow'
32
32
  end
33
33
 
34
- it "should return the result of executing the block" do
35
- expect(@session.within_frame("frameOne") { "return value" }).to eql "return value"
34
+ it 'should return the result of executing the block' do
35
+ expect(@session.within_frame('frameOne') { 'return value' }).to eql 'return value'
36
36
  end
37
37
 
38
- it "should find the div given Element" do
38
+ it 'should find the div given Element' do
39
39
  element = @session.find(:id, 'frameOne')
40
40
  @session.within_frame element do
41
41
  expect(@session.find("//*[@id='divInFrameOne']").text).to eql 'This is the text of divInFrameOne'
42
42
  end
43
43
  end
44
44
 
45
- it "should find the div given selector and locator" do
45
+ it 'should find the div given selector and locator' do
46
46
  @session.within_frame(:css, '#frameOne') do
47
47
  expect(@session.find("//*[@id='divInFrameOne']").text).to eql 'This is the text of divInFrameOne'
48
48
  end
49
49
  end
50
50
 
51
- it "should default to the :frame selector kind when only options passed" do
51
+ it 'should default to the :frame selector kind when only options passed' do
52
52
  @session.within_frame(name: 'my frame one') do
53
53
  expect(@session.find("//*[@id='divInFrameOne']").text).to eql 'This is the text of divInFrameOne'
54
54
  end
55
55
  end
56
56
 
57
- it "should find multiple nested frames" do
57
+ it 'should default to the :frame selector when no options passed' do
58
+ container = @session.find(:css, '#divInMainWindow')
59
+ @session.within(container) do
60
+ # Ensure only one frame in scope
61
+ @session.within_frame do
62
+ expect(@session).to have_css('body#parentBody')
63
+ end
64
+ end
65
+ expect do
66
+ # Multiple frames in scope here
67
+ @session.within_frame { ; }
68
+ end.to raise_error Capybara::Ambiguous
69
+ end
70
+
71
+ it 'should find multiple nested frames' do
58
72
  @session.within_frame 'parentFrame' do
59
73
  @session.within_frame 'childFrame' do
60
74
  @session.within_frame 'grandchildFrame1' do
@@ -67,15 +81,15 @@ Capybara::SpecHelper.spec '#within_frame', requires: [:frames] do
67
81
  end
68
82
  end
69
83
 
70
- it "should reset scope when changing frames" do
84
+ it 'should reset scope when changing frames' do
71
85
  @session.within(:css, '#divInMainWindow') do
72
86
  @session.within_frame 'innerParentFrame' do
73
- expect(@session.has_selector?(:css, "iframe#childFrame")).to be true
87
+ expect(@session.has_selector?(:css, 'iframe#childFrame')).to be true
74
88
  end
75
89
  end
76
90
  end
77
91
 
78
- it "works if the frame is closed", requires: %i[frames js] do
92
+ it 'works if the frame is closed', requires: %i[frames js] do
79
93
  @session.within_frame 'parentFrame' do
80
94
  @session.within_frame 'childFrame' do
81
95
  @session.click_link 'Close Window'
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  Capybara::SpecHelper.spec '#go_back', requires: [:js] do
4
- it "should fetch a response from the driver from the previous page" do
4
+ it 'should fetch a response from the driver from the previous page' do
5
5
  @session.visit('/')
6
6
  expect(@session).to have_content('Hello world!')
7
7
  @session.visit('/foo')
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  Capybara::SpecHelper.spec '#go_forward', requires: [:js] do
4
- it "should fetch a response from the driver from the previous page" do
4
+ it 'should fetch a response from the driver from the previous page' do
5
5
  @session.visit('/')
6
6
  expect(@session).to have_content('Hello world!')
7
7
  @session.visit('/foo')
@@ -5,26 +5,26 @@ Capybara::SpecHelper.spec '#have_all_selectors' do
5
5
  @session.visit('/with_html')
6
6
  end
7
7
 
8
- it "should be true if the given selectors are on the page" do
9
- expect(@session).to have_all_of_selectors(:css, "p a#foo", "h2#h2one", "h2#h2two")
8
+ it 'should be true if the given selectors are on the page' do
9
+ expect(@session).to have_all_of_selectors(:css, 'p a#foo', 'h2#h2one', 'h2#h2two')
10
10
  end
11
11
 
12
- it "should be false if any of the given selectors are not on the page" do
12
+ it 'should be false if any of the given selectors are not on the page' do
13
13
  expect do
14
- expect(@session).to have_all_of_selectors(:css, "p a#foo", "h2#h2three", "h2#h2one")
14
+ expect(@session).to have_all_of_selectors(:css, 'p a#foo', 'h2#h2three', 'h2#h2one')
15
15
  end.to raise_error ::RSpec::Expectations::ExpectationNotMetError
16
16
  end
17
17
 
18
- it "should use default selector" do
18
+ it 'should use default selector' do
19
19
  Capybara.default_selector = :css
20
- expect(@session).to have_all_of_selectors("p a#foo", "h2#h2two", "h2#h2one")
20
+ expect(@session).to have_all_of_selectors('p a#foo', 'h2#h2two', 'h2#h2one')
21
21
  expect do
22
- expect(@session).to have_all_of_selectors("p a#foo", "h2#h2three", "h2#h2one")
22
+ expect(@session).to have_all_of_selectors('p a#foo', 'h2#h2three', 'h2#h2one')
23
23
  end.to raise_error ::RSpec::Expectations::ExpectationNotMetError
24
24
  end
25
25
 
26
- context "should respect scopes" do
27
- it "when used with `within`" do
26
+ context 'should respect scopes' do
27
+ it 'when used with `within`' do
28
28
  @session.within "//p[@id='first']" do
29
29
  expect(@session).to have_all_of_selectors(".//a[@id='foo']")
30
30
  expect do
@@ -33,7 +33,7 @@ Capybara::SpecHelper.spec '#have_all_selectors' do
33
33
  end
34
34
  end
35
35
 
36
- it "when called on elements" do
36
+ it 'when called on elements' do
37
37
  el = @session.find "//p[@id='first']"
38
38
  expect(el).to have_all_of_selectors(".//a[@id='foo']")
39
39
  expect do
@@ -42,8 +42,8 @@ Capybara::SpecHelper.spec '#have_all_selectors' do
42
42
  end
43
43
  end
44
44
 
45
- context "with options" do
46
- it "should apply options to all locators" do
45
+ context 'with options' do
46
+ it 'should apply options to all locators' do
47
47
  expect(@session).to have_all_of_selectors(:field, 'normal', 'additional_newline', type: :textarea)
48
48
  expect do
49
49
  expect(@session).to have_all_of_selectors(:field, 'normal', 'test_field', 'additional_newline', type: :textarea)
@@ -51,19 +51,19 @@ Capybara::SpecHelper.spec '#have_all_selectors' do
51
51
  end
52
52
  end
53
53
 
54
- context "with wait", requires: [:js] do
55
- it "should not raise error if all the elements appear before given wait duration" do
54
+ context 'with wait', requires: [:js] do
55
+ it 'should not raise error if all the elements appear before given wait duration' do
56
56
  Capybara.using_wait_time(0.1) do
57
57
  @session.visit('/with_js')
58
58
  @session.click_link('Click me')
59
- expect(@session).to have_all_of_selectors(:css, "a#clickable", "a#has-been-clicked", '#drag', wait: 0.9)
59
+ expect(@session).to have_all_of_selectors(:css, 'a#clickable', 'a#has-been-clicked', '#drag', wait: 5)
60
60
  end
61
61
  end
62
62
  end
63
63
 
64
- it "cannot be negated" do
64
+ it 'cannot be negated' do
65
65
  expect do
66
- expect(@session).not_to have_all_of_selectors(:css, "p a#foo", "h2#h2one", "h2#h2two")
66
+ expect(@session).not_to have_all_of_selectors(:css, 'p a#foo', 'h2#h2one', 'h2#h2two')
67
67
  end.to raise_error ArgumentError
68
68
  end
69
69
  end