site_prism 4.0.beta → 4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4ebb39462fdc078aff996d358cfadeb4feddbb443cb0655340efa51f4d4af80d
4
- data.tar.gz: 2913da09df5462bcf924d3598d8d9f6f4e996c65951acb31694d0dea67990b4d
3
+ metadata.gz: a42324a6a59bf20f2c35c519c130d94e314c5170b47ddf1c9f1d3faae98238d7
4
+ data.tar.gz: d17845d3b0131de25848bf85b86a7c696ef1160bdc4cf759bd43958d56742d00
5
5
  SHA512:
6
- metadata.gz: '080072c82a3df37666dd079600cd75db84be14b2f73e2f06227bdf48e45f8ff2783a64d122c05e12c8eda54462491a6c0f3d3e935b48fad54278dcf4eab0d841'
7
- data.tar.gz: 79157445566537187b9578113b3a3100aa13dbf4cbb615f9e8563dc6d1264177eaab62d9caa2fa79f152118aa1c919a5607477492fa33b1d2b23c6f2bf162b49
6
+ metadata.gz: 7e09efb630b6f8270c7c8bb23c9db92bcccaa09e54c0a7e9ef1a6f2a645f47d821bf912141588ccec1bb3c6aea73f181ff6c8e5b771116f84936d10f95e714ab
7
+ data.tar.gz: d1dee7191ea9c01a8cc03e0726ae55ec1de91fe1d9bbb0f6db73e0c6b8af261d598b59d4d1be54e0589e481613b40e574f0d406ac1242d6a2e4cd46a9480c08c
data/README.md CHANGED
@@ -7,7 +7,7 @@ _A Page Object Model DSL for Capybara_
7
7
  SitePrism gives you a simple, clean and semantic DSL for describing your site using the Page Object Model pattern,
8
8
  for use with Capybara in automated acceptance testing.
9
9
 
10
- Find the pretty documentation here: https://rdoc.info/gems/site_prism/frames
10
+ Find the pretty documentation here: https://www.rubydoc.info/github/site-prism/site_prism
11
11
 
12
12
  Make sure to add your project/company to https://github.com/site-prism/site_prism/wiki/Who-is-using-SitePrism
13
13
 
@@ -81,34 +81,34 @@ end
81
81
 
82
82
  # now for some tests
83
83
 
84
- When(/^I navigate to the google home page$/) do
84
+ When('I navigate to the google home page') do
85
85
  @home = Home.new
86
86
  @home.load
87
87
  end
88
88
 
89
- Then(/^the home page should contain the menu and the search form$/) do
90
- @home.wait_until_menu_visible # menu loads after a second or 2, give it time to arrive
89
+ Then('the home page should contain the menu and the search form') do
90
+ @home.wait_until_menu_visible(wait: 5)
91
91
  expect(@home).to have_menu
92
92
  expect(@home).to have_search_field
93
93
  expect(@home).to have_search_button
94
94
  end
95
95
 
96
- When(/^I search for Sausages$/) do
97
- @home.search_field.set 'Sausages'
96
+ When('I search for Sausages') do
97
+ @home.search_field.send_keys('Sausages')
98
98
  @home.search_button.click
99
99
  end
100
100
 
101
- Then(/^the search results page is displayed$/) do
101
+ Then('the search results page is displayed') do
102
102
  @results_page = SearchResults.new
103
103
  expect(@results_page).to be_displayed
104
104
  end
105
105
 
106
- Then(/^the search results page contains 10 individual search results$/) do
107
- @results_page.wait_until_search_results_visible
106
+ Then('the search results page contains 10 individual search results') do
107
+ @results_page.wait_until_search_results_visible(wait: 5)
108
108
  expect(@results_page).to have_search_results(count: 10)
109
109
  end
110
110
 
111
- Then(/^the search results contain a link to the wikipedia sausages page$/) do
111
+ Then('the search results contain a link to the wikipedia sausages page') do
112
112
  expect(@results_page.search_result_links).to include('http://en.wikipedia.org/wiki/Sausage')
113
113
  end
114
114
  ```
@@ -134,7 +134,6 @@ require 'capybara'
134
134
  require 'capybara/cucumber'
135
135
  require 'selenium-webdriver'
136
136
  require 'site_prism'
137
- require 'site_prism/all_there' # Optional but needed to perform more complex matching
138
137
  ```
139
138
 
140
139
  The driver creation is identical to how you would normally create a Capybara driver,
@@ -143,7 +142,7 @@ a sample Selenium one could look something like this...
143
142
  ```ruby
144
143
  Capybara.register_driver :site_prism do |app|
145
144
  browser = ENV.fetch('browser', 'firefox').to_sym
146
- Capybara::Selenium::Driver.new(app, browser: browser, desired_capabilities: capabilities)
145
+ Capybara::Selenium::Driver.new(app, browser: browser, options: options)
147
146
  end
148
147
 
149
148
  # Then tell Capybara to use the Driver you've just defined as its default driver
@@ -161,7 +160,6 @@ require 'capybara'
161
160
  require 'capybara/rspec'
162
161
  require 'selenium-webdriver'
163
162
  require 'site_prism'
164
- require 'site_prism/all_there' # Optional but needed to perform more complex matching
165
163
  ```
166
164
 
167
165
  And again, as above, a sample driver is no different to a normal driver instantiation in Capybara.
@@ -175,7 +173,7 @@ to then use instances of those classes in your tests.
175
173
 
176
174
  If a class represents a page then each element of the page is
177
175
  represented by a method that, when called, returns a reference to that
178
- element that can then be acted upon (clicked, set text value), or
176
+ element that can then be acted upon (clicked, type in some text), or
179
177
  queried (is it enabled? / visible?).
180
178
 
181
179
  SitePrism is based around this concept, but goes further as you'll see
@@ -218,7 +216,7 @@ class Home < SitePrism::Page
218
216
  end
219
217
  ```
220
218
 
221
- Note that setting a URL is optional - you only need to set a url if you want to be able to
219
+ Note that setting a URL is **optional** - you only need to set a url if you want to be able to
222
220
  navigate directly to that page. It makes sense to set the URL for a page model of a
223
221
  home page or a login page, but probably not a search results page.
224
222
 
@@ -245,8 +243,7 @@ See https://github.com/sporkmonger/addressable for more details on parameterized
245
243
 
246
244
  ### Navigating to the Page
247
245
 
248
- Once the URL has been set (using `set_url`), you can navigate directly
249
- to the page using `#load`:
246
+ Once the URL has been set (using `set_url`), you can navigate directly to the page using `#load`:
250
247
 
