capybara 3.2.1 → 3.3.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 +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:
|