testcentricity_web 1.0.23 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/LICENSE.txt +1 -1
- data/README.md +176 -8
- data/lib/testcentricity_web/page_objects_helper.rb +6 -0
- data/lib/testcentricity_web/page_sections_helper.rb +6 -0
- data/lib/testcentricity_web/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 70b7ed7b77f264766c15a9215ffafd3e62b4a00c
|
4
|
+
data.tar.gz: 94ffe57156d1e9e181aaeffaa671cd3a6ac091d7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d230d08d0df3a009df25251f056ed0746cfd68a4775a879e12c4ea0176bf667857a2ac685122bd9202a78a338e95ce5b67e0e5802e904e72bb96c96dc4b9891d
|
7
|
+
data.tar.gz: fbd2c61354b850f76523b7ae5371e3b9ff182aaa6249267925b04094c66d4709aac363c95e8c847fda6329f09af44bd5a9b650bf068f3c6e5c425555427007ce
|
data/LICENSE.txt
CHANGED
data/README.md
CHANGED
@@ -158,6 +158,7 @@ You define your page's **Traits** as shown below:
|
|
158
158
|
|
159
159
|
### Adding UI Elements to your Page Object
|
160
160
|
|
161
|
+
Web pages are made up of UI elements like text fields, check boxes, combo boxes, radio buttons, tables, lists, buttons, etc.
|
161
162
|
**UI Elements** are added to your **Page Object** class definition as shown below:
|
162
163
|
|
163
164
|
class LoginPage < TestCentricity::PageObject
|
@@ -334,6 +335,7 @@ You define your page section's **Traits** as shown below:
|
|
334
335
|
|
335
336
|
### Adding UI Elements to your PageSection Object
|
336
337
|
|
338
|
+
Page sections are typically made up of UI elements like text fields, check boxes, combo boxes, radio buttons, tables, lists, buttons, etc.
|
337
339
|
**UI Elements** are added to your **PageSection** class definition as shown below:
|
338
340
|
|
339
341
|
class SearchForm < TestCentricity::PageSection
|
@@ -384,6 +386,121 @@ Once your **Page Object** has been instantiated, you can call its **PageSection*
|
|
384
386
|
|
385
387
|
|
386
388
|
|
389
|
+
## UI Elements
|
390
|
+
|
391
|
+
**Page Objects** and **PageSection Objects** are typically made up of **UI Element** like text fields, check boxes, combo boxes, radio buttons,
|
392
|
+
tables, lists, buttons, etc. **UI Elements** are declared and instantiated within the class definition of the **Page Object** or **PageSection
|
393
|
+
Object** in which they are contained. With TestCentricity Web, all UI elements are based on the **UIElement** class.
|
394
|
+
|
395
|
+
|
396
|
+
### Declaring and instantiating UI Element
|
397
|
+
|
398
|
+
Single **UIElement** declarations have the following format:
|
399
|
+
|
400
|
+
elementType :element Name, locator
|
401
|
+
|
402
|
+
* The `element name` is the unique name that you will use to refer to the UI element and is specified as a symbol.
|
403
|
+
* The `locator` is the CSS or XPath attribute that uniquely and unambiguously identifies the UI element.
|
404
|
+
|
405
|
+
Multiple **UIElement** declarations for a collection of elements of the same type can be performed by passing a hash table containing the
|
406
|
+
names and locators of each individual element.
|
407
|
+
|
408
|
+
Supported **UI Element** elementTypes and their declarations have the following format:
|
409
|
+
|
410
|
+
*Single element declarations:*
|
411
|
+
|
412
|
+
button :button_name, locator
|
413
|
+
textfield :field_name, locator
|
414
|
+
checkbox :checkbox_name, locator
|
415
|
+
radio :radio_button_name, locator
|
416
|
+
label :label_name, locator
|
417
|
+
link :link_name, locator
|
418
|
+
selectlist :select_name, locator
|
419
|
+
list :list_name, locator
|
420
|
+
table :table_name, locator
|
421
|
+
image :image_name, locator
|
422
|
+
filefield :filefield_name, locator
|
423
|
+
|
424
|
+
*Multiple element declarations:*
|
425
|
+
|
426
|
+
buttons button_1_name: locator,
|
427
|
+
button_2_name: locator,
|
428
|
+
...
|
429
|
+
button_X_name: locator
|
430
|
+
textfields field_1_name: locator,
|
431
|
+
field_2_name: locator,
|
432
|
+
...
|
433
|
+
field_X_name: locator
|
434
|
+
checkboxes check_1_name: locator,
|
435
|
+
check_2_name: locator,
|
436
|
+
...
|
437
|
+
check_X_name: locator
|
438
|
+
radios radio_1_name: locator,
|
439
|
+
...
|
440
|
+
radio_X_name: locator
|
441
|
+
labels label_1_name: locator,
|
442
|
+
...
|
443
|
+
label_X_name: locator
|
444
|
+
links link_1_name: locator,
|
445
|
+
...
|
446
|
+
link_X_name: locator
|
447
|
+
selectlists selectlist_1_name: locator,
|
448
|
+
...
|
449
|
+
selectlist_X_name: locator
|
450
|
+
lists list_1_name: locator,
|
451
|
+
...
|
452
|
+
list_X_name: locator
|
453
|
+
tables table_1_name: locator,
|
454
|
+
...
|
455
|
+
table_X_name: locator
|
456
|
+
images image_1_name: locator,
|
457
|
+
...
|
458
|
+
image_X_name: locator
|
459
|
+
filefields filefield_1_name: locator,
|
460
|
+
...
|
461
|
+
filefield_X_name: locator
|
462
|
+
|
463
|
+
|
464
|
+
Refer to the Class List documentation for the **PageObject** and **PageSection** classes for details on the class methods used for declaring
|
465
|
+
and instantiating **UI Elements**. Examples of UI element declarations can be found in the ***Adding UI Elements to your Page Object*** and
|
466
|
+
***Adding UI Elements to your PageSection Object*** sections above.
|
467
|
+
|
468
|
+
|
469
|
+
### UIElement inherited methods
|
470
|
+
|
471
|
+
With TestCentricity, all UI elements are based on the **UIElement** class, and inherit the following methods:
|
472
|
+
|
473
|
+
**Action methods:**
|
474
|
+
|
475
|
+
element.click
|
476
|
+
|
477
|
+
element.double_click
|
478
|
+
element.right_click
|
479
|
+
element.click_at(x, y)
|
480
|
+
element.hover
|
481
|
+
element.drag_by(right_offset, down_offset)
|
482
|
+
element.drag_and_drop(target, right_offset, down_offset)
|
483
|
+
|
484
|
+
**Object state methods:**
|
485
|
+
|
486
|
+
element.exists?
|
487
|
+
element.visible?
|
488
|
+
element.hidden?
|
489
|
+
element.enabled?
|
490
|
+
element.disabled?
|
491
|
+
element.get_value
|
492
|
+
element.get_attribute(attrib)
|
493
|
+
|
494
|
+
**Waiting methods:**
|
495
|
+
|
496
|
+
element.wait_until_exists(seconds)
|
497
|
+
element.wait_until_gone(seconds)
|
498
|
+
element.wait_until_visible(seconds)
|
499
|
+
element.wait_until_hidden(seconds)
|
500
|
+
element.wait_until_value_is(value, seconds)
|
501
|
+
element.wait_until_value_changes(seconds)
|
502
|
+
|
503
|
+
|
387
504
|
## Instantiating your Page Objects
|
388
505
|
|
389
506
|
Before you can call the methods in your **Page Objects** and **PageSection Objects**, you must instantiate the **Page Objects** of your
|
@@ -437,7 +554,11 @@ to be instantiated by **PageManager**:
|
|
437
554
|
:confirm_purchase_page => PurchaseConfirmationPage,
|
438
555
|
:my_account_page => MyAccountPage,
|
439
556
|
:my_order_history_page => MyOrderHistoryPage,
|
440
|
-
:my_ship_to_addresses_page => MyShipToAddressesPage
|
557
|
+
:my_ship_to_addresses_page => MyShipToAddressesPage,
|
558
|
+
:terms_conditions_page => TermsConditionsPage,
|
559
|
+
:privacy_policy_page => PrivacyPolicyPage,
|
560
|
+
:faqs_page => FAQsPage,
|
561
|
+
:contact_us_page => ContactUsPage
|
441
562
|
}
|
442
563
|
end
|
443
564
|
end
|
@@ -455,9 +576,10 @@ executed:
|
|
455
576
|
**NOTE:** If you intend to use the **PageManager**, you must define a `page_name` trait for each of the **Page Objects** to be registered.
|
456
577
|
|
457
578
|
|
458
|
-
### Leveraging the PageManager
|
459
|
-
|
579
|
+
### Leveraging the PageManager in your Cucumber tests
|
460
580
|
|
581
|
+
Many Cucumber based automated tests suites include scenarios that verify that web pages are correctly loaded, displayed, or can be
|
582
|
+
navigated to by clicking associated links. One such Cucumber navigation scenario is displayed below:
|
461
583
|
|
462
584
|
Scenario Outline: Verify Home page navigation links
|
463
585
|
Given I am on the Home page
|
@@ -471,17 +593,63 @@ executed:
|
|
471
593
|
|Terms & Conditions |
|
472
594
|
|Privacy Policy |
|
473
595
|
|FAQs |
|
474
|
-
|Refunds & Cancellations |
|
475
596
|
|Contact Us |
|
476
597
|
|
598
|
+
In the above example, the step definitions associated with the 3 steps might be implemented using a page_dispatcher method using a
|
599
|
+
`case` statement to parse the `page` parameter as in the example below:
|
477
600
|
|
478
|
-
|
601
|
+
Given(/^I am on the ([^\"]*) page$/) do |page_name|
|
602
|
+
target_page = page_dispatcher(page_name)
|
603
|
+
target_page.load_page
|
604
|
+
end
|
605
|
+
|
606
|
+
When(/^I click the ([^\"]*) navigation link$/) do |link_name|
|
607
|
+
target_page = page_dispatcher(link_name)
|
608
|
+
target_page.navigate_to
|
609
|
+
end
|
610
|
+
|
611
|
+
Then(/^I expect the ([^\"]*) page to be correctly displayed$/) do |page_name|
|
612
|
+
target_page = page_dispatcher(page_name)
|
613
|
+
target_page.verify_page_exists
|
614
|
+
target_page.verify_page_ui
|
615
|
+
end
|
616
|
+
|
617
|
+
# this method takes a page name as a parameter and returns an instance of the associated Page Object
|
618
|
+
def page_dispatcher(page_name)
|
619
|
+
case page_name
|
620
|
+
when 'Registration'
|
621
|
+
page = registration_page
|
622
|
+
when 'My Account'
|
623
|
+
page = my_account_page
|
624
|
+
when 'Terms & Conditions'
|
625
|
+
page = terms_conditions_page
|
626
|
+
when 'Privacy Policy'
|
627
|
+
page = privacy_policy_page
|
628
|
+
when 'Contact Us'
|
629
|
+
page = contact_us_page
|
630
|
+
when 'FAQs'
|
631
|
+
page = faqs_page
|
632
|
+
end
|
633
|
+
raise "No page object defined for page named '#{page_name}'" unless page
|
634
|
+
page
|
635
|
+
end
|
636
|
+
|
637
|
+
|
638
|
+
While this approach may be effective for small web applications with only a few pages (and hence few **Page Objects**), it quickly becomes
|
639
|
+
cumbersome to manage if your web application has dozens of **Page Objects** that need to be managed.
|
640
|
+
|
641
|
+
The **PageManager** class provides a `find_page` method that replaces the cumbersome and difficult to maintain `case` statement used in the
|
642
|
+
above example. The **PageManager** `current_page` method allows you to set or get an instance of the currently active Page Object.
|
643
|
+
|
644
|
+
To use these **PageManager** methods, include the step definitions and code below in a `page_steps.rb` or `generic_steps.rb` file in the
|
645
|
+
`features/step_definitions` folder:
|
479
646
|
|
480
647
|
include TestCentricity
|
481
648
|
|
482
649
|
Given(/^I am on the ([^\"]*) page$/) do |page_name|
|
483
650
|
target_page = page_dispatcher(page_name)
|
484
651
|
target_page.load_page if target_page
|
652
|
+
# let PageManager store instance of current page object
|
485
653
|
PageManager.current_page = target_page
|
486
654
|
end
|
487
655
|
|
@@ -493,6 +661,7 @@ Include the step definitions and code below in a `page_steps.rb` or `generic_ste
|
|
493
661
|
Then(/^I expect to see the ([^\"]*) page$/) do |page_name|
|
494
662
|
target_page = page_dispatcher(page_name)
|
495
663
|
target_page.verify_page_exists if target_page
|
664
|
+
# let PageManager store instance of current page object
|
496
665
|
PageManager.current_page = target_page
|
497
666
|
end
|
498
667
|
|
@@ -500,10 +669,10 @@ Include the step definitions and code below in a `page_steps.rb` or `generic_ste
|
|
500
669
|
target_page = page_dispatcher(page_name)
|
501
670
|
target_page.verify_page_exists
|
502
671
|
target_page.verify_page_ui
|
672
|
+
# let PageManager store instance of current page object
|
503
673
|
PageManager.current_page = target_page
|
504
674
|
end
|
505
675
|
|
506
|
-
|
507
676
|
# this method takes a page name as a parameter and returns an instance of the associated Page Object
|
508
677
|
def page_dispatcher(page_name)
|
509
678
|
page = PageManager.find_page(page_name)
|
@@ -512,7 +681,6 @@ Include the step definitions and code below in a `page_steps.rb` or `generic_ste
|
|
512
681
|
end
|
513
682
|
|
514
683
|
|
515
|
-
|
516
684
|
## Connecting to a Web Browser
|
517
685
|
|
518
686
|
The `TestCentricity::WebDriverConnect.initialize_web_driver` method configures the appropriate selenium-webdriver capabilities required to establish a
|
@@ -1140,7 +1308,7 @@ landscape orientation running on the BrowserStack service:
|
|
1140
1308
|
|
1141
1309
|
## Copyright and License
|
1142
1310
|
|
1143
|
-
TestCentricity™ Framework is Copyright (c) 2014-
|
1311
|
+
TestCentricity™ Framework is Copyright (c) 2014-2017, Tony Mrozinski.
|
1144
1312
|
All rights reserved.
|
1145
1313
|
|
1146
1314
|
|
@@ -272,6 +272,12 @@ module TestCentricity
|
|
272
272
|
class_eval(%(def #{element_name};@#{element_name} ||= TestCentricity::FileField.new("#{element_name}", self, "#{locator}", :page);end))
|
273
273
|
end
|
274
274
|
|
275
|
+
def self.filefields(element_hash)
|
276
|
+
element_hash.each do |element_name, locator|
|
277
|
+
filefield(element_name, locator)
|
278
|
+
end
|
279
|
+
end
|
280
|
+
|
275
281
|
# Declare and instantiate a cell button in a table column on this page object.
|
276
282
|
#
|
277
283
|
# @param element_name [Symbol] name of cell button object (as a symbol)
|
@@ -281,6 +281,12 @@ module TestCentricity
|
|
281
281
|
class_eval(%(def #{element_name};@#{element_name} ||= TestCentricity::FileField.new("#{element_name}", self, "#{locator}", :section);end))
|
282
282
|
end
|
283
283
|
|
284
|
+
def self.filefields(element_hash)
|
285
|
+
element_hash.each do |element_name, locator|
|
286
|
+
filefield(element_name, locator)
|
287
|
+
end
|
288
|
+
end
|
289
|
+
|
284
290
|
# Declare and instantiate a cell button in a table column on this page section.
|
285
291
|
#
|
286
292
|
# @param element_name [Symbol] name of cell button object (as a symbol)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: testcentricity_web
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- A.J. Mrozinski
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-01-
|
11
|
+
date: 2017-01-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|