251
248
  ```ruby
252
249
  @home_page = Home.new
@@ -282,8 +279,6 @@ end
282
279
  This will tell whichever capybara driver you have configured to
283
280
  navigate to the URL set against that page's class.
284
281
 
285
- See https://github.com/sporkmonger/addressable for more details on parameterized URLs.
286
-
287
282
  ### Verifying that a particular page is displayed
288
283
 
289
284
  Automated tests often need to verify that a particular page is
@@ -319,8 +314,7 @@ wait time in seconds as the first argument like this:
319
314
  #### Specifying parameter values for templated URLs
320
315
 
321
316
  Sometimes you want to verify not just that the current URL matches the
322
- template, but that you're looking at a specific page matching that
323
- template.
317
+ template, but that you're looking at a specific page matching that template.
324
318
 
325
319
  Given the previous example, if you wanted to ensure that the browser had loaded
326
320
  account number 22, you could assert the following:
@@ -347,7 +341,7 @@ when comparing your page's URL template to the current_url:
347
341
  @account_page.load(id: 22, query: { token: 'ca2786616a4285bc', color: 'irrelevant' })
348
342
 
349
343
  expect(@account_page).to be_displayed(id: 22)
350
- expect(@account_page.url_matches['query']['token']).to eq('ca2786616a4285bc')
344
+ expect(@account_page.url_matches.dig('query', 'token')).to eq('ca2786616a4285bc')
351
345
  ```
352
346
 
353
347
  #### Falling back to basic regexp matchers
@@ -367,7 +361,7 @@ end
367
361
  SitePrism's `#displayed?` predicate method allows for semantic code in your tests:
368
362
 
369
363
  ```ruby
370
- Then(/^the account page is displayed$/) do
364
+ Then('the account page is displayed') do
371
365
  expect(@account_page).to be_displayed
372
366
  expect(@some_other_page).not_to be_displayed
373
367
  end
@@ -375,8 +369,7 @@ end
375
369
 
376
370
  ### Getting the Current Page's URL
377
371
 
378
- SitePrism allows you to get the current page's URL. Here's how it's
379
- done:
372
+ SitePrism allows you to get the current page's URL. Here's how it's done:
380
373
 
381
374
  ```ruby
382
375
  class Account < SitePrism::Page
@@ -462,8 +455,8 @@ end
462
455
  @home.load
463
456
 
464
457
  @home.search_field #=> will return the capybara element found using the selector
465
- @home.search_field.set 'the search string' #=> `search_field` returns a capybara element, so use the capybara API to deal with it
466
- @home.search_field.text #=> standard method on a capybara element; returns a string
458
+ @home.search_field.send_keys('the search string')
459
+ @home.search_field['value'] #=> standard method on a capybara element (field); returns the string value
467
460
  ```
468
461
 
469
462
  #### Testing for the existence of the element
@@ -492,16 +485,16 @@ end
492
485
  ...which makes for nice test code:
493
486
 
494
487
  ```ruby
495
- Then(/^the search field exists$/) do
488
+ Then('the search field exists') do
496
489
  expect(@home).to have_search_field
497
490
  end
498
491
  ```
499
492
 
500
493
  #### Testing that an element does not exist
501
494
 
502
- To test that an element does not exist on the page, it is not possible to just call
495
+ To test that an element does not exist on the page, you should not call
503
496
  `#not_to have_search_field`. SitePrism supplies the `#has_no_<element>?` method
