spreewald 2.4.2 → 2.8.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +30 -3
- data/README.md +87 -15
- data/Rakefile +10 -5
- data/examples/paths.rb +36 -0
- data/examples/selectors.rb +28 -0
- data/lib/spreewald/all_steps.rb +4 -1
- data/lib/spreewald/browser_tab_steps.rb +91 -0
- data/lib/spreewald/development_steps.rb +1 -1
- data/lib/spreewald/email_steps.rb +3 -1
- data/lib/spreewald/session_steps.rb +18 -0
- data/lib/spreewald/time_steps.rb +102 -0
- data/lib/spreewald/timecop_steps.rb +6 -76
- data/lib/spreewald/web_steps.rb +25 -25
- data/lib/spreewald_support/driver_info.rb +8 -0
- data/lib/spreewald_support/tolerance_for_selenium_sync_issues.rb +9 -3
- data/lib/spreewald_support/version.rb +1 -1
- data/lib/spreewald_support/web_steps_helpers.rb +17 -0
- data/support/step_definition.rb +1 -1
- data/support/step_definition_file.rb +2 -0
- data/tests/rails-3_capybara-1/Gemfile +2 -1
- data/tests/rails-3_capybara-1/Gemfile.lock +3 -1
- data/tests/rails-3_capybara-2/Gemfile +2 -1
- data/tests/rails-3_capybara-2/Gemfile.lock +3 -1
- data/tests/rails-4_capybara-3/Gemfile.lock +1 -1
- data/tests/rails-4_capybara-3/features/browser_tab_steps.feature +1 -0
- data/tests/rails-4_capybara-3/features/session_steps.feature +1 -0
- data/tests/rails-4_capybara-3/features/time_steps.feature +1 -0
- data/tests/rails-6_capybara-3/.ruby-version +1 -1
- data/tests/rails-6_capybara-3/Gemfile +1 -1
- data/tests/rails-6_capybara-3/Gemfile.lock +1 -1
- data/tests/rails-6_capybara-3/features/browser_tab_steps.feature +1 -0
- data/tests/rails-6_capybara-3/features/session_steps.feature +1 -0
- data/tests/rails-6_capybara-3/features/time_steps.feature +1 -0
- data/tests/shared/app/controllers/downloads_controller.rb +1 -1
- data/tests/shared/app/controllers/static_pages_controller.rb +9 -0
- data/tests/shared/app/views/forms/disabled_elements.html.haml +18 -0
- data/tests/shared/app/views/mailer/html_email_with_links.haml +2 -0
- data/tests/shared/app/views/mailer/text_email_with_links.text.erb +1 -0
- data/tests/shared/app/views/static_pages/session_1.haml +1 -0
- data/tests/shared/app/views/static_pages/session_2.haml +1 -0
- data/tests/shared/app/views/static_pages/session_3.haml +1 -0
- data/tests/shared/app/views/static_pages/tab_1.haml +3 -0
- data/tests/shared/app/views/static_pages/tab_2.haml +2 -0
- data/tests/shared/app/views/static_pages/tab_3.haml +1 -0
- data/tests/shared/app/views/static_pages/time.html.haml +2 -0
- data/tests/shared/config/routes.rb +9 -2
- data/tests/shared/features/shared/browser_tab_steps.feature +103 -0
- data/tests/shared/features/shared/session_steps.feature +29 -0
- data/tests/shared/features/shared/time_steps.feature +31 -0
- data/tests/shared/features/shared/web_steps.feature +8 -2
- metadata +37 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 59c446ad46ae093a7bb103d7e4959dbbc7e29327cbc30e5730aff221f8488e36
|
4
|
+
data.tar.gz: e23e4bd833a6234e6ce2b4e6ab104f102708bab13ab54f10aad8b97df08cd39b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8d7b6e7ddd55b75433d7c800045c09f68b7175646de8a3f9ac11a5741ee83ce39c22d8bb5a8b5d9d77b4d22df01eda5de51093de4a76cabf73ae354308b12abc
|
7
|
+
data.tar.gz: bc169b566a8878be0ad26b2b1522b960b57772d80d135ffbe4a34476c673282d75b7666d9ccf14a585c229739b3d543620f578c3b59a7e6f62cf036a5df2f90c
|
data/CHANGELOG.md
CHANGED
@@ -3,8 +3,35 @@ All notable changes to this project will be documented in this file.
|
|
3
3
|
|
4
4
|
This project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
|
5
5
|
|
6
|
+
## 2.8.0
|
7
|
+
- Add radio buttons to the `the "..." (field|button|checkbox|radio button) should( not)? be disabled` step.
|
8
|
+
|
9
|
+
## 2.7.2
|
10
|
+
- Fix the step `I follow the ... link in the email` if the email contains non-HTTP(S) links
|
11
|
+
|
12
|
+
## 2.7.1
|
13
|
+
- Support RFC-compliant encoding of filenames in `Content-Disposition` header (e.g. send_data), as provided by Rails 6.
|
14
|
+
|
15
|
+
## 2.7.0
|
16
|
+
- Add a step modifier to control different Capybara sessions: `... in the browser session "..."`. (see issue [#66](https://github.com/makandra/spreewald/issues/66))
|
17
|
+
|
18
|
+
## 2.6.0
|
19
|
+
- The time steps do now work with the time helpers in ActiveSupport 4.1+ if the timecop gem is not included in the bundle. Please note that the two approaches branch. While ActiveSupport will freeze the time, Timecop will keep it running.
|
20
|
+
- The steps in the file `spreewald/timecop.rb` file were moved to `spreewald/time.rb` and importing `spreewald/timecop` directly is deprecated now.
|
21
|
+
|
22
|
+
## 2.5.0
|
23
|
+
- Add a set of steps to control browser tabs (Selenium only):
|
24
|
+
* `I open ... in a new browser tab`
|
25
|
+
* `I close the browser tab`
|
26
|
+
* `I switch to the new browser tab`
|
27
|
+
* `I switch to the previous browser tab`
|
28
|
+
* `I may open a new browser tab` (required for the following step)
|
29
|
+
* `I should( not)? have opened a new browser tab`
|
30
|
+
* `there should be (\d+) browser tabs?`
|
31
|
+
* `there should be at least (\d+) browser tabs?`
|
32
|
+
|
6
33
|
## 2.4.2
|
7
|
-
|
34
|
+
- Fix the step `I should( not)? see a link labeled "STRING"`, it is now overridable.
|
8
35
|
|
9
36
|
## 2.4.1
|
10
37
|
|
@@ -21,7 +48,7 @@ This project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html
|
|
21
48
|
|
22
49
|
## 2.2.4
|
23
50
|
- Fix "..." field should have the error "..." test by removing old should syntax
|
24
|
-
- Add single-line mail step to
|
51
|
+
- Add single-line mail step to README
|
25
52
|
|
26
53
|
## 2.2.3
|
27
54
|
- Fix 'the window should be titled' step - closes: [#102](https://github.com/makandra/spreewald/issues/102)
|
@@ -41,7 +68,7 @@ This project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html
|
|
41
68
|
|
42
69
|
## 2.2.0
|
43
70
|
- Add a new step `I should( not)? see a link labeled "STRING"`.
|
44
|
-
- Refer to Capybara 3's new flag `Capybara.default_normalize_ws = true` in the
|
71
|
+
- Refer to Capybara 3's new flag `Capybara.default_normalize_ws = true` in the README,
|
45
72
|
|
46
73
|
## 2.1.3
|
47
74
|
The `I should(not )? see /REGEXP/` step no longer refuses slashes as part of the regular expression. You can thus match full domains and more.
|
data/README.md
CHANGED
@@ -38,6 +38,7 @@ single files like this:
|
|
38
38
|
require 'spreewald/email_steps'
|
39
39
|
require 'spreewald/web_steps'
|
40
40
|
|
41
|
+
Have a look at our [recommended Capybara defaults](#recommended-capybara-defaults) as they impact the behavior of many Spreewald steps.
|
41
42
|
|
42
43
|
## Spreewald binary
|
43
44
|
|
@@ -83,7 +84,7 @@ More info [here](https://makandracards.com/makandra/12139-waiting-for-page-load-
|
|
83
84
|
Thanks to [cucumber_priority](https://github.com/makandra/cucumber_priority) you can override any step definition from Spreewald with your own pattern. Cucumber will not raise `Cucumber::Ambiguous` if your custom steps collide with a Spreewald step.
|
84
85
|
|
85
86
|
|
86
|
-
##
|
87
|
+
## Recommended Capybara defaults
|
87
88
|
|
88
89
|
If you are upgrading from Capybara 2 to Capybara 3, you might [see failing tests](https://github.com/makandra/spreewald/issues/95) with Spreewald steps like `I should see`. This is caused by a breaking change in [Capybara's Finders](https://www.rubydoc.info/github/jnicklas/capybara/Capybara/Node/Finders) that accept a `:text` option. To activate Capybara 2 behavior globally in your project, enable this flag:
|
89
90
|
|
@@ -99,6 +100,12 @@ Furthermore, we recommend setting [Capybara's matching strategy](https://github.
|
|
99
100
|
Capybara.match = :prefer_exact
|
100
101
|
````
|
101
102
|
|
103
|
+
If you want Spreewald to match fields, links and buttons against the `aria-label` attribute, enable the following global configuration in Capybara 2.8+:
|
104
|
+
|
105
|
+
```ruby
|
106
|
+
Capybara.enable_aria_label = true
|
107
|
+
```
|
108
|
+
|
102
109
|
## Contributing
|
103
110
|
|
104
111
|
### Testing
|
@@ -132,6 +139,54 @@ the step definitions.
|
|
132
139
|
|
133
140
|
## Steps
|
134
141
|
|
142
|
+
### browser_tab_steps.rb
|
143
|
+
|
144
|
+
* **When I open ... in a new browser tab**
|
145
|
+
|
146
|
+
Opens [the page](https://github.com/makandra/spreewald/blob/master/examples/paths.rb) in a new browser tab and switches to it.
|
147
|
+
|
148
|
+
|
149
|
+
* **When I close the browser tab**
|
150
|
+
|
151
|
+
Closes the current browser tab and switches back to the first tab.
|
152
|
+
|
153
|
+
|
154
|
+
* **When I switch to the new(ly opened)? browser tab**
|
155
|
+
|
156
|
+
Waits for the new browser tab to appear, then switches to it.
|
157
|
+
|
158
|
+
|
159
|
+
* **When I switch( back)? to the previous browser tab**
|
160
|
+
|
161
|
+
Changes the browser context to the second-last browser tab.
|
162
|
+
|
163
|
+
|
164
|
+
* **When I may open a new browser tab**
|
165
|
+
|
166
|
+
Required for the check whether a new browser tab was opened or not.
|
167
|
+
|
168
|
+
|
169
|
+
* **Then I should( not)? have opened a new browser tab**
|
170
|
+
|
171
|
+
Example (positive expectation):
|
172
|
+
|
173
|
+
When I may open a new browser tab
|
174
|
+
And I click on "Open link in new browser tab"
|
175
|
+
Then I should have opened a new browser tab
|
176
|
+
|
177
|
+
Example (negative expectation):
|
178
|
+
|
179
|
+
When I may open a new browser tab
|
180
|
+
And I click on "Open link in current browser tab"
|
181
|
+
Then I should not have opened a new browser tab
|
182
|
+
|
183
|
+
|
184
|
+
* **Then there should be (\d+) browser tabs?**
|
185
|
+
|
186
|
+
|
187
|
+
* **Then there should be at least (\d+) browser tabs?**
|
188
|
+
|
189
|
+
|
135
190
|
### development_steps.rb
|
136
191
|
|
137
192
|
* **Then it should work...?**
|
@@ -146,14 +201,14 @@ the step definitions.
|
|
146
201
|
for its job)
|
147
202
|
|
148
203
|
|
149
|
-
* **AfterStep @slow**
|
204
|
+
* **AfterStep @slow-motion**
|
150
205
|
|
151
206
|
Waits 2 seconds after each step
|
152
207
|
|
153
208
|
|
154
|
-
* **AfterStep @single**
|
209
|
+
* **AfterStep @single-step**
|
155
210
|
|
156
|
-
Waits for keypress after each step
|
211
|
+
Waits for a keypress after each step
|
157
212
|
|
158
213
|
|
159
214
|
### email_steps.rb
|
@@ -192,6 +247,9 @@ the step definitions.
|
|
192
247
|
|
193
248
|
* **When I follow the (first|second|third)? link in the e?mail**
|
194
249
|
|
250
|
+
Please note that this step will only follow HTTP and HTTPS links.
|
251
|
+
Other links (such as mailto: or ftp:// links) are ignored.
|
252
|
+
|
195
253
|
|
196
254
|
* **Then no e?mail should have been sent**
|
197
255
|
|
@@ -231,6 +289,18 @@ the step definitions.
|
|
231
289
|
This step is deprecated and will be removed from spreewald. If you still want to use it, copy the code to your project's own steps.
|
232
290
|
|
233
291
|
|
292
|
+
### session_steps.rb
|
293
|
+
|
294
|
+
* **When ... in the browser session "..."**
|
295
|
+
|
296
|
+
You can append `in the browser session "name"` to any other step to execute
|
297
|
+
the step in a different browser session.
|
298
|
+
|
299
|
+
You may need to update other steps to allow multiple sessions (e.g. your
|
300
|
+
authentication steps have to support multiple logged in users).
|
301
|
+
More details [here](https://makandracards.com/makandra/474480-how-to-make-a-cucumber-test-work-with-multiple-browser-sessions).
|
302
|
+
|
303
|
+
|
234
304
|
### table_steps.rb
|
235
305
|
|
236
306
|
* **Then I should( not)? see a table with (exactly )?the following rows( in any order)?:?**
|
@@ -240,11 +310,14 @@ the step definitions.
|
|
240
310
|
See [this article](https://makandracards.com/makandra/763-cucumber-step-to-match-table-rows-with-capybara) for details.
|
241
311
|
|
242
312
|
|
243
|
-
###
|
313
|
+
### time_steps.rb
|
244
314
|
|
245
|
-
Steps to travel through time
|
315
|
+
Steps to travel through time
|
246
316
|
|
247
|
-
|
317
|
+
This uses [Timecop](https://github.com/jtrupiano/timecop) or Active Support 4.1+ to stub Time.now / Time.current.
|
318
|
+
The user is responsible for including one of the two gems.
|
319
|
+
|
320
|
+
Please note that the two approaches branch. While ActiveSupport will freeze the time, Timecop will keep it running.
|
248
321
|
|
249
322
|
|
250
323
|
* **When the (date|time) is "?(\d{4}-\d{2}-\d{2}( \d{1,2}:\d{2})?)"?**
|
@@ -262,7 +335,7 @@ See [this article](https://makandracards.com/makandra/1222-useful-cucumber-steps
|
|
262
335
|
Given the time is 13:40
|
263
336
|
|
264
337
|
|
265
|
-
* **When it is (\d+|
|
338
|
+
* **When it is (\d+|an?|some|a few) (seconds?|minutes?|hours?|days?|weeks?|months?|years?) (later|earlier)**
|
266
339
|
|
267
340
|
Example:
|
268
341
|
|
@@ -270,6 +343,8 @@ See [this article](https://makandracards.com/makandra/1222-useful-cucumber-steps
|
|
270
343
|
When it is a few hours earlier
|
271
344
|
|
272
345
|
|
346
|
+
|
347
|
+
|
273
348
|
### web_steps.rb
|
274
349
|
|
275
350
|
Most of cucumber-rails' original web steps plus a few of our own.
|
@@ -298,7 +373,7 @@ deprecation notice. Decide for yourself whether you want to use them:
|
|
298
373
|
|
299
374
|
* **When ... within ...**
|
300
375
|
|
301
|
-
You can append `within [selector]` to any other web step.
|
376
|
+
You can append `within [selector]` to any other web step, even multiple times.
|
302
377
|
Be aware that within will only look at the first element that matches.
|
303
378
|
If this is a problem for you following links, you might want to have a look
|
304
379
|
at the 'When I follow "..." inside any "..."'-step.
|
@@ -608,7 +683,7 @@ deprecation notice. Decide for yourself whether you want to use them:
|
|
608
683
|
|
609
684
|
Then "Sponsor" should link to "http://makandra.com/"
|
610
685
|
|
611
|
-
Don't forget the trailing slash. Otherwise you'll get the error
|
686
|
+
Don't forget the trailing slash. Otherwise you'll get the error
|
612
687
|
expected: /http:\/\/makandra.com(\?[^\/]*)?$/
|
613
688
|
got: "http://makandra.com/" (using =~)
|
614
689
|
|
@@ -643,12 +718,9 @@ deprecation notice. Decide for yourself whether you want to use them:
|
|
643
718
|
* **When I enter "..." into the browser dialog**
|
644
719
|
|
645
720
|
|
646
|
-
* **
|
647
|
-
|
648
|
-
|
649
|
-
* **Then the "..." (field|button|checkbox) should( not)? be disabled**
|
721
|
+
* **Then the "..." (field|button|checkbox|radio button) should( not)? be disabled**
|
650
722
|
|
651
|
-
Tests that an input, button or
|
723
|
+
Tests that an input, button, checkbox or radio button with the given label is disabled.
|
652
724
|
|
653
725
|
|
654
726
|
* **Then the "..." field should( not)? be visible**
|
data/Rakefile
CHANGED
@@ -44,11 +44,16 @@ task :update_readme do
|
|
44
44
|
require 'support/step_manager'
|
45
45
|
end
|
46
46
|
|
47
|
-
readme = File.read(
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
47
|
+
readme = File.read(readme_path)
|
48
|
+
File.open(readme_path, 'w') do |file|
|
49
|
+
start_of_steps_section = readme =~ /^## Steps/
|
50
|
+
length_of_steps_section = readme[(start_of_steps_section+1)..-1] =~ /^##[^#]/
|
51
|
+
length_of_steps_section ||= readme.size - start_of_steps_section
|
52
|
+
step_documentation = StepManager.new('lib/spreewald').to_markdown
|
53
|
+
readme[start_of_steps_section, length_of_steps_section] = "## Steps\n\n#{step_documentation}"
|
54
|
+
|
55
|
+
file.write(readme)
|
56
|
+
end
|
52
57
|
|
53
58
|
system "git diff #{readme_path}"
|
54
59
|
puts '', '> Done (diff applied).'
|
data/examples/paths.rb
CHANGED
@@ -13,6 +13,30 @@ module NavigationHelpers
|
|
13
13
|
when /^the home\s?page$/
|
14
14
|
root_path
|
15
15
|
|
16
|
+
when /^the (page|form) for the (.*?) above$/
|
17
|
+
action_prose = Regexp.last_match(1)
|
18
|
+
model_prose = Regexp.last_match(2)
|
19
|
+
route = "#{(action_prose == 'form') ? 'edit_' : ''}#{model_prose_to_route_segment(model_prose)}_path"
|
20
|
+
model = model_prose_to_class(model_prose)
|
21
|
+
send(route, model.reorder(:id).last!)
|
22
|
+
|
23
|
+
when /^the (page|form) for the (.*?) "(.*?)"$/
|
24
|
+
action_prose = Regexp.last_match(1)
|
25
|
+
model_prose = Regexp.last_match(2)
|
26
|
+
identifier = Regexp.last_match(3)
|
27
|
+
path_to_show_or_edit(action_prose, model_prose, identifier)
|
28
|
+
|
29
|
+
when /^the (.*?) (page|form) for "(.*?)"$/
|
30
|
+
model_prose = Regexp.last_match(1)
|
31
|
+
action_prose = Regexp.last_match(2)
|
32
|
+
identifier = Regexp.last_match(3)
|
33
|
+
path_to_show_or_edit(action_prose, model_prose, identifier)
|
34
|
+
|
35
|
+
when /^the (.*?) form$/
|
36
|
+
model_prose = Regexp.last_match(1)
|
37
|
+
route = "new_#{model_prose_to_route_segment(model_prose)}_path"
|
38
|
+
send(route)
|
39
|
+
|
16
40
|
else
|
17
41
|
begin
|
18
42
|
page_name =~ /^the (.*) page$/
|
@@ -24,6 +48,18 @@ module NavigationHelpers
|
|
24
48
|
end
|
25
49
|
end
|
26
50
|
end
|
51
|
+
|
52
|
+
private
|
53
|
+
|
54
|
+
def model_prose_to_class(model_prose)
|
55
|
+
model_prose.gsub(' ', '_').classify.constantize
|
56
|
+
end
|
57
|
+
|
58
|
+
def model_prose_to_route_segment(model_prose)
|
59
|
+
model_prose = model_prose.downcase
|
60
|
+
model_prose.gsub(/[\ \/]/, '_')
|
61
|
+
end
|
62
|
+
|
27
63
|
end
|
28
64
|
|
29
65
|
World(NavigationHelpers)
|
data/examples/selectors.rb
CHANGED
@@ -12,6 +12,27 @@ module HtmlSelectorsHelpers
|
|
12
12
|
when "the page"
|
13
13
|
"html > body"
|
14
14
|
|
15
|
+
# Auto-mapper for BEM classes and ARIA labels
|
16
|
+
#
|
17
|
+
# Usage examples:
|
18
|
+
# the main menu -> '.main-menu, [aria-label="main menu"]'
|
19
|
+
# the item box's header -> '.item-box--header, [aria-label="item box's header"]'
|
20
|
+
# the slider's item that is current -> '.slider--item.is-current, [aria-label="slider's item that is current"]'
|
21
|
+
when /^the (.*)$/
|
22
|
+
match = Regexp.last_match(1)
|
23
|
+
match =~ /^(.+?)(?:'s (.+?))?(?: that (.+))?$/
|
24
|
+
|
25
|
+
bem_selector = '.'
|
26
|
+
bem_selector << selectorify(Regexp.last_match(1))
|
27
|
+
bem_selector << '--' << selectorify(Regexp.last_match(2)) if Regexp.last_match(2)
|
28
|
+
bem_selector << '.' << selectorify(Regexp.last_match(3)) if Regexp.last_match(3)
|
29
|
+
|
30
|
+
aria_selector = '[aria-label="'
|
31
|
+
aria_selector << match.gsub('"', '\\"')
|
32
|
+
aria_selector << '"]'
|
33
|
+
|
34
|
+
[bem_selector, aria_selector].join(', ')
|
35
|
+
|
15
36
|
# Add more mappings here.
|
16
37
|
# Here is an example that pulls values out of the Regexp:
|
17
38
|
#
|
@@ -35,6 +56,13 @@ module HtmlSelectorsHelpers
|
|
35
56
|
"Now, go and add a mapping in #{__FILE__}"
|
36
57
|
end
|
37
58
|
end
|
59
|
+
|
60
|
+
private
|
61
|
+
|
62
|
+
def selectorify(string)
|
63
|
+
string.gsub(/ /, '-')
|
64
|
+
end
|
65
|
+
|
38
66
|
end
|
39
67
|
|
40
68
|
World(HtmlSelectorsHelpers)
|
data/lib/spreewald/all_steps.rb
CHANGED
@@ -1,9 +1,12 @@
|
|
1
1
|
# coding: UTF-8
|
2
2
|
require 'rspec/matchers'
|
3
3
|
|
4
|
+
ALREADY_LOADED_FILES = %w[all_steps timecop_steps]
|
5
|
+
|
4
6
|
Dir[File.join(File.dirname(__FILE__), '*_steps.rb')].each do |f|
|
5
7
|
name = File.basename(f, '.rb')
|
6
|
-
|
8
|
+
|
9
|
+
unless ALREADY_LOADED_FILES.include?(name)
|
7
10
|
require "spreewald/#{name}"
|
8
11
|
end
|
9
12
|
end
|
@@ -0,0 +1,91 @@
|
|
1
|
+
Before do
|
2
|
+
@previous_browser_tabs_count = nil
|
3
|
+
end
|
4
|
+
|
5
|
+
# Close all but the first browser tab
|
6
|
+
After do
|
7
|
+
next unless selenium_driver?
|
8
|
+
|
9
|
+
browser.switch_to.window(browser.window_handles.last)
|
10
|
+
while browser.window_handles.size > 1 do
|
11
|
+
browser.close
|
12
|
+
browser.switch_to.window(browser.window_handles.last)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
# Opens [the page](https://github.com/makandra/spreewald/blob/master/examples/paths.rb) in a new browser tab and switches to it.
|
17
|
+
When /^I open (.+?) in a new browser tab$/ do |page_name|
|
18
|
+
require_selenium!
|
19
|
+
previous_handles_count = browser.window_handles.size
|
20
|
+
relative_target_path = path_to(page_name)
|
21
|
+
|
22
|
+
page.execute_script "window.open('#{relative_target_path}', '_blank')"
|
23
|
+
step "there should be #{previous_handles_count + 1} browser tabs"
|
24
|
+
step "I switch to the new browser tab"
|
25
|
+
end.overridable
|
26
|
+
|
27
|
+
# Closes the current browser tab and switches back to the first tab.
|
28
|
+
When 'I close the browser tab' do
|
29
|
+
require_selenium!
|
30
|
+
# Wait for browser tab to close
|
31
|
+
previous_handles_count = browser.window_handles.size
|
32
|
+
raise 'Cannot close the last remaining browser tab' if previous_handles_count == 1
|
33
|
+
|
34
|
+
browser.close
|
35
|
+
step "there should be #{previous_handles_count - 1} browser tabs"
|
36
|
+
|
37
|
+
# Closing the current tab causes Selenium to continue using a stale invalid tab handle
|
38
|
+
browser.switch_to.window(browser.window_handles.first)
|
39
|
+
end.overridable
|
40
|
+
|
41
|
+
# Waits for the new browser tab to appear, then switches to it.
|
42
|
+
When /^I switch to the new(?:ly opened)? browser tab$/ do
|
43
|
+
require_selenium!
|
44
|
+
step 'there should be at least 2 browser tabs'
|
45
|
+
browser.switch_to.window(browser.window_handles.last)
|
46
|
+
end.overridable
|
47
|
+
|
48
|
+
# Changes the browser context to the second-last browser tab.
|
49
|
+
When /^I switch(?: back)? to the previous browser tab$/ do
|
50
|
+
require_selenium!
|
51
|
+
previous_handle = browser.window_handles[-2] # Second last should be the previous browser tab
|
52
|
+
previous_handle ||= browser.window_handles.first # Fall back if only one tab is left
|
53
|
+
browser.switch_to.window(previous_handle)
|
54
|
+
end.overridable
|
55
|
+
|
56
|
+
# Required for the check whether a new browser tab was opened or not.
|
57
|
+
When 'I may open a new browser tab' do
|
58
|
+
@previous_browser_tabs_count = browser.window_handles.size
|
59
|
+
end.overridable
|
60
|
+
|
61
|
+
# Example (positive expectation):
|
62
|
+
#
|
63
|
+
# When I may open a new browser tab
|
64
|
+
# And I click on "Open link in new browser tab"
|
65
|
+
# Then I should have opened a new browser tab
|
66
|
+
#
|
67
|
+
# Example (negative expectation):
|
68
|
+
#
|
69
|
+
# When I may open a new browser tab
|
70
|
+
# And I click on "Open link in current browser tab"
|
71
|
+
# Then I should not have opened a new browser tab
|
72
|
+
Then /^I should( not)? have opened a new browser tab$/ do |negate|
|
73
|
+
raise "you need to use the 'I may open a new tab' step beforehand" unless @previous_browser_tabs_count
|
74
|
+
expected_browser_tab_count = negate ? @previous_browser_tabs_count : (@previous_browser_tabs_count + 1)
|
75
|
+
|
76
|
+
step "there should be #{expected_browser_tab_count} browser tabs"
|
77
|
+
end.overridable
|
78
|
+
|
79
|
+
Then /^there should be (\d+) browser tabs?$/ do |expected_browser_tabs|
|
80
|
+
patiently do
|
81
|
+
actual_browser_tabs = browser.window_handles.size
|
82
|
+
expect(actual_browser_tabs).to eq(expected_browser_tabs.to_i), "Expected #{expected_browser_tabs} browser tab to be open, but found #{actual_browser_tabs}"
|
83
|
+
end
|
84
|
+
end.overridable
|
85
|
+
|
86
|
+
Then /^there should be at least (\d+) browser tabs?$/ do |expected_browser_tabs|
|
87
|
+
patiently do
|
88
|
+
actual_browser_tabs = browser.window_handles.size
|
89
|
+
expect(actual_browser_tabs).to be >= (expected_browser_tabs.to_i), "Expected at least #{expected_browser_tabs} browser tab to be open, but found #{actual_browser_tabs}"
|
90
|
+
end
|
91
|
+
end.overridable
|