capybara 3.2.1 → 3.3.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.
- checksums.yaml +4 -4
- data/History.md +22 -1
- data/README.md +1 -1
- data/lib/capybara.rb +2 -0
- data/lib/capybara/driver/base.rb +5 -1
- data/lib/capybara/driver/node.rb +4 -0
- data/lib/capybara/helpers.rb +25 -0
- data/lib/capybara/minitest.rb +7 -1
- data/lib/capybara/minitest/spec.rb +8 -1
- data/lib/capybara/node/base.rb +3 -3
- data/lib/capybara/node/element.rb +52 -0
- data/lib/capybara/node/matchers.rb +33 -0
- data/lib/capybara/queries/selector_query.rb +4 -4
- data/lib/capybara/queries/style_query.rb +41 -0
- data/lib/capybara/rack_test/browser.rb +7 -1
- data/lib/capybara/rack_test/node.rb +4 -0
- data/lib/capybara/rspec/compound.rb +67 -65
- data/lib/capybara/rspec/features.rb +2 -4
- data/lib/capybara/rspec/matchers.rb +30 -10
- data/lib/capybara/selector.rb +9 -0
- data/lib/capybara/selector/css.rb +74 -1
- data/lib/capybara/selector/filters/base.rb +2 -1
- data/lib/capybara/selector/filters/expression_filter.rb +2 -1
- data/lib/capybara/selector/selector.rb +1 -1
- data/lib/capybara/selenium/driver.rb +34 -43
- data/lib/capybara/selenium/driver_specializations/chrome_driver.rb +35 -0
- data/lib/capybara/selenium/driver_specializations/marionette_driver.rb +31 -0
- data/lib/capybara/selenium/node.rb +17 -20
- data/lib/capybara/selenium/nodes/marionette_node.rb +31 -0
- data/lib/capybara/server.rb +8 -29
- data/lib/capybara/server/checker.rb +38 -0
- data/lib/capybara/spec/public/test.js +5 -0
- data/lib/capybara/spec/session/all_spec.rb +4 -0
- data/lib/capybara/spec/session/assert_style_spec.rb +26 -0
- data/lib/capybara/spec/session/click_button_spec.rb +10 -0
- data/lib/capybara/spec/session/click_link_spec.rb +11 -0
- data/lib/capybara/spec/session/fill_in_spec.rb +2 -0
- data/lib/capybara/spec/session/find_link_spec.rb +18 -0
- data/lib/capybara/spec/session/find_spec.rb +1 -0
- data/lib/capybara/spec/session/first_spec.rb +1 -0
- data/lib/capybara/spec/session/has_css_spec.rb +0 -6
- data/lib/capybara/spec/session/has_style_spec.rb +25 -0
- data/lib/capybara/spec/session/node_spec.rb +34 -0
- data/lib/capybara/spec/session/save_page_spec.rb +4 -1
- data/lib/capybara/spec/session/save_screenshot_spec.rb +3 -1
- data/lib/capybara/spec/session/text_spec.rb +1 -0
- data/lib/capybara/spec/session/title_spec.rb +1 -0
- data/lib/capybara/spec/session/window/current_window_spec.rb +1 -0
- data/lib/capybara/spec/session/window/open_new_window_spec.rb +1 -0
- data/lib/capybara/spec/session/window/window_opened_by_spec.rb +1 -0
- data/lib/capybara/spec/session/window/window_spec.rb +20 -0
- data/lib/capybara/spec/session/window/windows_spec.rb +1 -0
- data/lib/capybara/spec/session/window/within_window_spec.rb +1 -0
- data/lib/capybara/spec/session/within_spec.rb +1 -0
- data/lib/capybara/spec/spec_helper.rb +3 -1
- data/lib/capybara/spec/test_app.rb +18 -0
- data/lib/capybara/spec/views/form.erb +8 -0
- data/lib/capybara/spec/views/tables.erb +1 -1
- data/lib/capybara/spec/views/with_html.erb +9 -2
- data/lib/capybara/spec/views/with_js.erb +4 -0
- data/lib/capybara/spec/views/with_namespace.erb +20 -0
- data/lib/capybara/version.rb +1 -1
- data/lib/capybara/window.rb +11 -0
- data/spec/css_splitter_spec.rb +38 -0
- data/spec/dsl_spec.rb +1 -1
- data/spec/minitest_spec.rb +7 -1
- data/spec/minitest_spec_spec.rb +8 -1
- data/spec/rack_test_spec.rb +10 -0
- data/spec/rspec/shared_spec_matchers.rb +2 -0
- data/spec/selenium_spec_chrome.rb +28 -0
- data/spec/selenium_spec_chrome_remote.rb +2 -2
- data/spec/selenium_spec_marionette.rb +21 -1
- data/spec/server_spec.rb +0 -1
- data/spec/shared_selenium_session.rb +16 -1
- metadata +18 -19
data/spec/minitest_spec_spec.rb
CHANGED
@@ -11,6 +11,7 @@ class MinitestSpecTest < Minitest::Spec
|
|
11
11
|
before do
|
12
12
|
visit('/form')
|
13
13
|
end
|
14
|
+
|
14
15
|
after do
|
15
16
|
Capybara.reset_sessions!
|
16
17
|
end
|
@@ -115,6 +116,12 @@ class MinitestSpecTest < Minitest::Spec
|
|
115
116
|
it "handles failures" do
|
116
117
|
page.must_have_select('non_existing_form_title')
|
117
118
|
end
|
119
|
+
|
120
|
+
it "supports style expectations" do
|
121
|
+
skip "Rack test doesn't support style" if Capybara.current_driver == :rack_test
|
122
|
+
visit('/with_html')
|
123
|
+
find(:css, '#second').must_have_style('display' => 'inline')
|
124
|
+
end
|
118
125
|
end
|
119
126
|
|
120
127
|
RSpec.describe 'capybara/minitest/spec' do
|
@@ -129,7 +136,7 @@ RSpec.describe 'capybara/minitest/spec' do
|
|
129
136
|
reporter.start
|
130
137
|
MinitestSpecTest.run reporter, {}
|
131
138
|
reporter.report
|
132
|
-
expect(output.string).to include("
|
139
|
+
expect(output.string).to include("19 runs, 41 assertions, 1 failures, 0 errors, 1 skips")
|
133
140
|
# Make sure error messages are displayed
|
134
141
|
expect(output.string).to include('expected to find visible select box "non_existing_form_title" that is not disabled but there were no matches')
|
135
142
|
end
|
data/spec/rack_test_spec.rb
CHANGED
@@ -16,6 +16,8 @@ skipped_tests = %i[
|
|
16
16
|
server
|
17
17
|
hover
|
18
18
|
about_scheme
|
19
|
+
download
|
20
|
+
css
|
19
21
|
]
|
20
22
|
Capybara::SpecHelper.run_specs TestSessions::RackTest, "RackTest", capybara_skip: skipped_tests
|
21
23
|
|
@@ -125,6 +127,14 @@ RSpec.describe Capybara::Session do # rubocop:disable RSpec/MultipleDescribes
|
|
125
127
|
expect(normal.text).to eq 'banana'
|
126
128
|
end
|
127
129
|
end
|
130
|
+
|
131
|
+
describe '#style' do
|
132
|
+
it "should raise an error" do
|
133
|
+
@session.visit('/with_html')
|
134
|
+
el = @session.find(:css, '#first')
|
135
|
+
expect { el.style('display') }.to raise_error NotImplementedError, /not process CSS/
|
136
|
+
end
|
137
|
+
end
|
128
138
|
end
|
129
139
|
end
|
130
140
|
|
@@ -324,6 +324,7 @@ RSpec.shared_examples Capybara::RSpecMatchers do |session, _mode|
|
|
324
324
|
|
325
325
|
context "with default selector CSS" do
|
326
326
|
before { Capybara.default_selector = :css }
|
327
|
+
|
327
328
|
it "fails if has_content? returns false" do
|
328
329
|
expect do
|
329
330
|
expect(page).to have_content('No such Text')
|
@@ -459,6 +460,7 @@ RSpec.shared_examples Capybara::RSpecMatchers do |session, _mode|
|
|
459
460
|
|
460
461
|
context "with default selector CSS" do
|
461
462
|
before { Capybara.default_selector = :css }
|
463
|
+
|
462
464
|
it "fails if has_text? returns false" do
|
463
465
|
expect do
|
464
466
|
expect(page).to have_text('No such Text')
|
@@ -11,6 +11,34 @@ CHROME_DRIVER = ENV['HEADLESS'] ? :selenium_chrome_headless : :selenium_chrome
|
|
11
11
|
# Selenium::WebDriver::Chrome.path='/usr/bin/google-chrome-beta'
|
12
12
|
# end
|
13
13
|
|
14
|
+
Capybara.register_driver :selenium_chrome do |app|
|
15
|
+
driver = Capybara::Selenium::Driver.new(app, browser: :chrome)
|
16
|
+
# TODO: Fix this when selenium with `download_path =` support is released
|
17
|
+
bridge = driver.browser.send(:bridge)
|
18
|
+
params = { cmd: 'Page.setDownloadBehavior', params: { behavior: 'allow', downloadPath: Capybara.save_path } }
|
19
|
+
command = +'/session/:session_id/chromium/send_command'
|
20
|
+
command[':session_id'] = bridge.session_id
|
21
|
+
bridge.http.call(:post, command, params)
|
22
|
+
|
23
|
+
driver
|
24
|
+
end
|
25
|
+
|
26
|
+
Capybara.register_driver :selenium_chrome_headless do |app|
|
27
|
+
browser_options = ::Selenium::WebDriver::Chrome::Options.new
|
28
|
+
browser_options.args << '--headless'
|
29
|
+
browser_options.args << '--disable-gpu' if Gem.win_platform?
|
30
|
+
driver = Capybara::Selenium::Driver.new(app, browser: :chrome, options: browser_options)
|
31
|
+
|
32
|
+
# TODO: Fix this when selenium with `download_path =` support is released
|
33
|
+
bridge = driver.browser.send(:bridge)
|
34
|
+
params = { cmd: 'Page.setDownloadBehavior', params: { behavior: 'allow', downloadPath: Capybara.save_path } }
|
35
|
+
command = +'/session/:session_id/chromium/send_command'
|
36
|
+
command[':session_id'] = bridge.session_id
|
37
|
+
bridge.http.call(:post, command, params)
|
38
|
+
|
39
|
+
driver
|
40
|
+
end
|
41
|
+
|
14
42
|
Capybara.register_driver :selenium_chrome_clear_storage do |app|
|
15
43
|
chrome_options = {
|
16
44
|
browser: :chrome,
|
@@ -39,7 +39,7 @@ module TestSessions
|
|
39
39
|
Chrome = Capybara::Session.new(CHROME_REMOTE_DRIVER, TestApp)
|
40
40
|
end
|
41
41
|
|
42
|
-
skipped_tests = %i[response_headers status_code trigger]
|
42
|
+
skipped_tests = %i[response_headers status_code trigger download]
|
43
43
|
# skip window tests when headless for now - closing a window not supported by chromedriver/chrome
|
44
44
|
skipped_tests << :windows if ENV['TRAVIS'] && (ENV['SKIP_WINDOW'] || ENV['HEADLESS'])
|
45
45
|
|
@@ -51,6 +51,6 @@ RSpec.describe "Capybara::Session with chrome" do
|
|
51
51
|
include_examples Capybara::RSpecMatchers, TestSessions::Chrome, CHROME_REMOTE_DRIVER
|
52
52
|
|
53
53
|
it 'is considered to be chrome' do
|
54
|
-
expect(session.driver).to
|
54
|
+
expect(session.driver.send(:chrome?)).to be_truthy
|
55
55
|
end
|
56
56
|
end
|
@@ -10,13 +10,19 @@ browser_options.args << '--headless' if ENV['HEADLESS']
|
|
10
10
|
browser_options.add_preference 'dom.file.createInChild', true
|
11
11
|
# browser_options.add_option("log", {"level": "trace"})
|
12
12
|
|
13
|
+
browser_options.profile = Selenium::WebDriver::Firefox::Profile.new.tap do |profile|
|
14
|
+
profile['browser.download.dir'] = Capybara.save_path
|
15
|
+
profile['browser.download.folderList'] = 2
|
16
|
+
profile['browser.helperApps.neverAsk.saveToDisk'] = 'text/csv'
|
17
|
+
end
|
18
|
+
|
13
19
|
Capybara.register_driver :selenium_marionette do |app|
|
14
20
|
# ::Selenium::WebDriver.logger.level = "debug"
|
15
21
|
Capybara::Selenium::Driver.new(
|
16
22
|
app,
|
17
23
|
browser: :firefox,
|
18
24
|
desired_capabilities: { marionette: true, 'moz:webdriverClick': true },
|
19
|
-
options: browser_options
|
25
|
+
options: browser_options,
|
20
26
|
# Get a trace level log from geckodriver
|
21
27
|
# :driver_opts => { args: ['-vv'] }
|
22
28
|
)
|
@@ -67,6 +73,7 @@ RSpec.describe Capybara::Selenium::Driver do
|
|
67
73
|
before do
|
68
74
|
@original_browser = @driver.browser
|
69
75
|
end
|
76
|
+
|
70
77
|
after do
|
71
78
|
# Ensure browser is actually quit so we don't leave hanging processe
|
72
79
|
RSpec::Mocks.space.proxy_for(@original_browser).reset
|
@@ -145,3 +152,16 @@ RSpec.describe Capybara::Selenium::Driver do
|
|
145
152
|
end
|
146
153
|
end
|
147
154
|
end
|
155
|
+
|
156
|
+
RSpec.describe Capybara::Selenium::Node do
|
157
|
+
context "#click" do
|
158
|
+
it "warns when attempting on a table row" do
|
159
|
+
session = TestSessions::SeleniumMarionette
|
160
|
+
session.visit('/tables')
|
161
|
+
tr = session.find(:css, '#agent_table tr:first-child')
|
162
|
+
allow(tr.base).to receive(:warn)
|
163
|
+
tr.click
|
164
|
+
expect(tr.base).to have_received(:warn).with(/Clicking the first cell in the row instead/)
|
165
|
+
end
|
166
|
+
end
|
167
|
+
end
|
data/spec/server_spec.rb
CHANGED
@@ -219,7 +219,6 @@ RSpec.describe Capybara::Server do
|
|
219
219
|
it "should attempt an HTTPS connection if HTTP connection returns #{err}" do
|
220
220
|
app = -> { [200, {}, ['Hello, world']] }
|
221
221
|
ordered_errors = [Errno::ECONNREFUSED, err]
|
222
|
-
# allow(Net::HTTP).to receive(:start).with(anything, anything, hash_excluding(:use_ssl)).and_yield { raise Errno::ECONNREFUSED }
|
223
222
|
allow(Net::HTTP).to receive(:start).with(anything, anything, hash_excluding(:use_ssl)) do
|
224
223
|
raise ordered_errors.shift
|
225
224
|
end
|
@@ -180,7 +180,22 @@ RSpec.shared_examples "Capybara::Session" do |session, mode|
|
|
180
180
|
# this is here because it is testing for an XPath that is specific to the algorithm used in the selenium driver
|
181
181
|
session.visit('/path')
|
182
182
|
element = session.find(:link, 'Second Link')
|
183
|
-
expect(element.path).to eq('/
|
183
|
+
expect(element.path).to eq('/HTML/BODY/DIV[2]/A[1]')
|
184
|
+
end
|
185
|
+
|
186
|
+
it "handles namespaces" do
|
187
|
+
session.visit "/with_namespace"
|
188
|
+
rect = session.find(:css, "div svg rect")
|
189
|
+
expect(rect.path).to eq("/HTML/BODY/DIV/./*[((local-name(.) = 'svg') and (namespace-uri(.) = 'http://www.w3.org/2000/svg'))]/./*[((local-name(.) = 'rect') and (namespace-uri(.) = 'http://www.w3.org/2000/svg'))][1]")
|
190
|
+
expect(session.find(:xpath, rect.path)).to eq rect
|
191
|
+
end
|
192
|
+
|
193
|
+
it "handles case sensitive element names" do
|
194
|
+
session.visit "/with_namespace"
|
195
|
+
els = session.all(:css, "div *", visible: :all)
|
196
|
+
expect { els.map(&:path) }.not_to raise_error
|
197
|
+
lg = session.find(:css, "div linearGradient", visible: :all)
|
198
|
+
expect(session.find(:xpath, lg.path, visible: :all)).to eq lg
|
184
199
|
end
|
185
200
|
end
|
186
201
|
|
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.3.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-06-
|
13
|
+
date: 2018-06-25 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: addressable
|
@@ -212,28 +212,16 @@ dependencies:
|
|
212
212
|
name: selenium-webdriver
|
213
213
|
requirement: !ruby/object:Gem::Requirement
|
214
214
|
requirements:
|
215
|
-
- - "
|
216
|
-
- !ruby/object:Gem::Version
|
217
|
-
version: '3.0'
|
218
|
-
- - "<"
|
219
|
-
- !ruby/object:Gem::Version
|
220
|
-
version: '4.0'
|
221
|
-
- - "!="
|
215
|
+
- - "~>"
|
222
216
|
- !ruby/object:Gem::Version
|
223
|
-
version: 3.
|
217
|
+
version: '3.5'
|
224
218
|
type: :development
|
225
219
|
prerelease: false
|
226
220
|
version_requirements: !ruby/object:Gem::Requirement
|
227
221
|
requirements:
|
228
|
-
- - "
|
229
|
-
- !ruby/object:Gem::Version
|
230
|
-
version: '3.0'
|
231
|
-
- - "<"
|
232
|
-
- !ruby/object:Gem::Version
|
233
|
-
version: '4.0'
|
234
|
-
- - "!="
|
222
|
+
- - "~>"
|
235
223
|
- !ruby/object:Gem::Version
|
236
|
-
version: 3.
|
224
|
+
version: '3.5'
|
237
225
|
- !ruby/object:Gem::Dependency
|
238
226
|
name: sinatra
|
239
227
|
requirement: !ruby/object:Gem::Requirement
|
@@ -297,6 +285,7 @@ files:
|
|
297
285
|
- lib/capybara/queries/match_query.rb
|
298
286
|
- lib/capybara/queries/selector_query.rb
|
299
287
|
- lib/capybara/queries/sibling_query.rb
|
288
|
+
- lib/capybara/queries/style_query.rb
|
300
289
|
- lib/capybara/queries/text_query.rb
|
301
290
|
- lib/capybara/queries/title_query.rb
|
302
291
|
- lib/capybara/rack_test/browser.rb
|
@@ -320,9 +309,13 @@ files:
|
|
320
309
|
- lib/capybara/selector/filters/node_filter.rb
|
321
310
|
- lib/capybara/selector/selector.rb
|
322
311
|
- lib/capybara/selenium/driver.rb
|
312
|
+
- lib/capybara/selenium/driver_specializations/chrome_driver.rb
|
313
|
+
- lib/capybara/selenium/driver_specializations/marionette_driver.rb
|
323
314
|
- lib/capybara/selenium/node.rb
|
315
|
+
- lib/capybara/selenium/nodes/marionette_node.rb
|
324
316
|
- lib/capybara/server.rb
|
325
317
|
- lib/capybara/server/animation_disabler.rb
|
318
|
+
- lib/capybara/server/checker.rb
|
326
319
|
- lib/capybara/server/middleware.rb
|
327
320
|
- lib/capybara/session.rb
|
328
321
|
- lib/capybara/session/config.rb
|
@@ -342,6 +335,7 @@ files:
|
|
342
335
|
- lib/capybara/spec/session/assert_all_of_selectors_spec.rb
|
343
336
|
- lib/capybara/spec/session/assert_current_path_spec.rb
|
344
337
|
- lib/capybara/spec/session/assert_selector_spec.rb
|
338
|
+
- lib/capybara/spec/session/assert_style_spec.rb
|
345
339
|
- lib/capybara/spec/session/assert_text_spec.rb
|
346
340
|
- lib/capybara/spec/session/assert_title_spec.rb
|
347
341
|
- lib/capybara/spec/session/attach_file_spec.rb
|
@@ -384,6 +378,7 @@ files:
|
|
384
378
|
- lib/capybara/spec/session/has_none_selectors_spec.rb
|
385
379
|
- lib/capybara/spec/session/has_select_spec.rb
|
386
380
|
- lib/capybara/spec/session/has_selector_spec.rb
|
381
|
+
- lib/capybara/spec/session/has_style_spec.rb
|
387
382
|
- lib/capybara/spec/session/has_table_spec.rb
|
388
383
|
- lib/capybara/spec/session/has_text_spec.rb
|
389
384
|
- lib/capybara/spec/session/has_title_spec.rb
|
@@ -443,6 +438,7 @@ files:
|
|
443
438
|
- lib/capybara/spec/views/with_html.erb
|
444
439
|
- lib/capybara/spec/views/with_html_entities.erb
|
445
440
|
- lib/capybara/spec/views/with_js.erb
|
441
|
+
- lib/capybara/spec/views/with_namespace.erb
|
446
442
|
- lib/capybara/spec/views/with_scope.erb
|
447
443
|
- lib/capybara/spec/views/with_simple_html.erb
|
448
444
|
- lib/capybara/spec/views/with_slow_unload.erb
|
@@ -454,6 +450,7 @@ files:
|
|
454
450
|
- lib/capybara/window.rb
|
455
451
|
- spec/basic_node_spec.rb
|
456
452
|
- spec/capybara_spec.rb
|
453
|
+
- spec/css_splitter_spec.rb
|
457
454
|
- spec/dsl_spec.rb
|
458
455
|
- spec/filter_set_spec.rb
|
459
456
|
- spec/fixtures/capybara.csv
|
@@ -485,7 +482,9 @@ files:
|
|
485
482
|
homepage: https://github.com/teamcapybara/capybara
|
486
483
|
licenses:
|
487
484
|
- MIT
|
488
|
-
metadata:
|
485
|
+
metadata:
|
486
|
+
changelog_uri: https://github.com/teamcapybara/capybara/blob/master/History.md
|
487
|
+
source_code_uri: https://github.com/teamcapybara/capybara
|
489
488
|
post_install_message:
|
490
489
|
rdoc_options: []
|
491
490
|
require_paths:
|