testcentricity_web 1.0.3 → 1.0.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 828ba7ccba0258caff9d05dbc66af20c6c87a915
4
- data.tar.gz: 2a021784f3c899fdd34cebfcd490c6e44b911cfc
3
+ metadata.gz: 47950cb4c712070298ad6deb05d1b50ae5f18009
4
+ data.tar.gz: 567501e936e2fcbac0a57e1c866cb921afc5d7b2
5
5
  SHA512:
6
- metadata.gz: 2ed47cdbaa73967009d8caf713d698ed17c541f569a4385416ba78d1a3a39992a1b1701b1ff814c0d2fe57a303390f207dd4b9acb8b46fdb6aa51a52070df33b
7
- data.tar.gz: 3e30928f42b8a80a325f52b46e095cb34678183662f776cd8e27511227f80bb091f3e0da496c1e05e33fc8ee199c4b410a77740f98d39b0c4b936b92f2c705c7
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
- and Appium, and ensure that the `appium_capybara` gem is installed and required as described in **section 2.4 (Setup - Using Appium)** above.
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) for information regarding the specific capabilities.
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) for information regarding the specific capabilities.
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 information regarding the specific capabilities.
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 information regarding the specific capabilities.
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 information regarding the specific capabilities.
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 information regarding the specific capabilities.
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 regarding the specific capabilities.
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) { "/shopping_basket" }
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, "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, "consumer_password"
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, "#accept_terms_conditions", :accept_terms_label
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, "#decline_terms_conditions", :decline_terms_label
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, "a.account-nav__link.register"
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] CSS selector or XPath expression that uniquely identifies object
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, "#search_form_category_chosen"
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, "g.x-axis"
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, "div.product_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, "s_SweFileName"
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
- if ui_object.get_object_type == :selectlist
272
- actual = ui_object.get_selected_option
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
- if ui_object.get_object_type == :selectlist
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
- if ui_object.get_object_type == :selectlist
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
- # registration_page.populate_data_fields(data)
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, "div.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, "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, "#consumer_password"
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, "#accept_terms_conditions", :accept_terms_label
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, "#decline_terms_conditions", :decline_terms_label
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, "a.account-nav__link.register"
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, "#search_form_category_chosen"
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, "div.product_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, "s_SweFileName"
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
- if ui_object.get_object_type == :selectlist
312
- actual = ui_object.get_selected_option
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
- if ui_object.get_object_type == :selectlist
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
- if ui_object.get_object_type == :selectlist
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
- # patient_record_page.personal_info_widget.populate_data_fields(data)
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
@@ -1,3 +1,3 @@
1
1
  module TestCentricityWeb
2
- VERSION = '1.0.3'
2
+ VERSION = '1.0.4'
3
3
  end
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.3
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-17 00:00:00.000000000 Z
11
+ date: 2016-08-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler