testcentricity_web 1.0.3 → 1.0.4
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 +95 -12
- data/lib/testcentricity_web/browser_helper.rb +8 -0
- data/lib/testcentricity_web/elements/select_list.rb +6 -0
- data/lib/testcentricity_web/page_objects_helper.rb +116 -28
- data/lib/testcentricity_web/page_sections_helper.rb +86 -26
- data/lib/testcentricity_web/ui_elements_helper.rb +4 -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: 47950cb4c712070298ad6deb05d1b50ae5f18009
|
4
|
+
data.tar.gz: 567501e936e2fcbac0a57e1c866cb921afc5d7b2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b13b00820983439f0bbe49be197f975d10ec163b8cfc72f27b4a0e4333fdb57697acd41276ec533036f4e8429d5dd420c9df7417db8201f223a9da7ebe7af7a5
|
7
|
+
data.tar.gz: 0bdcf538a51a41cd76150c5b424f013cf06fa1548b5b8a91c2eba2eb07f927104e8fa37ebf33a30936ca305386c69f15784e9f42b3e1cedb1df3b5b23880a42e
|
data/README.md
CHANGED
@@ -102,13 +102,18 @@ test automation project. You define new **Page Objects** as shown below:
|
|
102
102
|
end
|
103
103
|
|
104
104
|
|
105
|
+
class RegistrationPage < TestCentricity::PageObject
|
106
|
+
end
|
107
|
+
|
108
|
+
|
105
109
|
### Adding Traits to your Page Object
|
106
110
|
|
107
111
|
Web pages typically have names and URLs associated with them. Web pages also typically have a unique object or attribute that, when present,
|
108
112
|
indicates that the page's contents have fully loaded.
|
109
113
|
|
110
114
|
The `page_name` trait is registered with the **PageManager** object, which includes a `find_page` method that takes a page name as a
|
111
|
-
parameter and returns an instance of the associated **Page Object**.
|
115
|
+
parameter and returns an instance of the associated **Page Object**. If you intend to use the **PageManager**, you must define a `page_name`
|
116
|
+
trait for each of the **Page Objects** to be registered.
|
112
117
|
|
113
118
|
A `page_url` trait should be defined if a page can be directly loaded using a URL. If you set Capybara's `app_host`, or specify a base URL
|
114
119
|
when calling the `WebDriverConnect.initialize_web_driver` method, then your `page_url` trait can be the relative URL slug that will
|
@@ -135,6 +140,13 @@ You define your page's **Traits** as shown below:
|
|
135
140
|
end
|
136
141
|
|
137
142
|
|
143
|
+
class RegistrationPage < TestCentricity::PageObject
|
144
|
+
trait(:page_name) { 'Registration' }
|
145
|
+
trait(:page_url) { '/register' }
|
146
|
+
trait(:page_locator) { 'body.registration' }
|
147
|
+
end
|
148
|
+
|
149
|
+
|
138
150
|
### Adding UI Elements to your Page Object
|
139
151
|
|
140
152
|
**UI Elements** are added to your **Page Object** class definition as shown below:
|
@@ -196,6 +208,7 @@ the UI to hide implementation details, as shown below:
|
|
196
208
|
password_field => { :visible => true, :enabled => true, :value => '', :placeholder => 'Password' },
|
197
209
|
remember_checkbox => { :exists => true, :enabled => true, :checked => false },
|
198
210
|
forgot_password_link => { :visible => true, :value => 'Forgot your password?' },
|
211
|
+
error_message_label => { :visible => false }
|
199
212
|
}
|
200
213
|
verify_ui_states(ui)
|
201
214
|
super
|
@@ -331,6 +344,7 @@ to be instantiated by **PageManager**:
|
|
331
344
|
{ :login_page => LoginPage,
|
332
345
|
:home_page => HomePage,
|
333
346
|
:registration_page => RegistrationPage,
|
347
|
+
:search_results_page => SearchResultsPage,
|
334
348
|
:products_grid_page => ProductsCollectionPage,
|
335
349
|
:product_detail_page => ProductDetailPage,
|
336
350
|
:shopping_basket_page => ShoppingBasketPage,
|
@@ -353,14 +367,75 @@ executed:
|
|
353
367
|
include WorldPages
|
354
368
|
WorldPages.instantiate_page_objects
|
355
369
|
|
370
|
+
**NOTE:** If you intend to use the **PageManager**, you must define a `page_name` trait for each of the **Page Objects** to be registered.
|
371
|
+
|
372
|
+
|
373
|
+
### Leveraging the PageManager from Cucumber
|
374
|
+
|
375
|
+
|
376
|
+
|
377
|
+
Scenario Outline: Verify Home page navigation links
|
378
|
+
Given I am on the Home page
|
379
|
+
When I click the <page> navigation link
|
380
|
+
Then I expect the <page> page to be correctly displayed
|
381
|
+
|
382
|
+
Examples:
|
383
|
+
|page |
|
384
|
+
|Registration |
|
385
|
+
|My Account |
|
386
|
+
|Terms & Conditions |
|
387
|
+
|Privacy Policy |
|
388
|
+
|FAQs |
|
389
|
+
|Refunds & Cancellations |
|
390
|
+
|Contact US |
|
391
|
+
|
392
|
+
|
393
|
+
Include the step definitions and code below in a `page_steps.rb` or `generic_steps.rb` file in the `features/step_definitions` folder:
|
394
|
+
|
395
|
+
include TestCentricity
|
396
|
+
|
397
|
+
Given(/^I am (?:on|viewing) the ([^\"]*) page$/) do |page_name|
|
398
|
+
target_page = page_dispatcher(page_name)
|
399
|
+
target_page.load_page if target_page
|
400
|
+
PageManager.set_current_page(target_page)
|
401
|
+
end
|
402
|
+
|
403
|
+
When(/^I click the ([^\"]*) navigation link$/) do |link_name|
|
404
|
+
target_page = page_dispatcher(link_name)
|
405
|
+
target_page.navigate_to if target_page
|
406
|
+
end
|
407
|
+
|
408
|
+
Then(/^I expect to see the ([^\"]*) page$/) do |page_name|
|
409
|
+
target_page = page_dispatcher(page_name)
|
410
|
+
target_page.verify_page_exists if target_page
|
411
|
+
PageManager.set_current_page(target_page)
|
412
|
+
end
|
413
|
+
|
414
|
+
Then(/^I expect the ([^\"]*) page to be correctly displayed$/) do |page_name|
|
415
|
+
target_page = page_dispatcher(page_name)
|
416
|
+
if target_page
|
417
|
+
target_page.verify_page_exists
|
418
|
+
target_page.verify_page_ui
|
419
|
+
PageManager.set_current_page(target_page)
|
420
|
+
end
|
421
|
+
end
|
422
|
+
|
423
|
+
|
424
|
+
# this method that takes a page name as a parameter and returns an instance of the associated Page Object
|
425
|
+
def page_dispatcher(page_name)
|
426
|
+
page = PageManager.find_page(page_name)
|
427
|
+
raise "No page object defined for page named '#{page_name}'" unless page
|
428
|
+
page
|
429
|
+
end
|
430
|
+
|
356
431
|
|
357
432
|
|
358
433
|
## Connecting to a Web Browser
|
359
434
|
|
360
|
-
The `WebDriverConnect.initialize_web_driver` method configures the appropriate selenium-webdriver capabilities required to establish a
|
435
|
+
The `TestCentricity::WebDriverConnect.initialize_web_driver` method configures the appropriate selenium-webdriver capabilities required to establish a
|
361
436
|
connection with a target web browser, and sets the base host URL of the web site you are running your tests against.
|
362
437
|
|
363
|
-
The `WebDriverConnect.initialize_web_driver` method accepts a single optional parameter - the base host URL. Cucumber **Environment
|
438
|
+
The `TestCentricity::WebDriverConnect.initialize_web_driver` method accepts a single optional parameter - the base host URL. Cucumber **Environment
|
364
439
|
Variables** are used to specify the target local or remote web browser, and the various webdriver capability parameters required to configure
|
365
440
|
the connection.
|
366
441
|
|
@@ -427,8 +502,9 @@ to `chrome`.
|
|
427
502
|
|
428
503
|
### Mobile Safari browser on iOS Simulators
|
429
504
|
|
430
|
-
You can run your mobile web tests against the mobile Safari browser on simulated iOS devices using Appium and XCode on OS X. You must install XCode
|
431
|
-
|
505
|
+
You can run your mobile web tests against the mobile Safari browser on simulated iOS devices using Appium and XCode on OS X. You must install XCode, the
|
506
|
+
iOS version-specific device simulators for XCode, and Appium. You must ensure that the `appium_capybara` gem is installed and required as described in
|
507
|
+
**section 2.4 (Setup - Using Appium)** above.
|
432
508
|
|
433
509
|
Appium must be running prior to invoking Cucumber to run your features/scenarios.
|
434
510
|
|
@@ -460,7 +536,8 @@ staging server inside your LAN, you must set the `TUNNELING` Environment Variabl
|
|
460
536
|
#### Remote desktop browsers on the BrowserStack service
|
461
537
|
|
462
538
|
For remotely hosted desktop web browsers on the BrowserStack service, the following **Environment Variables** must be set as described in
|
463
|
-
the table below. Refer to the [Browserstack-specific capabilities chart page](https://www.browserstack.com/automate/capabilities#capabilities-browserstack)
|
539
|
+
the table below. Refer to the [Browserstack-specific capabilities chart page](https://www.browserstack.com/automate/capabilities#capabilities-browserstack)
|
540
|
+
for information regarding the specific capabilities.
|
464
541
|
|
465
542
|
**Environment Variable** | **Description**
|
466
543
|
--------------- | ----------------
|
@@ -479,7 +556,8 @@ the table below. Refer to the [Browserstack-specific capabilities chart page](ht
|
|
479
556
|
#### Remote mobile browsers on the BrowserStack service
|
480
557
|
|
481
558
|
For remotely hosted mobile web browsers on the BrowserStack service, the following **Environment Variables** must be set as described in
|
482
|
-
the table below. Refer to the [Browserstack-specific capabilities chart page](https://www.browserstack.com/automate/capabilities#capabilities-browserstack)
|
559
|
+
the table below. Refer to the [Browserstack-specific capabilities chart page](https://www.browserstack.com/automate/capabilities#capabilities-browserstack)
|
560
|
+
for information regarding the specific capabilities.
|
483
561
|
|
484
562
|
**Environment Variable** | **Description**
|
485
563
|
--------------- | ----------------
|
@@ -497,7 +575,8 @@ the table below. Refer to the [Browserstack-specific capabilities chart page](ht
|
|
497
575
|
#### Remote desktop browsers on the CrossBrowserTesting service
|
498
576
|
|
499
577
|
For remotely hosted desktop web browsers on the CrossBrowserTesting service, the following **Environment Variables** must be set as described in
|
500
|
-
the table below. Use the Configuration Wizard on the [Start a Selenium Test page](https://app.crossbrowsertesting.com/selenium/run) to obtain
|
578
|
+
the table below. Use the Configuration Wizard on the [Start a Selenium Test page](https://app.crossbrowsertesting.com/selenium/run) to obtain
|
579
|
+
information regarding the specific capabilities.
|
501
580
|
|
502
581
|
**Environment Variable** | **Description**
|
503
582
|
--------------- | ----------------
|
@@ -513,7 +592,8 @@ the table below. Use the Configuration Wizard on the [Start a Selenium Test page
|
|
513
592
|
#### Remote mobile browsers on the CrossBrowserTesting service
|
514
593
|
|
515
594
|
For remotely hosted mobile web browsers on the CrossBrowserTesting service, the following **Environment Variables** must be set as described in
|
516
|
-
the table below. Use the Configuration Wizard on the [Start a Selenium Test page](https://app.crossbrowsertesting.com/selenium/run) to obtain
|
595
|
+
the table below. Use the Configuration Wizard on the [Start a Selenium Test page](https://app.crossbrowsertesting.com/selenium/run) to obtain
|
596
|
+
information regarding the specific capabilities.
|
517
597
|
|
518
598
|
**Environment Variable** | **Description**
|
519
599
|
--------------- | ----------------
|
@@ -529,7 +609,8 @@ the table below. Use the Configuration Wizard on the [Start a Selenium Test page
|
|
529
609
|
#### Remote desktop browsers on the Sauce Labs service
|
530
610
|
|
531
611
|
For remotely hosted desktop web browsers on the Sauce Labs service, the following **Environment Variables** must be set as described in
|
532
|
-
the table below. Use the Selenium API on the [Platform Configurator page](https://wiki.saucelabs.com/display/DOCS/Platform+Configurator#/) to obtain
|
612
|
+
the table below. Use the Selenium API on the [Platform Configurator page](https://wiki.saucelabs.com/display/DOCS/Platform+Configurator#/) to obtain
|
613
|
+
information regarding the specific capabilities.
|
533
614
|
|
534
615
|
**Environment Variable** | **Description**
|
535
616
|
--------------- | ----------------
|
@@ -546,7 +627,8 @@ the table below. Use the Selenium API on the [Platform Configurator page](https:
|
|
546
627
|
#### Remote mobile browsers on the Sauce Labs service
|
547
628
|
|
548
629
|
For remotely hosted mobile web browsers on the Sauce Labs service, the following **Environment Variables** must be set as described in
|
549
|
-
the table below. Use the Selenium API on the [Platform Configurator page](https://wiki.saucelabs.com/display/DOCS/Platform+Configurator#/) to obtain
|
630
|
+
the table below. Use the Selenium API on the [Platform Configurator page](https://wiki.saucelabs.com/display/DOCS/Platform+Configurator#/) to obtain
|
631
|
+
information regarding the specific capabilities.
|
550
632
|
|
551
633
|
**Environment Variable** | **Description**
|
552
634
|
--------------- | ----------------
|
@@ -564,7 +646,8 @@ the table below. Use the Selenium API on the [Platform Configurator page](https:
|
|
564
646
|
#### Remote desktop browsers on the TestingBot service
|
565
647
|
|
566
648
|
For remotely hosted desktop web browsers on the TestingBot service, the following **Environment Variables** must be set as described in
|
567
|
-
the table below. Refer to the [TestingBot List of Available Browsers page](https://testingbot.com/support/getting-started/browsers.html) for information
|
649
|
+
the table below. Refer to the [TestingBot List of Available Browsers page](https://testingbot.com/support/getting-started/browsers.html) for information
|
650
|
+
regarding the specific capabilities.
|
568
651
|
|
569
652
|
**Environment Variable** | **Description**
|
570
653
|
--------------- | ----------------
|
@@ -64,6 +64,14 @@ module TestCentricity
|
|
64
64
|
Capybara.page.driver.browser.switch_to.window(Capybara.page.driver.browser.window_handles.last)
|
65
65
|
end
|
66
66
|
|
67
|
+
def self.suppress_js_alerts
|
68
|
+
page.execute_script("window.alert = function() {}")
|
69
|
+
end
|
70
|
+
|
71
|
+
def self.suppress_js_leave_page_modal
|
72
|
+
page.execute_script('window.onbeforeunload = null')
|
73
|
+
end
|
74
|
+
|
67
75
|
def self.delete_all_cookies
|
68
76
|
if Capybara.current_driver == :selenium
|
69
77
|
browser = Capybara.current_session.driver.browser
|
@@ -80,6 +80,8 @@ module TestCentricity
|
|
80
80
|
end
|
81
81
|
end
|
82
82
|
|
83
|
+
alias :get_list_items :get_options
|
84
|
+
|
83
85
|
# Return the number of options in a select box object.
|
84
86
|
# Supports standard HTML select objects and Chosen select objects.
|
85
87
|
#
|
@@ -97,6 +99,8 @@ module TestCentricity
|
|
97
99
|
end
|
98
100
|
end
|
99
101
|
|
102
|
+
alias :get_item_count :get_option_count
|
103
|
+
|
100
104
|
def verify_options(expected, enqueue = false)
|
101
105
|
actual = get_options
|
102
106
|
enqueue ?
|
@@ -121,6 +125,8 @@ module TestCentricity
|
|
121
125
|
end
|
122
126
|
end
|
123
127
|
|
128
|
+
alias :selected? :get_selected_option
|
129
|
+
|
124
130
|
# Select the specified option in a Siebel OUI select box object.
|
125
131
|
#
|
126
132
|
# @param option [String] text of option to select
|
@@ -12,7 +12,7 @@ module TestCentricity
|
|
12
12
|
# @param block [&block] trait value
|
13
13
|
# @example
|
14
14
|
# trait(:page_name) { 'Shopping Basket' }
|
15
|
-
# trait(:page_url) {
|
15
|
+
# trait(:page_url) { '/shopping_basket' }
|
16
16
|
# trait(:page_locator) { "//body[@class='shopping_baskets']" }
|
17
17
|
#
|
18
18
|
def self.trait(trait_name, &block)
|
@@ -31,30 +31,74 @@ module TestCentricity
|
|
31
31
|
class_eval(%Q(def #{element_name.to_s};@#{element_name.to_s} ||= TestCentricity::UIElement.new(self, "#{locator}", :page);end))
|
32
32
|
end
|
33
33
|
|
34
|
+
# Declare and instantiate a collection of generic UI Elements for this page object.
|
35
|
+
#
|
36
|
+
# @param element_hash [Hash] names of UI objects (as a symbol) and CSS selectors or XPath expressions that uniquely identifies objects
|
37
|
+
# @example
|
38
|
+
# elements profile_item: 'a#profile',
|
39
|
+
# settings_item: 'a#userPreferencesTrigger',
|
40
|
+
# log_out_item: 'a#logout'
|
41
|
+
#
|
42
|
+
def self.elements(element_hash)
|
43
|
+
element_hash.each do |element_name, locator|
|
44
|
+
element(element_name, locator)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
34
48
|
# Declare and instantiate a button UI Element for this page object.
|
35
49
|
#
|
36
50
|
# @param element_name [Symbol] name of button object (as a symbol)
|
37
51
|
# @param locator [String] CSS selector or XPath expression that uniquely identifies object
|
38
52
|
# @example
|
39
|
-
# button :checkout_button,
|
53
|
+
# button :checkout_button, 'button.checkout_button'
|
40
54
|
# button :login_button, "//input[@id='submit_button']"
|
41
55
|
#
|
42
56
|
def self.button(element_name, locator)
|
43
57
|
class_eval(%Q(def #{element_name.to_s};@#{element_name.to_s} ||= TestCentricity::Button.new(self, "#{locator}", :page);end))
|
44
58
|
end
|
45
59
|
|
60
|
+
# Declare and instantiate a collection of buttons for this page object.
|
61
|
+
#
|
62
|
+
# @param element_hash [Hash] names of buttons (as a symbol) and CSS selectors or XPath expressions that uniquely identifies buttons
|
63
|
+
# @example
|
64
|
+
# buttons new_account_button: 'button#new-account',
|
65
|
+
# save_button: 'button#save',
|
66
|
+
# cancel_button: 'button#cancel'
|
67
|
+
#
|
68
|
+
def self.buttons(element_hash)
|
69
|
+
element_hash.each do |element_name, locator|
|
70
|
+
button(element_name, locator)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
46
74
|
# Declare and instantiate a text field UI Element for this page object.
|
47
75
|
#
|
48
76
|
# @param element_name [Symbol] name of text field object (as a symbol)
|
49
77
|
# @param locator [String] CSS selector or XPath expression that uniquely identifies object
|
50
78
|
# @example
|
51
79
|
# textfield :user_id_field, "//input[@id='UserName']"
|
52
|
-
# textfield :password_field,
|
80
|
+
# textfield :password_field, 'consumer_password'
|
53
81
|
#
|
54
82
|
def self.textfield(element_name, locator)
|
55
83
|
class_eval(%Q(def #{element_name.to_s};@#{element_name.to_s} ||= TestCentricity::TextField.new(self, "#{locator}", :page);end))
|
56
84
|
end
|
57
85
|
|
86
|
+
# Declare and instantiate a collection of text fields for this page object.
|
87
|
+
#
|
88
|
+
# @param element_hash [Hash] names of text fields (as a symbol) and CSS selectors or XPath expressions that uniquely identifies text fields
|
89
|
+
# @example
|
90
|
+
# textfields name_field: 'input#Name',
|
91
|
+
# title_field: 'input#Title',
|
92
|
+
# phone_field: 'input#PhoneNumber',
|
93
|
+
# fax_field: 'input#FaxNumber',
|
94
|
+
# email_field: 'input#Email'
|
95
|
+
#
|
96
|
+
def self.textfields(element_hash)
|
97
|
+
element_hash.each do |element_name, locator|
|
98
|
+
textfield(element_name, locator)
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
58
102
|
# Declare and instantiate a checkbox UI Element for this page object.
|
59
103
|
#
|
60
104
|
# @param element_name [Symbol] name of checkbox object (as a symbol)
|
@@ -62,12 +106,18 @@ module TestCentricity
|
|
62
106
|
# @param proxy [Symbol] Optional name (as a symbol) of proxy object to receive click actions
|
63
107
|
# @example
|
64
108
|
# checkbox :remember_checkbox, "//input[@id='RememberUser']"
|
65
|
-
# checkbox :accept_terms_checkbox,
|
109
|
+
# checkbox :accept_terms_checkbox, 'input#accept_terms_conditions', :accept_terms_label
|
66
110
|
#
|
67
111
|
def self.checkbox(element_name, locator, proxy = nil)
|
68
112
|
class_eval(%Q(def #{element_name.to_s};@#{element_name.to_s} ||= TestCentricity::CheckBox.new(self, "#{locator}", :page, #{proxy});end))
|
69
113
|
end
|
70
114
|
|
115
|
+
def self.checkboxes(element_hash)
|
116
|
+
element_hash.each do |element_name, locator|
|
117
|
+
checkbox(element_name, locator)
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
71
121
|
# Declare and instantiate a radio button UI Element for this page object.
|
72
122
|
#
|
73
123
|
# @param element_name [Symbol] name of radio object (as a symbol)
|
@@ -75,12 +125,18 @@ module TestCentricity
|
|
75
125
|
# @param proxy [Symbol] Optional name (as a symbol) of proxy object to receive click actions
|
76
126
|
# @example
|
77
127
|
# radio :accept_terms_radio, "//input[@id='Accept_Terms']"
|
78
|
-
# radio :decline_terms_radio,
|
128
|
+
# radio :decline_terms_radio, '#decline_terms_conditions', :decline_terms_label
|
79
129
|
#
|
80
130
|
def self.radio(element_name, locator, proxy = nil)
|
81
131
|
class_eval(%Q(def #{element_name.to_s};@#{element_name.to_s} ||= TestCentricity::Radio.new(self, "#{locator}", :page, #{proxy});end))
|
82
132
|
end
|
83
133
|
|
134
|
+
def self.radios(element_hash)
|
135
|
+
element_hash.each do |element_name, locator|
|
136
|
+
radio(element_name, locator)
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
84
140
|
# Declare and instantiate a label UI Element for this page object.
|
85
141
|
#
|
86
142
|
# @param element_name [Symbol] name of label object (as a symbol)
|
@@ -93,22 +149,34 @@ module TestCentricity
|
|
93
149
|
class_eval(%Q(def #{element_name.to_s};@#{element_name.to_s} ||= TestCentricity::Label.new(self, "#{locator}", :page);end))
|
94
150
|
end
|
95
151
|
|
152
|
+
def self.labels(element_hash)
|
153
|
+
element_hash.each do |element_name, locator|
|
154
|
+
label(element_name, locator)
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
96
158
|
# Declare and instantiate a link UI Element for this page object.
|
97
159
|
#
|
98
160
|
# @param element_name [Symbol] name of link object (as a symbol)
|
99
161
|
# @param locator [String] CSS selector or XPath expression that uniquely identifies object
|
100
162
|
# @example
|
101
|
-
# link :registration_link,
|
163
|
+
# link :registration_link, 'a.account-nav__link.register'
|
102
164
|
# link :shopping_basket_link, "//a[@href='shopping_basket']"
|
103
165
|
#
|
104
166
|
def self.link(element_name, locator)
|
105
167
|
class_eval(%Q(def #{element_name.to_s};@#{element_name.to_s} ||= TestCentricity::Link.new(self, "#{locator}", :page);end))
|
106
168
|
end
|
107
169
|
|
170
|
+
def self.links(element_hash)
|
171
|
+
element_hash.each do |element_name, locator|
|
172
|
+
link(element_name, locator)
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
108
176
|
# Declare and instantiate a table UI Element for this page object.
|
109
177
|
#
|
110
178
|
# @param element_name [Symbol] name of table object (as a symbol)
|
111
|
-
# @param locator [String]
|
179
|
+
# @param locator [String] XPath expression that uniquely identifies object
|
112
180
|
# @example
|
113
181
|
# table :payments_table, "//table[@class='payments_table']"
|
114
182
|
#
|
@@ -116,47 +184,71 @@ module TestCentricity
|
|
116
184
|
class_eval(%Q(def #{element_name.to_s};@#{element_name.to_s} ||= TestCentricity::Table.new(self, "#{locator}", :page);end))
|
117
185
|
end
|
118
186
|
|
187
|
+
def self.tables(element_hash)
|
188
|
+
element_hash.each do |element_name, locator|
|
189
|
+
table(element_name, locator)
|
190
|
+
end
|
191
|
+
end
|
192
|
+
|
119
193
|
# Declare and instantiate a select list UI Element for this page object.
|
120
194
|
#
|
121
195
|
# @param element_name [Symbol] name of select list object (as a symbol)
|
122
196
|
# @param locator [String] CSS selector or XPath expression that uniquely identifies object
|
123
197
|
# @example
|
124
|
-
# selectlist :category_selector,
|
198
|
+
# selectlist :category_selector, 'select#search_form_category_chosen'
|
125
199
|
# selectlist :gender_select, "//select[@id='customer_gender']"
|
126
200
|
#
|
127
201
|
def self.selectlist(element_name, locator)
|
128
202
|
class_eval(%Q(def #{element_name.to_s};@#{element_name.to_s} ||= TestCentricity::SelectList.new(self, "#{locator}", :page);end))
|
129
203
|
end
|
130
204
|
|
205
|
+
def self.selectlists(element_hash)
|
206
|
+
element_hash.each do |element_name, locator|
|
207
|
+
selectlist(element_name, locator)
|
208
|
+
end
|
209
|
+
end
|
210
|
+
|
131
211
|
# Declare and instantiate a list UI Element for this page object.
|
132
212
|
#
|
133
213
|
# @param element_name [Symbol] name of list object (as a symbol)
|
134
214
|
# @param locator [String] CSS selector or XPath expression that uniquely identifies object
|
135
215
|
# @example
|
136
|
-
# list :x_axis_list,
|
216
|
+
# list :x_axis_list, 'g.x-axis'
|
137
217
|
#
|
138
218
|
def self.list(element_name, locator)
|
139
219
|
class_eval(%Q(def #{element_name.to_s};@#{element_name.to_s} ||= TestCentricity::List.new(self, "#{locator}", :page);end))
|
140
220
|
end
|
141
221
|
|
222
|
+
def self.lists(element_hash)
|
223
|
+
element_hash.each do |element_name, locator|
|
224
|
+
list(element_name, locator)
|
225
|
+
end
|
226
|
+
end
|
227
|
+
|
142
228
|
# Declare and instantiate an image UI Element for this page object.
|
143
229
|
#
|
144
230
|
# @param element_name [Symbol] name of image object (as a symbol)
|
145
231
|
# @param locator [String] CSS selector or XPath expression that uniquely identifies object
|
146
232
|
# @example
|
147
|
-
# image :basket_item_image,
|
233
|
+
# image :basket_item_image, 'div.product_image'
|
148
234
|
# image :corporate_logo_image, "//img[@alt='MyCompany_logo']"
|
149
235
|
#
|
150
236
|
def self.image(element_name, locator)
|
151
237
|
class_eval(%Q(def #{element_name.to_s};@#{element_name.to_s} ||= TestCentricity::Image.new(self, "#{locator}", :page);end))
|
152
238
|
end
|
153
239
|
|
240
|
+
def self.images(element_hash)
|
241
|
+
element_hash.each do |element_name, locator|
|
242
|
+
image(element_name, locator)
|
243
|
+
end
|
244
|
+
end
|
245
|
+
|
154
246
|
# Declare and instantiate a File Field UI Element for this page object.
|
155
247
|
#
|
156
248
|
# @param element_name [Symbol] name of file field object (as a symbol)
|
157
249
|
# @param locator [String] CSS selector or XPath expression that uniquely identifies object
|
158
250
|
# @example
|
159
|
-
# filefield :attach_file,
|
251
|
+
# filefield :attach_file, 's_SweFileName'
|
160
252
|
#
|
161
253
|
def self.filefield(element_name, locator)
|
162
254
|
class_eval(%Q(def #{element_name.to_s};@#{element_name.to_s} ||= TestCentricity::FileField.new(self, "#{locator}", :page);end))
|
@@ -173,6 +265,12 @@ module TestCentricity
|
|
173
265
|
class_eval(%Q(def #{section_name.to_s};@#{section_name.to_s} ||= #{class_name.to_s}.new(self, "#{locator}", :page);end))
|
174
266
|
end
|
175
267
|
|
268
|
+
def self.sections(section_hash)
|
269
|
+
section_hash.each do |section_name, class_name|
|
270
|
+
section(section_name, class_name)
|
271
|
+
end
|
272
|
+
end
|
273
|
+
|
176
274
|
def open_portal
|
177
275
|
environment = Environ.current
|
178
276
|
environment.hostname.blank? ?
|
@@ -187,6 +285,7 @@ module TestCentricity
|
|
187
285
|
end
|
188
286
|
|
189
287
|
def verify_page_exists
|
288
|
+
raise "Page object #{self.class.name} does not have a page_locator trait defined" unless defined?(page_locator)
|
190
289
|
unless page.has_selector?(page_locator)
|
191
290
|
body_class = find(:xpath, '//body')[:class]
|
192
291
|
error_message = "Expected page to have selector '#{page_locator}' but found '#{body_class}' instead.\nURL of page loaded = #{URI.parse(current_url)}"
|
@@ -224,6 +323,7 @@ module TestCentricity
|
|
224
323
|
# home_page.exists?
|
225
324
|
#
|
226
325
|
def exists?
|
326
|
+
raise "Page object #{self.class.name} does not have a page_locator trait defined" unless defined?(page_locator)
|
227
327
|
saved_wait_time = Capybara.default_max_wait_time
|
228
328
|
Capybara.default_max_wait_time = 0.1
|
229
329
|
tries ||= 2
|
@@ -268,12 +368,8 @@ module TestCentricity
|
|
268
368
|
when :checked
|
269
369
|
actual = ui_object.checked?
|
270
370
|
when :selected
|
271
|
-
|
272
|
-
|
273
|
-
else
|
274
|
-
actual = ui_object.selected?
|
275
|
-
end
|
276
|
-
when :value
|
371
|
+
actual = ui_object.selected?
|
372
|
+
when :value, :caption
|
277
373
|
actual = ui_object.get_value
|
278
374
|
when :maxlength
|
279
375
|
actual = ui_object.get_max_length
|
@@ -284,17 +380,9 @@ module TestCentricity
|
|
284
380
|
when :placeholder
|
285
381
|
actual = ui_object.get_placeholder
|
286
382
|
when :options, :items, :list_items
|
287
|
-
|
288
|
-
actual = ui_object.get_options
|
289
|
-
else
|
290
|
-
actual = ui_object.get_list_items
|
291
|
-
end
|
383
|
+
actual = ui_object.get_list_items
|
292
384
|
when :optioncount, :itemcount
|
293
|
-
|
294
|
-
actual = ui_object.get_option_count
|
295
|
-
else
|
296
|
-
actual = ui_object.get_item_count
|
297
|
-
end
|
385
|
+
actual = ui_object.get_item_count
|
298
386
|
when :column_headers
|
299
387
|
actual = ui_object.get_header_columns
|
300
388
|
when :siebel_options
|
@@ -355,7 +443,7 @@ module TestCentricity
|
|
355
443
|
# email_field => 'p.pumperknickle4876@google.com',
|
356
444
|
# mailing_list_check => 'Yes'
|
357
445
|
# }
|
358
|
-
#
|
446
|
+
# populate_data_fields(data)
|
359
447
|
#
|
360
448
|
def populate_data_fields(data)
|
361
449
|
data.each do | data_field, data_param |
|
@@ -33,36 +33,54 @@ module TestCentricity
|
|
33
33
|
# @param locator [String] CSS selector or XPath expression that uniquely identifies object
|
34
34
|
# @example
|
35
35
|
# element :undo_record_item, "//li[@rn='Undo Record']/a"
|
36
|
-
# element :basket_header,
|
36
|
+
# element :basket_header, 'div.basket_header'
|
37
37
|
#
|
38
38
|
def self.element(element_name, locator)
|
39
39
|
class_eval(%Q(def #{element_name.to_s};@#{element_name.to_s} ||= TestCentricity::UIElement.new(self, "#{locator}", :section);end))
|
40
40
|
end
|
41
41
|
|
42
|
+
def self.elements(element_hash)
|
43
|
+
element_hash.each do |element_name, locator|
|
44
|
+
element(element_name, locator)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
42
48
|
# Declare and instantiate a button UI Element for this page section.
|
43
49
|
#
|
44
50
|
# @param element_name [Symbol] name of button object (as a symbol)
|
45
51
|
# @param locator [String] CSS selector or XPath expression that uniquely identifies object
|
46
52
|
# @example
|
47
|
-
# button :checkout_button,
|
53
|
+
# button :checkout_button, 'button.checkout_button'
|
48
54
|
# button :login_button, "//input[@id='submit_button']"
|
49
55
|
#
|
50
56
|
def self.button(element_name, locator)
|
51
57
|
class_eval(%Q(def #{element_name.to_s};@#{element_name.to_s} ||= TestCentricity::Button.new(self, "#{locator}", :section);end))
|
52
58
|
end
|
53
59
|
|
60
|
+
def self.buttons(element_hash)
|
61
|
+
element_hash.each do |element_name, locator|
|
62
|
+
button(element_name, locator)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
54
66
|
# Declare and instantiate a text field UI Element for this page section.
|
55
67
|
#
|
56
68
|
# @param element_name [Symbol] name of text field object (as a symbol)
|
57
69
|
# @param locator [String] CSS selector or XPath expression that uniquely identifies object
|
58
70
|
# @example
|
59
71
|
# textfield :user_id_field, "//input[@id='UserName']"
|
60
|
-
# textfield :password_field,
|
72
|
+
# textfield :password_field, 'input#consumer_password'
|
61
73
|
#
|
62
74
|
def self.textfield(element_name, locator)
|
63
75
|
class_eval(%Q(def #{element_name.to_s};@#{element_name.to_s} ||= TestCentricity::TextField.new(self, "#{locator}", :section);end))
|
64
76
|
end
|
65
77
|
|
78
|
+
def self.textfields(element_hash)
|
79
|
+
element_hash.each do |element_name, locator|
|
80
|
+
textfield(element_name, locator)
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
66
84
|
# Declare and instantiate a checkbox UI Element for this page section.
|
67
85
|
#
|
68
86
|
# @param element_name [Symbol] name of checkbox object (as a symbol)
|
@@ -70,12 +88,18 @@ module TestCentricity
|
|
70
88
|
# @param proxy [Symbol] Optional name (as a symbol) of proxy object to receive click actions
|
71
89
|
# @example
|
72
90
|
# checkbox :remember_checkbox, "//input[@id='RememberUser']"
|
73
|
-
# checkbox :accept_terms_checkbox,
|
91
|
+
# checkbox :accept_terms_checkbox, 'input#accept_terms_conditions', :accept_terms_label
|
74
92
|
#
|
75
93
|
def self.checkbox(element_name, locator, proxy = nil)
|
76
94
|
class_eval(%Q(def #{element_name.to_s};@#{element_name.to_s} ||= TestCentricity::CheckBox.new(self, "#{locator}", :section, #{proxy});end))
|
77
95
|
end
|
78
96
|
|
97
|
+
def self.checkboxes(element_hash)
|
98
|
+
element_hash.each do |element_name, locator|
|
99
|
+
checkbox(element_name, locator)
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
79
103
|
# Declare and instantiate a radio button UI Element for this page section.
|
80
104
|
#
|
81
105
|
# @param element_name [Symbol] name of radio object (as a symbol)
|
@@ -83,12 +107,18 @@ module TestCentricity
|
|
83
107
|
# @param proxy [Symbol] Optional name (as a symbol) of proxy object to receive click actions
|
84
108
|
# @example
|
85
109
|
# radio :accept_terms_radio, "//input[@id='Accept_Terms']"
|
86
|
-
# radio :decline_terms_radio,
|
110
|
+
# radio :decline_terms_radio, 'input#decline_terms_conditions', :decline_terms_label
|
87
111
|
#
|
88
112
|
def self.radio(element_name, locator, proxy = nil)
|
89
113
|
class_eval(%Q(def #{element_name.to_s};@#{element_name.to_s} ||= TestCentricity::Radio.new(self, "#{locator}", :section, #{proxy});end))
|
90
114
|
end
|
91
115
|
|
116
|
+
def self.radios(element_hash)
|
117
|
+
element_hash.each do |element_name, locator|
|
118
|
+
radio(element_name, locator)
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
92
122
|
# Declare and instantiate a label UI Element for this page section.
|
93
123
|
#
|
94
124
|
# @param element_name [Symbol] name of label object (as a symbol)
|
@@ -101,18 +131,30 @@ module TestCentricity
|
|
101
131
|
class_eval(%Q(def #{element_name.to_s};@#{element_name.to_s} ||= TestCentricity::Label.new(self, "#{locator}", :section);end))
|
102
132
|
end
|
103
133
|
|
134
|
+
def self.labels(element_hash)
|
135
|
+
element_hash.each do |element_name, locator|
|
136
|
+
label(element_name, locator)
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
104
140
|
# Declare and instantiate a link UI Element for this page section.
|
105
141
|
#
|
106
142
|
# @param element_name [Symbol] name of link object (as a symbol)
|
107
143
|
# @param locator [String] CSS selector or XPath expression that uniquely identifies object
|
108
144
|
# @example
|
109
|
-
# link :registration_link,
|
145
|
+
# link :registration_link, 'a.account-nav__link.register'
|
110
146
|
# link :shopping_basket_link, "//a[@href='shopping_basket']"
|
111
147
|
#
|
112
148
|
def self.link(element_name, locator)
|
113
149
|
class_eval(%Q(def #{element_name.to_s};@#{element_name.to_s} ||= TestCentricity::Link.new(self, "#{locator}", :section);end))
|
114
150
|
end
|
115
151
|
|
152
|
+
def self.links(element_hash)
|
153
|
+
element_hash.each do |element_name, locator|
|
154
|
+
link(element_name, locator)
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
116
158
|
# Declare and instantiate a table UI Element for this page section.
|
117
159
|
#
|
118
160
|
# @param element_name [Symbol] name of table object (as a symbol)
|
@@ -124,18 +166,30 @@ module TestCentricity
|
|
124
166
|
class_eval(%Q(def #{element_name.to_s};@#{element_name.to_s} ||= TestCentricity::Table.new(self, "#{locator}", :section);end))
|
125
167
|
end
|
126
168
|
|
169
|
+
def self.tables(element_hash)
|
170
|
+
element_hash.each do |element_name, locator|
|
171
|
+
table(element_name, locator)
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
127
175
|
# Declare and instantiate a select list UI Element for this page section.
|
128
176
|
#
|
129
177
|
# @param element_name [Symbol] name of select list object (as a symbol)
|
130
178
|
# @param locator [String] CSS selector or XPath expression that uniquely identifies object
|
131
179
|
# @example
|
132
|
-
# selectlist :category_selector,
|
180
|
+
# selectlist :category_selector, 'select#search_form_category_chosen'
|
133
181
|
# selectlist :gender_select, "//select[@id='customer_gender']"
|
134
182
|
#
|
135
183
|
def self.selectlist(element_name, locator)
|
136
184
|
class_eval(%Q(def #{element_name.to_s};@#{element_name.to_s} ||= TestCentricity::SelectList.new(self, "#{locator}", :section);end))
|
137
185
|
end
|
138
186
|
|
187
|
+
def self.selectlists(element_hash)
|
188
|
+
element_hash.each do |element_name, locator|
|
189
|
+
selectlist(element_name, locator)
|
190
|
+
end
|
191
|
+
end
|
192
|
+
|
139
193
|
# Declare and instantiate a list UI Element for this page section.
|
140
194
|
#
|
141
195
|
# @param element_name [Symbol] name of list object (as a symbol)
|
@@ -147,24 +201,36 @@ module TestCentricity
|
|
147
201
|
class_eval(%Q(def #{element_name.to_s};@#{element_name.to_s} ||= TestCentricity::List.new(self, "#{locator}", :section);end))
|
148
202
|
end
|
149
203
|
|
204
|
+
def self.lists(element_hash)
|
205
|
+
element_hash.each do |element_name, locator|
|
206
|
+
list(element_name, locator)
|
207
|
+
end
|
208
|
+
end
|
209
|
+
|
150
210
|
# Declare and instantiate an image UI Element for this page section.
|
151
211
|
#
|
152
212
|
# @param element_name [Symbol] name of image object (as a symbol)
|
153
213
|
# @param locator [String] CSS selector or XPath expression that uniquely identifies object
|
154
214
|
# @example
|
155
|
-
# image :basket_item_image,
|
215
|
+
# image :basket_item_image, 'div.product_image'
|
156
216
|
# image :corporate_logo_image, "//img[@alt='MyCompany_logo']"
|
157
217
|
#
|
158
218
|
def self.image(element_name, locator)
|
159
219
|
class_eval(%Q(def #{element_name.to_s};@#{element_name.to_s} ||= TestCentricity::Image.new(self, "#{locator}", :section);end))
|
160
220
|
end
|
161
221
|
|
222
|
+
def self.images(element_hash)
|
223
|
+
element_hash.each do |element_name, locator|
|
224
|
+
image(element_name, locator)
|
225
|
+
end
|
226
|
+
end
|
227
|
+
|
162
228
|
# Declare and instantiate a File Field UI Element for this page section.
|
163
229
|
#
|
164
230
|
# @param element_name [Symbol] name of file field object (as a symbol)
|
165
231
|
# @param locator [String] CSS selector or XPath expression that uniquely identifies object
|
166
232
|
# @example
|
167
|
-
# filefield :attach_file,
|
233
|
+
# filefield :attach_file, 's_SweFileName'
|
168
234
|
#
|
169
235
|
def self.filefield(element_name, locator)
|
170
236
|
class_eval(%Q(def #{element_name.to_s};@#{element_name.to_s} ||= TestCentricity::FileField.new(self, "#{locator}", :section);end))
|
@@ -181,6 +247,12 @@ module TestCentricity
|
|
181
247
|
class_eval(%Q(def #{section_name.to_s};@#{section_name.to_s} ||= #{class_name.to_s}.new(self, "#{locator}", :section);end))
|
182
248
|
end
|
183
249
|
|
250
|
+
def self.sections(section_hash)
|
251
|
+
section_hash.each do |section_name, class_name|
|
252
|
+
section(section_name, class_name)
|
253
|
+
end
|
254
|
+
end
|
255
|
+
|
184
256
|
def get_locator
|
185
257
|
(@locator.empty? && defined?(section_locator)) ? locator = section_locator : locator = @locator
|
186
258
|
(@context == :section && !@parent.nil? && !@parent.get_locator.nil?) ? "#{@parent.get_locator}|#{locator}" : locator
|
@@ -308,12 +380,8 @@ module TestCentricity
|
|
308
380
|
when :checked
|
309
381
|
actual = ui_object.checked?
|
310
382
|
when :selected
|
311
|
-
|
312
|
-
|
313
|
-
else
|
314
|
-
actual = ui_object.selected?
|
315
|
-
end
|
316
|
-
when :value
|
383
|
+
actual = ui_object.selected?
|
384
|
+
when :value, :caption
|
317
385
|
actual = ui_object.get_value
|
318
386
|
when :maxlength
|
319
387
|
actual = ui_object.get_max_length
|
@@ -324,17 +392,9 @@ module TestCentricity
|
|
324
392
|
when :placeholder
|
325
393
|
actual = ui_object.get_placeholder
|
326
394
|
when :options, :items, :list_items
|
327
|
-
|
328
|
-
actual = ui_object.get_options
|
329
|
-
else
|
330
|
-
actual = ui_object.get_list_items
|
331
|
-
end
|
395
|
+
actual = ui_object.get_list_items
|
332
396
|
when :optioncount, :itemcount
|
333
|
-
|
334
|
-
actual = ui_object.get_option_count
|
335
|
-
else
|
336
|
-
actual = ui_object.get_item_count
|
337
|
-
end
|
397
|
+
actual = ui_object.get_item_count
|
338
398
|
when :column_headers
|
339
399
|
actual = ui_object.get_header_columns
|
340
400
|
when :siebel_options
|
@@ -396,7 +456,7 @@ module TestCentricity
|
|
396
456
|
# organ_donor_check => 'Yes',
|
397
457
|
# dnr_on_file_check => 'Yes'
|
398
458
|
# }
|
399
|
-
#
|
459
|
+
# populate_data_fields(data)
|
400
460
|
#
|
401
461
|
def populate_data_fields(data)
|
402
462
|
data.each do | data_field, data_param |
|
@@ -276,6 +276,8 @@ module TestCentricity
|
|
276
276
|
end
|
277
277
|
end
|
278
278
|
|
279
|
+
alias :get_caption :get_value
|
280
|
+
|
279
281
|
def verify_value(expected, enqueue = false)
|
280
282
|
actual = get_value
|
281
283
|
enqueue ?
|
@@ -283,6 +285,8 @@ module TestCentricity
|
|
283
285
|
assert_equal(expected.strip, actual.strip, "Expected #{@locator} to display '#{expected}' but found '#{actual}'")
|
284
286
|
end
|
285
287
|
|
288
|
+
alias :verify_caption :verify_value
|
289
|
+
|
286
290
|
# Hover the cursor over an object
|
287
291
|
#
|
288
292
|
# @example
|
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: 1.0.
|
4
|
+
version: 1.0.4
|
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: 2016-08-
|
11
|
+
date: 2016-08-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|