testcentricity_web 4.1.10 → 4.3.1

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.
Files changed (115) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +92 -1
  3. data/README.md +301 -230
  4. data/lib/testcentricity_web/browser_helper.rb +2 -1
  5. data/lib/testcentricity_web/data_objects/environment.rb +0 -3
  6. data/lib/testcentricity_web/version.rb +1 -1
  7. data/lib/testcentricity_web/web_core/page_objects_helper.rb +39 -2
  8. data/lib/testcentricity_web/web_core/webdriver_helper.rb +162 -152
  9. data/lib/testcentricity_web/web_elements/media.rb +108 -0
  10. data/lib/testcentricity_web/web_elements/textfield.rb +28 -0
  11. data/lib/testcentricity_web/web_elements/ui_elements_helper.rb +39 -1
  12. metadata +18 -162
  13. data/.gitignore +0 -39
  14. data/.idea/.name +0 -1
  15. data/.idea/encodings.xml +0 -6
  16. data/.idea/misc.xml +0 -4
  17. data/.idea/modules.xml +0 -8
  18. data/.idea/vcs.xml +0 -7
  19. data/.rspec +0 -4
  20. data/.rubocop.yml +0 -38
  21. data/.ruby-version +0 -1
  22. data/.simplecov +0 -9
  23. data/CODE_OF_CONDUCT.md +0 -13
  24. data/Gemfile +0 -6
  25. data/Rakefile +0 -115
  26. data/config/cucumber.yml +0 -171
  27. data/config/locales/en-US.yml +0 -56
  28. data/config/test_data/LOCAL_data.json +0 -15
  29. data/config/test_data/LOCAL_data.xls +0 -0
  30. data/config/test_data/LOCAL_data.yml +0 -11
  31. data/config/test_data/data.json +0 -25
  32. data/config/test_data/data.xls +0 -0
  33. data/config/test_data/data.yml +0 -20
  34. data/docker-compose.yml +0 -48
  35. data/features/basic_form_page_css.feature +0 -54
  36. data/features/basic_form_page_xpath.feature +0 -26
  37. data/features/custom_controls.feature +0 -29
  38. data/features/media_players.feature +0 -67
  39. data/features/step_definitions/generic_steps.rb.rb +0 -124
  40. data/features/step_definitions/media_steps.rb +0 -30
  41. data/features/support/data/form_data.rb +0 -43
  42. data/features/support/env.rb +0 -53
  43. data/features/support/hooks.rb +0 -270
  44. data/features/support/pages/base_test_page.rb +0 -22
  45. data/features/support/pages/basic_css_form_page.rb +0 -57
  46. data/features/support/pages/basic_form_page.rb +0 -500
  47. data/features/support/pages/basic_xpath_form_page.rb +0 -58
  48. data/features/support/pages/custom_controls_page.rb +0 -263
  49. data/features/support/pages/indexed_sections_page.rb +0 -57
  50. data/features/support/pages/media_test_page.rb +0 -207
  51. data/features/support/sections/header_nav.rb +0 -48
  52. data/features/support/sections/product_card.rb +0 -39
  53. data/features/support/world_data.rb +0 -12
  54. data/features/support/world_pages.rb +0 -18
  55. data/reports/.keep +0 -1
  56. data/spec/fixtures/page_object.rb +0 -22
  57. data/spec/fixtures/section_object.rb +0 -21
  58. data/spec/spec_helper.rb +0 -33
  59. data/spec/testcentricity_web/browser_spec.rb +0 -41
  60. data/spec/testcentricity_web/elements/audio_spec.rb +0 -68
  61. data/spec/testcentricity_web/elements/button_spec.rb +0 -18
  62. data/spec/testcentricity_web/elements/checkbox_spec.rb +0 -33
  63. data/spec/testcentricity_web/elements/file_field_spec.rb +0 -13
  64. data/spec/testcentricity_web/elements/image_spec.rb +0 -33
  65. data/spec/testcentricity_web/elements/label_spec.rb +0 -18
  66. data/spec/testcentricity_web/elements/link_spec.rb +0 -23
  67. data/spec/testcentricity_web/elements/list_spec.rb +0 -13
  68. data/spec/testcentricity_web/elements/radio_spec.rb +0 -28
  69. data/spec/testcentricity_web/elements/ui_element_spec.rb +0 -125
  70. data/spec/testcentricity_web/elements/video_spec.rb +0 -68
  71. data/spec/testcentricity_web/helper_specs/object_helpers_spec.rb +0 -39
  72. data/spec/testcentricity_web/helper_specs/string_helpers_spec.rb +0 -49
  73. data/spec/testcentricity_web/page_object_spec.rb +0 -90
  74. data/spec/testcentricity_web/section_object_spec.rb +0 -72
  75. data/spec/testcentricity_web/version_spec.rb +0 -7
  76. data/spec/testcentricity_web/webdriver_connect/grid_webdriver_spec.rb +0 -72
  77. data/spec/testcentricity_web/webdriver_connect/local_webdriver_spec.rb +0 -86
  78. data/spec/testcentricity_web/webdriver_connect/mobile_webdriver_spec.rb +0 -65
  79. data/test_site/basic_test_page.html +0 -269
  80. data/test_site/chosen/chosen-sprite.png +0 -0
  81. data/test_site/chosen/chosen-sprite@2x.png +0 -0
  82. data/test_site/chosen/chosen.css +0 -496
  83. data/test_site/chosen/chosen.jquery.js +0 -1359
  84. data/test_site/chosen/chosen.jquery.min.js +0 -3
  85. data/test_site/chosen/chosen.min.css +0 -11
  86. data/test_site/chosen/chosen.proto.js +0 -1399
  87. data/test_site/chosen/chosen.proto.min.js +0 -3
  88. data/test_site/chosen/composer.json +0 -36
  89. data/test_site/custom_controls_page.html +0 -629
  90. data/test_site/docsupport/chosen.png +0 -0
  91. data/test_site/docsupport/init.js +0 -11
  92. data/test_site/docsupport/init.proto.js +0 -16
  93. data/test_site/docsupport/jquery-1.12.4.min.js +0 -5
  94. data/test_site/docsupport/jquery-3.2.1.min.js +0 -4
  95. data/test_site/docsupport/oss-credit.png +0 -0
  96. data/test_site/docsupport/prism.css +0 -108
  97. data/test_site/docsupport/prism.js +0 -9
  98. data/test_site/docsupport/prototype-1.7.0.0.js +0 -6082
  99. data/test_site/docsupport/style.css +0 -219
  100. data/test_site/images/Blouse_Black.jpg +0 -0
  101. data/test_site/images/Granny.jpg +0 -0
  102. data/test_site/images/Printed_Dress.jpg +0 -0
  103. data/test_site/images/T-shirt.jpg +0 -0
  104. data/test_site/images/Wilder.jpg +0 -0
  105. data/test_site/images/You_Betcha.jpg +0 -0
  106. data/test_site/images/jeans3.jpg +0 -0
  107. data/test_site/indexed_sections_page.html +0 -215
  108. data/test_site/media/MIB2-subtitles-pt-BR.vtt +0 -49
  109. data/test_site/media/MIB2.mp4 +0 -0
  110. data/test_site/media/MP4_small.mp4 +0 -0
  111. data/test_site/media/MPS_sample.mp3 +0 -0
  112. data/test_site/media/bbc_scotland_report.mp3 +0 -0
  113. data/test_site/media/count_and_bars.mp4 +0 -0
  114. data/test_site/media_page.html +0 -86
  115. data/testcentricity_web.gemspec +0 -59
data/README.md CHANGED
@@ -1,18 +1,21 @@
1
1
  # TestCentricity™ Web
2
2
 
3
3
  [![Gem Version](https://badge.fury.io/rb/testcentricity_web.svg)](https://badge.fury.io/rb/testcentricity_web) [![License (3-Clause BSD)](https://img.shields.io/badge/license-BSD%203--Clause-blue.svg?style=flat-square)](http://opensource.org/licenses/BSD-3-Clause)
4
+ ![Gem Downloads](https://img.shields.io/gem/dt/testcentricity_web) ![Maintained](https://img.shields.io/maintenance/yes/2022)
4
5
 
5
6
 
6
- The TestCentricity™ Web core generic framework for desktop and mobile web browser-based app testing implements a Page Object Model DSL
7
- for use with Cucumber, Capybara (version 3.x), and Selenium-Webdriver (version 4.x). It also facilitates the configuration of the appropriate
8
- Selenium-Webdriver capabilities required to establish a connection with a local or cloud hosted desktop or mobile web browser.
7
+ The TestCentricity™ Web core framework for desktop and mobile web browser-based app testing implements a Page Object Model
8
+ DSL for use with Cucumber (version 7.x or greater), Capybara (version 3.37), and Selenium-Webdriver (version 4.3). It also
9
+ facilitates the configuration of the appropriate Selenium-Webdriver capabilities required to establish a connection with a
10
+ local or cloud hosted desktop or mobile web browser.
9
11
 
10
12
  The TestCentricity™ Web gem supports running automated tests against the following web test targets:
11
13
  * locally hosted desktop browsers (Chrome, Edge, Firefox, Safari, or IE)
12
14
  * locally hosted "headless" Chrome, Firefox, or Edge browsers
15
+ *
13
16
  * remote desktop and emulated mobile web browsers hosted on Selenium Grid 4 and Dockerized Selenium Grid 4 environments
14
- * mobile Safari browsers on iOS device simulators or physical iOS devices (using Appium and XCode on OS X)
15
- * mobile Chrome or Android browsers on Android Studio virtual device emulators (using Appium and Android Studio on OS X)
17
+ * mobile Safari browsers on iOS device simulators or physical iOS devices (using Appium and XCode on macOS)
18
+ * mobile Chrome or Android browsers on Android Studio virtual device emulators (using Appium and Android Studio on macOS)
16
19
  * cloud hosted desktop (Firefox, Chrome, Safari, IE, or Edge) or mobile (iOS Mobile Safari or Android) web browsers using the following service:
17
20
  * [Browserstack](https://www.browserstack.com/list-of-browsers-and-platforms?product=automate)
18
21
  * [Sauce Labs](https://saucelabs.com/open-source#automated-testing-platform)
@@ -29,13 +32,14 @@ A complete history of bug fixes and new features can be found in the {file:CHANG
29
32
 
30
33
  The RubyDocs for this gem can be found [here](https://www.rubydoc.info/gems/testcentricity_web).
31
34
 
32
- An example project that demonstrates the implementation of a page object model framework using Cucumber and TestCentricity™
35
+ An example project that demonstrates the implementation of a page object model framework using Cucumber and TestCentricity™ Web
33
36
  can be found [here](https://github.com/TestCentricity/tc_web_sample).
34
37
 
35
38
 
36
39
  ## Installation
37
40
 
38
- TestCentricity version 4.1 and above requires Ruby 2.7 or later. To install the TestCentricity gem, add this line to your automation project's Gemfile:
41
+ TestCentricity Web version 4.1 and above requires Ruby 2.7.5 or later. To install the TestCentricity Web gem, add this line
42
+ to your automation project's Gemfile:
39
43
 
40
44
  gem 'testcentricity_web'
41
45
 
@@ -59,7 +63,7 @@ If you are using Cucumber, you need to require the following in your `env.rb` fi
59
63
 
60
64
  ### Using RSpec
61
65
 
62
- If you are using RSpec instead, you need to require the following in your `env.rb` file:
66
+ If you are using RSpec instead, you need to require the following in your `spec_helper.rb` file:
63
67
 
64
68
  require 'capybara'
65
69
  require 'capybara/rspec'
@@ -68,8 +72,8 @@ If you are using RSpec instead, you need to require the following in your `env.r
68
72
 
69
73
  ### Using Appium
70
74
 
71
- If you will be running your tests on mobile Safari browsers on simulated iOS devices using Appium and XCode Simulators, you need to require
72
- the following in your `env.rb` file:
75
+ If you will be running your tests on mobile Safari browsers on simulated iOS devices using Appium and XCode Simulators, you
76
+ need to require the following in your `env.rb` and/or `spec_helper.rb` file:
73
77
 
74
78
  require 'appium_capybara'
75
79
 
@@ -84,21 +88,23 @@ And then execute:
84
88
 
85
89
  ## PageObjects
86
90
 
87
- The **Page Object Model** is a test automation pattern that aims to create an abstraction of your web app's User Interface that can be used
88
- in tests. A **Page Object** is an object that represents a single page in your AUT (Application Under Test). **Page Objects** encapsulate the
89
- implementation details of a web page and expose an API that supports interaction with, and validation of the UI elements on the page.
91
+ The **Page Object Model** is a test automation pattern that aims to create an abstraction of your web app's User Interface
92
+ that can be used in tests. A **Page Object** represents a single page in your AUT (Application Under Test). **Page Objects**
93
+ encapsulate the implementation details of a web page and expose an API that supports interaction with, and validation of
94
+ the UI elements on the page.
90
95
 
91
- **Page Objects** makes it easier to maintain automated tests because changes to page UI elements are updated in only one location - in the
92
- **Page Object** class definition. By adopting a **Page Object Model**, Cucumber Feature files and step definitions are no longer required to
93
- hold specific information about a page's UI objects, thus minimizing maintenance requirements. If any element on, or property of a page changes
94
- (URL path, text field attributes, button captions, etc.), maintenance is performed in the `PageObject` class definition only, typically with
95
- no need to update the affected feature file, scenarios, or step definitions.
96
+ **Page Objects** makes it easier to maintain automated tests because changes to page UI elements are updated in only one
97
+ location - in the **Page Object** class definition. By adopting a **Page Object Model**, Cucumber Feature files and step
98
+ definitions are no longer required to hold specific information about a page's UI objects, thus minimizing maintenance
99
+ requirements. If any element on, or property of a page changes (URL path, text field attributes, button captions, etc.),
100
+ maintenance is performed in the `PageObject` class definition only, typically with no need to update the affected feature
101
+ file, scenarios, or step definitions.
96
102
 
97
103
 
98
104
  ### Defining a PageObject
99
105
 
100
- Your `PageObject` class definitions should be contained within individual `.rb` files in the `features/support/pages` folder of your
101
- test automation project. You define new `PageObjects` as shown below:
106
+ Your `PageObject` class definitions should be contained within individual `.rb` files in the `features/support/pages` folder
107
+ of your test automation project. You define new `PageObjects` as shown below:
102
108
 
103
109
  class LoginPage < TestCentricity::PageObject
104
110
  end
@@ -114,25 +120,25 @@ test automation project. You define new `PageObjects` as shown below:
114
120
 
115
121
  ### Adding Traits to your PageObject
116
122
 
117
- Web pages typically have names and URLs associated with them. Web pages also typically have a unique object or attribute that, when present,
118
- indicates that the page's contents have fully loaded.
123
+ Web pages typically have names and URLs associated with them. Web pages also typically have a unique object or attribute
124
+ that, when present, indicates that the page's contents have fully loaded.
119
125
 
120
- The `page_name` trait is registered with the `PageManager` object, which includes a `find_page` method that takes a page name as a
121
- parameter and returns an instance of the associated `Page Object`. If you intend to use the `PageManager`, you must define a `page_name`
122
- trait for each `PageObject` to be registered.
126
+ The `page_name` trait is registered with the `PageManager` object, which includes a `find_page` method that takes a page
127
+ name as a parameter and returns an instance of the associated `PageObject`. If you intend to use the `PageManager`, you
128
+ must define a `page_name` trait for each `PageObject` to be registered.
123
129
 
124
- The `page_name` trait is usually a `String` value that represents the name of the page that will be matched by the `PageManager.findpage` method.
125
- `page_name` traits are case and white-space sensitive. For pages that may be referenced with multiple names, the `page_name` trait may also be
126
- an `Array` of `String` values representing those page names.
130
+ The `page_name` trait is usually a `String` value that represents the name of the page that will be matched by the `PageManager.findpage`
131
+ method. `page_name` traits are case and white-space sensitive. For pages that may be referenced with multiple names, the
132
+ `page_name` trait may also be an `Array` of `String` values representing those page names.
127
133
 
128
- 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
129
- when calling the `WebDriverConnect.initialize_web_driver` method, then your `page_url` trait can be the relative URL slug that will
130
- be appended to the base URL specified in `app_host`. Specifying a `page_url` trait is optional, as not all web pages can be directly loaded
131
- via a URL.
134
+ A `page_locator` trait is defined if a page has a unique object or attribute that exists once the page's contents have fully
135
+ loaded. The `page_locator` trait is a CSS or Xpath expression that uniquely identifies the object or attribute. The
136
+ `verify_page_exists` method waits for the `page_locator` trait to exist.
132
137
 
133
- A `page_locator` trait is defined if a page has a unique object or attribute that exists once the page's contents have fully loaded. The
134
- `page_locator` trait is a CSS or Xpath expression that uniquely identifies the object or attribute. The `verify_page_exists` method waits
135
- for the `page_locator` trait to exist.
138
+ 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
139
+ specify a base URL when calling the `WebDriverConnect.initialize_web_driver` method, then your `page_url` trait can be the
140
+ relative URL slug that will be appended to the base URL specified in `app_host`. Specifying a `page_url` trait is optional,
141
+ as not all web pages can be directly loaded via a URL.
136
142
 
137
143
  You define your page's **Traits** as shown below:
138
144
 
@@ -202,9 +208,9 @@ Web pages are made up of UI elements like text fields, check boxes, combo boxes,
202
208
 
203
209
  ### Adding Methods to your PageObject
204
210
 
205
- It is good practice for your Cucumber step definitions to call high level methods in your your `PageObject` instead of directly accessing
206
- and interacting with a page object's UI elements. You can add high level methods to your `PageObject` class definition for interacting with
207
- the UI to hide implementation details, as shown below:
211
+ It is good practice for your Cucumber step definitions to call high level methods in your your `PageObject` instead of
212
+ directly accessing and interacting with a page object's UI elements. You can add high level methods to your `PageObject`
213
+ class definition for interacting with the UI to hide implementation details, as shown below:
208
214
 
209
215
  class LoginPage < TestCentricity::PageObject
210
216
  trait(:page_name) { 'Login' }
@@ -301,9 +307,10 @@ Once your `PageObjects` have been instantiated, you can call your methods as sho
301
307
 
302
308
  ## PageSections
303
309
 
304
- A `PageSection` is a collection of **UI Elements** that may appear in multiple locations on a page, or on multiple pages in a web
305
- app. It is a collection of **UI Elements** that represent a conceptual area of functionality, like a navigation bar, a search capability,
306
- or a menu. **UI Elements** and functional behavior are confined to the scope of a `PageSection` object.
310
+ A `PageSection` is a collection of **UI Elements** that may appear in multiple locations on a page, or on multiple pages
311
+ in a web app. It is a collection of **UI Elements** that represent a conceptual area of functionality, like a navigation
312
+ bar, a search capability, or a menu. **UI Elements** and functional behavior are confined to the scope of a `PageSection`
313
+ object.
307
314
 
308
315
  <img src="https://i.imgur.com/BTgi59R.jpg" alt="Navigation Header" title="Navigation Header">
309
316
 
@@ -317,8 +324,8 @@ A `PageSection` may contain other `PageSection` objects.
317
324
 
318
325
  ### Defining a PageSection
319
326
 
320
- Your `PageSection` class definitions should be contained within individual `.rb` files in the `features/support/sections` folder of
321
- your test automation project. You define new `PageSection` as shown below:
327
+ Your `PageSection` class definitions should be contained within individual `.rb` files in the `features/support/sections`
328
+ folder of your test automation project. You define new `PageSection` as shown below:
322
329
 
323
330
  class SearchForm < TestCentricity::PageSection
324
331
  end
@@ -339,8 +346,8 @@ You define your section's **Traits** as shown below:
339
346
 
340
347
  ### Adding UI Elements to your PageSection
341
348
 
342
- `PageSections` are typically made up of UI elements like text fields, check boxes, combo boxes, radio buttons, tables, lists, buttons, etc.
343
- **UI Elements** are added to your `PageSection` class definition as shown below:
349
+ `PageSections` are typically made up of UI elements like text fields, check boxes, combo boxes, radio buttons, tables, lists,
350
+ buttons, etc. **UI Elements** are added to your `PageSection` class definition as shown below:
344
351
 
345
352
  class SearchForm < TestCentricity::PageSection
346
353
  trait(:section_locator) { 'form#gnav-search' }
@@ -387,28 +394,27 @@ You add a `PageSection` to its associated `PageObject` as shown below:
387
394
  Once your `PageObject` has been instantiated, you can call its `PageSection` methods as shown below:
388
395
 
389
396
  home_page.search_form.search_for('ocarina')
390
-
391
-
397
+
392
398
 
393
399
  ## UIElements
394
400
 
395
- `PageObjects` and `PageSections` are typically made up of **UI Element** like text fields, check boxes, select lists (combo boxes),
396
- radio buttons, tables, ordered and unordered lists, buttons, images, HTML5 video objects, HTML5 audio objects, etc. **UI Elements** are declared
397
- and instantiated within the class definition of the `PageObject` or `PageSection` in which they are contained. With TestCentricity Web,
398
- all UI elements are based on the `UIElement` class.
401
+ `PageObjects` and `PageSections` are typically made up of **UI Element** like text fields, check boxes, select lists (combo
402
+ boxes), radio buttons, tables, ordered and unordered lists, buttons, images, HTML5 video objects, HTML5 audio objects, etc.
403
+ **UI Elements** are declared and instantiated within the class definition of the `PageObject` or `PageSection` in which they
404
+ are contained. With TestCentricity Web, all UI elements are based on the `UIElement` class.
399
405
 
400
406
 
401
407
  ### Declaring and Instantiating UIElements
402
408
 
403
409
  Single `UIElement` declarations have the following format:
404
410
 
405
- elementType :element Name, locator
411
+ elementType :elementName, locator
406
412
 
407
- * The `element name` is the unique name that you will use to refer to the UI element and is specified as a `Symbol`.
413
+ * The `elementName` is the unique name that you will use to refer to the UI element and is specified as a `Symbol`.
408
414
  * The `locator` is the CSS or XPath attribute that uniquely and unambiguously identifies the `UIElement`.
409
415
 
410
- Multiple `UIElement` declarations for a collection of elements of the same type can be performed by passing a hash table containing the
411
- names and locators of each individual element.
416
+ Multiple `UIElement` declarations for a collection of elements of the same type can be performed by passing a hash table
417
+ containing the names and locators of each individual element.
412
418
 
413
419
  ### Example UIElement Declarations
414
420
 
@@ -474,9 +480,10 @@ Supported `UIElement` elementTypes and their declarations have the following for
474
480
  end
475
481
 
476
482
 
477
- Refer to the Class List documentation for the `PageObject` and `PageSection` classes for details on the class methods used for declaring
478
- and instantiating `UIElements`. Examples of UI element declarations can be found in the ***Adding UI Elements to your Page Object*** and
479
- ***Adding UI Elements to your PageSection Object*** sections above.
483
+ Refer to the Class List documentation for the `PageObject` and `PageSection` classes for details on the class methods used
484
+ for declaring and instantiating `UIElements`. Examples of UI element declarations can be found in the ***Adding UI Elements
485
+ to your PageObject*** and
486
+ ***Adding UI Elements to your PageSection*** sections above.
480
487
 
481
488
 
482
489
  ### UIElement Inherited Methods
@@ -526,8 +533,10 @@ With TestCentricity, all UI elements are based on the `UIElement` class, and inh
526
533
  element.wait_until_gone(seconds)
527
534
  element.wait_until_visible(seconds)
528
535
  element.wait_until_hidden(seconds)
536
+ element.wait_until_enabled(seconds)
529
537
  element.wait_until_value_is(value, seconds)
530
538
  element.wait_until_value_changes(seconds)
539
+ element.wait_while_busy(seconds)
531
540
 
532
541
  **WAI-ARIA Object Accessibility (A11y) methods:**
533
542
 
@@ -567,24 +576,26 @@ With TestCentricity, all UI elements are based on the `UIElement` class, and inh
567
576
 
568
577
  ### Populating your PageObject or PageSection with data
569
578
 
570
- A typical automated test may be required to perform the entry of test data by interacting with various `UIElements` on your `PageObject` or
571
- `PageSection`. This data entry can be performed using the various object action methods (listed above) for each `UIElement` that needs to be
572
- interacted with.
579
+ A typical automated test may be required to perform the entry of test data by interacting with various `UIElements` on your
580
+ `PageObject` or `PageSection`. This data entry can be performed using the various object action methods (listed above) for
581
+ each `UIElement` that needs to be interacted with.
573
582
 
574
- The `PageObject.populate_data_fields` and `PageSection.populate_data_fields` methods support the entry of test data into a collection of
575
- `UIElements`. The `populate_data_fields` method accepts a hash containing key/hash pairs of `UIElements` and their associated data to be
576
- entered. Data values must be in the form of a `String` for `textfield`, `selectlist`, and `filefield` controls. For `checkbox` and `radio`
577
- controls, data must either be a `Boolean` or a `String` that evaluates to a `Boolean` value (Yes, No, 1, 0, true, false). For `range` controls,
578
- data must be an `Integer`. For `input(type='color')` color picker controls, which are specified as a `textfield`, data must be in the form
579
- of a hex color `String`. For `section` objects, data values must be a `String`, and the `section` object must have a `set` method defined.
583
+ The `PageObject.populate_data_fields` and `PageSection.populate_data_fields` methods support the entry of test data into a
584
+ collection of `UIElements`. The `populate_data_fields` method accepts a hash containing key/hash pairs of `UIElements` and
585
+ their associated data to be entered. Data values must be in the form of a `String` for `textfield`, `selectlist`, and `filefield`
586
+ controls. For `checkbox` and `radio` controls, data must either be a `Boolean` or a `String` that evaluates to a `Boolean`
587
+ value (Yes, No, 1, 0, true, false). For `range` controls, data must be an `Integer`. For `input(type='color')` color picker
588
+ controls, which are specified as a `textfield`, data must be in the form of a hex color `String`. For `section` objects, data
589
+ values must be a `String`, and the `section` object must have a `set` method defined.
580
590
 
581
- The `populate_data_fields` method verifies that data attributes associated with each `UIElement` is not `nil` or `empty` before attempting to
582
- enter data into the `UIElement`.
591
+ The `populate_data_fields` method verifies that data attributes associated with each `UIElement` is not `nil` or `empty`
592
+ before attempting to enter data into the `UIElement`.
583
593
 
584
- The optional `wait_time` parameter is used to specify the time (in seconds) to wait for each `UIElement` to become become viable for data entry
585
- (the `UIElement` must be visible and enabled) before entering the associated data value. This option is useful in situations where entering data,
586
- or setting the state of a `UIElement` might cause other `UIElements` to become visible or active. Specifying a wait_time value ensures that the
587
- subsequent `UIElements` will be ready to be interacted with as states are changed. If the wait time is `nil`, then the wait time will be 5 seconds.
594
+ The optional `wait_time` parameter is used to specify the time (in seconds) to wait for each `UIElement` to become viable
595
+ for data entry (the `UIElement` must be visible and enabled) before entering the associated data value. This option is useful
596
+ in situations where entering data, or setting the state of a `UIElement` might cause other `UIElements` to become visible
597
+ or active. Specifying a wait_time value ensures that the subsequent `UIElements` will be ready to be interacted with as
598
+ states are changed. If the wait time is `nil`, then the wait time will be 5 seconds.
588
599
 
589
600
  def enter_data(user_data)
590
601
  fields = {
@@ -602,14 +613,14 @@ subsequent `UIElements` will be ready to be interacted with as states are change
602
613
 
603
614
  ### Verifying UIElements on your PageObject or PageSection
604
615
 
605
- A typical automated test executes one or more interactions with the user interface, and then performs a validation to verify whether
606
- the expected state of the UI has been achieved. This verification can be performed using the various object state methods (listed above)
607
- for each `UIElement` that requires verification. Depending on the complexity and number of `UIElements` to be verified, the code required to
608
- verify the presence of `UIElements` and their correct states can become cumbersome.
616
+ A typical automated test executes one or more interactions with the user interface, and then performs a validation to verify
617
+ whether the expected state of the UI has been achieved. This verification can be performed using the various object state
618
+ methods (listed above) for each `UIElement` that requires verification. Depending on the complexity and number of `UIElements`
619
+ to be verified, the code required to verify the presence of `UIElements` and their correct states can become cumbersome.
609
620
 
610
- The `PageObject.verify_ui_states` and `PageSection.verify_ui_states` methods support the verification of multiple properties of multiple
611
- UI elements on a `PageObject` or `PageSection`. The `verify_ui_states` method accepts a hash containing key/hash pairs of UI
612
- elements and their properties or attributes to be verified.
621
+ The `PageObject.verify_ui_states` and `PageSection.verify_ui_states` methods support the verification of multiple properties
622
+ of multiple UI elements on a `PageObject` or `PageSection`. The `verify_ui_states` method accepts a hash containing key/hash
623
+ pairs of UI elements and their properties or attributes to be verified.
613
624
 
614
625
  ui = {
615
626
  object1 => { property: state },
@@ -618,9 +629,9 @@ elements and their properties or attributes to be verified.
618
629
  }
619
630
  verify_ui_states(ui)
620
631
 
621
- The `verify_ui_states` method queues up any exceptions that occur while verifying each object's properties until all `UIElements` and their
622
- properties have been checked, and then posts any exceptions encountered upon completion. Posted exceptions include a screenshot with a red
623
- dashed highlight around the UI element that did not match the expected results.
632
+ The `verify_ui_states` method queues up any exceptions that occur while verifying each object's properties until all `UIElements`
633
+ and their properties have been checked, and then posts any exceptions encountered upon completion. Posted exceptions include
634
+ a screenshot with a red dashed highlight around the UI element that did not match the expected results.
624
635
 
625
636
  The `verify_ui_states` method supports the following property/state pairs:
626
637
 
@@ -659,6 +670,21 @@ The `verify_ui_states` method supports the following property/state pairs:
659
670
  :max Integer
660
671
  :step Integer
661
672
 
673
+ Text Field Constraint validation
674
+
675
+ :validation_message String
676
+ :badInput Boolean
677
+ :customError Boolean
678
+ :patternMismatch Boolean
679
+ :rangeOverflow Boolean
680
+ :rangeUnderflow Boolean
681
+ :stepMismatch Boolean
682
+ :tooLong Boolean
683
+ :tooShort Boolean
684
+ :typeMismatch Boolean
685
+ :valid Boolean
686
+ :valueMissing Boolean
687
+
662
688
  **Checkboxes:**
663
689
 
664
690
  :checked Boolean
@@ -722,6 +748,13 @@ The `verify_ui_states` method supports the following property/state pairs:
722
748
  :volume Float
723
749
  :preload String
724
750
  :poster String
751
+ :track_count Integer
752
+ :active_track Integer
753
+ :active_track_data Hash
754
+ :all_tracks_data Array of Hash
755
+ :track_data Hash
756
+ :active_track_source String
757
+ :track_source String
725
758
 
726
759
  #### ARIA accessibility property/state pairs
727
760
 
@@ -740,6 +773,7 @@ The `verify_ui_states` method supports the following ARIA accessibility property
740
773
  :aria_checked Boolean
741
774
  :aria_readonly Boolean
742
775
  :aria_pressed Boolean
776
+ :aria_busy Boolean
743
777
  :aria_haspopup Boolean
744
778
  :aria_sort String
745
779
  :aria_rowcount String
@@ -867,18 +901,18 @@ Baseline translation strings are stored in `.yml` files in the `config/locales/`
867
901
 
868
902
  ### Working with custom UIElements
869
903
 
870
- Many responsive and touch-enabled web based user interfaces are implemented using front-end JavaScript libraries for building user
871
- interfaces based on UI components. Popular JS libraries include React, Angular, and Ember.js. These stylized and adorned controls can
872
- present a challenge when attempting to interact with them using Capybara and Selenium based automated tests.
904
+ Many responsive and touch-enabled web based user interfaces are implemented using front-end JavaScript libraries for building
905
+ user interfaces based on UI components. Popular JS libraries include React, Angular, and Ember.js. These stylized and adorned
906
+ controls can present a challenge when attempting to interact with them using Capybara and Selenium based automated tests.
873
907
 
874
908
  #### Radio and Checkbox UIElements
875
909
 
876
- Sometimes, radio buttons and checkboxes implemented using JS component libraries cannot be interacted with due to other UI elements
877
- being overlaid on top of them and the base `input(type='radio')` or `input(type='checkbox')` element not being visible.
910
+ Sometimes, radio buttons and checkboxes implemented using JS component libraries cannot be interacted with due to other UI
911
+ elements being overlaid on top of them and the base `input(type='radio')` or `input(type='checkbox')` element not being visible.
878
912
 
879
- In the screenshots below of an airline flight search and booking page, the **Roundtrip** and **One-way** radio buttons are adorned by
880
- `label` elements that also acts as proxies for their associated `input(type='radio')` elements, and they intercept the `click` actions
881
- that would normally be handled by the `input(type='radio')` elements.
913
+ In the screenshots below of an airline flight search and booking page, the **Roundtrip** and **One-way** radio buttons are
914
+ adorned by `label` elements that also acts as proxies for their associated `input(type='radio')` elements, and they intercept
915
+ the `click` actions that would normally be handled by the `input(type='radio')` elements.
882
916
 
883
917
  <img src="https://i.imgur.com/7bW5u4c.jpg" alt="Roundtrip Radio button Input" title="Roundtrip Radio button Input">
884
918
 
@@ -977,19 +1011,19 @@ as element locators.
977
1011
  #### List UIElements
978
1012
 
979
1013
  The basic HTML list is typically composed of the parent `ul` object, and one or more `li` elements representing the items
980
- in the list. However, list controls implemented using JS component libraries can be composed of multiple elements representing the
981
- components of a list implementation.
1014
+ in the list. However, list controls implemented using JS component libraries can be composed of multiple elements representing
1015
+ the components of a list implementation.
982
1016
 
983
- The `List.define_list_elements` method provides a means of specifying the elements that make up the key components of a `list` control.
984
- The method accepts a hash of element designators (key) and a CSS or Xpath expression (value) that expression that uniquely identifies
985
- the element. Valid element designators are `list_item:`and `selected_item:`.
1017
+ The `List.define_list_elements` method provides a means of specifying the elements that make up the key components of a `list`
1018
+ control. The method accepts a hash of element designators (key) and a CSS or Xpath expression (value) that expression that
1019
+ uniquely identifies the element. Valid element designators are `list_item:`and `selected_item:`.
986
1020
 
987
1021
 
988
1022
  ## Instantiating your PageObjects
989
1023
 
990
1024
  Before you can call the methods in your `PageObjects` and `PageSections`, you must instantiate the `PageObjects` of your web
991
- application, as well as create instance variables which can be used when calling a `PageObject`'s methods from your step definitions.
992
- There are several ways to instantiate your `PageObjects`.
1025
+ application, as well as create instance variables which can be used when calling a `PageObject`'s methods from your step
1026
+ definitions. There are several ways to instantiate your `PageObjects`.
993
1027
 
994
1028
  One common implementation is shown below:
995
1029
 
@@ -1013,17 +1047,17 @@ One common implementation is shown below:
1013
1047
 
1014
1048
  World(WorldPages)
1015
1049
 
1016
- The `WorldPages` module above can be defined in your `env.rb` file, or you can define it in a separate `world_pages.rb` file in the
1017
- `features/support` folder.
1050
+ The `WorldPages` module above can be defined in your `env.rb` file, or you can define it in a separate `world_pages.rb` file
1051
+ in the `features/support` folder.
1018
1052
 
1019
- While this approach is effective for small web applications with only a few pages (and hence few `PageObjects`), it quickly becomes
1020
- cumbersome to manage if your web application has dozens of `PageObjects` that need to be instantiated and managed.
1053
+ While this approach is effective for small web applications with only a few pages (and hence few `PageObjects`), it quickly
1054
+ becomes cumbersome to manage if your web application has dozens of `PageObjects` that need to be instantiated and managed.
1021
1055
 
1022
1056
  ### Using the PageManager
1023
1057
 
1024
- The `PageManager` class provides methods for supporting the instantiation and management of `PageObjects`. In the code example below,
1025
- the `page_objects` method contains a hash table of your `PageObject` instances and their associated `PageObject` class names to be
1026
- instantiated by `PageManager`:
1058
+ The `PageManager` class provides methods for supporting the instantiation and management of `PageObjects`. In the code example
1059
+ below, the `page_objects` method contains a hash table of your `PageObject` instances and their associated `PageObject` classes
1060
+ to be instantiated by `PageManager`:
1027
1061
 
1028
1062
  module WorldPages
1029
1063
  def page_objects
@@ -1053,8 +1087,8 @@ instantiated by `PageManager`:
1053
1087
 
1054
1088
  The `WorldPages` module above should be defined in the `world_pages.rb` file in the `features/support` folder.
1055
1089
 
1056
- Include the code below in your `env.rb` file to ensure that your `PageObjects` are instantiated before your Cucumber scenarios are
1057
- executed:
1090
+ Include the code below in your `env.rb` file to ensure that your `PageObjects` are instantiated before your Cucumber scenarios
1091
+ are executed:
1058
1092
 
1059
1093
  include WorldPages
1060
1094
  WorldPages.instantiate_page_objects
@@ -1064,8 +1098,8 @@ executed:
1064
1098
 
1065
1099
  ### Leveraging the PageManager in your Cucumber tests
1066
1100
 
1067
- Many Cucumber based automated tests suites include scenarios that verify that web pages are correctly loaded, displayed, or can be
1068
- navigated to by clicking associated links. One such Cucumber navigation scenario is displayed below:
1101
+ Many Cucumber based automated tests suites include scenarios that verify that web pages are correctly loaded, displayed, or
1102
+ can be navigated to by clicking associated links. One such Cucumber navigation scenario is displayed below:
1069
1103
 
1070
1104
  Scenario Outline: Verify Home page navigation links
1071
1105
  Given I am on the Home page
@@ -1081,8 +1115,8 @@ navigated to by clicking associated links. One such Cucumber navigation scenario
1081
1115
  |FAQs |
1082
1116
  |Contact Us |
1083
1117
 
1084
- In the above example, the step definitions associated with the 3 steps might be implemented using a `page_dispatcher` method using a
1085
- `case` statement to parse the `page` parameter as in the example below:
1118
+ In the above example, the step definitions associated with the 3 steps might be implemented using a `page_dispatcher` method
1119
+ using a `case` statement to parse the `page` parameter as in the example below:
1086
1120
 
1087
1121
  Given(/^I am on the (.*) page$/) do |page_name|
1088
1122
  target_page = page_dispatcher(page_name)
@@ -1121,14 +1155,15 @@ In the above example, the step definitions associated with the 3 steps might be
1121
1155
  end
1122
1156
 
1123
1157
 
1124
- While this approach may be effective for small web applications with only a few pages (and hence few `PageObjects`), it quickly becomes
1125
- cumbersome to manage if your web application has dozens of `PageObjects` that need to be managed.
1158
+ While this approach may be effective for small web applications with only a few pages (and hence few `PageObjects`), it quickly
1159
+ becomes cumbersome to manage if your web application has dozens of `PageObjects` that need to be managed.
1126
1160
 
1127
- The `PageManager` class provides a `find_page` method that replaces the cumbersome and difficult to maintain `case` statement used in the
1128
- above example. The `PageManager.current_page` method allows you to set or get an instance of the currently active Page Object.
1161
+ The `PageManager` class provides a `find_page` method that replaces the cumbersome and difficult to maintain `case` statement
1162
+ used in the above example. The `PageManager.current_page` method allows you to set or get an instance of the currently active
1163
+ Page Object.
1129
1164
 
1130
- To use these `PageManager` methods, include the step definitions and code below in a `page_steps.rb` or `generic_steps.rb` file in the
1131
- `features/step_definitions` folder:
1165
+ To use these `PageManager` methods, include the step definitions and code below in a `page_steps.rb` or `generic_steps.rb` file
1166
+ in the `features/step_definitions` folder:
1132
1167
 
1133
1168
  include TestCentricity
1134
1169
 
@@ -1157,28 +1192,29 @@ To use these `PageManager` methods, include the step definitions and code below
1157
1192
 
1158
1193
  ## Connecting to a Web Browser
1159
1194
 
1160
- The `TestCentricity::WebDriverConnect.initialize_web_driver` method configures the appropriate Selenium-Webdriver capabilities required to
1161
- establish a connection with a target web browser, and sets the base host URL of the web site you are running your tests against.
1195
+ The `TestCentricity::WebDriverConnect.initialize_web_driver` method configures the appropriate Selenium-Webdriver capabilities
1196
+ required to establish a connection with a target web browser, and sets the base host URL of the web site you are running your
1197
+ tests against.
1162
1198
 
1163
- The `TestCentricity::WebDriverConnect.initialize_web_driver` method accepts a single optional parameter - the base host URL. Cucumber
1164
- **Environment Variables** are used to specify the target local or remote web browser, and the various webdriver capability parameters required to configure
1165
- the connection.
1199
+ The `TestCentricity::WebDriverConnect.initialize_web_driver` method accepts a single optional parameter - the base host URL.
1200
+ Cucumber **Environment Variables** are used to specify the target local or remote web browser, and the various webdriver
1201
+ capability parameters required to configure the connection.
1166
1202
 
1167
1203
 
1168
1204
  ### Locally hosted desktop web browser
1169
1205
 
1170
- For locally hosted desktop web browsers running on macOS (OS X) or Windows platforms, the `WEB_BROWSER` Environment Variable must be set to one of the
1171
- values from the table below:
1206
+ For locally hosted desktop web browsers running on macOS or Windows platforms, the `WEB_BROWSER` Environment Variable must
1207
+ be set to one of the values from the table below:
1172
1208
 
1173
1209
  | `WEB_BROWSER` | **Desktop Platform** |
1174
1210
  |--------------------|------------------------------------------------|
1175
- | `chrome` | OS X or Windows |
1176
- | `chrome_headless` | OS X or Windows (headless - no visible UI) |
1177
- | `firefox` | OS X or Windows |
1178
- | `firefox_headless` | OS X or Windows (headless - no visible UI) |
1179
- | `edge` | OS X or Windows |
1180
- | `edge_headless` | OS X or Windows (headless - no visible UI) |
1181
- | `safari` | OS X only |
1211
+ | `chrome` | macOS or Windows |
1212
+ | `chrome_headless` | macOS or Windows (headless - no visible UI) |
1213
+ | `firefox` | macOS or Windows |
1214
+ | `firefox_headless` | macOS or Windows (headless - no visible UI) |
1215
+ | `edge` | macOS or Windows |
1216
+ | `edge_headless` | macOS or Windows (headless - no visible UI) |
1217
+ | `safari` | macOS only |
1182
1218
  | `ie` | Windows only (IE version 10.x or greater only) |
1183
1219
 
1184
1220
  Refer to **section 8.6 (Using Browser specific Profiles in cucumber.yml)** below.
@@ -1186,7 +1222,8 @@ Refer to **section 8.6 (Using Browser specific Profiles in cucumber.yml)** below
1186
1222
 
1187
1223
  #### Setting desktop browser window size
1188
1224
 
1189
- To set the size of a desktop browser window, you set the `BROWSER_SIZE` Environment Variable to the desired width and height in pixels as shown below:
1225
+ To set the size of a desktop browser window, you set the `BROWSER_SIZE` Environment Variable to the desired width and height
1226
+ in pixels as shown below:
1190
1227
 
1191
1228
  BROWSER_SIZE=1600,1000
1192
1229
 
@@ -1197,8 +1234,9 @@ To maximize a desktop browser window, you set the `BROWSER_SIZE` Environment Var
1197
1234
 
1198
1235
  #### Testing file downloads with desktop browsers
1199
1236
 
1200
- File download functionality can be tested with locally hosted instances of Chrome, Edge, or Firefox desktop browsers. Your automation project must include
1201
- a `/downloads` folder at the same level as the `/config` and `/features` folders, as depicted below:
1237
+ File download functionality can be tested with locally hosted instances of Chrome, Edge, or Firefox desktop browsers. Your
1238
+ automation project must include a `/downloads` folder at the same level as the `/config` and `/features` folders, as depicted
1239
+ below:
1202
1240
 
1203
1241
  my_automation_project
1204
1242
  ├── config
@@ -1208,9 +1246,9 @@ a `/downloads` folder at the same level as the `/config` and `/features` folders
1208
1246
  └── README.md
1209
1247
 
1210
1248
 
1211
- When running tests in multiple concurrent threads using the `parallel_tests` gem, a new folder will be created within the `/downloads` folder for each
1212
- test thread. This is to ensure that files downloaded in each test thread are isolated from tests running in other parallel threads. An example of the
1213
- `/downloads` folder structure for 4 parallel threads is depicted below:
1249
+ When running tests in multiple concurrent threads using the `parallel_tests` gem, a new folder will be created within the
1250
+ `/downloads` folder for each test thread. This is to ensure that files downloaded in each test thread are isolated from tests
1251
+ running in other parallel threads. An example of the`/downloads` folder structure for 4 parallel threads is depicted below:
1214
1252
 
1215
1253
  my_automation_project
1216
1254
  ├── config
@@ -1224,10 +1262,10 @@ test thread. This is to ensure that files downloaded in each test thread are iso
1224
1262
  └── README.md
1225
1263
 
1226
1264
 
1227
- When testing file downloads using a local instance of Firefox, you will need to specify the MIME types of the various file types that your tests will
1228
- be downloading. This is accomplished by setting the `MIME_TYPES` Environment Variable to a comma-delimited string containing the list of MIME types to
1229
- be accepted. This list is required as it will prevent Firefox from displaying the File Download modal dialog, which will halt your automated tests. An
1230
- example of a list of MIME types is depicted below:
1265
+ When testing file downloads using a local instance of Firefox, you will need to specify the MIME types of the various file types
1266
+ that your tests will be downloading. This is accomplished by setting the `MIME_TYPES` Environment Variable to a comma-delimited
1267
+ string containing the list of MIME types to be accepted. This list is required as it will prevent Firefox from displaying the
1268
+ File Download modal dialog, which will halt your automated tests. An example of a list of MIME types is depicted below:
1231
1269
 
1232
1270
  MIME_TYPES='images/jpeg, application/pdf, application/octet-stream'
1233
1271
 
@@ -1236,10 +1274,11 @@ A detailed list of file MIME types can be found [here](https://www.freeformatter
1236
1274
 
1237
1275
  ### Locally hosted emulated mobile web browser
1238
1276
 
1239
- You can run your tests against mobile device browsers that are emulated within a locally hosted instance of a Chrome desktop browser on OS X or
1240
- Windows. The specified mobile browser's user agent, CSS screen dimensions, and default screen orientation will be automatically set within the
1241
- local Chrome browser instance. You may even specify the emulated device's screen orientation. For locally hosted emulated mobile web browsers,
1242
- the `WEB_BROWSER` Environment Variable must be set to one of the values from the table below:
1277
+ You can run your tests against mobile device browsers that are emulated within a locally hosted instance of a Chrome desktop
1278
+ browser on macOS or Windows. The specified mobile browser's user agent, CSS screen dimensions, and default screen orientation
1279
+ will be automatically set within the local Chrome browser instance. You may even specify the emulated device's screen orientation.
1280
+ For locally hosted emulated mobile web browsers, the `WEB_BROWSER` Environment Variable must be set to one of the values from
1281
+ the table below:
1243
1282
 
1244
1283
  | `WEB_BROWSER` | `HOST_BROWSER` | **CSS Screen Dimensions** | **Default Orientation** | **OS Version** |
1245
1284
  |-----------------------|----------------|---------------------------|-------------------------|-------------------------------------------|
@@ -1291,18 +1330,20 @@ the `WEB_BROWSER` Environment Variable must be set to one of the values from the
1291
1330
  | `blackberry_leap` | `chrome` | 360 x 640 | portrait | BlackBerry 10 OS |
1292
1331
  | `blackberry_passport` | `chrome` | 504 x 504 | square | BlackBerry 10 OS |
1293
1332
 
1294
- To change the emulated device's screen orientation from the default setting, set the `ORIENTATION` Environment Variable to either `portrait` or `landscape`.
1333
+ To change the emulated device's screen orientation from the default setting, set the `ORIENTATION` Environment Variable to
1334
+ either `portrait` or `landscape`.
1295
1335
 
1296
- To use a local instance of the Chrome desktop browser to host the emulated mobile web browser, you must set the `HOST_BROWSER` Environment Variable
1297
- to `chrome`.
1336
+ To use a local instance of the Chrome desktop browser to host the emulated mobile web browser, you must set the `HOST_BROWSER`
1337
+ Environment Variable to `chrome`.
1298
1338
 
1299
1339
  Refer to **section 8.6 (Using Browser specific Profiles in cucumber.yml)** below.
1300
1340
 
1301
1341
 
1302
1342
  #### User defined mobile device profiles
1303
1343
 
1304
- User defined mobile device profiles can be specified in a `device.yml` file for testing locally hosted emulated mobile web browsers running in an instance
1305
- of the Chrome desktop browser. The user specified device profiles must be located at `config/data/devices/devices.yml` as depicted below:
1344
+ User defined mobile device profiles can be specified in a `device.yml` file for testing locally hosted emulated mobile web
1345
+ browsers running in an instance of the Chrome desktop browser. The user specified device profiles must be located at
1346
+ `config/data/devices/devices.yml` as depicted below:
1306
1347
 
1307
1348
  my_automation_project
1308
1349
  ├── config
@@ -1331,7 +1372,8 @@ The format for a new device profile is:
1331
1372
 
1332
1373
  ### Selenium Grid 4 and Dockerized Selenium Grid 4 hosted desktop and emulated mobile web browsers
1333
1374
 
1334
- For remote desktop and emulated mobile web browsers running on Selenium Grid 4 or Dockerized Selenium Grid 4 environments as described in the table below.
1375
+ For remote desktop and emulated mobile web browsers running on Selenium Grid 4 or Dockerized Selenium Grid 4 environments
1376
+ as described in the table below.
1335
1377
 
1336
1378
  | **Environment Variable** | **Description** |
1337
1379
  |--------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
@@ -1346,18 +1388,19 @@ Refer to **section 8.6 (Using Browser specific Profiles in cucumber.yml)** below
1346
1388
 
1347
1389
  #### Mobile Safari browser on iOS Simulators or iOS Physical Devices
1348
1390
 
1349
- You can run your mobile web tests against the mobile Safari browser on simulated iOS devices or physically connected iOS devices using Appium and XCode on
1350
- OS X. You must install Appium, XCode, and the iOS version-specific device simulators for XCode. You must also ensure that the `appium_capybara` gem is
1351
- installed and required as described in **section 3.3 (Setup - Using Appium)** above.
1391
+ You can run your mobile web tests against the mobile Safari browser on simulated iOS devices or physically connected iOS devices
1392
+ using Appium and XCode on macOS. You must install Appium, XCode, and the iOS version-specific device simulators for XCode. You
1393
+ must also ensure that the `appium_capybara` gem is installed and required as described in **section 3.3 (Setup - Using Appium)** above.
1352
1394
 
1353
- Information about Appium setup and configuration requirements for testing on physically connected iOS devices can be found on [this page](https://github.com/appium/appium/blob/master/docs/en/drivers/ios-xcuitest-real-devices.md).
1354
- The Appium server must be running prior to invoking Cucumber to run your features/scenarios.
1395
+ Information about Appium setup and configuration requirements for testing on physically connected iOS devices can be found
1396
+ on [this page](https://github.com/appium/appium/blob/master/docs/en/drivers/ios-xcuitest-real-devices.md). The Appium server
1397
+ must be running prior to invoking Cucumber to run your features/scenarios.
1355
1398
 
1356
1399
  Once your test environment is properly configured, the following **Environment Variables** must be set as described in the table below.
1357
1400
 
1358
1401
  | **Environment Variable** | **Description** |
1359
1402
  |----------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------|
1360
- | `WEB_BROWSER` | Must be set to `appium` |
1403
+ | `DRIVER` | Must be set to `appium` |
1361
1404
  | `APP_PLATFORM_NAME` | Must be set to `iOS` |
1362
1405
  | `APP_BROWSER` | Must be set to `Safari` |
1363
1406
  | `APP_VERSION` | Must be set to `15.4`, `14.5`, or which ever iOS version you wish to run within the XCode Simulator |
@@ -1388,19 +1431,21 @@ Refer to **section 8.6 (Using Browser specific Profiles in cucumber.yml)** below
1388
1431
 
1389
1432
  #### Mobile Chrome or Android browsers on Android Studio Virtual Device emulators
1390
1433
 
1391
- You can run your mobile web tests against the mobile Chrome or Android browser on emulated Android devices using Appium and Android Studio on OS X. You
1392
- must install Android Studio, the desired Android version-specific virtual device emulators, and Appium. Refer to [this page](http://appium.io/docs/en/drivers/android-uiautomator2/index.html)
1393
- for information on configuring Appium to work with the Android SDK. You must also ensure that the `appium_capybara` gem is installed and required as
1394
- described in **section 3.3 (Setup - Using Appium)** above.
1434
+ You can run your mobile web tests against the mobile Chrome or Android browser on emulated Android devices using Appium and
1435
+ Android Studio on macOS. You must install Android Studio, the desired Android version-specific virtual device emulators, and
1436
+ Appium. Refer to [this page](http://appium.io/docs/en/drivers/android-uiautomator2/index.html) for information on configuring
1437
+ Appium to work with the Android SDK. You must also ensure that the `appium_capybara` gem is installed and required as described
1438
+ in **section 3.3 (Setup - Using Appium)** above.
1395
1439
 
1396
1440
  The Appium server must be running prior to invoking Cucumber to run your features/scenarios. Refer to [this page](https://appium.io/docs/en/writing-running-appium/web/chromedriver/index.html)
1397
- for information on configuring Appium to use the correct version of Chromedriver required to work with the web browser supported by each Android OS version.
1441
+ for information on configuring Appium to use the correct version of Chromedriver required to work with the web browser supported
1442
+ by each Android OS version.
1398
1443
 
1399
1444
  Once your test environment is properly configured, the following **Environment Variables** must be set as described in the table below.
1400
1445
 
1401
1446
  | **Environment Variable** | **Description** |
1402
1447
  |---------------------------|--------------------------------------------------------------------------------------------------------------------------------|
1403
- | `WEB_BROWSER` | Must be set to `appium` |
1448
+ | `DRIVER` | Must be set to `appium` |
1404
1449
  | `APP_PLATFORM_NAME` | Must be set to `Android` |
1405
1450
  | `APP_BROWSER` | Must be set to `Chrome` or `Browser` |
1406
1451
  | `APP_VERSION` | Must be set to `12.0`, or which ever Android OS version you wish to run with the Android Virtual Device |
@@ -1421,8 +1466,8 @@ Refer to **section 8.6 (Using Browser specific Profiles in cucumber.yml)** below
1421
1466
  #### Starting and stopping Appium Server
1422
1467
 
1423
1468
  The Appium server must be running prior to invoking Cucumber to run your features/scenarios on mobile simulators or physical
1424
- device. To programmatically control the starting and stopping of Appium server with the execution of your automated tests, place
1425
- the code shown below in your `hooks.rb` file.
1469
+ device. To programmatically control the starting and stopping of Appium server with the execution of your automated tests,
1470
+ place the code shown below in your `hooks.rb` file.
1426
1471
 
1427
1472
  BeforeAll do
1428
1473
  # start Appium Server if APPIUM_SERVER = 'run' and target browser is a mobile simulator or device
@@ -1442,9 +1487,9 @@ the code shown below in your `hooks.rb` file.
1442
1487
  end
1443
1488
 
1444
1489
 
1445
- The `APPIUM_SERVER` environment variable must be set to `run` in order to programmatically start and stop Appium server. This can be
1446
- set by adding the following to your `cucumber.yml` file and including `-p run_appium` in your command line when starting your Cucumber
1447
- test suite(s):
1490
+ The `APPIUM_SERVER` environment variable must be set to `run` in order to programmatically start and stop Appium server. This
1491
+ can be set by adding the following to your `cucumber.yml` file and including `-p run_appium` in your command line when starting
1492
+ your Cucumber test suite(s):
1448
1493
 
1449
1494
  run_appium: APPIUM_SERVER=run
1450
1495
 
@@ -1454,26 +1499,26 @@ Refer to **section 8.6 (Using Browser specific Profiles in cucumber.yml)** below
1454
1499
 
1455
1500
  ### Remote cloud hosted desktop and mobile web browsers
1456
1501
 
1457
- You can run your automated tests against remote cloud hosted desktop and mobile web browsers using the BrowserStack, SauceLabs, TestingBot, or
1458
- LambdaTest services. If your tests are running against a web site hosted on your local computer (`localhost`), or on a staging server inside
1459
- your LAN, you must set the `TUNNELING` Environment Variable to `true`.
1502
+ You can run your automated tests against remote cloud hosted desktop and mobile web browsers using the BrowserStack, SauceLabs,
1503
+ TestingBot, or LambdaTest services. If your tests are running against a web site hosted on your local computer (`localhost`),
1504
+ or on a staging server inside your LAN, you must set the `TUNNELING` Environment Variable to `true`.
1460
1505
 
1461
- Due to lack of support for Selenium 4.x and the W3C browser capabilities protocol, support for CrossBrowserTesting and Gridlastic cloud hosted
1462
- Selenium grid services was removed as of version 4.1 of this gem. If your testing requires access to either of those services, or support for
1463
- Selenium version 3.x, you should use earlier versions of this gem.
1506
+ Due to lack of support for Selenium 4.x and the W3C browser capabilities protocol, support for CrossBrowserTesting and Gridlastic
1507
+ cloud hosted Selenium grid services was removed as of version 4.1 of this gem. If your testing requires access to either of those
1508
+ services, or support for Selenium version 3.x, you should use earlier versions of this gem.
1464
1509
 
1465
1510
  Refer to **section 8.6 (Using Browser specific Profiles in cucumber.yml)** below.
1466
1511
 
1467
1512
 
1468
1513
  #### Remote desktop browsers on the BrowserStack service
1469
1514
 
1470
- For remotely hosted desktop web browsers on the BrowserStack service, the following **Environment Variables** must be set as described in
1471
- the table below. Refer to the [Browserstack-specific capabilities chart page](https://www.browserstack.com/automate/capabilities?tag=selenium-4)
1515
+ For remotely hosted desktop web browsers on the BrowserStack service, the following **Environment Variables** must be set as
1516
+ described in the table below. Refer to the [Browserstack-specific capabilities chart page](https://www.browserstack.com/automate/capabilities?tag=selenium-4)
1472
1517
  for information regarding the specific capabilities.
1473
1518
 
1474
1519
  | **Environment Variable** | **Description** |
1475
1520
  |--------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
1476
- | `WEB_BROWSER` | Must be set to `browserstack` |
1521
+ | `DRIVER` | Must be set to `browserstack` |
1477
1522
  | `BS_USERNAME` | Must be set to your BrowserStack account user name |
1478
1523
  | `BS_AUTHKEY` | Must be set to your BrowserStack account access key |
1479
1524
  | `BS_OS` | Must be set to `OS X` or `Windows` |
@@ -1507,7 +1552,7 @@ for information regarding the specific capabilities.
1507
1552
 
1508
1553
  | **Environment Variable** | **Description** |
1509
1554
  |--------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
1510
- | `WEB_BROWSER` | Must be set to `browserstack` |
1555
+ | `DRIVER` | Must be set to `browserstack` |
1511
1556
  | `BS_USERNAME` | Must be set to your BrowserStack account user name |
1512
1557
  | `BS_AUTHKEY` | Must be set to your BrowserStack account access key |
1513
1558
  | `BS_OS` | Must be set to `ios` or `android` |
@@ -1524,6 +1569,7 @@ for information regarding the specific capabilities.
1524
1569
  | `NETWORK_LOGS` | [Optional] Capture network logs (`true` or `false`) |
1525
1570
  | `APPIUM_LOGS` | [Optional] Generate Appium logs (`true` or `false`) |
1526
1571
 
1572
+
1527
1573
  #### Remote desktop browsers on the Sauce Labs service
1528
1574
 
1529
1575
  For remotely hosted desktop web browsers on the Sauce Labs service, the following **Environment Variables** must be set as described in the
@@ -1532,7 +1578,7 @@ to obtain information regarding the specific capabilities.
1532
1578
 
1533
1579
  | **Environment Variable** | **Description** |
1534
1580
  |--------------------------|----------------------------------------------------------------------------------------------------------------------------|
1535
- | `WEB_BROWSER` | Must be set to `saucelabs` |
1581
+ | `DRIVER` | Must be set to `saucelabs` |
1536
1582
  | `SL_USERNAME` | Must be set to your Sauce Labs account user name or email address |
1537
1583
  | `SL_AUTHKEY` | Must be set to your Sauce Labs account access key |
1538
1584
  | `DATA_CENTER` | Must be set to your Sauce Labs account Data Center assignment (`us-west-1`, `eu-central-1`, `apac-southeast-1`) |
@@ -1543,6 +1589,7 @@ to obtain information regarding the specific capabilities.
1543
1589
  | `BROWSER_SIZE ` | [Optional] Specify width, height of browser window |
1544
1590
  | `RECORD_VIDEO` | [Optional] Enable screen video recording during test execution (`true` or `false`) |
1545
1591
 
1592
+
1546
1593
  #### Remote desktop browsers on the TestingBot service
1547
1594
 
1548
1595
  For remotely hosted desktop web browsers on the TestingBot service, the following **Environment Variables** must be set as described in
@@ -1551,7 +1598,7 @@ regarding the specific capabilities.
1551
1598
 
1552
1599
  | **Environment Variable** | **Description** |
1553
1600
  |--------------------------|-------------------------------------------------------------------------------------------------------------------|
1554
- | `WEB_BROWSER` | Must be set to `testingbot` |
1601
+ | `DRIVER` | Must be set to `testingbot` |
1555
1602
  | `TB_USERNAME` | Must be set to your TestingBot account user name |
1556
1603
  | `TB_AUTHKEY` | Must be set to your TestingBot account access key |
1557
1604
  | `TB_OS` | Refer to `platform` capability in chart |
@@ -1561,6 +1608,27 @@ regarding the specific capabilities.
1561
1608
  | `RESOLUTION` | [Optional] Possible values: `800x600`, `1024x768`, `1280x960`, `1280x1024`, `1600x1200`, `1920x1200`, `2560x1440` |
1562
1609
  | `BROWSER_SIZE` | [Optional] Specify width, height of browser window |
1563
1610
 
1611
+
1612
+ #### Remote mobile browsers on the TestingBot service
1613
+
1614
+ For remotely hosted mobile web browsers iOS simulators and Android emulators on the TestingBot service, the following Environment
1615
+ Variables must be set as described in the table below.
1616
+
1617
+ | **Environment Variable** | **Description** |
1618
+ |--------------------------|-------------------------------------------------------------------------------------------------|
1619
+ | `DRIVER` | Must be set to `testingbot` |
1620
+ | `TB_USERNAME` | Must be set to your TestingBot account user name |
1621
+ | `TB_AUTHKEY` | Must be set to your TestingBot account access key |
1622
+ | `TB_PLATFORM` | Must be set to `iOS` or `ANDROID` |
1623
+ | `TB_OS` | Must be set to `iOS` or `ANDROID` |
1624
+ | `TB_BROWSER` | Must be set to `safari` (for iOS) or `chrome` (for Android) |
1625
+ | `TB_VERSION` | Refer to `version` capability in chart |
1626
+ | `TB_DEVICE` | Refer to `deviceName` capability in chart |
1627
+ | `DEVICE_TYPE` | Must be set to `phone` or `tablet` |
1628
+ | `TUNNELING` | [Optional] Must be `true` if you are testing against internal/local servers (`true` or `false`) |
1629
+ | `ORIENTATION` | [Optional] Set to `portrait` or `landscape` |
1630
+
1631
+
1564
1632
  #### Remote desktop browsers on the LambdaTest service
1565
1633
 
1566
1634
  For remotely hosted desktop web browsers on the LambdaTest service, the following **Environment Variables** must be set as described in the table
@@ -1569,7 +1637,7 @@ to obtain information regarding the specific capabilities.
1569
1637
 
1570
1638
  | **Environment Variable** | **Description** |
1571
1639
  |--------------------------|------------------------------------------------------------------------------------------|
1572
- | `WEB_BROWSER` | Must be set to `lambdatest` |
1640
+ | `DRIVER` | Must be set to `lambdatest` |
1573
1641
  | `LT_USERNAME` | Must be set to your LambdaTest account user name or email address |
1574
1642
  | `LT_AUTHKEY` | Must be set to your LambdaTest account access key |
1575
1643
  | `LT_OS` | Refer to `platformName` capability in the sample script of the Wizard |
@@ -1582,16 +1650,18 @@ to obtain information regarding the specific capabilities.
1582
1650
  | `ALLOW_COOKIES` | [Optional] Allow all cookies (`true` or `false`) - for Safari browsers only |
1583
1651
  | `CONSOLE_LOGS` | [Optional] Used to capture browser console logs. |
1584
1652
 
1653
+
1585
1654
  ### Using Browser specific Profiles in cucumber.yml
1586
1655
 
1587
- While you can set **Environment Variables** in the command line when invoking Cucumber, a preferred method of specifying and managing
1588
- target web browsers is to create browser specific **Profiles** that set the appropriate **Environment Variables** for each target browser
1589
- in your `cucumber.yml` file.
1656
+ While you can set **Environment Variables** in the command line when invoking Cucumber, a preferred method of specifying and
1657
+ managing target web browsers is to create browser specific **Profiles** that set the appropriate **Environment Variables** for
1658
+ each target browser in your `cucumber.yml` file.
1590
1659
 
1591
- Below is a list of Cucumber **Profiles** for supported locally and remotely hosted desktop and mobile web browsers (put these in in your
1592
- `cucumber.yml` file). Before you can use the BrowserStack, SauceLabs, TestingBot or LambdaTest services, you will need to replace the
1593
- *INSERT USER NAME HERE* and *INSERT PASSWORD HERE* placeholder text with your user account and authorization code for the cloud service(s)
1594
- that you intend to connect with.
1660
+ Below is a list of Cucumber **Profiles** for supported locally and remotely hosted desktop and mobile web browsers (put these
1661
+ in in your`cucumber.yml` file). Before you can use the BrowserStack, SauceLabs, TestingBot or LambdaTest services, you will
1662
+ need to replace the*INSERT USER NAME HERE* and *INSERT PASSWORD HERE* placeholder text with your user account and authorization
1663
+ code for the cloud service(s) that you intend to connect with. However, cloud service credentials should not be stored as text
1664
+ in your `cucumber.yml` file where it can be exposed by anyone with access to your version control system
1595
1665
 
1596
1666
 
1597
1667
  <% desktop = "--tags @desktop --require features BROWSER_TILE=true BROWSER_SIZE=1500,1000" %>
@@ -1694,7 +1764,7 @@ that you intend to connect with.
1694
1764
  # NOTE: Requires installation of XCode, iOS version specific target simulators, Appium, and the appium_capybara gem
1695
1765
  #==============
1696
1766
 
1697
- appium_ios: WEB_BROWSER=appium AUTOMATION_ENGINE=XCUITest APP_PLATFORM_NAME="ios" APP_BROWSER="Safari" NEW_COMMAND_TIMEOUT=30 SHOW_SIM_KEYBOARD=false
1767
+ appium_ios: DRIVER=appium AUTOMATION_ENGINE=XCUITest APP_PLATFORM_NAME="ios" APP_BROWSER="Safari" NEW_COMMAND_TIMEOUT=30 SHOW_SIM_KEYBOARD=false
1698
1768
  app_ios_15: --profile appium_ios APP_VERSION="15.4"
1699
1769
  ipad_pro_12_15_sim: --profile app_ios_15 DEVICE_TYPE=tablet APP_DEVICE="iPad Pro (12.9-inch) (5th generation)"
1700
1770
  ipad_air_15_sim: --profile app_ios_15 DEVICE_TYPE=tablet APP_DEVICE="iPad Air (5th generation)" <%= desktop %>
@@ -1715,16 +1785,18 @@ that you intend to connect with.
1715
1785
  # NOTE: Requires installation of Android Studio, Android version specific virtual device simulators, Appium, and the appium_capybara gem
1716
1786
  #==============
1717
1787
 
1718
- appium_android: WEB_BROWSER=appium APP_PLATFORM_NAME="Android" <%= mobile %>
1788
+ appium_android: DRIVER=appium APP_PLATFORM_NAME="Android" <%= mobile %>
1719
1789
  app_android_12: --profile appium_android APP_BROWSER="Chrome" APP_VERSION="12.0"
1720
1790
  pixel_c_api31_sim: --profile app_android_12 DEVICE_TYPE=tablet APP_DEVICE="Pixel_C_API_31"
1721
1791
 
1722
1792
 
1723
1793
  #==============
1724
1794
  # profiles for remotely hosted web browsers on the BrowserStack service
1795
+ # WARNING: Credentials should not be stored as text in your cucumber.yml file where it can be exposed by anyone with access
1796
+ # to your version control system
1725
1797
  #==============
1726
1798
 
1727
- browserstack: WEB_BROWSER=browserstack BS_USERNAME="<INSERT USER NAME HERE>" BS_AUTHKEY="<INSERT PASSWORD HERE>"
1799
+ browserstack: DRIVER=browserstack BS_USERNAME="<INSERT USER NAME HERE>" BS_AUTHKEY="<INSERT PASSWORD HERE>"
1728
1800
  bs_desktop: --profile browserstack <%= desktop %> RESOLUTION="1920x1080"
1729
1801
  bs_mobile: --profile browserstack <%= mobile %>
1730
1802
 
@@ -1752,9 +1824,11 @@ that you intend to connect with.
1752
1824
 
1753
1825
  #==============
1754
1826
  # profiles for remotely hosted web browsers on the SauceLabs service
1827
+ # WARNING: Credentials should not be stored as text in your cucumber.yml file where it can be exposed by anyone with access
1828
+ # to your version control system
1755
1829
  #==============
1756
1830
 
1757
- saucelabs: WEB_BROWSER=saucelabs SL_USERNAME="<INSERT USER NAME HERE>" SL_AUTHKEY="<INSERT PASSWORD HERE>" DATA_CENTER="<INSERT DATA CENTER HERE"
1831
+ saucelabs: DRIVER=saucelabs SL_USERNAME="<INSERT USER NAME HERE>" SL_AUTHKEY="<INSERT PASSWORD HERE>" DATA_CENTER="<INSERT DATA CENTER HERE"
1758
1832
  sl_desktop: --profile saucelabs <%= desktop %>
1759
1833
  sl_mobile: --profile saucelabs <%= mobile %>
1760
1834
 
@@ -1776,9 +1850,11 @@ that you intend to connect with.
1776
1850
 
1777
1851
  #==============
1778
1852
  # profiles for remotely hosted web browsers on the TestingBot service
1853
+ # WARNING: Credentials should not be stored as text in your cucumber.yml file where it can be exposed by anyone with access
1854
+ # to your version control system
1779
1855
  #==============
1780
1856
 
1781
- testingbot: WEB_BROWSER=testingbot TB_USERNAME="<INSERT USER NAME HERE>" TB_AUTHKEY="<INSERT PASSWORD HERE>"
1857
+ testingbot: DRIVER=testingbot TB_USERNAME="<INSERT USER NAME HERE>" TB_AUTHKEY="<INSERT PASSWORD HERE>"
1782
1858
  tb_desktop: --profile testingbot <%= desktop %> RESOLUTION="1920x1200"
1783
1859
 
1784
1860
  # TestingBot macOS desktop browser profiles
@@ -1795,9 +1871,11 @@ that you intend to connect with.
1795
1871
 
1796
1872
  #==============
1797
1873
  # profiles for remotely hosted web browsers on the LambdaTest service
1874
+ # WARNING: Credentials should not be stored as text in your cucumber.yml file where it can be exposed by anyone with access
1875
+ # to your version control system
1798
1876
  #==============
1799
1877
 
1800
- lambdatest: WEB_BROWSER=lambdatest LT_USERNAME=<INSERT USER NAME HERE> LT_AUTHKEY=<INSERT PASSWORD HERE>
1878
+ lambdatest: DRIVER=lambdatest LT_USERNAME=<INSERT USER NAME HERE> LT_AUTHKEY=<INSERT PASSWORD HERE>
1801
1879
  lt_desktop: --profile lambdatest <%= desktop %> RESOLUTION="2560x1440"
1802
1880
 
1803
1881
  # LambdaTest macOS desktop browser profiles
@@ -1812,27 +1890,27 @@ that you intend to connect with.
1812
1890
  lt_i0_win11: --profile lt_win10 LT_BROWSER="Internet Explorer" LT_VERSION="11.0"
1813
1891
 
1814
1892
 
1815
- To specify a locally hosted target browser using a profile at runtime, you use the flag `--profile` or `-p` followed by the profile name when
1816
- invoking Cucumber in the command line. For instance, the following command invokes Cucumber and specifies that a local instance of Firefox
1817
- will be used as the target web browser:
1893
+ To specify a locally hosted target browser using a profile at runtime, you use the flag `--profile` or `-p` followed by the
1894
+ profile name when invoking Cucumber in the command line. For instance, the following command invokes Cucumber and specifies
1895
+ that a local instance of Firefox will be used as the target web browser:
1818
1896
 
1819
1897
  cucumber -p firefox
1820
1898
 
1821
1899
 
1822
- The following command specifies that Cucumber will run tests against an instance of Chrome hosted within a Dockerized Selenium Grid 4
1823
- environment:
1900
+ The following command specifies that Cucumber will run tests against an instance of Chrome hosted within a Dockerized Selenium
1901
+ Grid 4 environment:
1824
1902
 
1825
1903
  cucumber -p chrome -p grid
1826
1904
 
1827
1905
 
1828
- The following command specifies that Cucumber will run tests against a local instance of Chrome, which will be used to emulate an iPad Pro
1829
- in landscape orientation:
1906
+ The following command specifies that Cucumber will run tests against a local instance of Chrome, which will be used to emulate
1907
+ an iPad Pro in landscape orientation:
1830
1908
 
1831
1909
  cucumber -p ipad_pro -p landscape
1832
1910
 
1833
1911
 
1834
- The following command specifies that Cucumber will run tests against an iPad Pro (12.9-inch) (5th generation) with iOS version 15.4 in an
1835
- XCode Simulator in landscape orientation:
1912
+ The following command specifies that Cucumber will run tests against an iPad Pro (12.9-inch) (5th generation) with iOS version
1913
+ 15.4 in an XCode Simulator in landscape orientation:
1836
1914
 
1837
1915
  cucumber -p ipad_pro_12_15_sim -p landscape
1838
1916
 
@@ -1843,8 +1921,8 @@ You can ensure that Appium Server is running by including `-p run_appium` in you
1843
1921
  cucumber -p ipad_pro_12_15_sim -p landscape -p run_appium
1844
1922
 
1845
1923
 
1846
- The following command specifies that Cucumber will run tests against a remotely hosted Safari web browser running on a macOS Monterey
1847
- virtual machine on the BrowserStack service:
1924
+ The following command specifies that Cucumber will run tests against a remotely hosted Safari web browser running on a macOS
1925
+ Monterey virtual machine on the BrowserStack service:
1848
1926
 
1849
1927
  cucumber -p bs_safari_monterey
1850
1928
 
@@ -1877,7 +1955,7 @@ area sub-folders as needed. Likewise, `PageSection` class definitions should be
1877
1955
 
1878
1956
  ## Web Test Automation Framework Implementation
1879
1957
 
1880
- <img src="https://i.imgur.com/eukmEan.jpg" alt="TestCentricity Web Framework Overview" title="TestCentricity Web Framework Overview">
1958
+ <img src="https://i.imgur.com/lCT9HbK.jpg" alt="TestCentricity Web Framework Overview" title="TestCentricity Web Framework Overview">
1881
1959
 
1882
1960
 
1883
1961
 
@@ -1886,27 +1964,20 @@ area sub-folders as needed. Likewise, `PageSection` class definitions should be
1886
1964
  TestCentricity™ Framework is Copyright (c) 2014-2022, Tony Mrozinski.
1887
1965
  All rights reserved.
1888
1966
 
1889
- Redistribution and use in source and binary forms, with or without
1890
- modification, are permitted provided that the following conditions are met:
1891
-
1892
- 1. Redistributions of source code must retain the above copyright notice,
1893
- this list of conditions and the following disclaimer.
1894
-
1895
- 2. Redistributions in binary form must reproduce the above copyright
1896
- notice, this list of conditions and the following disclaimer in the
1897
- documentation and/or other materials provided with the distribution.
1898
-
1899
- 3. Neither the name of the copyright holder nor the names of its contributors
1900
- may be used to endorse or promote products derived from this software without
1901
- specific prior written permission.
1902
-
1903
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
1904
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
1905
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
1906
- IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
1907
- INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
1908
- NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
1909
- OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
1910
- WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
1911
- ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
1912
- POSSIBILITY OF SUCH DAMAGE.
1967
+ Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following
1968
+ conditions are met:
1969
+
1970
+ 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
1971
+
1972
+ 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer
1973
+ in the documentation and/or other materials provided with the distribution.
1974
+
1975
+ 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived
1976
+ from this software without specific prior written permission.
1977
+
1978
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
1979
+ BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
1980
+ SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
1981
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
1982
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
1983
+ OR OTHERWISE)ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.