site_prism 2.17.1 → 3.0.beta
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/README.md +216 -391
- data/lib/site_prism.rb +2 -31
- data/lib/site_prism/addressable_url_matcher.rb +1 -1
- data/lib/site_prism/element_checker.rb +6 -6
- data/lib/site_prism/element_container.rb +19 -83
- data/lib/site_prism/error.rb +19 -22
- data/lib/site_prism/loadable.rb +3 -28
- data/lib/site_prism/page.rb +4 -4
- data/lib/site_prism/version.rb +1 -1
- data/lib/site_prism/waiter.rb +1 -1
- metadata +5 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c72504b3ebac7b0209d022bfe8851bc1cedfebfae96b1647ae5fdb043282c49e
|
4
|
+
data.tar.gz: c6432642fb9b5ec2a7a3405a5011e66c8f76c673b5eb14971a3117ef48eda3b4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 75baa0fcc7a0844bc8eda684fcb7943bf67421e30f30b8e9d200c26021f7f6d303fae4d7b43355a89784e19578916113effc5fceb1ce9a1678b5b77ce3ccff50
|
7
|
+
data.tar.gz: bf020114f3bb95a330dcfb05d056f39bb299a7135ea80c75896bda135c5dd67058fe60549a624de6dc8da91cc2ee834b759556163c40ecf33e856045cbcca72b
|
data/README.md
CHANGED
@@ -472,57 +472,18 @@ Then /^the search field exists$/ do
|
|
472
472
|
end
|
473
473
|
```
|
474
474
|
|
475
|
-
#### Waiting for an element to exist on a page
|
476
|
-
|
477
|
-
Another method added by calling `element` is the `wait_for_<element_name>` method.
|
478
|
-
Calling the method will cause the test to wait for the Capybara's
|
479
|
-
default wait time for the element to exist. It is also possible to use a
|
480
|
-
custom amount of time to wait. Using the same example as above:
|
481
|
-
|
482
|
-
```ruby
|
483
|
-
class Home < SitePrism::Page
|
484
|
-
set_url 'http://www.google.com'
|
485
|
-
|
486
|
-
element :search_field, 'input[name="q"]'
|
487
|
-
end
|
488
|
-
```
|
489
|
-
|
490
|
-
... you can wait for the search field to exist like this:
|
491
|
-
|
492
|
-
```ruby
|
493
|
-
@home = Home.new
|
494
|
-
@home.load
|
495
|
-
@home.wait_for_search_field
|
496
|
-
# or...
|
497
|
-
@home.wait_for_search_field(10) #will wait for 10 seconds for the search field to appear
|
498
|
-
```
|
499
|
-
|
500
|
-
#### Waiting for an element to not exist on a page
|
501
|
-
|
502
|
-
Another method added by calling `element` is the `wait_for_no_<element_name>` method.
|
503
|
-
Calling the method will cause the test to wait for the Capybara's
|
504
|
-
default wait time for the element to not exist. It is also possible to use a
|
505
|
-
custom amount of time to wait. Using the same example as above:
|
506
|
-
|
507
|
-
```ruby
|
508
|
-
@home.wait_for_no_search_field
|
509
|
-
# or...
|
510
|
-
@home.wait_for_no_search_field(10) #will wait for 10 seconds for the search field to disappear
|
511
|
-
```
|
512
|
-
|
513
475
|
#### Waiting for an element to become visible
|
514
476
|
|
515
|
-
|
477
|
+
A method that gets added by calling `element` is the
|
516
478
|
`wait_until_<element_name>_visible` method. Calling this method will
|
517
479
|
cause the test to wait for Capybara's default wait time for the element
|
518
|
-
to become visible
|
519
|
-
|
520
|
-
example:
|
480
|
+
to become visible. You can customise the wait time by supplying a number
|
481
|
+
of seconds to wait in-line or configuring the default wait time.
|
521
482
|
|
522
483
|
```ruby
|
523
484
|
@home.wait_until_search_field_visible
|
524
485
|
# or...
|
525
|
-
@home.wait_until_search_field_visible(10)
|
486
|
+
@home.wait_until_search_field_visible(wait: 10)
|
526
487
|
```
|
527
488
|
|
528
489
|
#### Waiting for an element to become invisible
|
@@ -530,27 +491,29 @@ example:
|
|
530
491
|
Another method added by calling `element` is the
|
531
492
|
`wait_until_<element_name>_invisible` method. Calling this method will
|
532
493
|
cause the test to wait for Capybara's default wait time for the element
|
533
|
-
to become invisible. You can
|
534
|
-
|
494
|
+
to become invisible. You can as with the visibility waiter, customise
|
495
|
+
the wait time in the same way.
|
535
496
|
|
536
497
|
```ruby
|
537
498
|
@home.wait_until_search_field_invisible
|
538
499
|
# or...
|
539
|
-
@home.wait_until_search_field_invisible(10)
|
500
|
+
@home.wait_until_search_field_invisible(wait: 10)
|
540
501
|
```
|
541
502
|
|
542
503
|
#### CSS Selectors vs. XPath Expressions
|
543
504
|
|
544
505
|
While the above examples all use CSS selectors to find elements, it is
|
545
506
|
possible to use XPath expressions too. In SitePrism, everywhere that you
|
546
|
-
can use a CSS selector, you can use an XPath expression.
|
507
|
+
can use a CSS selector, you can use an XPath expression.
|
508
|
+
|
509
|
+
An example:
|
547
510
|
|
548
511
|
```ruby
|
549
512
|
class Home < SitePrism::Page
|
550
|
-
# CSS Selector
|
513
|
+
# CSS Selector
|
551
514
|
element :first_name, 'div#signup input[name="first-name"]'
|
552
515
|
|
553
|
-
#
|
516
|
+
# Identical selector as an XPath expression
|
554
517
|
element :first_name, :xpath, '//div[@id="signup"]//input[@name="first-name"]'
|
555
518
|
end
|
556
519
|
```
|
@@ -565,17 +528,14 @@ class Home < SitePrism::Page
|
|
565
528
|
end
|
566
529
|
```
|
567
530
|
|
568
|
-
|
531
|
+
Then the following methods are available:
|
569
532
|
|
570
533
|
```ruby
|
571
534
|
@home.search_field
|
572
535
|
@home.has_search_field?
|
573
536
|
@home.has_no_search_field?
|
574
|
-
@home.wait_for_search_field
|
575
|
-
@home.wait_for_no_search_field
|
576
537
|
@home.wait_until_search_field_visible
|
577
538
|
@home.wait_until_search_field_invisible
|
578
|
-
|
579
539
|
```
|
580
540
|
|
581
541
|
### Element Collections
|
@@ -593,7 +553,7 @@ end
|
|
593
553
|
|
594
554
|
Just like the `element` method, the `elements` method takes 2 arguments:
|
595
555
|
the first being the name of the elements as a symbol, the second is the
|
596
|
-
css selector that would return
|
556
|
+
css selector (Or locator strategy), that would return capybara elements.
|
597
557
|
|
598
558
|
#### Accessing the elements
|
599
559
|
|
@@ -624,7 +584,7 @@ arrays:
|
|
624
584
|
@friends_page.names.map { |name| name.text }
|
625
585
|
```
|
626
586
|
|
627
|
-
Or even run some tests...
|
587
|
+
Or even run some tests ...
|
628
588
|
|
629
589
|
```ruby
|
630
590
|
expect(@friends_page.names.map { |name| name.text }).to eq(['Alice', 'Bob', 'Fred'])
|
@@ -646,60 +606,23 @@ class Friends < SitePrism::Page
|
|
646
606
|
end
|
647
607
|
```
|
648
608
|
|
649
|
-
|
609
|
+
Then the following method is available:
|
650
610
|
|
651
611
|
```ruby
|
652
612
|
@friends_page.has_names? #=> returns true if at least one element is found using the relevant selector
|
653
613
|
```
|
654
614
|
|
655
|
-
|
615
|
+
This in turn allows the following nice test code
|
656
616
|
|
657
617
|
```ruby
|
658
618
|
Then /^there should be some names listed on the page$/ do
|
659
|
-
expect(@friends_page).to have_names
|
660
|
-
end
|
661
|
-
```
|
662
|
-
|
663
|
-
#### Waiting for the element collection
|
664
|
-
|
665
|
-
Just like for an individual element, the tests can be told to wait for
|
666
|
-
the existence or non-existence of the element collection. The `elements`
|
667
|
-
method adds `wait_for_<element collection name>` and
|
668
|
-
`wait_for_no_<element collection name>` methods that will wait for
|
669
|
-
Capybara's default wait time until at least 1 element is found that
|
670
|
-
matches the selector, or no elements are found that match the selector,
|
671
|
-
respectively. For example, with the following page:
|
672
|
-
|
673
|
-
```ruby
|
674
|
-
class Friends < SitePrism::Page
|
675
|
-
elements :names, 'ul#names li a'
|
619
|
+
expect(@friends_page).to have_names #=> This only passes if there is at least one `name`
|
676
620
|
end
|
677
|
-
|
678
|
-
```
|
679
|
-
|
680
|
-
You can also wait for the existence of a list of names like this:
|
681
|
-
|
682
|
-
```ruby
|
683
|
-
@friends_page.wait_for_names
|
684
|
-
```
|
685
|
-
|
686
|
-
or wait for the non-existence of a list of names like this:
|
687
|
-
|
688
|
-
```ruby
|
689
|
-
@friends_page.wait_for_no_names
|
690
|
-
```
|
691
|
-
|
692
|
-
Again, you can customise the wait time by supplying a number of seconds
|
693
|
-
to wait for:
|
694
|
-
|
695
|
-
```ruby
|
696
|
-
@friends_page.wait_for_names(10)
|
697
|
-
@friends_page.wait_for_no_names(10)
|
698
621
|
```
|
699
622
|
|
700
623
|
#### Waiting for the elements to be visible or invisible
|
701
624
|
|
702
|
-
Like
|
625
|
+
Like an individual element, calling the `elements` method will create
|
703
626
|
two methods: `wait_until_<elements_name>_visible` and
|
704
627
|
`wait_until_<elements_name>_invisible`. Calling these methods will cause
|
705
628
|
your test to wait for the elements to become visible or invisible. Using
|
@@ -715,9 +638,9 @@ It is possible to wait for a specific amount of time instead of using
|
|
715
638
|
the default Capybara wait time:
|
716
639
|
|
717
640
|
```ruby
|
718
|
-
@friends_page.wait_until_names_visible(5)
|
641
|
+
@friends_page.wait_until_names_visible(wait: 5)
|
719
642
|
# and...
|
720
|
-
@friends_page.wait_until_names_invisible(7)
|
643
|
+
@friends_page.wait_until_names_invisible(wait: 7)
|
721
644
|
```
|
722
645
|
|
723
646
|
### Checking that all mapped elements are present on the page
|
@@ -738,7 +661,11 @@ Then /^the friends page contains all the expected elements$/ do
|
|
738
661
|
end
|
739
662
|
```
|
740
663
|
|
741
|
-
You may wish to have elements declared in a page object class that are not
|
664
|
+
You may wish to have elements declared in a page object class that are not
|
665
|
+
always guaranteed to be present (success or error messages, etc.).
|
666
|
+
If you'd still like to test such a page with `all_there?` you can declare
|
667
|
+
`expected_elements` on your page object class that narrows the elements
|
668
|
+
included in `all_there?` check to those that definitely should be present.
|
742
669
|
|
743
670
|
```ruby
|
744
671
|
class TestPage < SitePrism::Page
|
@@ -784,7 +711,7 @@ A section is similar to a page in that it inherits from a SitePrism
|
|
784
711
|
class:
|
785
712
|
|
786
713
|
```ruby
|
787
|
-
class
|
714
|
+
class Menu < SitePrism::Section
|
788
715
|
end
|
789
716
|
```
|
790
717
|
|
@@ -793,11 +720,11 @@ At the moment, this section does nothing.
|
|
793
720
|
#### Adding a section to a page
|
794
721
|
|
795
722
|
Pages include sections that's how SitePrism works. Here's a page that
|
796
|
-
includes the above `
|
723
|
+
includes the above `Menu` section:
|
797
724
|
|
798
725
|
```ruby
|
799
726
|
class Home < SitePrism::Page
|
800
|
-
section :menu,
|
727
|
+
section :menu, Menu, '#gbx3'
|
801
728
|
end
|
802
729
|
```
|
803
730
|
|
@@ -815,14 +742,14 @@ to have some handy constructs like the one below
|
|
815
742
|
|
816
743
|
```ruby
|
817
744
|
class People < SitePrism::Section
|
818
|
-
element :
|
745
|
+
element :footer, 'h4'
|
819
746
|
end
|
820
747
|
|
821
748
|
class HomePage < SitePrism::Page
|
822
|
-
# section people_with_block will have headline and
|
823
|
-
#
|
749
|
+
# section people_with_block will have `headline` and
|
750
|
+
# `footer` elements in it
|
824
751
|
section :people_with_block, People do
|
825
|
-
element :
|
752
|
+
element :headline, 'h2'
|
826
753
|
end
|
827
754
|
end
|
828
755
|
```
|
@@ -841,7 +768,7 @@ class Home < SitePrism::Page
|
|
841
768
|
end
|
842
769
|
```
|
843
770
|
|
844
|
-
#### Accessing a
|
771
|
+
#### Accessing a Page's section
|
845
772
|
|
846
773
|
The `section` method (like the `element` method) adds a few methods to
|
847
774
|
the page or section class it was called against. The first method that
|
@@ -851,13 +778,13 @@ being the first argument to the `section` method. Here's an example:
|
|
851
778
|
```ruby
|
852
779
|
# the section
|
853
780
|
|
854
|
-
class
|
781
|
+
class Menu < SitePrism::Section
|
855
782
|
end
|
856
783
|
|
857
784
|
# the page that includes the section
|
858
785
|
|
859
786
|
class Home < SitePrism::Page
|
860
|
-
section :menu,
|
787
|
+
section :menu, Menu, '#gbx3'
|
861
788
|
end
|
862
789
|
|
863
790
|
# the page and section in action
|
@@ -866,11 +793,11 @@ end
|
|
866
793
|
@home.menu #=> <MenuSection...>
|
867
794
|
```
|
868
795
|
|
869
|
-
When the `menu` method is called against `@home`, an instance of
|
870
|
-
|
871
|
-
|
872
|
-
|
873
|
-
|
796
|
+
When the `menu` method is called against `@home`, an instance of `Menu`
|
797
|
+
(the second argument to the `section` method) is returned. The third
|
798
|
+
argument that is passed to the `section` method is the locator that
|
799
|
+
will be used to find the root element of the section; this root node
|
800
|
+
becomes the 'scope' of the section.
|
874
801
|
|
875
802
|
The following shows that though the same section can appear on multiple
|
876
803
|
pages, it can take a different root node:
|
@@ -878,46 +805,46 @@ pages, it can take a different root node:
|
|
878
805
|
```ruby
|
879
806
|
# define the section that appears on both pages
|
880
807
|
|
881
|
-
class
|
808
|
+
class Menu < SitePrism::Section
|
882
809
|
end
|
883
810
|
|
884
811
|
# define 2 pages, each containing the same section
|
885
812
|
|
886
813
|
class Home < SitePrism::Page
|
887
|
-
section :menu,
|
814
|
+
section :menu, Menu, '#gbx3'
|
888
815
|
end
|
889
816
|
|
890
817
|
class SearchResults < SitePrism::Page
|
891
|
-
section :menu,
|
818
|
+
section :menu, Menu, '#gbx48'
|
892
819
|
end
|
893
820
|
```
|
894
821
|
|
895
|
-
You can see that the `
|
822
|
+
You can see that the `Menu` is used in both the `Home` and
|
896
823
|
`SearchResults` pages, but each has slightly different root node. The
|
897
824
|
capybara element that is found by the css selector becomes the root node
|
898
|
-
for the relevant page's instance of the `
|
825
|
+
for the relevant page's instance of the `Menu` section.
|
899
826
|
|
900
827
|
#### Adding elements to a section
|
901
828
|
|
902
829
|
This works just the same as adding elements to a page:
|
903
830
|
|
904
831
|
```ruby
|
905
|
-
class
|
832
|
+
class Menu < SitePrism::Section
|
906
833
|
element :search, 'a.search'
|
907
834
|
element :images, 'a.image-search'
|
908
835
|
element :maps, 'a.map-search'
|
909
836
|
end
|
910
837
|
```
|
911
838
|
|
912
|
-
Note that the
|
839
|
+
Note that the locators used to find elements are searched for
|
913
840
|
within the scope of the root element of that section. The search for the
|
914
841
|
element won't be page-wide but it will only look in the section.
|
915
842
|
|
916
|
-
When the section is added to a page...
|
843
|
+
When the section is added to a page ...
|
917
844
|
|
918
845
|
```ruby
|
919
846
|
class Home < SitePrism::Page
|
920
|
-
section :menu,
|
847
|
+
section :menu, Menu, '#gbx3'
|
921
848
|
end
|
922
849
|
```
|
923
850
|
|
@@ -935,7 +862,7 @@ end
|
|
935
862
|
|
936
863
|
```
|
937
864
|
|
938
|
-
|
865
|
+
This then leads to some pretty test code ...
|
939
866
|
|
940
867
|
```ruby
|
941
868
|
Then /^the home page menu contains a link to the various search functions$/ do
|
@@ -948,8 +875,10 @@ end
|
|
948
875
|
|
949
876
|
##### Accessing section elements using a block
|
950
877
|
|
951
|
-
|
952
|
-
|
878
|
+
A Section can be scoped so it is only accessible inside a block. This is
|
879
|
+
similar to Capybara's `within` method and allows for shorter test code
|
880
|
+
particularly with nested sections. Some of this test code can be
|
881
|
+
made a little prettier by simply passing a block in.
|
953
882
|
|
954
883
|
```ruby
|
955
884
|
Then /^the home page menu contains a link to the various search functions$/ do
|
@@ -988,7 +917,7 @@ Then calling `#parent` will return the following:
|
|
988
917
|
@my_page.load
|
989
918
|
|
990
919
|
@my_page.my_section.parent #=> returns @my_page
|
991
|
-
@my_page.my_section.my_subsection.parent #=> returns @my_section
|
920
|
+
@my_page.my_section.my_subsection.parent #=> returns @my_page.my_section
|
992
921
|
```
|
993
922
|
|
994
923
|
#### Getting a section's parent page
|
@@ -997,14 +926,14 @@ It is possible to ask a section for the page that it belongs to. For example,
|
|
997
926
|
given the following setup:
|
998
927
|
|
999
928
|
```ruby
|
1000
|
-
class
|
929
|
+
class Menu < SitePrism::Section
|
1001
930
|
element :search, 'a.search'
|
1002
931
|
element :images, 'a.image-search'
|
1003
932
|
element :maps, 'a.map-search'
|
1004
933
|
end
|
1005
934
|
|
1006
935
|
class Home < SitePrism::Page
|
1007
|
-
section :menu,
|
936
|
+
section :menu, Menu, '#gbx3'
|
1008
937
|
end
|
1009
938
|
```
|
1010
939
|
|
@@ -1024,14 +953,14 @@ to the page or section it's been added to - same idea as what the
|
|
1024
953
|
`has_<element name>?` method. Given the following setup:
|
1025
954
|
|
1026
955
|
```ruby
|
1027
|
-
class
|
956
|
+
class Menu < SitePrism::Section
|
1028
957
|
element :search, 'a.search'
|
1029
958
|
element :images, 'a.image-search'
|
1030
959
|
element :maps, 'a.map-search'
|
1031
960
|
end
|
1032
961
|
|
1033
962
|
class Home < SitePrism::Page
|
1034
|
-
section :menu,
|
963
|
+
section :menu, Menu, '#gbx3'
|
1035
964
|
end
|
1036
965
|
```
|
1037
966
|
|
@@ -1050,41 +979,6 @@ expect(@home).to have_menu
|
|
1050
979
|
expect(@home).not_to have_menu
|
1051
980
|
```
|
1052
981
|
|
1053
|
-
#### Waiting for a section to exist
|
1054
|
-
|
1055
|
-
Additional methods added to the page or section by the `section` method are
|
1056
|
-
`wait_for_<section name>` and `wait_for_no_<section name>`. Similar to what
|
1057
|
-
`element` does, these methods wait for the section to appear or disappear,
|
1058
|
-
respectively - the test will wait up to capybara's
|
1059
|
-
default wait time until the `root_element` of the section exists or does
|
1060
|
-
not exist on the page/section that our section was added to. Given the following setup:
|
1061
|
-
|
1062
|
-
```ruby
|
1063
|
-
class MenuSection < SitePrism::Section
|
1064
|
-
element :search, 'a.search'
|
1065
|
-
element :images, 'a.image-search'
|
1066
|
-
element :maps, 'a.map-search'
|
1067
|
-
end
|
1068
|
-
|
1069
|
-
class Home < SitePrism::Page
|
1070
|
-
section :menu, MenuSection, '#gbx3'
|
1071
|
-
end
|
1072
|
-
```
|
1073
|
-
|
1074
|
-
... we can wait for the menu section to appear on the page like this:
|
1075
|
-
|
1076
|
-
```ruby
|
1077
|
-
@home.wait_for_menu
|
1078
|
-
@home.wait_for_menu(10) # waits for 10 seconds instead of capybara's default timeout
|
1079
|
-
```
|
1080
|
-
|
1081
|
-
... and we can wait for the menu section to disappear on the page like this:
|
1082
|
-
|
1083
|
-
```ruby
|
1084
|
-
@home.wait_for_no_menu
|
1085
|
-
@home.wait_for_no_menu(10) # waits for 10 seconds instead of capybara's default timeout
|
1086
|
-
```
|
1087
|
-
|
1088
982
|
#### Waiting for a section to become visible or invisible
|
1089
983
|
|
1090
984
|
Like an element, it is possible to wait for a section to become visible
|
@@ -1106,9 +1000,9 @@ time to wait for visibility/invisibility of a section. Here's how:
|
|
1106
1000
|
|
1107
1001
|
```ruby
|
1108
1002
|
@home = Home.new
|
1109
|
-
@home.wait_until_menu_visible(5)
|
1003
|
+
@home.wait_until_menu_visible(wait: 5)
|
1110
1004
|
# and...
|
1111
|
-
@home.wait_until_menu_invisible(3)
|
1005
|
+
@home.wait_until_menu_invisible(wait: 3)
|
1112
1006
|
```
|
1113
1007
|
|
1114
1008
|
#### Sections within sections
|
@@ -1118,7 +1012,8 @@ sections within sections within sections within sections!
|
|
1118
1012
|
|
1119
1013
|
```ruby
|
1120
1014
|
|
1121
|
-
# define a page that contains an area that contains a section for both
|
1015
|
+
# define a page that contains an area that contains a section for both
|
1016
|
+
# logging in and registration. Modelling each of the sub-sections separately
|
1122
1017
|
|
1123
1018
|
class Login < SitePrism::Section
|
1124
1019
|
element :username, '#username'
|
@@ -1146,7 +1041,6 @@ end
|
|
1146
1041
|
Then /^I sign in$/ do
|
1147
1042
|
@home = Home.new
|
1148
1043
|
@home.load
|
1149
|
-
@home.wait_for_login_and_registration
|
1150
1044
|
expect(@home).to have_login_and_registration
|
1151
1045
|
expect(@home.login_and_registration).to have_username
|
1152
1046
|
@home.login_and_registration.login.username.set 'bob'
|
@@ -1203,41 +1097,42 @@ The only difference between `section` and `sections` is that whereas the
|
|
1203
1097
|
first returns an instance of the supplied section class, the second
|
1204
1098
|
returns an array containing as many instances of the section class as
|
1205
1099
|
there are capybara elements found by the supplied css selector. This is
|
1206
|
-
better explained in
|
1100
|
+
better explained in the following example ...
|
1207
1101
|
|
1208
1102
|
#### Adding a Section collection to a page (or other section)
|
1209
1103
|
|
1210
1104
|
Given the following setup:
|
1211
1105
|
|
1212
1106
|
```ruby
|
1213
|
-
class
|
1107
|
+
class SearchResults < SitePrism::Section
|
1214
1108
|
element :title, 'a.title'
|
1215
|
-
element :blurb, 'span.result-
|
1109
|
+
element :blurb, 'span.result-description'
|
1216
1110
|
end
|
1217
1111
|
|
1218
|
-
class
|
1219
|
-
sections :search_results,
|
1112
|
+
class Home < SitePrism::Page
|
1113
|
+
sections :search_results, SearchResults, '#results li'
|
1220
1114
|
end
|
1221
1115
|
```
|
1222
1116
|
|
1223
|
-
|
1117
|
+
It is possible to access each of the search results:
|
1224
1118
|
|
1225
1119
|
```ruby
|
1226
|
-
@
|
1120
|
+
@home = Home.new
|
1227
1121
|
# ...
|
1228
|
-
@
|
1229
|
-
puts
|
1122
|
+
@home.search_results.each do |result|
|
1123
|
+
puts result.title.text
|
1230
1124
|
end
|
1231
1125
|
```
|
1232
1126
|
|
1233
|
-
|
1127
|
+
This allows for pretty tests ...
|
1234
1128
|
|
1235
1129
|
```ruby
|
1236
1130
|
Then /^there are lots of search_results$/ do
|
1237
|
-
expect(@results_page.search_results.size).to eq
|
1238
|
-
|
1239
|
-
|
1240
|
-
expect(
|
1131
|
+
expect(@results_page.search_results.size).to eq(10)
|
1132
|
+
|
1133
|
+
@home.search_results.each do |result|
|
1134
|
+
expect(result).to have_title
|
1135
|
+
expect(result.blurb.text).not_to be_empty
|
1241
1136
|
end
|
1242
1137
|
end
|
1243
1138
|
```
|
@@ -1245,11 +1140,10 @@ end
|
|
1245
1140
|
The css selector that is passed as the 3rd argument to the
|
1246
1141
|
`sections` method ("#results li") is used to find a number of capybara
|
1247
1142
|
elements. Each capybara element found using the css selector is used to
|
1248
|
-
create a new instance of
|
1143
|
+
create a new instance of `SearchResults` and becomes its root
|
1249
1144
|
element. So if the css selector finds 3 `li` elements, calling
|
1250
1145
|
`search_results` will return an array containing 3 instances of
|
1251
|
-
`
|
1252
|
-
element.
|
1146
|
+
`SearchResults`, each with one of the `li` elements as it's root element.
|
1253
1147
|
|
1254
1148
|
#### Anonymous Section Collections
|
1255
1149
|
|
@@ -1257,10 +1151,10 @@ You can define collections of anonymous sections the same way you would
|
|
1257
1151
|
define a single anonymous section:
|
1258
1152
|
|
1259
1153
|
```ruby
|
1260
|
-
class
|
1154
|
+
class Home < SitePrism::Page
|
1261
1155
|
sections :search_results, '#results li' do
|
1262
1156
|
element :title, 'a.title'
|
1263
|
-
element :blurb, 'span.result-
|
1157
|
+
element :blurb, 'span.result-description'
|
1264
1158
|
end
|
1265
1159
|
end
|
1266
1160
|
```
|
@@ -1269,85 +1163,92 @@ end
|
|
1269
1163
|
|
1270
1164
|
Using the example above, it is possible to test for the existence of the
|
1271
1165
|
sections. As long as there is at least one section in the array, the
|
1272
|
-
sections exist. The `sections` method
|
1273
|
-
method to the page/section that our
|
1274
|
-
|
1166
|
+
sections item is said to exist. The `sections` method
|
1167
|
+
adds a `has_<sections name>?` method to the page/section that our
|
1168
|
+
section has been added to.
|
1169
|
+
|
1170
|
+
So given the example below, we can do the following ...
|
1275
1171
|
|
1276
1172
|
```ruby
|
1277
|
-
class
|
1173
|
+
class SearchResults < SitePrism::Section
|
1278
1174
|
element :title, 'a.title'
|
1279
|
-
element :blurb, 'span.result-
|
1175
|
+
element :blurb, 'span.result-description'
|
1280
1176
|
end
|
1281
1177
|
|
1282
|
-
class
|
1283
|
-
sections :search_results,
|
1178
|
+
class Home < SitePrism::Page
|
1179
|
+
sections :search_results, SearchResults, '#results li'
|
1284
1180
|
end
|
1285
1181
|
```
|
1286
1182
|
|
1287
|
-
|
1183
|
+
Here's how to test for the existence of the section:
|
1288
1184
|
|
1289
1185
|
```ruby
|
1290
|
-
@
|
1186
|
+
@home = Home.new
|
1291
1187
|
# ...
|
1292
|
-
@
|
1188
|
+
@home.has_search_results? #=> Only returns `true` if there is 1 or more results
|
1293
1189
|
```
|
1294
1190
|
|
1295
|
-
|
1191
|
+
This allows for some pretty tests ...
|
1296
1192
|
|
1297
1193
|
```ruby
|
1298
1194
|
Then /^there are search results on the page$/ do
|
1299
|
-
expect(@
|
1195
|
+
expect(@home).to have_search_results
|
1300
1196
|
end
|
1301
1197
|
```
|
1302
1198
|
|
1303
|
-
#### Waiting for sections to appear
|
1199
|
+
#### Waiting for sections to appear/disappear
|
1304
1200
|
|
1305
1201
|
The last methods added by `sections` to the page/section we're adding
|
1306
|
-
our sections to are `
|
1307
|
-
They will wait for capybara's
|
1308
|
-
|
1309
|
-
of sections
|
1202
|
+
our sections to are `wait_until_<sections name>_visible` and
|
1203
|
+
`wait_until_<sections name>_invisible`. They will wait for capybara's
|
1204
|
+
default wait time for there to be at least one of the section items
|
1205
|
+
in the array of sections to be visible or for one of the section items
|
1206
|
+
to be invisible respectively.
|
1207
|
+
|
1208
|
+
For example:
|
1310
1209
|
|
1311
1210
|
```ruby
|
1312
|
-
class
|
1211
|
+
class SearchResults < SitePrism::Section
|
1313
1212
|
element :title, 'a.title'
|
1314
1213
|
element :blurb, 'span.result-decription'
|
1315
1214
|
end
|
1316
1215
|
|
1317
|
-
class
|
1318
|
-
sections :search_results,
|
1216
|
+
class Home < SitePrism::Page
|
1217
|
+
sections :search_results, SearchResults, '#results li'
|
1319
1218
|
end
|
1320
1219
|
```
|
1321
1220
|
|
1322
|
-
... here's how to wait for the section:
|
1221
|
+
... here's how to wait for one the section items to become visible:
|
1323
1222
|
|
1324
1223
|
```ruby
|
1325
|
-
@
|
1224
|
+
@home = Home.new
|
1326
1225
|
# ...
|
1327
|
-
@
|
1328
|
-
@
|
1226
|
+
@home.wait_until_search_results_visible
|
1227
|
+
@home.wait_until_search_results_visible(wait: 3) #=> waits for 3 seconds instead of the default capybara timeout
|
1329
1228
|
```
|
1330
1229
|
|
1331
1230
|
... and how to wait for the sections to disappear
|
1332
1231
|
|
1333
1232
|
```ruby
|
1334
|
-
@
|
1233
|
+
@home = Home.new
|
1335
1234
|
# ...
|
1336
|
-
@
|
1337
|
-
@
|
1235
|
+
@home.wait_until_search_results_invisible
|
1236
|
+
@home.wait_until_search_results_invisible(wait: 6) #=> waits for 6 seconds instead of the default capybara timeout
|
1338
1237
|
```
|
1339
1238
|
|
1340
1239
|
## Load Validations
|
1341
1240
|
|
1342
|
-
Load validations enable common validations to be abstracted and performed
|
1343
|
-
|
1241
|
+
Load validations enable common validations to be abstracted and performed
|
1242
|
+
on a Page or Section to determine when it has finished loading
|
1243
|
+
and is ready for interaction in your tests.
|
1344
1244
|
|
1345
|
-
For example, suppose you have a page which displays a 'Loading...' message
|
1346
|
-
the page is loaded in the background.
|
1347
|
-
|
1245
|
+
For example, suppose you have a page which displays a 'Loading...' message
|
1246
|
+
while the body of the page is loaded in the background. Load validations can
|
1247
|
+
be used to ensure tests wait for the correct url to be displayed and the
|
1248
|
+
loading message is no longer present before trying to interact with the page.
|
1348
1249
|
|
1349
|
-
Other use cases include Sections which are displayed conditionally and may
|
1350
|
-
interact with, such as animated lightboxes.
|
1250
|
+
Other use cases include Sections which are displayed conditionally and may
|
1251
|
+
take time to become ready to interact with, such as animated lightboxes.
|
1351
1252
|
|
1352
1253
|
### Using Load Validations
|
1353
1254
|
|
@@ -1359,8 +1260,9 @@ Load validations can be used in three constructs:
|
|
1359
1260
|
|
1360
1261
|
#### Page#load
|
1361
1262
|
|
1362
|
-
When a block is passed to the `Page#load` method, the url will be loaded
|
1363
|
-
|
1263
|
+
When a block is passed to the `Page#load` method, the url will be loaded
|
1264
|
+
normally and then the block will be executed within the context of
|
1265
|
+
`when_loaded`. See `when_loaded` documentation below for further details.
|
1364
1266
|
|
1365
1267
|
Example:
|
1366
1268
|
|
@@ -1373,10 +1275,11 @@ end
|
|
1373
1275
|
|
1374
1276
|
#### Loadable#when_loaded
|
1375
1277
|
|
1376
|
-
The `Loadable#when_loaded` method on a Loadable class instance will yield
|
1377
|
-
block after all load validations have passed.
|
1278
|
+
The `Loadable#when_loaded` method on a Loadable class instance will yield
|
1279
|
+
the instance of the class into a block after all load validations have passed.
|
1378
1280
|
|
1379
|
-
If any load validation fails, an error will be raised
|
1281
|
+
If any load validation fails, an error will be raised
|
1282
|
+
with the reason, if given, for the failure.
|
1380
1283
|
|
1381
1284
|
Example:
|
1382
1285
|
|
@@ -1390,9 +1293,10 @@ end
|
|
1390
1293
|
#### Loadable#loaded?
|
1391
1294
|
|
1392
1295
|
You can explicitly run load validations on a Loadable via the `loaded?` method.
|
1393
|
-
This method will execute all load validations on the object and
|
1394
|
-
In the event of a validation failure, a validation error
|
1395
|
-
method on the object, if any error message
|
1296
|
+
This method will execute all load validations on the object and
|
1297
|
+
return a boolean value. In the event of a validation failure, a validation error
|
1298
|
+
can be accessed via the `load_error` method on the object, if any error message
|
1299
|
+
was emitted by the failing validation.
|
1396
1300
|
|
1397
1301
|
Example:
|
1398
1302
|
|
@@ -1407,7 +1311,8 @@ end
|
|
1407
1311
|
|
1408
1312
|
### Defining Load Validations
|
1409
1313
|
|
1410
|
-
A load validation is a block which returns a boolean value when evaluated against
|
1314
|
+
A load validation is a block which returns a boolean value when evaluated against
|
1315
|
+
an instance of the Page or Section where defined.
|
1411
1316
|
|
1412
1317
|
```ruby
|
1413
1318
|
class SomePage < SitePrism::Page
|
@@ -1416,11 +1321,12 @@ class SomePage < SitePrism::Page
|
|
1416
1321
|
end
|
1417
1322
|
```
|
1418
1323
|
|
1419
|
-
The block may
|
1420
|
-
|
1324
|
+
The block may be defined as a two-element array which includes the boolean check
|
1325
|
+
as the first element and an error message as the second element.
|
1326
|
+
It is highly recommended to supply an error message, as they are
|
1421
1327
|
extremely useful in debugging validation errors.
|
1422
1328
|
|
1423
|
-
The error message
|
1329
|
+
The error message is ignored unless the boolean value is evaluated as falsey.
|
1424
1330
|
|
1425
1331
|
```ruby
|
1426
1332
|
class SomePage < SitePrism::Page
|
@@ -1429,15 +1335,18 @@ class SomePage < SitePrism::Page
|
|
1429
1335
|
end
|
1430
1336
|
```
|
1431
1337
|
|
1432
|
-
Load validations may be defined on `SitePrism::Page` and `SitePrism::Section`
|
1433
|
-
to as `Loadables`) and are evaluated against an
|
1338
|
+
Load validations may be defined on `SitePrism::Page` and `SitePrism::Section`
|
1339
|
+
classes (herein referred to as `Loadables`) and are evaluated against an
|
1340
|
+
instance of the class when created.
|
1434
1341
|
|
1435
1342
|
### Load Validation Inheritance and Execution Order
|
1436
1343
|
|
1437
|
-
Any number of load validations may be defined on a Loadable
|
1344
|
+
Any number of load validations may be defined on a Loadable and they are
|
1345
|
+
inherited by its subclasses (if any exist).
|
1438
1346
|
|
1439
|
-
Load validations are executed in the order that they are defined.
|
1440
|
-
from the top of the inheritance chain
|
1347
|
+
Load validations are executed in the order that they are defined.
|
1348
|
+
Inherited load validations are executed from the top of the inheritance chain
|
1349
|
+
(e.g. `SitePrism::Page` or `SitePrism::Section`) to the bottom.
|
1441
1350
|
|
1442
1351
|
For example:
|
1443
1352
|
|
@@ -1446,7 +1355,6 @@ class BasePage < SitePrism::Page
|
|
1446
1355
|
element :loading_message, '.loader'
|
1447
1356
|
|
1448
1357
|
load_validation do
|
1449
|
-
wait_for_loading_message(1)
|
1450
1358
|
[has_no_loading_message?(wait: 10), 'loading message was still displayed']
|
1451
1359
|
end
|
1452
1360
|
end
|
@@ -1462,61 +1370,60 @@ class FooPage < BasePage
|
|
1462
1370
|
end
|
1463
1371
|
```
|
1464
1372
|
|
1465
|
-
In the above example, when `loaded?` is called on an instance of `FooPage`,
|
1466
|
-
following order:
|
1373
|
+
In the above example, when `loaded?` is called on an instance of `FooPage`,
|
1374
|
+
the validations will be performed in the following order:
|
1467
1375
|
|
1468
|
-
1. The `
|
1469
|
-
2. The `
|
1470
|
-
3. The `FooPage`
|
1471
|
-
4. The `FooPage` load validation will wait for the `some_other_element` element to be present.
|
1376
|
+
1. The `BasePage` validation will wait for the loading message to disappear.
|
1377
|
+
2. The `FooPage` validation will wait for the `form` element to be present.
|
1378
|
+
3. The `FooPage` validation will wait for the `some_other_element` element to be present.
|
1472
1379
|
|
1473
|
-
|
1474
|
-
|
1475
|
-
|
1380
|
+
**NB:** `SitePrism::Page` **used to** include a default load validation on
|
1381
|
+
`page.displayed?` however for v3 this has been removed. It is therefore
|
1382
|
+
necessary to re-define this if you want to retain the behaviour
|
1383
|
+
from site_prism v2. See [UPGRADING.md](https://github.com/natritmeyer/site_prism/blob/master/UPGRADING.md#default-load-validations)
|
1384
|
+
for more info on this.
|
1476
1385
|
|
1477
1386
|
## Using Capybara Query Options
|
1478
1387
|
|
1479
|
-
When querying an element, section or a collection of elements or sections,
|
1480
|
-
supply Capybara query options as arguments to the element and section
|
1481
|
-
to refine the results of the query and enable Capybara to
|
1482
|
-
necessary to properly fulfill your request.
|
1388
|
+
When querying an element, section or a collection of elements or sections,
|
1389
|
+
you may supply Capybara query options as arguments to the element and section
|
1390
|
+
methods in order to refine the results of the query and enable Capybara to
|
1391
|
+
wait for all of the conditions necessary to properly fulfill your request.
|
1483
1392
|
|
1484
1393
|
Given the following sample page and elements:
|
1485
1394
|
|
1486
1395
|
```ruby
|
1487
|
-
class
|
1396
|
+
class SearchResults < SitePrism::Section
|
1488
1397
|
element :title, 'a.title'
|
1489
1398
|
element :blurb, 'span.result-decription'
|
1490
1399
|
end
|
1491
1400
|
|
1492
|
-
class
|
1401
|
+
class Home < SitePrism::Page
|
1493
1402
|
element :footer, '.footer'
|
1494
|
-
sections :search_results,
|
1403
|
+
sections :search_results, SearchResults, '#results li'
|
1495
1404
|
end
|
1496
1405
|
```
|
1497
1406
|
|
1498
|
-
Asserting the attributes of an element or section returned by any method may
|
1499
|
-
the page has not finished loading the
|
1407
|
+
Asserting the attributes of an element or section returned by any method may
|
1408
|
+
fail if the page has not finished loading the section(s):
|
1500
1409
|
|
1501
1410
|
```ruby
|
1502
|
-
@
|
1411
|
+
@home = Home.new
|
1503
1412
|
# ...
|
1504
|
-
expect(@
|
1413
|
+
expect(@home.search_results.size).to == 25 # This may fail!
|
1505
1414
|
```
|
1506
1415
|
|
1507
|
-
The above query can be rewritten to utilize the Capybara
|
1508
|
-
|
1509
|
-
|
1416
|
+
The above query can be rewritten to utilize the Capybara `:count` option
|
1417
|
+
when querying for the sections to be present and countable, which in turn
|
1418
|
+
causes Capybara to expect some number of results to be returned.
|
1419
|
+
The method calls below will succeed, provided the elements appear on
|
1420
|
+
the page within the timeout:
|
1510
1421
|
|
1511
1422
|
```ruby
|
1512
|
-
@
|
1513
|
-
|
1514
|
-
@results_page.has_search_results?(count: 25)
|
1515
|
-
# OR
|
1516
|
-
@results_page.search_results(count: 25)
|
1423
|
+
@home = Home.new
|
1424
|
+
@home.has_search_results?(count: 25)
|
1517
1425
|
# OR
|
1518
|
-
@
|
1519
|
-
# Note that wait_for_<element_name> expects a timeout value to be passed as the first parameter or nil to use the default timeout value.
|
1426
|
+
@home.search_results(count: 25)
|
1520
1427
|
```
|
1521
1428
|
|
1522
1429
|
Now we can write pretty, non-failing tests without hard coding these options
|
@@ -1528,14 +1435,14 @@ Then /^there are search results on the page$/ do
|
|
1528
1435
|
end
|
1529
1436
|
```
|
1530
1437
|
|
1531
|
-
This is supported for all of the Capybara options including, but not limited to
|
1532
|
-
|
1438
|
+
This is supported for all of the Capybara options including, but not limited to
|
1439
|
+
`:count`, `:text` etc. This can also be used when defining page objects.
|
1533
1440
|
|
1534
1441
|
```ruby
|
1535
|
-
class
|
1536
|
-
|
1537
|
-
|
1538
|
-
|
1442
|
+
class Home < SitePrism::Page
|
1443
|
+
element :footer, '.footer'
|
1444
|
+
element :view_more, 'li', text: 'View More'
|
1445
|
+
sections :search_results, SearchResults, '#results li', count: 5
|
1539
1446
|
end
|
1540
1447
|
```
|
1541
1448
|
|
@@ -1547,8 +1454,6 @@ The following element methods allow Capybara options to be passed as arguments t
|
|
1547
1454
|
@results_page.<element_or_section_name>(text: 'Welcome!')
|
1548
1455
|
@results_page.has_<element_or_section_name>?(count: 25)
|
1549
1456
|
@results_page.has_no_<element_or_section_name>?(text: 'Logout')
|
1550
|
-
@results_page.wait_for_<element_or_section_name>(nil, count: 25)
|
1551
|
-
@results_page.wait_for_no_<element_or_section_name>(nil, count: 25)
|
1552
1457
|
@results_page.wait_until_<element_or_section_name>_visible(text: 'Some ajaxy text appears!')
|
1553
1458
|
@results_page.wait_until_<element_or_section_name>_invisible(text: 'Some ajaxy text disappears!')
|
1554
1459
|
```
|
@@ -1577,7 +1482,7 @@ describe 'admin/things/index' do
|
|
1577
1482
|
end
|
1578
1483
|
```
|
1579
1484
|
|
1580
|
-
##
|
1485
|
+
## iFrames
|
1581
1486
|
|
1582
1487
|
SitePrism allows you to interact with iframes. An iframe is declared as
|
1583
1488
|
a `SitePrism::Page` class, and then referenced by the page or section it
|
@@ -1606,7 +1511,7 @@ class PageContainingIframe < SitePrism::Page
|
|
1606
1511
|
end
|
1607
1512
|
```
|
1608
1513
|
|
1609
|
-
### Locating an
|
1514
|
+
### Locating an iFrame
|
1610
1515
|
|
1611
1516
|
While the above example uses a CSS selector to find the iframe, it is also
|
1612
1517
|
possible to use an XPath expression or the index of the iframe in its parent
|
@@ -1635,30 +1540,17 @@ the above example, here's how it's done:
|
|
1635
1540
|
expect(@page).to have_my_iframe
|
1636
1541
|
```
|
1637
1542
|
|
1638
|
-
### Waiting for an iframe
|
1639
|
-
|
1640
|
-
Like an element or section, it is possible to wait for an iframe to
|
1641
|
-
exist or not exist by using the `wait_for_<iframe_name>` and
|
1642
|
-
`wait_for_no_<iframe_name>` methods. For example:
|
1643
|
-
|
1644
|
-
```ruby
|
1645
|
-
@page = PageContainingIframe.new
|
1646
|
-
# ...
|
1647
|
-
@page.wait_for_my_iframe
|
1648
|
-
@page.wait_for_no_my_iframe
|
1649
|
-
```
|
1650
|
-
|
1651
1543
|
### Interacting with an iframe's contents:
|
1652
1544
|
|
1653
|
-
Since an iframe contains a fully fledged SitePrism::Page
|
1545
|
+
Since an iframe contains a fully fledged `SitePrism::Page`, you are able
|
1654
1546
|
to interact with the elements and sections defined within it. Due to
|
1655
1547
|
capybara internals it is necessary to pass a block to the iframe instead
|
1656
1548
|
of simply calling methods on it; the block argument is the
|
1657
|
-
SitePrism::Page that represents the iframe's contents. For example:
|
1549
|
+
`SitePrism::Page` that represents the iframe's contents. For example:
|
1658
1550
|
|
1659
1551
|
```ruby
|
1660
1552
|
# SitePrism::Page representing the iframe
|
1661
|
-
class
|
1553
|
+
class LoginFrame < SitePrism::Page
|
1662
1554
|
element :username, 'input.username'
|
1663
1555
|
element :password, 'input.password'
|
1664
1556
|
end
|
@@ -1667,7 +1559,7 @@ end
|
|
1667
1559
|
class Home < SitePrism::Page
|
1668
1560
|
set_url 'http://www.example.com'
|
1669
1561
|
|
1670
|
-
iframe :
|
1562
|
+
iframe :login_frame, LoginFrame, '#login_and_registration'
|
1671
1563
|
end
|
1672
1564
|
|
1673
1565
|
# cucumber step that performs login
|
@@ -1675,8 +1567,8 @@ When /^I log in$/ do
|
|
1675
1567
|
@home = Home.new
|
1676
1568
|
@home.load
|
1677
1569
|
|
1678
|
-
@home.
|
1679
|
-
#`frame` is an instance of the `
|
1570
|
+
@home.login_frame do |frame|
|
1571
|
+
#`frame` is an instance of the `LoginFrame` class
|
1680
1572
|
frame.username.set 'admin'
|
1681
1573
|
frame.password.set 'p4ssword'
|
1682
1574
|
end
|
@@ -1693,110 +1585,38 @@ a Cucumber based framework
|
|
1693
1585
|
|
1694
1586
|
### Using Capybara Implicit Waits
|
1695
1587
|
|
1696
|
-
By default, SitePrism element and section methods
|
1697
|
-
Capybara's implicit wait methodology and will return
|
1698
|
-
the
|
1699
|
-
following code to enable Capybara's implicit wait methodology.
|
1700
|
-
|
1701
|
-
```ruby
|
1702
|
-
SitePrism.configure do |config|
|
1703
|
-
config.use_implicit_waits = true
|
1704
|
-
end
|
1705
|
-
```
|
1706
|
-
|
1707
|
-
This enables you to replace this:
|
1708
|
-
|
1709
|
-
```ruby
|
1710
|
-
# wait_until methods always wait for the element to be present on the page:
|
1711
|
-
@search_page.wait_for_search_results
|
1712
|
-
|
1713
|
-
# Element and section methods do not (But will do if you configure the above)
|
1714
|
-
@search_page.search_results
|
1715
|
-
```
|
1716
|
-
|
1717
|
-
with this:
|
1718
|
-
|
1719
|
-
```ruby
|
1720
|
-
# With implicit waits enabled, use of wait_until methods is no longer required.
|
1721
|
-
# This method will wait for the element to be found on the page or
|
1722
|
-
# until the `Capybara.default_max_wait_time` timeout is reached.
|
1723
|
-
@search_page.search_results
|
1724
|
-
```
|
1588
|
+
By default, SitePrism element and section methods utilize
|
1589
|
+
Capybara's implicit wait methodology and will return only once the shorter of
|
1590
|
+
the Capybara timeout limit has been reached or the required query has passed.
|
1725
1591
|
|
1726
|
-
|
1592
|
+
If you want to tweak the waiting time or disable it completely, configure it
|
1593
|
+
as per the code below
|
1727
1594
|
|
1728
1595
|
```ruby
|
1729
|
-
|
1730
|
-
|
1731
|
-
|
1732
|
-
|
1733
|
-
Capybara.using_wait_time(30) do
|
1734
|
-
@search_page.subsection.search_results
|
1596
|
+
Capybara.configure do |config|
|
1597
|
+
config.default_max_wait_time = 11 #=> Wait up to 11 seconds for all querys to fail
|
1598
|
+
# or alternatively, if you don't want to ever wait
|
1599
|
+
config.default_max_wait_time = 0 #=> Don't ever wait!
|
1735
1600
|
end
|
1736
1601
|
```
|
1737
1602
|
|
1738
|
-
|
1739
|
-
|
1740
|
-
By default, when using `wait_for_*` and `wait_for_no_*` methods, SitePrism will not raise
|
1741
|
-
an error if an element does not appear or disappear within the timeout period and will
|
1742
|
-
simply return `false` and allow the test to continue. This is different from
|
1743
|
-
the other methods such as `wait_until_*_visible` which do raise errors.
|
1744
|
-
|
1745
|
-
Add the following code to enable errors to be raised immediately when a
|
1746
|
-
`wait_for_*` method does not find the element it is waiting for and when a
|
1747
|
-
`wait_for_no_*` method continues to find an element it is waiting to not exist.
|
1603
|
+
Note that even with implicit waits on you can dynamically modify the wait times
|
1604
|
+
in any SitePrism method to help work-around special circumstances.
|
1748
1605
|
|
1749
1606
|
```ruby
|
1750
|
-
|
1751
|
-
|
1752
|
-
end
|
1753
|
-
```
|
1754
|
-
|
1755
|
-
This enables you to replace this:
|
1756
|
-
|
1757
|
-
```ruby
|
1758
|
-
raise unless @search_page.wait_for_search_results
|
1759
|
-
# or...
|
1760
|
-
raise unless @search_page.wait_for_no_search_results
|
1761
|
-
```
|
1762
|
-
|
1763
|
-
with this:
|
1607
|
+
# Option 1: using wait key assignment
|
1608
|
+
@home.search_results(wait: 20) # will wait up to 20 seconds
|
1764
1609
|
|
1765
|
-
|
1766
|
-
|
1767
|
-
|
1768
|
-
@search_page.wait_for_search_results
|
1769
|
-
# or automatically raise if search results are still found
|
1770
|
-
@search_page.wait_for_no_search_results
|
1771
|
-
```
|
1772
|
-
|
1773
|
-
## Configuring default load_validations
|
1774
|
-
|
1775
|
-
By default, SitePrism will add a single default load validation to all pages.
|
1776
|
-
This single load validation verifies the page URL is correct, and will run whenever you
|
1777
|
-
call `#loaded?` on an instantiated page. It uses the DSL defined `set_url` or `set_url_matcher`
|
1778
|
-
as a source of truth to compare the value of `page.current_url` when you call `#loaded?`
|
1779
|
-
|
1780
|
-
However there may be times you are unsure what your page URL will even look like, or you
|
1781
|
-
might not want this validation to run first, or even at all. In these situations it is
|
1782
|
-
sometimes desirable to remove this default validation.
|
1783
|
-
|
1784
|
-
Adding the below code and SitePrism will remove this validation from being
|
1785
|
-
set up for all your pages (And ran accordingly). Note that by default this validation
|
1786
|
-
is set to run on **all** pages.
|
1787
|
-
|
1788
|
-
```ruby
|
1789
|
-
SitePrism.configure do |config|
|
1790
|
-
config.default_load_validations = false
|
1610
|
+
# Option 2: using Capybara directly, this will wait up to 20 seconds
|
1611
|
+
Capybara.using_wait_time(20) do
|
1612
|
+
@home.search_results
|
1791
1613
|
end
|
1792
1614
|
```
|
1793
1615
|
|
1794
1616
|
## Using SitePrism with VCR
|
1795
1617
|
|
1796
1618
|
There's a SitePrism plugin called `site_prism.vcr` that lets you use
|
1797
|
-
SitePrism with the VCR gem. Check it out
|
1798
|
-
|
1799
|
-
* https://github.com/dnesteryuk/site_prism.vcr
|
1619
|
+
SitePrism with the VCR gem. Check it out [HERE](https://github.com/dnesteryuk/site_prism.vcr)
|
1800
1620
|
|
1801
1621
|
# Epilogue
|
1802
1622
|
|
@@ -1872,5 +1692,10 @@ end
|
|
1872
1692
|
# etc...
|
1873
1693
|
```
|
1874
1694
|
|
1875
|
-
The only thing that needs instantiating is the App class - from then on
|
1876
|
-
need to be initialized, they are now returned by methods on
|
1695
|
+
The only thing that needs instantiating is the `App` class - from then on
|
1696
|
+
pages don't need to be initialized, they are now returned by methods on `@app`.
|
1697
|
+
|
1698
|
+
It is possible to further optimise this, by using Cucumber/RSpec hooks, however
|
1699
|
+
the investigation and optimisation of this is left as an exercise to the Reader.
|
1700
|
+
|
1701
|
+
Happy testing from all of the SitePrism team!
|