504
- that should be used to test for non-existence.
497
+ that should be used instead to test for non-existence.
505
498
  This method delegates to [Capybara::Node::Matchers#has_no_selector?](https://www.rubydoc.info/github/teamcapybara/capybara/master/Capybara/Node/Matchers#has_no_selector%3F-instance_method)
506
499
  Using the above example:
507
500
 
@@ -514,7 +507,7 @@ Using the above example:
514
507
  ...which makes for nice test code:
515
508
 
516
509
  ```ruby
517
- Then(/^the search field exists$/)do
510
+ Then('the search field exists')do
518
511
  expect(@home).to have_no_search_field #NB: NOT => expect(@home).not_to have_search_field
519
512
  end
520
513
  ```
@@ -529,7 +522,7 @@ to become visible. You can customise the wait time by supplying a number
529
522
  of seconds to wait in-line or configuring the default wait time.
530
523
 
531
524
  ```ruby
532
- @home.wait_until_search_field_visible
525
+ @home.wait_until_search_field_visible # using the default wait time set
533
526
  # or...
534
527
  @home.wait_until_search_field_visible(wait: 10)
535
528
  ```
@@ -544,7 +537,7 @@ wait time for the element to become invisible. You can as with the visibility
544
537
  waiter, customise the wait time in the same way.
545
538
 
546
539
  ```ruby
547
- @home.wait_until_search_field_invisible
540
+ @home.wait_until_search_field_invisible # using the default wait time set
548
541
  # or...
549
542
  @home.wait_until_search_field_invisible(wait: 10)
550
543
  ```
@@ -663,7 +656,7 @@ Then the following method is available:
663
656
  This in turn allows the following nice test code
664
657
 
665
658
  ```ruby
666
- Then(/^there should be some names listed on the page$/) do
659
+ Then('there should be some names listed on the page') do
667
660
  expect(@friends_page).to have_names #=> This only passes if there is at least one `name`
668
661
  end
669
662
  ```
@@ -704,16 +697,16 @@ are present in the browser and `false` if they're not all there.
704
697
 
705
698
  # and...
706
699
 
707
- Then(/^the friends page contains all the expected elements$/) do
700
+ Then('the friends page contains all the expected elements') do
708
701
  expect(@friends_page).to be_all_there
709
702
  end
710
703
  ```
711
704
 
712
705
  You may wish to have elements declared in a page object class that are not
713
706
  always guaranteed to be present (success or error messages, etc.).
714
- If you'd still like to test such a page with `all_there?` you can declare
715
- `expected_elements` on your page object class that narrows the elements
716
- included in `all_there?` check to those that definitely should be present.
707
+ If you'd still like to test such a page with `#all_there?` you can declare
708
+ `.expected_elements` on your page class that narrows the elements
709
+ included in `#all_there?` check to those that definitely should be present.
717
710
 
718
711
  ```ruby
719
712
  class TestPage < SitePrism::Page
@@ -748,9 +741,9 @@ for this at the moment are `:none` and `:one`
748
741
  Passing `:none` (default), will not change the functionality. However passing in `:one` will cause
749
742
  `site_prism` to recurse through all `section` / `sections` items defined in your present scope.
750
743
 
751
- Work alongside developing this functionality further is being continued in the
744
+ Work to develop this is contained in the
752
745
  [site_prism-all_there](http://www.github.com/site-prism/site_prism-all_there) repo. So head on over
753
- there if you're interested in how this feature will work going forwards
746
+ there if you're interested in this area more
754
747
 
755
748
  ### Getting the list of missing elements
756
749
 
@@ -830,15 +823,14 @@ class People < SitePrism::Section
830
823
  end
831
824
 
832
825
  class Home < SitePrism::Page
833
- # section people_with_block will have `headline` and
834
- # `footer` elements in it
826
+ # section people_with_block will have `headline` and `footer` elements in it
835
827
  section :people_with_block, People do
836
828
  element :headline, 'h2'
837
829
  end
838
830
  end
839
831
  ```
840
832
 
841
- The 3rd argument (Locators), can be omitted if you are re-using the same
833
+ The 3rd argument (Locator), can be omitted if you are re-using the same
842
834
  locator for all references to the section Class. In order to do this,
843
835
  simply tell SitePrism that you want to use default search arguments.
844
836
 
@@ -874,7 +866,7 @@ end
874
866
  # the page and section in action
875
867
 
876
868
  @home = Home.new
877
- @home.menu #=> <MenuSection...>
869
+ @home.menu #=> <Menu...>
878
870
  ```
879
871
 
880
872
  When the `menu` method is called against `@home`, an instance of `Menu`
@@ -949,7 +941,7 @@ end
949
941
  This then leads to some pretty test code ...
950
942
 
951
943
  ```ruby
952
- Then(/^the home page menu contains a link to the various search functions$/) do
944
+ Then('the home page menu contains a link to the various search functions') do
953
945
  expect(@home.menu).to have_search
954
946
  expect(@home.menu.search['href']).to include('google.com')
955
947
  expect(@home.menu).to have_images
@@ -964,7 +956,7 @@ similar to Capybara's `within` method and allows for shorter test code
964
956
  particularly with nested sections. Test code that might have to repeat the block name can be shortened up this way.
965
957
 
966
958
  ```ruby
967
- Then(/^the home page menu contains a link to the various search functions$/) do
959
+ Then('the home page menu contains a link to the various search functions') do
968
960
  @home.menu.within do |menu|
969
961
  expect(menu).to have_search
970
962
  expect(menu.search['href']).to include('google.com')
@@ -974,10 +966,12 @@ Then(/^the home page menu contains a link to the various search functions$/) do
974
966
  end
975
967
  ```
976
968
 
977
- Note that on an individual section it's possible to pass a block directly to the section without using `within`. Because the block is executed only during `Section` initialization this won't work when accessing a single Section from an array of Sections. For that reason we recommend using `within` which works in either case.
969
+ Note that on an individual section it's possible to pass a block directly to the section without using `within`.
970
+ Because the block is executed only during `Section` initialization this won't work when accessing a single
971
+ Section from an array of Sections. For that reason we recommend using `within` which works in either case.
978
972
 
979
973
  ```ruby
980
- Then(/^the home page menu contains a link to the various search functions$/) do
974
+ Then('the home page menu contains a link to the various search functions') do
981
975
  @home.menu do |menu| # possible, but prefer: `@home.menu.within`
982
976
  expect(menu).to have_search
983
977
  end
@@ -1129,26 +1123,22 @@ class Home < SitePrism::Page
1129
1123
  section :login_and_registration, LoginRegistrationForm, 'div.login-registration'
1130
1124
  end
1131
1125
 
1132
- # how to login (fatuous, but demonstrates the point):
1126
+ # Then you could log in like so ...
1133
1127
 
1134
- Then(/^I sign in$/) do
1128
+ Then('I sign in') do
1135
1129
  @home = Home.new
1136
1130
  @home.load
1137
- expect(@home).to have_login_and_registration
1138
- expect(@home.login_and_registration).to have_username
1139
- @home.login_and_registration.login.username.set 'bob'
1140
- @home.login_and_registration.login.password.set 'p4ssw0rd'
1131
+ @home.login_and_registration.login.username.send_keys('bob')
1132
+ @home.login_and_registration.login.password.send_keys('p4ssw0rd')
1141
1133
  @home.login_and_registration.login.sign_in.click
1142
1134
  end
1143
1135
 
1144
- # how to sign up:
1136
+ # And you could sign up like so ...
1145
1137
 
1146
- When(/^I enter my name into the home page's registration form$/) do
1138
+ When('I sign up') do
1147
1139
  @home = Home.new
1148
1140
  @home.load
1149
- expect(@home.login_and_registration).to have_first_name
1150
- expect(@home.login_and_registration).to have_last_name
1151
- @home.login_and_registration.first_name.set 'Bob'
1141
+ @home.login_and_registration.first_name.send_keys('Bob')
1152
1142
  # ...
1153
1143
  end
1154
1144
  ```
@@ -1188,7 +1178,7 @@ can be called in a page or a section.
1188
1178
 
1189
1179
  The only difference between `section` and `sections` is that whereas the
1190
1180
  first returns an instance of the supplied section class, the second
1191
- returns an array containing as many instances of the section class as
1181
+ returns a `Capybara::Result` containing as many instances of the section class as
1192
1182
  there are capybara elements found by the supplied css selector. This is
1193
1183
  better explained in the following example ...
1194
1184
 
@@ -1220,7 +1210,7 @@ end
1220
1210
  This allows for pretty tests ...
1221
1211
 
1222
1212
  ```ruby
1223
- Then(/^there are lots of search_results$/) do
1213
+ Then('there are lots of search_results') do
1224
1214
  expect(@results_page.search_results.size).to eq(10)
1225
1215
 
1226
1216
  @home.search_results.each do |result|
@@ -1235,12 +1225,14 @@ The css selector that is passed as the 3rd argument to the
1235
1225
  elements. Each capybara element found using the css selector is used to
1236
1226
  create a new instance of `SearchResults` and becomes its root
1237
1227
  element. So if the css selector finds 3 `li` elements, calling
1238
- `search_results` will return an array containing 3 instances of
1228
+ `search_results` will return a `Capybara::Result` containing 3 instances of
1239
1229
  `SearchResults`, each with one of the `li` elements as it's root element.
1240
1230
 
1241
1231
  ##### Accessing Within a Collection of Sections
1242
1232
 
1243
- When using an iterator such as `each` to pass a block through to a collection of sections it is possible to skip using `within`. However some caution is warranted when accessing the Sections directly from an array, as the block can only be executed when the section is being initialized. The following does not work:
1233
+ When using an iterator such as `each` to pass a block through to a collection of sections it is
1234
+ possible to skip using `within`. However some caution is warranted when accessing the
1235
+ Sections directly from an array, as the block can only be executed when the section is being initialized. The following does not work:
1244
1236
 
1245
1237
  ```rb
1246
1238
  @home.search_results.first do |result|
@@ -1304,7 +1296,7 @@ Here's how to test for the existence of the section:
1304
1296
  This allows for some pretty tests ...
1305
1297
 
1306
1298
  ```ruby
1307
- Then(/^there are search results on the page$/) do
1299
+ Then('there are search results on the page') do
1308
1300
  expect(@home).to have_search_results
1309
1301
  end
1310
1302
  ```
@@ -1443,8 +1435,8 @@ The error message is ignored unless the boolean value is evaluated as falsey.
1443
1435
 
1444
1436
  ```ruby
1445
1437
  class SomePage < SitePrism::Page
1446
- element :foo_element, '.foo'
1447
- load_validation { [has_foo_element?, 'did not have foo element!'] }
1438
+ element :foo, '.foo'
1439
+ load_validation { [has_foo?, 'did not have foo element!'] }
1448
1440
  end
1449
1441
  ```
1450
1442
 
@@ -1490,8 +1482,8 @@ class FooPage < BasePage
1490
1482
  section :form, '#form'
1491
1483
  element :some_other_element, '.myelement'
1492
1484
 
1493
- load_validation { [has_form?, 'form did not appear'] }
1494
- load_validation { [has_some_other_element?, 'some other element did not appear'] }
1485
+ load_validation { [has_form?(wait: 5), 'form did not appear'] }
1486
+ load_validation { [has_some_other_element?(wait: 5), 'some other element did not appear'] }
1495
1487
  end
1496
1488
  ```
1497
1489
 
@@ -1502,12 +1494,6 @@ the validations will be performed in the following order:
1502
1494
  2. The `FooPage` validation will wait for the `form` element to be present.
1503
1495
  3. The `FooPage` validation will wait for the `some_other_element` element to be present.
1504
1496
 
1505
- **NB:** `SitePrism::Page` **used to** include a default load validation on
1506
- `page.displayed?` however for v3 this has been removed. It is therefore
1507
- necessary to re-define this if you want to retain the behaviour
1508
- from site_prism v2. See [UPGRADING.md](https://github.com/site-prism/site_prism/blob/main/UPGRADING.md#default-load-validations)
1509
- for more info on this.
1510
-
1511
1497
  ## Using Capybara Query Options
1512
1498
 
1513
1499
  When querying an element, section or a collection of elements or sections,
@@ -1535,7 +1521,7 @@ fail if the page has not finished loading the section(s):
1535
1521
  ```ruby
1536
1522
  @home = Home.new
1537
1523
  # ...
1538
- expect(@home.search_results.size).to == 25 # This may fail!
1524
+ expect(@home.search_results.size).to eq(25) # This may fail!
1539
1525
  ```
1540
1526
 
1541
1527
  The above query can be rewritten to utilize the Capybara `:count` option
@@ -1546,16 +1532,16 @@ the page within the timeout:
1546
1532
 
1547
1533
  ```ruby
1548
1534
  @home = Home.new
1549
- @home.has_search_results?(count: 25)
1535
+ @home.has_search_results?(count: 25) # will wait default wait time
1550
1536
  # OR
1551
- @home.search_results(count: 25)
1537
+ @home.search_results(count: 25, wait: 5) # will wait 5 seconds
1552
1538
  ```
1553
1539
 
1554
1540
  Now we can write pretty, non-failing tests without hard coding these options
1555
1541
  into our page and section classes:
1556
1542
 
1557
1543
  ```ruby
1558
- Then(/^there are search results on the page$/) do
1544
+ Then('there are search results on the page') do
1559
1545
  expect(@results_page).to have_search_results(count: 25)
1560
1546
  end
1561
1547
  ```
@@ -1586,7 +1572,7 @@ The following element methods allow Capybara options to be passed as arguments t
1586
1572
  ## Test views with Page objects
1587
1573
 
1588
1574
  It's possible to use the same page objects of integration tests for view tests, too,
1589
- just pass the rendered HTML to the ```load``` method:
1575
+ just pass the rendered HTML to the `load` method:
1590
1576
 
1591
1577
  ```ruby
1592
1578
  require 'spec_helper'
@@ -1688,14 +1674,14 @@ class Home < SitePrism::Page
1688
1674
  end
1689
1675
 
1690
1676
  # cucumber step that performs login
1691
- When(/^I log in$/) do
1677
+ When('I log in') do
1692
1678
  @home = Home.new
1693
1679
  @home.load
1694
1680
 
1695
1681
  @home.login_frame do |frame|
1696
1682
  #`frame` is an instance of the `LoginFrame` class
1697
- frame.username.set 'admin'
1698
- frame.password.set 'p4ssword'
1683
+ frame.username.send_keys('admin')
1684
+ frame.password.send_keys('p4ssword')
1699
1685
  end
1700
1686
  end
1701
1687
  ```
@@ -1738,14 +1724,6 @@ Capybara.using_wait_time(20) do
1738
1724
  end
1739
1725
  ```
1740
1726
 
1741
- ## Using SitePrism with VCR
1742
-
1743
- There's a SitePrism plugin called `site_prism.vcr` that lets you use
1744
- SitePrism with the VCR gem. Check it out [HERE](https://github.com/dnesteryuk/site_prism.vcr)
1745
-
1746
- Note that as of 2016 this plugin doesn't appear to have been under active development. Also it is
1747
- still pinned to the `2.x` series of site_prism so use it of your own accord.
1748
-
1749
1727
  # Epilogue
1750
1728
 
1751
1729
  So, we've seen how to use SitePrism to put together page objects made up
@@ -1756,7 +1734,7 @@ all over the place. Here's an example of this common problem:
1756
1734
  ```ruby
1757
1735
  @home = Home.new # <-- noise
1758
1736
  @home.load
1759
- @home.search_field.set 'Sausages'
1737
+ @home.search_field.send_keys('Sausages')
1760
1738
  @home.search_field.search_button.click
1761
1739
  @results_page = SearchResults.new # <-- noise
1762
1740
  expect(@results_page).to have_search_result_items
@@ -1766,7 +1744,7 @@ The annoyance (and, later, maintenance nightmare) is having to create
1766
1744
  `@home` and `@results_page`. It would be better to not have to create
1767
1745
  instances of pages all over your tests.
1768
1746
 
1769
- The way I've dealt with this problem is to create a class containing
1747
+ One way you can deal with this problem is to create a class containing
1770
1748
  methods that return instances of the pages. Eg:
1771
1749
 
1772
1750
  ```ruby
@@ -1803,17 +1781,17 @@ end
1803
1781
  # and here's how to use it
1804
1782
 
1805
1783
  #first line of the test...
1806
- Given(/^I start on the home page$/) do
1784
+ Given('I start on the home page') do
1807
1785
  @app = App.new
1808
1786
  @app.home.load
1809
1787
  end
1810
1788
 
1811
- When(/^I search for Sausages$/) do
1789
+ When('I search for Sausages') do
1812
1790
  @app.home.search_field.set 'Sausages'
1813
1791
  @app.home.search_button.click
1814
1792
  end
1815
1793
 
1816
- Then(/^I am on the results page$/) do
1794
+ Then('I am on the results page') do
1817
1795
  expect(@app.results_page).to be_displayed
1818
1796
  end
1819
1797
 
@@ -1823,8 +1801,8 @@ end
1823
1801
  The only thing that needs instantiating is the `App` class - from then on
1824
1802
  pages don't need to be initialized, they are now returned by methods on `@app`.
1825
1803
 
1826
- It is possible to further optimise this, by using Cucumber/RSpec hooks, amongst
1827
- other things. However the investigation and optimisation of this (and other
1804
+ It is possible to further optimise this, by using Cucumber/RSpec hooks, memoization as well
1805
+ as many other things. However the investigation and optimisation of this (and other
1828
1806
  aspects of SitePrism), is left as an exercise to the Reader.
1829
1807
 
1830
1808
  Happy testing from all of the SitePrism team!
@@ -15,7 +15,7 @@ module SitePrism
15
15
  warn("#{old} is being deprecated and should no longer be used.")
16
16
  end
17
17
 
18
- warn("#{old} will be removed in SitePrism v4. You have been warned!")
18
+ warn("#{old} will be removed in SitePrism v5. You have been warned!")
19
19
  end
20
20
 
21
21
  # @return SitePrism.logger.debug(msg)
@@ -16,7 +16,7 @@ module SitePrism
16
16
 
17
17
  private
18
18
 
19
- def raise_if_block(object, name, has_block, type)
19
+ def raise_if_runtime_block_supplied(object, name, has_block, type)
20
20
  return unless has_block
21
21
 
22
22
  SitePrism.logger.debug("Type passed in: #{type}")
@@ -24,25 +24,21 @@ module SitePrism
24
24
  raise SitePrism::UnsupportedBlockError
25
25
  end
26
26
 
27
- # Call `find` inside `to_capybara_node` context (Either Capybara::Session or Capybara::Node::Element)
28
27
  def _find(*find_args)
29
28
  kwargs = find_args.pop
30
29
  to_capybara_node.find(*find_args, **kwargs)
31
30
  end
32
31
 
33
- # Call `all` inside `to_capybara_node` context (Either Capybara::Session or Capybara::Node::Element)
34
32
  def _all(*find_args)
35
33
  kwargs = find_args.pop
36
34
  to_capybara_node.all(*find_args, **kwargs)
37
35
  end
38
36
 
39
- # Call `has_selector?` inside `to_capybara_node` context (Either Capybara::Session or Capybara::Node::Element)
40
37
  def element_exists?(*find_args)
41
38
  kwargs = find_args.pop
42
39
  to_capybara_node.has_selector?(*find_args, **kwargs)
43
40
  end
44
41
 
45
- # Call `has_no_selector?` inside `to_capybara_node` context (Either Capybara::Session or Capybara::Node::Element)
46
42
  def element_does_not_exist?(*find_args)
47
43
  kwargs = find_args.pop
48
44
  to_capybara_node.has_no_selector?(*find_args, **kwargs)
@@ -103,10 +99,10 @@ module SitePrism
103
99
  # Wait for the elements to be present or not -> @return [TrueClass, SitePrism::Error]
104
100
  # Validate certain properties about the element
105
101
  def element(name, *find_args)
106
- raise_if_block(self, name, block_given?, :element)
102
+ raise_if_build_time_block_supplied(self, name, block_given?, :element)
107
103
  build(:element, name, *find_args) do
108
104
  define_method(name) do |*runtime_args, &runtime_block|
109
- raise_if_block(self, name, runtime_block, :element)
105
+ raise_if_runtime_block_supplied(self, name, runtime_block, :element)
110
106
  _find(*merge_args(find_args, runtime_args))
111
107
  end
112
108
  end
@@ -118,10 +114,10 @@ module SitePrism
118
114
  # Wait for the elements to be present or not -> @return [TrueClass, SitePrism::Error]
119
115
  # Validate certain properties about the elements
120
116
  def elements(name, *find_args)
121
- raise_if_block(self, name, block_given?, :elements)
117
+ raise_if_build_time_block_supplied(self, name, block_given?, :elements)
122
118
  build(:elements, name, *find_args) do
123
119
  define_method(name) do |*runtime_args, &runtime_block|
124
- raise_if_block(self, name, runtime_block, :elements)
120
+ raise_if_runtime_block_supplied(self, name, runtime_block, :elements)
125
121
  _all(*merge_args(find_args, runtime_args))
126
122
  end
127
123
  end
@@ -151,7 +147,7 @@ module SitePrism
151
147
  section_class, find_args = extract_section_options(args, &block)
152
148
  build(:sections, name, *find_args) do
153
149
  define_method(name) do |*runtime_args, &runtime_block|
154
- raise_if_block(self, name, runtime_block, :sections)
150
+ raise_if_runtime_block_supplied(self, name, runtime_block, :sections)
155
151
  _all(*merge_args(find_args, runtime_args)).map do |element|
156
152
  section_class.new(self, element)
157
153
  end
@@ -160,7 +156,7 @@ module SitePrism
160
156
  end
161
157
 
162
158
  def iframe(name, klass, *args)
163
- SitePrism.logger.debug('Block passed into iFrame construct at build time') if block_given?
159
+ raise_if_build_time_block_supplied(self, name, block_given?, :elements)
164
160
  element_find_args = deduce_iframe_element_find_args(args)
165
161
  scope_find_args = deduce_iframe_scope_find_args(args)
166
162
  build(:iframe, name, *element_find_args) do
@@ -175,10 +171,10 @@ module SitePrism
175
171
  # Return a list of all mapped items on a SitePrism class instance (Page or Section)
176
172
  # If legacy is set to true (Default) -> @return [Array]
177
173
  # If legacy is set to false (New behaviour) -> @return [Hash]
178
- def mapped_items(legacy: true)
179
- return old_mapped_items if legacy
174
+ def mapped_items(legacy: false)
175
+ return legacy_mapped_items if legacy
180
176
 
181
- new_mapped_items
177
+ @mapped_items ||= { element: [], elements: [], section: [], sections: [], iframe: [] }
182
178
  end
183
179
 
184
180
  private
@@ -192,13 +188,13 @@ module SitePrism
192
188
  map_item(type, name)
193
189
  yield
194
190
  end
195
- add_helper_methods(name, *find_args)
191
+ add_helper_methods(name, type, *find_args)
196
192
  end
197
193
 
198
- def add_helper_methods(name, *find_args)
194
+ def add_helper_methods(name, _type, *find_args)
199
195
  create_existence_checker(name, *find_args)
200
196
  create_nonexistence_checker(name, *find_args)
201
- SitePrism::RspecMatchers.new(name)._create_rspec_existence_matchers if defined?(RSpec)
197
+ SitePrism::RSpecMatchers.new(name)._create_rspec_existence_matchers if defined?(RSpec)
202
198
  create_visibility_waiter(name, *find_args)
203
199
  create_invisibility_waiter(name, *find_args)
204
200
  end
@@ -254,15 +250,15 @@ module SitePrism
254
250
  end
255
251
 
256
252
  def create_error_method(name)
257
- SitePrism.logger.error("#{name} has come from an item with no locators.")
258
- SitePrism::Deprecator.soft_deprecate(
253
+ SitePrism::Deprecator.deprecate(
259
254
  'DSL definition with no find_args',
260
- 'All DSL elements should have find_args'
255
+ 'DSL definition with at least 1 find_arg'
261
256
  )
257
+ SitePrism.logger.error("#{name} has come from an item with no locators.")
262
258
  define_method(name) { raise SitePrism::InvalidElementError }
263
259
  end
264
260
 
265
- def raise_if_block(parent_object, name, has_block, type)
261
+ def raise_if_build_time_block_supplied(parent_object, name, has_block, type)
266
262
  return unless has_block
267
263
 
268
264
  SitePrism.logger.debug("Type passed in: #{type}")
@@ -270,22 +266,17 @@ module SitePrism
270
266
  raise SitePrism::UnsupportedBlockError
271
267
  end
272
268
 
273
- def old_mapped_items
274
- SitePrism::Deprecator.soft_deprecate(
275
- '.mapped_items on a class',
276
- 'To allow easier recursion through the items in conjunction with #all_there?',
277
- '.mapped_items(legacy: false)'
269
+ def legacy_mapped_items
270
+ SitePrism::Deprecator.deprecate(
271
+ '.mapped_items structure (internally), on a class',
272
+ 'Thew new .mapped_items structure'
278
273
  )
279
- @old_mapped_items ||= []
280
- end
281
-
282
- def new_mapped_items
283
- @new_mapped_items ||= { element: [], elements: [], section: [], sections: [], iframe: [] }
274
+ @legacy_mapped_items ||= []
284
275
  end
285
276
 
286
277
  def map_item(type, name)
287
- old_mapped_items << { type => name }
288
- new_mapped_items[type] << name.to_sym
278
+ mapped_items(legacy: true) << { type => name }
279
+ mapped_items[type] << name.to_sym
289
280
  end
290
281
 
291
282
  def deduce_iframe_scope_find_args(args)
@@ -1,11 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module SitePrism
4
+ #
4
5
  # [SitePrism::ElementChecker]
5
6
  #
6
7
  # This allows users to run `#all_there?` checks on an instance.
7
8
  #
8
- # NB: This functionality is being removed in v4 in favour of the all_there gem
9
9
  module ElementChecker
10
10
  # Runnable in the scope of any SitePrism::Page or Section.
11
11
  # Returns +true+ when "every item" that is being checked is
@@ -26,13 +26,7 @@ module SitePrism
26
26
  # Override: 'one' => Perform one recursive dive into all section/sections
27
27
  # items and call #all_there? on all of those items too.
28
28
  def all_there?(recursion: :none)
29
- case recursion
30
- when :none; then elements_to_check.all? { |name| there?(name) }
31
- when :one; then SitePrism::AllThere::RecursionChecker.new(self).all_there?
32
- else
33
- SitePrism.logger.debug("Input value '#{recursion}'. Valid values are :none or :one.")
34
- SitePrism.logger.error('Invalid recursion setting, Will not run #all_there?.')
35
- end
29
+ SitePrism::AllThere::RecursionChecker.new(self).all_there?(recursion: recursion)
36
30
  end
37
31
 
38
32
  # Returns each element that is currently present inside the scope being tested
@@ -51,8 +45,6 @@ module SitePrism
51
45
 
52
46
  private
53
47
 
54
- # If the page or section has expected_items set, return expected_items that are mapped
55
- # otherwise just return the list of all mapped_items
56
48
  def elements_to_check
57
49
  if _expected_items
58
50
  SitePrism.logger.debug('Expected Items has been set.')
@@ -63,7 +55,7 @@ module SitePrism
63
55
  end
64
56
 
65
57
  def _mapped_items
66
- self.class.mapped_items(legacy: false).values.flatten.uniq
58
+ self.class.mapped_items.values.flatten.uniq
67
59
  end
68
60
 
69
61
  def _expected_items
@@ -43,10 +43,11 @@ module SitePrism
43
43
 
44
44
  # Check if the page is loaded.
45
45
  #
46
- # On failure, if an error was reported by a failing validation,
47
- # it will be available via the `load_error` accessor.
46
+ # On failure, if an error was reported by a failing validation, it will be available via the `load_error` accessor
48
47
  #
49
- # @return [Boolean] True if the page loaded successfully; otherwise false.
48
+ # It will return true if the page has been loaded successfully; otherwise it returns false
49
+ #
50
+ # @return [Boolean]
50
51
  def loaded?
51
52
  self.load_error = nil
52
53
 
@@ -57,8 +58,6 @@ module SitePrism
57
58
 
58
59
  private
59
60
 
60
- # If any load validations from page subclasses returns false,
61
- # immediately return false.
62
61
  def load_validations_pass?
63
62
  self.class.load_validations.all? do |validation|
64
63
  passed, message = instance_eval(&validation)
@@ -9,7 +9,7 @@ module SitePrism
9
9
  # through clicking buttons or filling in fields, or verbosely loaded by using the `#load` method
10
10
  #
11
11
  # All method calls made whilst on a page are scoped using `#to_capybara_node` which defaults to the
12
- # current Capybara session
12
+ # current Capybara session or the `@page` that has been loaded in-line
13
13
  class Page
14
14
  include Capybara::DSL
15
15
  include ElementChecker
@@ -48,12 +48,15 @@ module SitePrism
48
48
  #
49
49
  # @return [Capybara::Node::Simple || Capybara::Session]
50
50
  def page
51
+ SitePrism::Deprecator.deprecate('Calling #page on a SitePrism::Page instance')
51
52
  (defined?(@page) && @page) || Capybara.current_session
52
53
  end
53
54
 
54
55
  # This scopes our calls inside Page correctly to the `Capybara::Session`
56
+ #
57
+ # @return [Capybara::Node::Simple || Capybara::Session]
55
58
  def to_capybara_node
56
- page
59
+ (defined?(@page) && @page) || Capybara.current_session
57
60
  end
58
61
 
59
62
  # Loads the page.
@@ -85,12 +88,21 @@ module SitePrism
85
88
  return_yield || true
86
89
  end
87
90
 
91
+ # Returns true if the page is displayed within the requisite time
92
+ # Returns false if the page is not displayed within the requisite time
93
+ #
94
+ # @return [Boolean]
88
95
  def displayed?(*args)
89
96
  wait_until_displayed(*args)
90
97
  rescue SitePrism::TimeoutError
91
98
  false
92
99
  end
93
100
 
101
+ # Wait until the page is displayed according to input arguments
102
+ # If no url_matcher is provided we don't know how to determine if the page is displayed. So we return an error
103
+ # Then we wait until the url matches the expected mappings
104
+ #
105
+ # @return [Boolean]
94
106
  def wait_until_displayed(*args)
95
107
  raise SitePrism::NoUrlMatcherForPageError unless url_matcher
96
108
 
@@ -99,6 +111,13 @@ module SitePrism
99
111
  Waiter.wait_until_true(seconds) { url_matches?(expected_mappings) }
100
112
  end
101
113
 
114
+ # Return the matching information of a page
115
+ #
116
+ # Return nil if the page is not displayed correctly
117
+ # Return the regex matches if we have provided a regexp style url_matcher
118
+ # Otherwise fall back to an addressable-style template of matches
119
+ #
120
+ # @return [Nil || MatchData || Hash]
102
121
  def url_matches(seconds = Capybara.default_max_wait_time)
103
122
  return unless displayed?(seconds)
104
123
  return regexp_backed_matches if url_matcher.is_a?(Regexp)
@@ -106,14 +125,24 @@ module SitePrism
106
125
  template_backed_matches
107
126
  end
108
127
 
128
+ # Returns the templated url from the set_url property defined during the page definition
129
+ # Returns `nil` if there was not a property set (i.e. the page should not be directly loaded)
130
+ #
131
+ # @return [NilClass || String]
109
132
  def url(expansion = {})
110
133
  self.class.url && Addressable::Template.new(self.class.url).expand(expansion).to_s
111
134
  end
112
135
 
136
+ # Returns the url_matcher property defined during the page definition
137
+ #
138
+ # @return [Regexp]
113
139
  def url_matcher
114
140
  self.class.url_matcher
115
141
  end
116
142
 
143
+ # Returns true if the page is secure, otherwise returns false
144
+ #
145
+ # @return [Boolean]
117
146
  def secure?
118
147
  page.current_url.start_with?('https')
119
148
  end
@@ -4,13 +4,16 @@ module SitePrism
4
4
  #
5
5
  # @api private
6
6
  #
7
- class RspecMatchers
7
+ class RSpecMatchers
8
8
  attr_reader :element_name
9
9
 
10
10
  def initialize(element_name)
11
11
  @element_name = element_name
12
12
  end
13
13
 
14
+ # Create the positive and negative rspec matchers that will use the SitePrism boolean methods
15
+ #
16
+ # @return [Symbol]
14
17
  def _create_rspec_existence_matchers
15
18
  SitePrism.logger.debug('Including all relevant matcher names / warnings in RSpec scope.')
16
19
  create_rspec_existence_matchers(matcher, object_method, negated_object_method, warning)
@@ -43,8 +46,8 @@ module SitePrism
43
46
  end
44
47
 
45
48
  def warning
46
- "The RSpec matcher '#{matcher}' was added by SitePrism, but the object under test "\
47
- "does not respond to '#{negated_object_method}' and is probably not a SitePrism object. "\
49
+ "The RSpec matcher '#{matcher}' was added by SitePrism, but the object under test " \
50
+ "does not respond to '#{negated_object_method}' and is probably not a SitePrism object. " \
48
51
  'Falling back to the default RSpec matcher.'
49
52
  end
50
53
  end
@@ -72,13 +72,6 @@ module SitePrism
72
72
  Capybara.within(root_element) { yield(self) }
73
73
  end
74
74
 
75
- # This was the old API-style of delegating through the Capybara.page call and over-loading
76
- # the method so we always went through our correct `root_element`
77
- def page
78
- SitePrism.logger.fatal('This is not supposed to be used. All delegation now happens automatically!')
79
- raise SitePrism::SitePrismError
80
- end
81
-
82
75
  def capybara_session
83
76
  Capybara.current_session
84
77
  end
@@ -7,9 +7,9 @@ module SitePrism
7
7
  class Timer
8
8
  attr_reader :wait_time
9
9
 
10
- # Return &block
11
- #
12
10
  # Count towards a specified time (Supplied)
11
+ #
12
+ # @return [Proc]
13
13
  def self.run(wait_time, &block)
14
14
  new(wait_time).run(&block)
15
15
  end
@@ -19,16 +19,16 @@ module SitePrism
19
19
  @done = false
20
20
  end
21
21
 
22
- # Return Boolean
23
- #
24
22
  # Whether the timer has completed
23
+ #
24
+ # @return [Boolean]
25
25
  def done?
26
26
  @done == true
27
27
  end
28
28
 
29
- # Return &block
30
- #
31
29
  # Start the Timer and re-evaluate the block repeatedly
30
+ #
31
+ # @return [Proc]
32
32
  def run
33
33
  start
34
34
  yield self
@@ -36,9 +36,9 @@ module SitePrism
36
36
  stop
37
37
  end
38
38
 
39
- # Return [Boolean, Nil]
40
- #
41
39
  # Start the Timer in a separate process
40
+ #
41
+ # Return [True]
42
42
  def start
43
43
  stop
44
44
  return if wait_time.zero?
@@ -50,9 +50,9 @@ module SitePrism
50
50
  end
51
51
  end
52
52
 
53
- # Return True
54
- #
55
53
  # Forcibly stop the timer, and kill any threads created by it
54
+ #
55
+ # Return [True]
56
56
  def stop
57
57
  if @thread
58
58
  @thread.kill
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module SitePrism
4
- VERSION = '4.0.beta'
4
+ VERSION = '4.0'
5
5
  end
@@ -3,10 +3,10 @@
3
3
  module SitePrism
4
4
  # [SitePrism::Waiter]
5
5
  class Waiter
6
- # @return Boolean
7
- #
8
6
  # A looper that will wait until the passed in block evaluates to true
9
7
  # Alternatively it will time out once the wait_time is exceeded
8
+ #
9
+ # @return [Boolean]
10
10
  def self.wait_until_true(wait_time = Capybara.default_max_wait_time, sleep_duration = 0.05)
11
11
  Timer.run(wait_time) do |timer|
12
12
  loop do
data/lib/site_prism.rb CHANGED
@@ -16,7 +16,7 @@ module SitePrism
16
16
  autoload :Loadable, 'site_prism/loadable'
17
17
  autoload :Logger, 'site_prism/logger'
18
18
  autoload :Page, 'site_prism/page'
19
- autoload :RspecMatchers, 'site_prism/rspec_matchers'
19
+ autoload :RSpecMatchers, 'site_prism/rspec_matchers'
20
20
  autoload :Section, 'site_prism/section'
21
21
  autoload :Timer, 'site_prism/timer'
22
22
  autoload :Waiter, 'site_prism/waiter'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: site_prism
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.0.beta
4
+ version: '4.0'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Luke Hill
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2022-11-28 00:00:00.000000000 Z
12
+ date: 2023-04-19 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: addressable
@@ -17,48 +17,42 @@ dependencies:
17
17
  requirements:
18
18
  - - "~>"
19
19
  - !ruby/object:Gem::Version
20
- version: '2.6'
20
+ version: '2.8'
21
21
  type: :runtime
22
22
  prerelease: false
23
23
  version_requirements: !ruby/object:Gem::Requirement
24
24
  requirements:
25
25
  - - "~>"
26
26
  - !ruby/object:Gem::Version
27
- version: '2.6'
27
+ version: '2.8'
28
28
  - !ruby/object:Gem::Dependency
29
29
  name: capybara
30
30
  requirement: !ruby/object:Gem::Requirement
31
31
  requirements:
32
32
  - - "~>"
33
33
  - !ruby/object:Gem::Version
34
- version: '3.15'
34
+ version: '3.27'
35
35
  type: :runtime
36
36
  prerelease: false
37
37
  version_requirements: !ruby/object:Gem::Requirement
38
38
  requirements:
39
39
  - - "~>"
40
40
  - !ruby/object:Gem::Version
41
- version: '3.15'
41
+ version: '3.27'
42
42
  - !ruby/object:Gem::Dependency
43
43
  name: site_prism-all_there
44
44
  requirement: !ruby/object:Gem::Requirement
45
45
  requirements:
46
- - - ">"
47
- - !ruby/object:Gem::Version
48
- version: '1'
49
- - - "<"
46
+ - - "~>"
50
47
  - !ruby/object:Gem::Version
51
- version: '2'
48
+ version: '2.0'
52
49
  type: :runtime
53
50
  prerelease: false
54
51
  version_requirements: !ruby/object:Gem::Requirement
55
52
  requirements:
56
- - - ">"
57
- - !ruby/object:Gem::Version
58
- version: '1'
59
- - - "<"
53
+ - - "~>"
60
54
  - !ruby/object:Gem::Version
61
- version: '2'
55
+ version: '2.0'
62
56
  - !ruby/object:Gem::Dependency
63
57
  name: cucumber
64
58
  requirement: !ruby/object:Gem::Requirement
@@ -85,104 +79,104 @@ dependencies:
85
79
  requirements:
86
80
  - - "~>"
87
81
  - !ruby/object:Gem::Version
88
- version: '3.10'
82
+ version: '3.12'
89
83
  type: :development
90
84
  prerelease: false
91
85
  version_requirements: !ruby/object:Gem::Requirement
92
86
  requirements:
93
87
  - - "~>"
94
88
  - !ruby/object:Gem::Version
95
- version: '3.10'
89
+ version: '3.12'
96
90
  - !ruby/object:Gem::Dependency
97
91
  name: rubocop
98
92
  requirement: !ruby/object:Gem::Requirement
99
93
  requirements:
100
94
  - - "~>"
101
95
  - !ruby/object:Gem::Version
102
- version: 1.28.0
96
+ version: 1.49.0
103
97
  type: :development
104
98
  prerelease: false
105
99
  version_requirements: !ruby/object:Gem::Requirement
106
100
  requirements:
107
101
  - - "~>"
108
102
  - !ruby/object:Gem::Version
109
- version: 1.28.0
103
+ version: 1.49.0
110
104
  - !ruby/object:Gem::Dependency
111
105
  name: rubocop-performance
112
106
  requirement: !ruby/object:Gem::Requirement
113
107
  requirements:
114
108
  - - "~>"
115
109
  - !ruby/object:Gem::Version
116
- version: 1.13.0
110
+ version: 1.16.0
117
111
  type: :development
118
112
  prerelease: false
119
113
  version_requirements: !ruby/object:Gem::Requirement
120
114
  requirements:
121
115
  - - "~>"
122
116
  - !ruby/object:Gem::Version
123
- version: 1.13.0
117
+ version: 1.16.0
124
118
  - !ruby/object:Gem::Dependency
125
119
  name: rubocop-rspec
126
120
  requirement: !ruby/object:Gem::Requirement
127
121
  requirements:
128
122
  - - "~>"
129
123
  - !ruby/object:Gem::Version
130
- version: 2.7.0
124
+ version: 2.19.0
131
125
  type: :development
132
126
  prerelease: false
133
127
  version_requirements: !ruby/object:Gem::Requirement
134
128
  requirements:
135
129
  - - "~>"
136
130
  - !ruby/object:Gem::Version
137
- version: 2.7.0
131
+ version: 2.19.0
138
132
  - !ruby/object:Gem::Dependency
139
133
  name: selenium-webdriver
140
134
  requirement: !ruby/object:Gem::Requirement
141
135
  requirements:
142
- - - ">="
143
- - !ruby/object:Gem::Version
144
- version: '3.13'
145
- - - "<"
136
+ - - "~>"
146
137
  - !ruby/object:Gem::Version
147
- version: '5'
138
+ version: '4.0'
148
139
  type: :development
149
140
  prerelease: false
150
141
  version_requirements: !ruby/object:Gem::Requirement
151
142
  requirements:
152
- - - ">="
153
- - !ruby/object:Gem::Version
154
- version: '3.13'
155
- - - "<"
143
+ - - "~>"
156
144
  - !ruby/object:Gem::Version
157
- version: '5'
145
+ version: '4.0'
158
146
  - !ruby/object:Gem::Dependency
159
147
  name: simplecov
160
148
  requirement: !ruby/object:Gem::Requirement
161
149
  requirements:
162
150
  - - "~>"
163
151
  - !ruby/object:Gem::Version
164
- version: '0.18'
152
+ version: '0.21'
165
153
  type: :development
166
154
  prerelease: false
167
155
  version_requirements: !ruby/object:Gem::Requirement
168
156
  requirements:
169
157
  - - "~>"
170
158
  - !ruby/object:Gem::Version
171
- version: '0.18'
159
+ version: '0.21'
172
160
  - !ruby/object:Gem::Dependency
173
161
  name: webdrivers
174
162
  requirement: !ruby/object:Gem::Requirement
175
163
  requirements:
176
- - - "~>"
164
+ - - ">"
177
165
  - !ruby/object:Gem::Version
178
166
  version: '4.6'
167
+ - - "<"
168
+ - !ruby/object:Gem::Version
169
+ version: '6'
179
170
  type: :development
180
171
  prerelease: false
181
172
  version_requirements: !ruby/object:Gem::Requirement
182
173
  requirements:
183
- - - "~>"
174
+ - - ">"
184
175
  - !ruby/object:Gem::Version
185
176
  version: '4.6'
177
+ - - "<"
178
+ - !ruby/object:Gem::Version
179
+ version: '6'
186
180
  description: SitePrism gives you a simple, clean and semantic DSL for describing your
187
181
  site. SitePrism implements the Page Object Model pattern on top of Capybara.
188
182
  email:
@@ -224,12 +218,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
224
218
  requirements:
225
219
  - - ">="
226
220
  - !ruby/object:Gem::Version
227
- version: '2.5'
221
+ version: '2.6'
228
222
  required_rubygems_version: !ruby/object:Gem::Requirement
229
223
  requirements:
230
- - - ">"
224
+ - - ">="
231
225
  - !ruby/object:Gem::Version
232
- version: 1.3.1
226
+ version: '0'
233
227
  requirements: []
234
228
  rubygems_version: 3.0.3.1
235
229
  signing_key: