capybara 2.18.0 → 3.0.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 +55 -1
- data/README.md +18 -17
- data/lib/capybara/config.rb +11 -58
- data/lib/capybara/cucumber.rb +2 -3
- data/lib/capybara/driver/base.rb +15 -16
- data/lib/capybara/driver/node.rb +5 -4
- data/lib/capybara/dsl.rb +1 -0
- data/lib/capybara/helpers.rb +19 -29
- data/lib/capybara/minitest/spec.rb +15 -14
- data/lib/capybara/minitest.rb +139 -138
- data/lib/capybara/node/actions.rb +60 -81
- data/lib/capybara/node/base.rb +11 -18
- data/lib/capybara/node/document.rb +2 -2
- data/lib/capybara/node/document_matchers.rb +8 -8
- data/lib/capybara/node/element.rb +30 -40
- data/lib/capybara/node/finders.rb +62 -70
- data/lib/capybara/node/matchers.rb +50 -71
- data/lib/capybara/node/simple.rb +11 -17
- data/lib/capybara/queries/ancestor_query.rb +11 -7
- data/lib/capybara/queries/base_query.rb +22 -18
- data/lib/capybara/queries/current_path_query.rb +8 -24
- data/lib/capybara/queries/match_query.rb +3 -7
- data/lib/capybara/queries/selector_query.rb +92 -95
- data/lib/capybara/queries/sibling_query.rb +4 -4
- data/lib/capybara/queries/text_query.rb +35 -35
- data/lib/capybara/queries/title_query.rb +8 -11
- data/lib/capybara/rack_test/browser.rb +15 -18
- data/lib/capybara/rack_test/css_handlers.rb +6 -4
- data/lib/capybara/rack_test/driver.rb +6 -10
- data/lib/capybara/rack_test/form.rb +50 -40
- data/lib/capybara/rack_test/node.rb +93 -63
- data/lib/capybara/rails.rb +2 -6
- data/lib/capybara/result.rb +22 -22
- data/lib/capybara/rspec/compound.rb +5 -10
- data/lib/capybara/rspec/features.rb +17 -48
- data/lib/capybara/rspec/matcher_proxies.rb +31 -15
- data/lib/capybara/rspec/matchers.rb +70 -61
- data/lib/capybara/rspec.rb +5 -10
- data/lib/capybara/selector/css.rb +6 -11
- data/lib/capybara/selector/filter.rb +1 -17
- data/lib/capybara/selector/filter_set.rb +18 -15
- data/lib/capybara/selector/filters/base.rb +7 -6
- data/lib/capybara/selector/filters/expression_filter.rb +6 -23
- data/lib/capybara/selector/filters/node_filter.rb +2 -12
- data/lib/capybara/selector/selector.rb +28 -34
- data/lib/capybara/selector.rb +129 -117
- data/lib/capybara/selenium/driver.rb +131 -125
- data/lib/capybara/selenium/node.rb +197 -115
- data/lib/capybara/server.rb +3 -2
- data/lib/capybara/session/config.rb +47 -67
- data/lib/capybara/session/matchers.rb +8 -7
- data/lib/capybara/session.rb +138 -224
- data/lib/capybara/spec/public/test.js +25 -4
- data/lib/capybara/spec/session/accept_alert_spec.rb +1 -0
- data/lib/capybara/spec/session/accept_confirm_spec.rb +3 -2
- data/lib/capybara/spec/session/accept_prompt_spec.rb +1 -0
- data/lib/capybara/spec/session/all_spec.rb +31 -18
- data/lib/capybara/spec/session/ancestor_spec.rb +6 -8
- data/lib/capybara/spec/session/assert_all_of_selectors_spec.rb +6 -5
- data/lib/capybara/spec/session/assert_current_path.rb +12 -11
- data/lib/capybara/spec/session/assert_selector.rb +1 -0
- data/lib/capybara/spec/session/assert_text.rb +23 -23
- data/lib/capybara/spec/session/assert_title.rb +13 -3
- data/lib/capybara/spec/session/attach_file_spec.rb +51 -30
- data/lib/capybara/spec/session/body_spec.rb +1 -0
- data/lib/capybara/spec/session/check_spec.rb +7 -6
- data/lib/capybara/spec/session/choose_spec.rb +5 -4
- data/lib/capybara/spec/session/click_button_spec.rb +24 -32
- data/lib/capybara/spec/session/click_link_or_button_spec.rb +8 -7
- data/lib/capybara/spec/session/click_link_spec.rb +8 -7
- data/lib/capybara/spec/session/current_scope_spec.rb +4 -3
- data/lib/capybara/spec/session/current_url_spec.rb +17 -6
- data/lib/capybara/spec/session/dismiss_confirm_spec.rb +1 -1
- data/lib/capybara/spec/session/dismiss_prompt_spec.rb +1 -0
- data/lib/capybara/spec/session/element/assert_match_selector.rb +1 -1
- data/lib/capybara/spec/session/element/match_xpath_spec.rb +1 -1
- data/lib/capybara/spec/session/element/matches_selector_spec.rb +5 -5
- data/lib/capybara/spec/session/evaluate_async_script_spec.rb +3 -2
- data/lib/capybara/spec/session/evaluate_script_spec.rb +4 -3
- data/lib/capybara/spec/session/execute_script_spec.rb +4 -3
- data/lib/capybara/spec/session/fill_in_spec.rb +30 -5
- data/lib/capybara/spec/session/find_button_spec.rb +4 -3
- data/lib/capybara/spec/session/find_by_id_spec.rb +2 -1
- data/lib/capybara/spec/session/find_field_spec.rb +9 -15
- data/lib/capybara/spec/session/find_link_spec.rb +6 -5
- data/lib/capybara/spec/session/find_spec.rb +37 -31
- data/lib/capybara/spec/session/first_spec.rb +60 -33
- data/lib/capybara/spec/session/frame/frame_title_spec.rb +23 -0
- data/lib/capybara/spec/session/frame/frame_url_spec.rb +23 -0
- data/lib/capybara/spec/session/frame/switch_to_frame_spec.rb +2 -1
- data/lib/capybara/spec/session/frame/within_frame_spec.rb +9 -16
- data/lib/capybara/spec/session/go_back_spec.rb +1 -0
- data/lib/capybara/spec/session/go_forward_spec.rb +1 -0
- data/lib/capybara/spec/session/has_all_selectors_spec.rb +15 -15
- data/lib/capybara/spec/session/has_button_spec.rb +2 -1
- data/lib/capybara/spec/session/has_css_spec.rb +3 -2
- data/lib/capybara/spec/session/has_current_path_spec.rb +12 -28
- data/lib/capybara/spec/session/has_field_spec.rb +4 -3
- data/lib/capybara/spec/session/has_link_spec.rb +1 -0
- data/lib/capybara/spec/session/has_none_selectors_spec.rb +17 -17
- data/lib/capybara/spec/session/has_select_spec.rb +30 -29
- data/lib/capybara/spec/session/has_selector_spec.rb +5 -4
- data/lib/capybara/spec/session/has_table_spec.rb +2 -1
- data/lib/capybara/spec/session/has_text_spec.rb +9 -13
- data/lib/capybara/spec/session/has_title_spec.rb +1 -0
- data/lib/capybara/spec/session/has_xpath_spec.rb +1 -0
- data/lib/capybara/spec/session/headers.rb +2 -1
- data/lib/capybara/spec/session/html_spec.rb +1 -0
- data/lib/capybara/spec/session/node_spec.rb +91 -56
- data/lib/capybara/spec/session/node_wrapper_spec.rb +36 -0
- data/lib/capybara/spec/session/refresh_spec.rb +6 -2
- data/lib/capybara/spec/session/reset_session_spec.rb +19 -0
- data/lib/capybara/spec/session/response_code.rb +1 -0
- data/lib/capybara/spec/session/save_and_open_page_spec.rb +1 -0
- data/lib/capybara/spec/session/save_and_open_screenshot_spec.rb +6 -11
- data/lib/capybara/spec/session/save_page_spec.rb +1 -17
- data/lib/capybara/spec/session/save_screenshot_spec.rb +3 -3
- data/lib/capybara/spec/session/select_spec.rb +20 -20
- data/lib/capybara/spec/session/selectors_spec.rb +2 -2
- data/lib/capybara/spec/session/sibling_spec.rb +1 -1
- data/lib/capybara/spec/session/text_spec.rb +17 -3
- data/lib/capybara/spec/session/title_spec.rb +11 -1
- data/lib/capybara/spec/session/uncheck_spec.rb +4 -3
- data/lib/capybara/spec/session/unselect_spec.rb +6 -5
- data/lib/capybara/spec/session/visit_spec.rb +9 -3
- data/lib/capybara/spec/session/window/become_closed_spec.rb +2 -1
- 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/switch_to_window_spec.rb +2 -1
- data/lib/capybara/spec/session/window/window_opened_by_spec.rb +2 -1
- data/lib/capybara/spec/session/window/window_spec.rb +12 -12
- data/lib/capybara/spec/session/window/windows_spec.rb +2 -3
- data/lib/capybara/spec/session/window/within_window_spec.rb +15 -71
- data/lib/capybara/spec/session/within_spec.rb +1 -0
- data/lib/capybara/spec/spec_helper.rb +34 -18
- data/lib/capybara/spec/test_app.rb +17 -9
- data/lib/capybara/spec/views/form.erb +7 -0
- data/lib/capybara/spec/views/with_html.erb +23 -1
- data/lib/capybara/spec/views/within_frames.erb +4 -1
- data/lib/capybara/version.rb +2 -1
- data/lib/capybara/window.rb +6 -10
- data/lib/capybara.rb +28 -25
- data/spec/basic_node_spec.rb +1 -0
- data/spec/capybara_spec.rb +11 -50
- data/spec/dsl_spec.rb +5 -13
- data/spec/filter_set_spec.rb +5 -4
- data/spec/fixtures/selenium_driver_rspec_failure.rb +2 -1
- data/spec/fixtures/selenium_driver_rspec_success.rb +3 -2
- data/spec/minitest_spec.rb +4 -3
- data/spec/minitest_spec_spec.rb +3 -2
- data/spec/per_session_config_spec.rb +9 -8
- data/spec/rack_test_spec.rb +21 -20
- data/spec/result_spec.rb +17 -16
- data/spec/rspec/features_spec.rb +17 -14
- data/spec/rspec/scenarios_spec.rb +5 -7
- data/spec/rspec/shared_spec_matchers.rb +96 -99
- data/spec/rspec/views_spec.rb +2 -1
- data/spec/rspec_matchers_spec.rb +18 -2
- data/spec/rspec_spec.rb +11 -15
- data/spec/selector_spec.rb +5 -6
- data/spec/selenium_spec_chrome.rb +9 -4
- data/spec/selenium_spec_edge.rb +27 -0
- data/spec/selenium_spec_ie.rb +31 -0
- data/spec/selenium_spec_marionette.rb +28 -12
- data/spec/server_spec.rb +33 -33
- data/spec/session_spec.rb +2 -1
- data/spec/shared_selenium_session.rb +36 -22
- data/spec/spec_helper.rb +3 -6
- metadata +68 -85
- data/lib/capybara/query.rb +0 -7
- data/spec/selenium_spec_firefox.rb +0 -68
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8389b150e2b44270ed1d94b8f6e0f48af613f1a2f28b8ad772e35cb7db635ad7
|
4
|
+
data.tar.gz: bace2657813bc0681e4586ba2c96a66e824e12651f0e839a8649ed491f0eafa1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5ffed0a0be90e5d8bf022b48d261aa160646562095114ca383a446431ab57403d67a6ccf252129a477484a6ea1bdc1edfefa6930571961e6307b5ce180c6aa30
|
7
|
+
data.tar.gz: e5956efba3a7e4a6833a9b63e61c6f136a3210eb77ac44d8b1603b81b6e5bea7bde1ea3fd4c76b8eda6a10f61c1e0e805aef7f8aa4bcf801061c46a7fded1c02
|
data/History.md
CHANGED
@@ -1,4 +1,56 @@
|
|
1
|
-
#Version
|
1
|
+
# Version 3.0.0
|
2
|
+
Release date: 2018-04-05
|
3
|
+
|
4
|
+
### Changed
|
5
|
+
|
6
|
+
* Selenium driver only closes extra windows for browsers where that is known to work (Firefox, Chrome)
|
7
|
+
* "threadsafe" mode is no longer considered beta
|
8
|
+
|
9
|
+
### Fixes
|
10
|
+
|
11
|
+
* Multiple file attach_file with Firefox
|
12
|
+
* Use Puma::Server directly rather than Rack::Handler::Puma so signal handlers don't prevent test quitting
|
13
|
+
|
14
|
+
# Version 3.0.0.rc2
|
15
|
+
Release date: 2018-03-23
|
16
|
+
|
17
|
+
### Changed
|
18
|
+
|
19
|
+
* Drivers are now expected to return visible text more in line with the WebDriver spec for visible text
|
20
|
+
* Drivers are expected to close extra windows when resetting the session
|
21
|
+
* Selenium driver supports Date/Time when filling in date/time/datetime-local inputs
|
22
|
+
* `current_url` returns the url for the top level browsing context
|
23
|
+
* `title` returns the title for the top level browsing context
|
24
|
+
|
25
|
+
### Added
|
26
|
+
|
27
|
+
* `Driver#frame_url` returns the url for the current frame
|
28
|
+
* `Driver#frame_title` returns the title for the current frame
|
29
|
+
|
30
|
+
# Version 3.0.0.rc1
|
31
|
+
Release date: 2018-03-02
|
32
|
+
|
33
|
+
### Added
|
34
|
+
* Support for libraries wrapping Capybara elements and providing a `#to_capybara_node` method
|
35
|
+
|
36
|
+
### Changed
|
37
|
+
|
38
|
+
* `first` now raises ElementNotFound, by default, instead of returning nil when no matches are found - Issue #1507
|
39
|
+
* 'all' now waits for at least one matching element by default. Pass `wait: false` if you want the previous
|
40
|
+
behavior where an empty result would be returned immediately if no matching elements exist yet.
|
41
|
+
* ArgumentError raised if extra parameters passed to selector queries
|
42
|
+
|
43
|
+
### Removed
|
44
|
+
|
45
|
+
* Ruby < 2.2.2 support
|
46
|
+
* `Capybara.exact_options` no longer exists. Just use `exact: true` on relevant actions/finders if necessary.
|
47
|
+
* All previously deprecated methods removed
|
48
|
+
* RSpec 2.x support
|
49
|
+
* selenium-webdriver 2.x support
|
50
|
+
* Nokogiri < 1.8 support
|
51
|
+
* `field_labeled` alias for `find_field`
|
52
|
+
|
53
|
+
# Version 2.18.0
|
2
54
|
Release date: 2018-02-12
|
3
55
|
|
4
56
|
### Fixed
|
@@ -10,6 +62,7 @@ Release date: 2018-02-12
|
|
10
62
|
|
11
63
|
* Headless chrome modal JS injection that is no longer needed for Chrome 64+/chromedriver 2.35+
|
12
64
|
|
65
|
+
|
13
66
|
# Version 2.17.0
|
14
67
|
Release date: 2018-01-02
|
15
68
|
|
@@ -253,6 +306,7 @@ Release date: 2016-10-05
|
|
253
306
|
Release date: 2016-09-29
|
254
307
|
|
255
308
|
### Fixed
|
309
|
+
|
256
310
|
* :label built-in selector finds nested label/control by control id if the label has no 'for' attribute [Thomas Walpole]
|
257
311
|
* Warning issued if an unknown selector type is specified [Thomas Walpole]
|
258
312
|
|
data/README.md
CHANGED
@@ -1,10 +1,15 @@
|
|
1
1
|
# Capybara
|
2
2
|
|
3
3
|
[](https://travis-ci.org/teamcapybara/capybara)
|
4
|
+
[](https://ci.appveyor.com/api/projects/github/teamcapybara/capybara)
|
4
5
|
[](https://gemnasium.com/teamcapybara/capybara)
|
5
6
|
[](https://codeclimate.com/github/teamcapybara/capybara)
|
6
7
|
[](https://gitter.im/jnicklas/capybara?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
|
7
8
|
|
9
|
+
**Note** You are viewing the README for the development version of Capybara. If you are using the current release version
|
10
|
+
you can find the README at https://github.com/teamcapybara/capybara/blob/3.0_stable/README.md
|
11
|
+
|
12
|
+
|
8
13
|
Capybara helps you test web applications by simulating how a real user would
|
9
14
|
interact with your app. It is agnostic about the driver running your tests and
|
10
15
|
comes with Rack::Test and Selenium support built in. WebKit is supported
|
@@ -71,24 +76,19 @@ GitHub): http://groups.google.com/group/ruby-capybara
|
|
71
76
|
|
72
77
|
## <a name="setup"></a>Setup
|
73
78
|
|
74
|
-
Capybara requires Ruby
|
79
|
+
Capybara requires Ruby 2.2.2 or later. To install, add this line to your
|
75
80
|
`Gemfile` and run `bundle install`:
|
76
81
|
|
77
82
|
```ruby
|
78
83
|
gem 'capybara'
|
79
84
|
```
|
80
85
|
|
81
|
-
**Note:** If using Ruby < 2.0 you will also need to limit the version of rack to < 2.0
|
82
|
-
|
83
86
|
If the application that you are testing is a Rails app, add this line to your test helper file:
|
84
87
|
|
85
88
|
```ruby
|
86
89
|
require 'capybara/rails'
|
87
90
|
```
|
88
91
|
|
89
|
-
**Note:** In Rails 4.0/4.1 the default test environment (`config/environments/test.rb`) is [not threadsafe](https://github.com/rails/rails/issues/15089).
|
90
|
-
If you experience random errors about missing constants, add `config.allow_concurrency = false` to `config/environments/test.rb`.
|
91
|
-
|
92
92
|
If the application that you are testing is a Rack app, but not Rails, set Capybara.app to your Rack app:
|
93
93
|
|
94
94
|
```ruby
|
@@ -140,26 +140,26 @@ There are also explicit tags for each registered driver set up for you (`@seleni
|
|
140
140
|
|
141
141
|
## <a name="using-capybara-with-rspec"></a>Using Capybara with RSpec
|
142
142
|
|
143
|
-
Load RSpec
|
143
|
+
Load RSpec 3.x support by adding the following line (typically to your
|
144
144
|
`spec_helper.rb` file):
|
145
145
|
|
146
146
|
```ruby
|
147
147
|
require 'capybara/rspec'
|
148
148
|
```
|
149
149
|
|
150
|
-
If you are using Rails, put your Capybara specs in `spec/features` (only works
|
150
|
+
If you are using Rails, put your Capybara specs in `spec/features` or `spec/system` (only works
|
151
151
|
if [you have it configured in
|
152
152
|
RSpec](https://www.relishapp.com/rspec/rspec-rails/docs/upgrade#file-type-inference-disabled))
|
153
153
|
and if you have your Capybara specs in a different directory, then tag the
|
154
|
-
example groups with
|
154
|
+
example groups with `type: :feature` or `type: :system` depending on which type of test you're writing.
|
155
155
|
|
156
156
|
If you are not using Rails, tag all the example groups in which you want to use
|
157
|
-
Capybara with
|
157
|
+
Capybara with `type: :feature`.
|
158
158
|
|
159
159
|
You can now write your specs like so:
|
160
160
|
|
161
161
|
```ruby
|
162
|
-
describe "the signin process", :
|
162
|
+
describe "the signin process", type: :feature do
|
163
163
|
before :each do
|
164
164
|
User.make(email: 'user@example.com', password: 'password')
|
165
165
|
end
|
@@ -183,7 +183,7 @@ to one specific driver. For example:
|
|
183
183
|
```ruby
|
184
184
|
describe 'some stuff which requires js', js: true do
|
185
185
|
it 'will use the default js driver'
|
186
|
-
it 'will switch to one specific driver', :
|
186
|
+
it 'will switch to one specific driver', driver: :webkit
|
187
187
|
end
|
188
188
|
```
|
189
189
|
|
@@ -219,11 +219,11 @@ feature "Signing in" do
|
|
219
219
|
end
|
220
220
|
```
|
221
221
|
|
222
|
-
`feature` is in fact just an alias for `describe ...,
|
222
|
+
`feature` is in fact just an alias for `describe ..., type:> :feature`,
|
223
223
|
`background` is an alias for `before`, `scenario` for `it`, and
|
224
224
|
`given`/`given!` aliases for `let`/`let!`, respectively.
|
225
225
|
|
226
|
-
Finally, Capybara matchers are supported in view specs:
|
226
|
+
Finally, Capybara matchers are also supported in view specs:
|
227
227
|
|
228
228
|
```ruby
|
229
229
|
RSpec.describe "todos/show.html.erb", type: :view do
|
@@ -742,7 +742,7 @@ Capybara 1.x, set `Capybara.match` to `:prefer_exact`.
|
|
742
742
|
|
743
743
|
## <a name="transactions-and-database-setup"></a>Transactions and database setup
|
744
744
|
|
745
|
-
**Note:** Rails 5.1+
|
745
|
+
**Note:** Rails 5.1+ "safely" shares the database connection between the app and test threads. Therefore,
|
746
746
|
if using Rails 5.1+ you SHOULD be able to ignore this section.
|
747
747
|
|
748
748
|
Some Capybara drivers need to run against an actual HTTP server. Capybara takes
|
@@ -1047,7 +1047,7 @@ additional info about how the underlying driver can be configured.
|
|
1047
1047
|
are testing for specific server errors and using multiple sessions make sure to test for the
|
1048
1048
|
errors using the initial session (usually :default)
|
1049
1049
|
|
1050
|
-
## <a name="threadsafe"></a>"Threadsafe" mode
|
1050
|
+
## <a name="threadsafe"></a>"Threadsafe" mode
|
1051
1051
|
|
1052
1052
|
In normal mode most of Capybara's configuration options are global settings which can cause issues
|
1053
1053
|
if using multiple sessions and wanting to change a setting for only one of the sessions. To provide
|
@@ -1082,7 +1082,8 @@ To set up a development environment, simply do:
|
|
1082
1082
|
|
1083
1083
|
```bash
|
1084
1084
|
bundle install
|
1085
|
-
bundle exec rake # run the test suite
|
1085
|
+
bundle exec rake # run the test suite with Firefox - requires `geckodriver` to be installed
|
1086
|
+
bundle exec rake spec_chrome # run the test suite with Chrome - require `chromedriver` to be installed
|
1086
1087
|
```
|
1087
1088
|
|
1088
1089
|
See
|
data/lib/capybara/config.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
require 'forwardable'
|
3
4
|
require 'capybara/session/config'
|
4
5
|
|
@@ -6,7 +7,7 @@ module Capybara
|
|
6
7
|
class Config
|
7
8
|
extend Forwardable
|
8
9
|
|
9
|
-
OPTIONS = [
|
10
|
+
OPTIONS = %i[app reuse_server threadsafe default_wait_time server default_driver javascript_driver].freeze
|
10
11
|
|
11
12
|
attr_accessor :app
|
12
13
|
attr_reader :reuse_server, :threadsafe
|
@@ -21,12 +22,9 @@ module Capybara
|
|
21
22
|
@session_options = Capybara::SessionConfig.new
|
22
23
|
end
|
23
24
|
|
24
|
-
|
25
|
-
@reuse_server = bool
|
26
|
-
end
|
25
|
+
attr_writer :reuse_server
|
27
26
|
|
28
27
|
def threadsafe=(bool)
|
29
|
-
warn "Capybara.threadsafe == true is a BETA feature and may change in future minor versions" if bool
|
30
28
|
raise "Threadsafe setting cannot be changed once a session is created" if (bool != threadsafe) && Session.instance_created?
|
31
29
|
@threadsafe = bool
|
32
30
|
end
|
@@ -35,16 +33,9 @@ module Capybara
|
|
35
33
|
#
|
36
34
|
# Return the proc that Capybara will call to run the Rack application.
|
37
35
|
# The block returned receives a rack app, port, and host/ip and should run a Rack handler
|
38
|
-
# By default, Capybara will try to
|
36
|
+
# By default, Capybara will try to use puma.
|
39
37
|
#
|
40
|
-
|
41
|
-
if block_given?
|
42
|
-
warn "DEPRECATED: Passing a block to Capybara::server is deprecated, please use Capybara::register_server instead"
|
43
|
-
@server = block
|
44
|
-
else
|
45
|
-
@server
|
46
|
-
end
|
47
|
-
end
|
38
|
+
attr_reader :server
|
48
39
|
|
49
40
|
##
|
50
41
|
#
|
@@ -62,14 +53,10 @@ module Capybara
|
|
62
53
|
#
|
63
54
|
def server=(name)
|
64
55
|
name, options = *name if name.is_a? Array
|
65
|
-
@server = if
|
66
|
-
name
|
56
|
+
@server = if options
|
57
|
+
proc { |app, port, host| Capybara.servers[name.to_sym].call(app, port, host, options) }
|
67
58
|
else
|
68
|
-
|
69
|
-
Proc.new { |app, port, host| Capybara.servers[name.to_sym].call(app,port,host,options) }
|
70
|
-
else
|
71
|
-
Capybara.servers[name.to_sym]
|
72
|
-
end
|
59
|
+
Capybara.servers[name.to_sym]
|
73
60
|
end
|
74
61
|
end
|
75
62
|
|
@@ -89,44 +76,10 @@ module Capybara
|
|
89
76
|
@javascript_driver || :selenium
|
90
77
|
end
|
91
78
|
|
92
|
-
|
93
|
-
def default_wait_time
|
94
|
-
deprecate('default_wait_time', 'default_max_wait_time', true)
|
95
|
-
default_max_wait_time
|
96
|
-
end
|
97
|
-
|
98
|
-
# @deprecated Use default_max_wait_time= instead
|
99
|
-
def default_wait_time=(t)
|
100
|
-
deprecate('default_wait_time=', 'default_max_wait_time=')
|
101
|
-
self.default_max_wait_time = t
|
102
|
-
end
|
103
|
-
|
104
|
-
def deprecate(method, alternate_method, once=false)
|
79
|
+
def deprecate(method, alternate_method, once = false)
|
105
80
|
@deprecation_notified ||= {}
|
106
81
|
warn "DEPRECATED: ##{method} is deprecated, please use ##{alternate_method} instead" unless once and @deprecation_notified[method]
|
107
|
-
@deprecation_notified[method]=true
|
108
|
-
end
|
109
|
-
end
|
110
|
-
|
111
|
-
# @api private
|
112
|
-
class ConfigureDeprecator
|
113
|
-
def initialize(config)
|
114
|
-
@config = config
|
115
|
-
end
|
116
|
-
|
117
|
-
def method_missing(m, *args, &block)
|
118
|
-
if @config.respond_to?(m)
|
119
|
-
@config.public_send(m, *args, &block)
|
120
|
-
elsif Capybara.respond_to?(m)
|
121
|
-
warn "Calling #{m} from Capybara.configure is deprecated - please call it on Capybara directly ( Capybara.#{m}(...) )"
|
122
|
-
Capybara.public_send(m, *args, &block)
|
123
|
-
else
|
124
|
-
super
|
125
|
-
end
|
126
|
-
end
|
127
|
-
|
128
|
-
def respond_to_missing?(m, include_private = false)
|
129
|
-
@config.respond_to?(m) || Capybara.respond_to?(m) || super
|
82
|
+
@deprecation_notified[method] = true
|
130
83
|
end
|
131
84
|
end
|
132
|
-
end
|
85
|
+
end
|
data/lib/capybara/cucumber.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
require 'capybara/dsl'
|
3
4
|
require 'capybara/rspec/matchers'
|
4
5
|
require 'capybara/rspec/matcher_proxies'
|
@@ -21,8 +22,6 @@ end
|
|
21
22
|
Before do |scenario|
|
22
23
|
scenario.source_tag_names.each do |tag|
|
23
24
|
driver_name = tag.sub(/^@/, '').to_sym
|
24
|
-
if Capybara.drivers.
|
25
|
-
Capybara.current_driver = driver_name
|
26
|
-
end
|
25
|
+
Capybara.current_driver = driver_name if Capybara.drivers.key?(driver_name)
|
27
26
|
end
|
28
27
|
end
|
data/lib/capybara/driver/base.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
class Capybara::Driver::Base
|
3
4
|
attr_writer :session
|
4
5
|
|
@@ -46,7 +47,7 @@ class Capybara::Driver::Base
|
|
46
47
|
raise Capybara::NotSupportedByDriverError, 'Capybara::Driver::Base#evaluate_script_asnyc'
|
47
48
|
end
|
48
49
|
|
49
|
-
def save_screenshot(path, options
|
50
|
+
def save_screenshot(path, **options)
|
50
51
|
raise Capybara::NotSupportedByDriverError, 'Capybara::Driver::Base#save_screenshot'
|
51
52
|
end
|
52
53
|
|
@@ -66,6 +67,16 @@ class Capybara::Driver::Base
|
|
66
67
|
raise Capybara::NotSupportedByDriverError, 'Capybara::Driver::Base#switch_to_frame'
|
67
68
|
end
|
68
69
|
|
70
|
+
def frame_title
|
71
|
+
find_xpath('/html/head/title').map(&:all_text).first.to_s
|
72
|
+
end
|
73
|
+
|
74
|
+
def frame_url
|
75
|
+
evaluate_script('document.location.href')
|
76
|
+
rescue Capybara::NotSupportedByDriverError
|
77
|
+
raise Capybara::NotSupportedByDriverError, 'Capybara::Driver::Base#frame_title'
|
78
|
+
end
|
79
|
+
|
69
80
|
def current_window_handle
|
70
81
|
raise Capybara::NotSupportedByDriverError, 'Capybara::Driver::Base#current_window_handle'
|
71
82
|
end
|
@@ -98,15 +109,10 @@ class Capybara::Driver::Base
|
|
98
109
|
raise Capybara::NotSupportedByDriverError, 'Capybara::Driver::Base#switch_to_window'
|
99
110
|
end
|
100
111
|
|
101
|
-
def within_window(locator)
|
102
|
-
raise Capybara::NotSupportedByDriverError, 'Capybara::Driver::Base#within_window'
|
103
|
-
end
|
104
|
-
|
105
112
|
def no_such_window_error
|
106
113
|
raise Capybara::NotSupportedByDriverError, 'Capybara::Driver::Base#no_such_window_error'
|
107
114
|
end
|
108
115
|
|
109
|
-
|
110
116
|
##
|
111
117
|
#
|
112
118
|
# Execute the block, and then accept the modal opened.
|
@@ -117,7 +123,7 @@ class Capybara::Driver::Base
|
|
117
123
|
# @return [String] the message shown in the modal
|
118
124
|
# @raise [Capybara::ModalNotFound] if modal dialog hasn't been found
|
119
125
|
#
|
120
|
-
def accept_modal(type, options
|
126
|
+
def accept_modal(type, **options, &blk)
|
121
127
|
raise Capybara::NotSupportedByDriverError, 'Capybara::Driver::Base#accept_modal'
|
122
128
|
end
|
123
129
|
|
@@ -130,7 +136,7 @@ class Capybara::Driver::Base
|
|
130
136
|
# @return [String] the message shown in the modal
|
131
137
|
# @raise [Capybara::ModalNotFound] if modal dialog hasn't been found
|
132
138
|
#
|
133
|
-
def dismiss_modal(type, options
|
139
|
+
def dismiss_modal(type, **options, &blk)
|
134
140
|
raise Capybara::NotSupportedByDriverError, 'Capybara::Driver::Base#dismiss_modal'
|
135
141
|
end
|
136
142
|
|
@@ -142,8 +148,7 @@ class Capybara::Driver::Base
|
|
142
148
|
false
|
143
149
|
end
|
144
150
|
|
145
|
-
def reset
|
146
|
-
end
|
151
|
+
def reset!; end
|
147
152
|
|
148
153
|
def needs_server?
|
149
154
|
false
|
@@ -152,10 +157,4 @@ class Capybara::Driver::Base
|
|
152
157
|
def session_options
|
153
158
|
(@session && @session.config) || Capybara.session_options
|
154
159
|
end
|
155
|
-
|
156
|
-
# @deprecated This method is being removed
|
157
|
-
def browser_initialized?
|
158
|
-
warn "DEPRECATED: #browser_initialized? is deprecated and will be removed in the next version of Capybara"
|
159
|
-
true
|
160
|
-
end
|
161
160
|
end
|
data/lib/capybara/driver/node.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
|
2
3
|
module Capybara
|
3
4
|
module Driver
|
4
5
|
class Node
|
@@ -27,7 +28,7 @@ module Capybara
|
|
27
28
|
|
28
29
|
# @param value String or Array. Array is only allowed if node has 'multiple' attribute
|
29
30
|
# @param options [Hash{}] Driver specific options for how to set a value on a node
|
30
|
-
def set(value, options
|
31
|
+
def set(value, **options)
|
31
32
|
raise NotImplementedError
|
32
33
|
end
|
33
34
|
|
@@ -39,15 +40,15 @@ module Capybara
|
|
39
40
|
raise NotImplementedError
|
40
41
|
end
|
41
42
|
|
42
|
-
def click
|
43
|
+
def click(keys = [], options = {})
|
43
44
|
raise NotImplementedError
|
44
45
|
end
|
45
46
|
|
46
|
-
def right_click
|
47
|
+
def right_click(keys = [], options = {})
|
47
48
|
raise NotImplementedError
|
48
49
|
end
|
49
50
|
|
50
|
-
def double_click
|
51
|
+
def double_click(keys = [], options = {})
|
51
52
|
raise NotImplementedError
|
52
53
|
end
|
53
54
|
|
data/lib/capybara/dsl.rb
CHANGED
data/lib/capybara/helpers.rb
CHANGED
@@ -1,14 +1,12 @@
|
|
1
|
-
# encoding: UTF-8
|
2
1
|
# frozen_string_literal: true
|
3
2
|
|
4
3
|
module Capybara
|
5
|
-
|
6
4
|
# @api private
|
7
5
|
module Helpers
|
8
6
|
extend self
|
9
7
|
|
10
8
|
##
|
11
|
-
#
|
9
|
+
# @deprecated
|
12
10
|
# Normalizes whitespace space by stripping leading and trailing
|
13
11
|
# whitespace and replacing sequences of whitespace characters
|
14
12
|
# with a single space.
|
@@ -17,6 +15,7 @@ module Capybara
|
|
17
15
|
# @return [String] Normalized text
|
18
16
|
#
|
19
17
|
def normalize_whitespace(text)
|
18
|
+
warn "DEPRECATED: Capybara::Helpers::normalize_whitespace is deprecated, please update your driver"
|
20
19
|
text.to_s.gsub(/[[:space:]]+/, ' ').strip
|
21
20
|
end
|
22
21
|
|
@@ -26,16 +25,17 @@ module Capybara
|
|
26
25
|
# if text is not a regexp
|
27
26
|
#
|
28
27
|
# @param [String] text Text to escape
|
29
|
-
# @
|
28
|
+
# @param [Boolean] exact (false) Whether or not this should be an exact text match
|
29
|
+
# @param [Fixnum, Boolean, nil] options Options passed to Regexp.new when creating the Regexp
|
30
|
+
# @return [Regexp] Regexp to match the passed in text and options
|
30
31
|
#
|
31
|
-
def to_regexp(text,
|
32
|
-
if text.is_a?(Regexp)
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
end
|
32
|
+
def to_regexp(text, exact: false, all_whitespace: false, options: nil)
|
33
|
+
return text if text.is_a?(Regexp)
|
34
|
+
|
35
|
+
escaped = Regexp.escape(text)
|
36
|
+
escaped = escaped.gsub("\\ ", "[[:blank:]]") if all_whitespace
|
37
|
+
escaped = "\\A#{escaped}\\z" if exact
|
38
|
+
Regexp.new(escaped, options)
|
39
39
|
end
|
40
40
|
|
41
41
|
##
|
@@ -44,16 +44,14 @@ module Capybara
|
|
44
44
|
# `Capybara.asset_host`.
|
45
45
|
#
|
46
46
|
# @param [String] html HTML code to inject into
|
47
|
+
# @param [URL] host (Capybara.asset_host) The host from which assets should be loaded
|
47
48
|
# @return [String] The modified HTML code
|
48
49
|
#
|
49
|
-
def inject_asset_host(html,
|
50
|
-
if
|
50
|
+
def inject_asset_host(html, host: Capybara.asset_host)
|
51
|
+
if host && Nokogiri::HTML(html).css("base").empty?
|
51
52
|
match = html.match(/<head[^<]*?>/)
|
52
|
-
if match
|
53
|
-
return html.clone.insert match.end(0), "<base href='#{asset_host}' />"
|
54
|
-
end
|
53
|
+
return html.clone.insert match.end(0), "<base href='#{host}' />" if match
|
55
54
|
end
|
56
|
-
|
57
55
|
html
|
58
56
|
end
|
59
57
|
|
@@ -68,21 +66,13 @@ module Capybara
|
|
68
66
|
# @param [Integer] count The number of items
|
69
67
|
#
|
70
68
|
def declension(singular, plural, count)
|
71
|
-
|
72
|
-
singular
|
73
|
-
else
|
74
|
-
plural
|
75
|
-
end
|
69
|
+
count == 1 ? singular : plural
|
76
70
|
end
|
77
71
|
|
78
72
|
if defined?(Process::CLOCK_MONOTONIC)
|
79
|
-
def monotonic_time
|
80
|
-
Process.clock_gettime Process::CLOCK_MONOTONIC
|
81
|
-
end
|
73
|
+
def monotonic_time; Process.clock_gettime Process::CLOCK_MONOTONIC; end
|
82
74
|
else
|
83
|
-
def monotonic_time
|
84
|
-
Time.now.to_f
|
85
|
-
end
|
75
|
+
def monotonic_time; Time.now.to_f; end
|
86
76
|
end
|
87
77
|
end
|
88
78
|
end
|
@@ -3,32 +3,34 @@ require 'minitest/spec'
|
|
3
3
|
module Capybara
|
4
4
|
module Minitest
|
5
5
|
module Expectations
|
6
|
-
%w
|
6
|
+
%w[text content title current_path].each do |assertion|
|
7
7
|
infect_an_assertion "assert_#{assertion}", "must_have_#{assertion}", :reverse
|
8
8
|
infect_an_assertion "refute_#{assertion}", "wont_have_#{assertion}", :reverse
|
9
9
|
end
|
10
10
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
11
|
+
# rubocop:disable Style/MultilineBlockChain
|
12
|
+
(%w[selector xpath css link button field select table checked_field unchecked_field].flat_map do |assertion|
|
13
|
+
[%W[assert_#{assertion} must_have_#{assertion}],
|
14
|
+
%W[refute_#{assertion} wont_have_#{assertion}]]
|
15
|
+
end + [%w[assert_all_of_selectors must_have_all_of_selectors],
|
16
|
+
%w[assert_none_of_selectors must_have_none_of_selectors]] +
|
17
|
+
%w[selector xpath css].flat_map do |assertion|
|
18
|
+
[%W[assert_matches_#{assertion} must_match_#{assertion}],
|
19
|
+
%W[refute_matches_#{assertion} wont_match_#{assertion}]]
|
19
20
|
end).each do |(meth, new_name)|
|
20
|
-
|
21
|
+
class_eval <<-ASSERTION, __FILE__, __LINE__ + 1
|
21
22
|
def #{new_name} *args, &block
|
22
23
|
::Minitest::Expectation.new(self, ::Minitest::Spec.current).#{new_name}(*args, &block)
|
23
24
|
end
|
24
|
-
|
25
|
+
ASSERTION
|
25
26
|
|
26
|
-
::Minitest::Expectation.class_eval <<-
|
27
|
+
::Minitest::Expectation.class_eval <<-ASSERTION, __FILE__, __LINE__ + 1
|
27
28
|
def #{new_name} *args, &block
|
28
29
|
ctx.#{meth}(target, *args, &block)
|
29
30
|
end
|
30
|
-
|
31
|
+
ASSERTION
|
31
32
|
end
|
33
|
+
# rubocop:enable Style/MultilineBlockChain
|
32
34
|
|
33
35
|
##
|
34
36
|
# Expectation that there is xpath
|
@@ -159,7 +161,6 @@ module Capybara
|
|
159
161
|
#
|
160
162
|
# @!method wont_have_current_path
|
161
163
|
# see {Capybara::SessionMatchers#assert_no_current_path}
|
162
|
-
|
163
164
|
end
|
164
165
|
end
|
165
166
|
end
|