testcentricity_web 4.3.0 → 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.
- checksums.yaml +4 -4
 - data/CHANGELOG.md +5 -0
 - data/README.md +234 -201
 - data/lib/testcentricity_web/data_objects/environment.rb +0 -2
 - data/lib/testcentricity_web/version.rb +1 -1
 - data/lib/testcentricity_web/web_core/webdriver_helper.rb +75 -74
 - metadata +2 -2
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
2 
     | 
    
         
             
            SHA256:
         
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: 7aca63221f1add18272c5804ac99594a658175ef4590033954f42bc1920aafea
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: 051be4c6fbd25be53fa9dfeb04ed6c71c1bcf99de3e08b3bb22b4f4f930d5b17
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: 8b7ec300f994b85b223bf71b0fc15ba82fc210979f1c979cea34f0e81efcf49e827a072a12f4a2430392c53dd07f78000fe115d18cca020030190098f7f3a490
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: '00959032416c0d922a883279c0eebe21d871d9dd80e2c7a6d82fb03fe1a423c25ef0e199d34acd2936a12d11f6fa7620572cd1b198c614eff3ab52729f47f929'
         
     | 
    
        data/CHANGELOG.md
    CHANGED
    
    | 
         @@ -1,6 +1,11 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            # CHANGELOG
         
     | 
| 
       2 
2 
     | 
    
         
             
            All notable changes to this project will be documented in this file.
         
     | 
| 
       3 
3 
     | 
    
         | 
| 
      
 4 
     | 
    
         
            +
            ## [4.3.1] - 19-AUGUST-2022
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
            ### Added
         
     | 
| 
      
 7 
     | 
    
         
            +
            * Added support for connecting to remote mobile browsers on iOS simulators and Android emulators on the TestingBot service.
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
       4 
9 
     | 
    
         | 
| 
       5 
10 
     | 
    
         
             
            ## [4.3.0] - 01-AUGUST-2022
         
     | 
| 
       6 
11 
     | 
    
         | 
    
        data/README.md
    CHANGED
    
    | 
         @@ -4,13 +4,15 @@ 
     | 
|
| 
       4 
4 
     | 
    
         
             
             
         
     | 
| 
       5 
5 
     | 
    
         | 
| 
       6 
6 
     | 
    
         | 
| 
       7 
     | 
    
         
            -
            The TestCentricity™ Web core framework for desktop and mobile web browser-based app testing implements a Page Object Model 
     | 
| 
       8 
     | 
    
         
            -
            with Cucumber (version 7.x or greater), Capybara (version 3.37), and Selenium-Webdriver (version 4.3). It also 
     | 
| 
       9 
     | 
    
         
            -
            Selenium-Webdriver capabilities required to establish a connection with a 
     | 
| 
      
 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.
         
     | 
| 
       10 
11 
     | 
    
         | 
| 
       11 
12 
     | 
    
         
             
            The TestCentricity™ Web gem supports running automated tests against the following web test targets:
         
     | 
| 
       12 
13 
     | 
    
         
             
            * locally hosted desktop browsers (Chrome, Edge, Firefox, Safari, or IE)
         
     | 
| 
       13 
14 
     | 
    
         
             
            * locally hosted "headless" Chrome, Firefox, or Edge browsers
         
     | 
| 
      
 15 
     | 
    
         
            +
            * 
         
     | 
| 
       14 
16 
     | 
    
         
             
            * remote desktop and emulated mobile web browsers hosted on Selenium Grid 4 and Dockerized Selenium Grid 4 environments
         
     | 
| 
       15 
17 
     | 
    
         
             
            * mobile Safari browsers on iOS device simulators or physical iOS devices (using Appium and XCode on macOS)
         
     | 
| 
       16 
18 
     | 
    
         
             
            * mobile Chrome or Android browsers on Android Studio virtual device emulators (using Appium and Android Studio on macOS)
         
     | 
| 
         @@ -36,8 +38,8 @@ can be found [here](https://github.com/TestCentricity/tc_web_sample). 
     | 
|
| 
       36 
38 
     | 
    
         | 
| 
       37 
39 
     | 
    
         
             
            ## Installation
         
     | 
| 
       38 
40 
     | 
    
         | 
| 
       39 
     | 
    
         
            -
            TestCentricity Web version 4.1 and above requires Ruby 2.7.5 or later. To install the TestCentricity Web gem, add this line 
     | 
| 
       40 
     | 
    
         
            -
            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:
         
     | 
| 
       41 
43 
     | 
    
         | 
| 
       42 
44 
     | 
    
         
             
                gem 'testcentricity_web'
         
     | 
| 
       43 
45 
     | 
    
         | 
| 
         @@ -70,8 +72,8 @@ If you are using RSpec instead, you need to require the following in your `spec_ 
     | 
|
| 
       70 
72 
     | 
    
         | 
| 
       71 
73 
     | 
    
         
             
            ### Using Appium
         
     | 
| 
       72 
74 
     | 
    
         | 
| 
       73 
     | 
    
         
            -
            If you will be running your tests on mobile Safari browsers on simulated iOS devices using Appium and XCode Simulators, you 
     | 
| 
       74 
     | 
    
         
            -
            the following in your `env.rb` and/or `spec_helper.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:
         
     | 
| 
       75 
77 
     | 
    
         | 
| 
       76 
78 
     | 
    
         
             
                require 'appium_capybara'
         
     | 
| 
       77 
79 
     | 
    
         | 
| 
         @@ -86,21 +88,23 @@ And then execute: 
     | 
|
| 
       86 
88 
     | 
    
         | 
| 
       87 
89 
     | 
    
         
             
            ## PageObjects
         
     | 
| 
       88 
90 
     | 
    
         | 
| 
       89 
     | 
    
         
            -
            The **Page Object Model** is a test automation pattern that aims to create an abstraction of your web app's User Interface 
     | 
| 
       90 
     | 
    
         
            -
            in tests. A **Page Object**  
     | 
| 
       91 
     | 
    
         
            -
            implementation details of a web page and expose an API that supports interaction with, and validation of 
     | 
| 
      
 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.
         
     | 
| 
       92 
95 
     | 
    
         | 
| 
       93 
     | 
    
         
            -
            **Page Objects** makes it easier to maintain automated tests because changes to page UI elements are updated in only one 
     | 
| 
       94 
     | 
    
         
            -
            **Page Object** class definition. By adopting a **Page Object Model**, Cucumber Feature files and step 
     | 
| 
       95 
     | 
    
         
            -
            hold specific information about a page's UI objects, thus minimizing maintenance 
     | 
| 
       96 
     | 
    
         
            -
            (URL path, text field attributes, button captions, etc.), 
     | 
| 
       97 
     | 
    
         
            -
            no need to update the affected feature 
     | 
| 
      
 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.
         
     | 
| 
       98 
102 
     | 
    
         | 
| 
       99 
103 
     | 
    
         | 
| 
       100 
104 
     | 
    
         
             
            ### Defining a PageObject
         
     | 
| 
       101 
105 
     | 
    
         | 
| 
       102 
     | 
    
         
            -
            Your `PageObject` class definitions should be contained within individual `.rb` files in the `features/support/pages` folder 
     | 
| 
       103 
     | 
    
         
            -
            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:
         
     | 
| 
       104 
108 
     | 
    
         | 
| 
       105 
109 
     | 
    
         
             
                class LoginPage < TestCentricity::PageObject
         
     | 
| 
       106 
110 
     | 
    
         
             
                end
         
     | 
| 
         @@ -116,25 +120,25 @@ test automation project. You define new `PageObjects` as shown below: 
     | 
|
| 
       116 
120 
     | 
    
         | 
| 
       117 
121 
     | 
    
         
             
            ### Adding Traits to your PageObject
         
     | 
| 
       118 
122 
     | 
    
         | 
| 
       119 
     | 
    
         
            -
            Web pages typically have names and URLs associated with them. Web pages also typically have a unique object or attribute 
     | 
| 
       120 
     | 
    
         
            -
            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.
         
     | 
| 
       121 
125 
     | 
    
         | 
| 
       122 
     | 
    
         
            -
            The `page_name` trait is registered with the `PageManager` object, which includes a `find_page` method that takes a page 
     | 
| 
       123 
     | 
    
         
            -
            parameter and returns an instance of the associated `PageObject`. If you intend to use the `PageManager`, you 
     | 
| 
       124 
     | 
    
         
            -
            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.
         
     | 
| 
       125 
129 
     | 
    
         | 
| 
       126 
     | 
    
         
            -
            The `page_name` trait is usually a `String` value that represents the name of the page that will be matched by the `PageManager.findpage` 
     | 
| 
       127 
     | 
    
         
            -
            `page_name` traits are case and white-space sensitive. For pages that may be referenced with multiple names, the 
     | 
| 
       128 
     | 
    
         
            -
            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.
         
     | 
| 
       129 
133 
     | 
    
         | 
| 
       130 
     | 
    
         
            -
            A `page_locator` trait is defined if a page has a unique object or attribute that exists once the page's contents have fully 
     | 
| 
       131 
     | 
    
         
            -
            `page_locator` trait is a CSS or Xpath expression that uniquely identifies the object or attribute. The 
     | 
| 
       132 
     | 
    
         
            -
            for the `page_locator` trait to exist.
         
     | 
| 
      
 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.
         
     | 
| 
       133 
137 
     | 
    
         | 
| 
       134 
     | 
    
         
            -
            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 
     | 
| 
       135 
     | 
    
         
            -
            when calling the `WebDriverConnect.initialize_web_driver` method, then your `page_url` trait can be the 
     | 
| 
       136 
     | 
    
         
            -
            be appended to the base URL specified in `app_host`. Specifying a `page_url` trait is optional, 
     | 
| 
       137 
     | 
    
         
            -
            via a URL.
         
     | 
| 
      
 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.
         
     | 
| 
       138 
142 
     | 
    
         | 
| 
       139 
143 
     | 
    
         
             
            You define your page's **Traits** as shown below:
         
     | 
| 
       140 
144 
     | 
    
         | 
| 
         @@ -204,9 +208,9 @@ Web pages are made up of UI elements like text fields, check boxes, combo boxes, 
     | 
|
| 
       204 
208 
     | 
    
         | 
| 
       205 
209 
     | 
    
         
             
            ### Adding Methods to your PageObject
         
     | 
| 
       206 
210 
     | 
    
         | 
| 
       207 
     | 
    
         
            -
            It is good practice for your Cucumber step definitions to call high level methods in your your `PageObject` instead of 
     | 
| 
       208 
     | 
    
         
            -
            and interacting with a page object's UI elements. You can add high level methods to your `PageObject` 
     | 
| 
       209 
     | 
    
         
            -
            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:
         
     | 
| 
       210 
214 
     | 
    
         | 
| 
       211 
215 
     | 
    
         
             
                class LoginPage < TestCentricity::PageObject
         
     | 
| 
       212 
216 
     | 
    
         
             
                  trait(:page_name)    { 'Login' }
         
     | 
| 
         @@ -303,9 +307,10 @@ Once your `PageObjects` have been instantiated, you can call your methods as sho 
     | 
|
| 
       303 
307 
     | 
    
         | 
| 
       304 
308 
     | 
    
         
             
            ## PageSections
         
     | 
| 
       305 
309 
     | 
    
         | 
| 
       306 
     | 
    
         
            -
            A `PageSection` is a collection of **UI Elements** that may appear in multiple locations on a page, or on multiple pages 
     | 
| 
       307 
     | 
    
         
            -
            app. It is a collection of **UI Elements** that represent a conceptual area of functionality, like a navigation 
     | 
| 
       308 
     | 
    
         
            -
            or a menu. **UI Elements** and functional behavior are confined to the scope of a `PageSection` 
     | 
| 
      
 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.
         
     | 
| 
       309 
314 
     | 
    
         | 
| 
       310 
315 
     | 
    
         
             
            <img src="https://i.imgur.com/BTgi59R.jpg" alt="Navigation Header" title="Navigation Header">
         
     | 
| 
       311 
316 
     | 
    
         | 
| 
         @@ -319,8 +324,8 @@ A `PageSection` may contain other `PageSection` objects. 
     | 
|
| 
       319 
324 
     | 
    
         | 
| 
       320 
325 
     | 
    
         
             
            ### Defining a PageSection
         
     | 
| 
       321 
326 
     | 
    
         | 
| 
       322 
     | 
    
         
            -
            Your `PageSection` class definitions should be contained within individual `.rb` files in the `features/support/sections` 
     | 
| 
       323 
     | 
    
         
            -
            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:
         
     | 
| 
       324 
329 
     | 
    
         | 
| 
       325 
330 
     | 
    
         
             
                class SearchForm < TestCentricity::PageSection
         
     | 
| 
       326 
331 
     | 
    
         
             
                end
         
     | 
| 
         @@ -341,8 +346,8 @@ You define your section's **Traits** as shown below: 
     | 
|
| 
       341 
346 
     | 
    
         | 
| 
       342 
347 
     | 
    
         
             
            ### Adding UI Elements to your PageSection
         
     | 
| 
       343 
348 
     | 
    
         | 
| 
       344 
     | 
    
         
            -
            `PageSections` are typically made up of UI elements like text fields, check boxes, combo boxes, radio buttons, tables, lists, 
     | 
| 
       345 
     | 
    
         
            -
            **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:
         
     | 
| 
       346 
351 
     | 
    
         | 
| 
       347 
352 
     | 
    
         
             
                class SearchForm < TestCentricity::PageSection
         
     | 
| 
       348 
353 
     | 
    
         
             
                  trait(:section_locator) { 'form#gnav-search' }
         
     | 
| 
         @@ -393,10 +398,10 @@ Once your `PageObject` has been instantiated, you can call its `PageSection` met 
     | 
|
| 
       393 
398 
     | 
    
         | 
| 
       394 
399 
     | 
    
         
             
            ## UIElements
         
     | 
| 
       395 
400 
     | 
    
         | 
| 
       396 
     | 
    
         
            -
            `PageObjects` and `PageSections` are typically made up of **UI Element** like text fields, check boxes, select lists (combo 
     | 
| 
       397 
     | 
    
         
            -
            radio buttons, tables, ordered and unordered lists, buttons, images, HTML5 video objects, HTML5 audio objects, etc. 
     | 
| 
       398 
     | 
    
         
            -
            and instantiated within the class definition of the `PageObject` or `PageSection` in which they 
     | 
| 
       399 
     | 
    
         
            -
            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.
         
     | 
| 
       400 
405 
     | 
    
         | 
| 
       401 
406 
     | 
    
         | 
| 
       402 
407 
     | 
    
         
             
            ### Declaring and Instantiating UIElements
         
     | 
| 
         @@ -408,8 +413,8 @@ Single `UIElement` declarations have the following format: 
     | 
|
| 
       408 
413 
     | 
    
         
             
            * The `elementName` is the unique name that you will use to refer to the UI element and is specified as a `Symbol`.
         
     | 
| 
       409 
414 
     | 
    
         
             
            * The `locator` is the CSS or XPath attribute that uniquely and unambiguously identifies the `UIElement`.
         
     | 
| 
       410 
415 
     | 
    
         | 
| 
       411 
     | 
    
         
            -
            Multiple `UIElement` declarations for a collection of elements of the same type can be performed by passing a hash table 
     | 
| 
       412 
     | 
    
         
            -
            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.
         
     | 
| 
       413 
418 
     | 
    
         | 
| 
       414 
419 
     | 
    
         
             
            ### Example UIElement Declarations
         
     | 
| 
       415 
420 
     | 
    
         | 
| 
         @@ -475,8 +480,9 @@ Supported `UIElement` elementTypes and their declarations have the following for 
     | 
|
| 
       475 
480 
     | 
    
         
             
                end
         
     | 
| 
       476 
481 
     | 
    
         | 
| 
       477 
482 
     | 
    
         | 
| 
       478 
     | 
    
         
            -
            Refer to the Class List documentation for the `PageObject` and `PageSection` classes for details on the class methods used 
     | 
| 
       479 
     | 
    
         
            -
            and instantiating `UIElements`. Examples of UI element declarations can be found in the ***Adding UI Elements 
     | 
| 
      
 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
         
     | 
| 
       480 
486 
     | 
    
         
             
            ***Adding UI Elements to your PageSection*** sections above.
         
     | 
| 
       481 
487 
     | 
    
         | 
| 
       482 
488 
     | 
    
         | 
| 
         @@ -570,24 +576,26 @@ With TestCentricity, all UI elements are based on the `UIElement` class, and inh 
     | 
|
| 
       570 
576 
     | 
    
         | 
| 
       571 
577 
     | 
    
         
             
            ### Populating your PageObject or PageSection with data
         
     | 
| 
       572 
578 
     | 
    
         | 
| 
       573 
     | 
    
         
            -
            A typical automated test may be required to perform the entry of test data by interacting with various `UIElements` on your 
     | 
| 
       574 
     | 
    
         
            -
            `PageSection`. This data entry can be performed using the various object action methods (listed above) for 
     | 
| 
       575 
     | 
    
         
            -
            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.
         
     | 
| 
       576 
582 
     | 
    
         | 
| 
       577 
     | 
    
         
            -
            The `PageObject.populate_data_fields` and `PageSection.populate_data_fields` methods support the entry of test data into a 
     | 
| 
       578 
     | 
    
         
            -
            `UIElements`. The `populate_data_fields` method accepts a hash containing key/hash pairs of `UIElements` and 
     | 
| 
       579 
     | 
    
         
            -
            entered. Data values must be in the form of a `String` for `textfield`, `selectlist`, and `filefield` 
     | 
| 
       580 
     | 
    
         
            -
            controls, data must either be a `Boolean` or a `String` that evaluates to a `Boolean` 
     | 
| 
       581 
     | 
    
         
            -
            data must be an `Integer`. For `input(type='color')` color picker 
     | 
| 
       582 
     | 
    
         
            -
             
     | 
| 
      
 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.
         
     | 
| 
       583 
590 
     | 
    
         | 
| 
       584 
     | 
    
         
            -
            The `populate_data_fields` method verifies that data attributes associated with each `UIElement` is not `nil` or `empty` 
     | 
| 
       585 
     | 
    
         
            -
            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`.
         
     | 
| 
       586 
593 
     | 
    
         | 
| 
       587 
     | 
    
         
            -
            The optional `wait_time` parameter is used to specify the time (in seconds) to wait for each `UIElement` to become viable 
     | 
| 
       588 
     | 
    
         
            -
            (the `UIElement` must be visible and enabled) before entering the associated data value. This option is useful 
     | 
| 
       589 
     | 
    
         
            -
            or setting the state of a `UIElement` might cause other `UIElements` to become visible 
     | 
| 
       590 
     | 
    
         
            -
            subsequent `UIElements` will be ready to be interacted with as 
     | 
| 
      
 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.
         
     | 
| 
       591 
599 
     | 
    
         | 
| 
       592 
600 
     | 
    
         
             
                def enter_data(user_data)
         
     | 
| 
       593 
601 
     | 
    
         
             
                  fields = {
         
     | 
| 
         @@ -605,14 +613,14 @@ subsequent `UIElements` will be ready to be interacted with as states are change 
     | 
|
| 
       605 
613 
     | 
    
         | 
| 
       606 
614 
     | 
    
         
             
            ### Verifying UIElements on your PageObject or PageSection
         
     | 
| 
       607 
615 
     | 
    
         | 
| 
       608 
     | 
    
         
            -
            A typical automated test executes one or more interactions with the user interface, and then performs a validation to verify 
     | 
| 
       609 
     | 
    
         
            -
            the expected state of the UI has been achieved. This verification can be performed using the various object state 
     | 
| 
       610 
     | 
    
         
            -
            for each `UIElement` that requires verification. Depending on the complexity and number of `UIElements` 
     | 
| 
       611 
     | 
    
         
            -
            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.
         
     | 
| 
       612 
620 
     | 
    
         | 
| 
       613 
     | 
    
         
            -
            The `PageObject.verify_ui_states` and `PageSection.verify_ui_states` methods support the verification of multiple properties 
     | 
| 
       614 
     | 
    
         
            -
            UI elements on a `PageObject` or `PageSection`. The `verify_ui_states` method accepts a hash containing key/hash 
     | 
| 
       615 
     | 
    
         
            -
            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.
         
     | 
| 
       616 
624 
     | 
    
         | 
| 
       617 
625 
     | 
    
         
             
                 ui = {
         
     | 
| 
       618 
626 
     | 
    
         
             
                   object1 => { property: state },
         
     | 
| 
         @@ -621,9 +629,9 @@ elements and their properties or attributes to be verified. 
     | 
|
| 
       621 
629 
     | 
    
         
             
                 }
         
     | 
| 
       622 
630 
     | 
    
         
             
                 verify_ui_states(ui)
         
     | 
| 
       623 
631 
     | 
    
         | 
| 
       624 
     | 
    
         
            -
            The `verify_ui_states` method queues up any exceptions that occur while verifying each object's properties until all `UIElements` 
     | 
| 
       625 
     | 
    
         
            -
            properties have been checked, and then posts any exceptions encountered upon completion. Posted exceptions include 
     | 
| 
       626 
     | 
    
         
            -
            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.
         
     | 
| 
       627 
635 
     | 
    
         | 
| 
       628 
636 
     | 
    
         
             
            The `verify_ui_states` method supports the following property/state pairs:
         
     | 
| 
       629 
637 
     | 
    
         | 
| 
         @@ -893,18 +901,18 @@ Baseline translation strings are stored in `.yml` files in the `config/locales/` 
     | 
|
| 
       893 
901 
     | 
    
         | 
| 
       894 
902 
     | 
    
         
             
            ### Working with custom UIElements
         
     | 
| 
       895 
903 
     | 
    
         | 
| 
       896 
     | 
    
         
            -
            Many responsive and touch-enabled web based user interfaces are implemented using front-end JavaScript libraries for building 
     | 
| 
       897 
     | 
    
         
            -
            interfaces based on UI components. Popular JS libraries include React, Angular, and Ember.js. These stylized and adorned 
     | 
| 
       898 
     | 
    
         
            -
            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.
         
     | 
| 
       899 
907 
     | 
    
         | 
| 
       900 
908 
     | 
    
         
             
            #### Radio and Checkbox UIElements
         
     | 
| 
       901 
909 
     | 
    
         | 
| 
       902 
     | 
    
         
            -
            Sometimes, radio buttons and checkboxes implemented using JS component libraries cannot be interacted with due to other UI 
     | 
| 
       903 
     | 
    
         
            -
            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.
         
     | 
| 
       904 
912 
     | 
    
         | 
| 
       905 
     | 
    
         
            -
            In the screenshots below of an airline flight search and booking page, the **Roundtrip** and **One-way** radio buttons are 
     | 
| 
       906 
     | 
    
         
            -
            `label` elements that also acts as proxies for their associated `input(type='radio')` elements, and they intercept 
     | 
| 
       907 
     | 
    
         
            -
            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.
         
     | 
| 
       908 
916 
     | 
    
         | 
| 
       909 
917 
     | 
    
         
             
            <img src="https://i.imgur.com/7bW5u4c.jpg" alt="Roundtrip Radio button Input" title="Roundtrip Radio button Input">
         
     | 
| 
       910 
918 
     | 
    
         | 
| 
         @@ -1003,19 +1011,19 @@ as element locators. 
     | 
|
| 
       1003 
1011 
     | 
    
         
             
            #### List UIElements
         
     | 
| 
       1004 
1012 
     | 
    
         | 
| 
       1005 
1013 
     | 
    
         
             
            The basic HTML list is typically composed of the parent `ul` object, and one or more `li` elements representing the items
         
     | 
| 
       1006 
     | 
    
         
            -
            in the list. However, list controls implemented using JS component libraries can be composed of multiple elements representing 
     | 
| 
       1007 
     | 
    
         
            -
            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.
         
     | 
| 
       1008 
1016 
     | 
    
         | 
| 
       1009 
     | 
    
         
            -
            The `List.define_list_elements` method provides a means of specifying the elements that make up the key components of a `list` 
     | 
| 
       1010 
     | 
    
         
            -
            The method accepts a hash of element designators (key) and a CSS or Xpath expression (value) that expression that 
     | 
| 
       1011 
     | 
    
         
            -
            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:`.
         
     | 
| 
       1012 
1020 
     | 
    
         | 
| 
       1013 
1021 
     | 
    
         | 
| 
       1014 
1022 
     | 
    
         
             
            ## Instantiating your PageObjects
         
     | 
| 
       1015 
1023 
     | 
    
         | 
| 
       1016 
1024 
     | 
    
         
             
            Before you can call the methods in your `PageObjects` and `PageSections`, you must instantiate the `PageObjects` of your web
         
     | 
| 
       1017 
     | 
    
         
            -
            application, as well as create instance variables which can be used when calling a `PageObject`'s methods from your step 
     | 
| 
       1018 
     | 
    
         
            -
            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`.
         
     | 
| 
       1019 
1027 
     | 
    
         | 
| 
       1020 
1028 
     | 
    
         
             
            One common implementation is shown below:
         
     | 
| 
       1021 
1029 
     | 
    
         | 
| 
         @@ -1039,17 +1047,17 @@ One common implementation is shown below: 
     | 
|
| 
       1039 
1047 
     | 
    
         | 
| 
       1040 
1048 
     | 
    
         
             
                World(WorldPages)
         
     | 
| 
       1041 
1049 
     | 
    
         | 
| 
       1042 
     | 
    
         
            -
            The `WorldPages` module above can be defined in your `env.rb` file, or you can define it in a separate `world_pages.rb` file 
     | 
| 
       1043 
     | 
    
         
            -
            `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.
         
     | 
| 
       1044 
1052 
     | 
    
         | 
| 
       1045 
     | 
    
         
            -
            While this approach is effective for small web applications with only a few pages (and hence few `PageObjects`), it quickly 
     | 
| 
       1046 
     | 
    
         
            -
            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.
         
     | 
| 
       1047 
1055 
     | 
    
         | 
| 
       1048 
1056 
     | 
    
         
             
            ### Using the PageManager
         
     | 
| 
       1049 
1057 
     | 
    
         | 
| 
       1050 
     | 
    
         
            -
            The `PageManager` class provides methods for supporting the instantiation and management of `PageObjects`. In the code example 
     | 
| 
       1051 
     | 
    
         
            -
            the `page_objects` method contains a hash table of your `PageObject` instances and their associated `PageObject` classes 
     | 
| 
       1052 
     | 
    
         
            -
            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`:
         
     | 
| 
       1053 
1061 
     | 
    
         | 
| 
       1054 
1062 
     | 
    
         
             
                module WorldPages
         
     | 
| 
       1055 
1063 
     | 
    
         
             
                  def page_objects
         
     | 
| 
         @@ -1079,8 +1087,8 @@ instantiated by `PageManager`: 
     | 
|
| 
       1079 
1087 
     | 
    
         | 
| 
       1080 
1088 
     | 
    
         
             
            The `WorldPages` module above should be defined in the `world_pages.rb` file in the `features/support` folder.
         
     | 
| 
       1081 
1089 
     | 
    
         | 
| 
       1082 
     | 
    
         
            -
            Include the code below in your `env.rb` file to ensure that your `PageObjects` are instantiated before your Cucumber scenarios 
     | 
| 
       1083 
     | 
    
         
            -
            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:
         
     | 
| 
       1084 
1092 
     | 
    
         | 
| 
       1085 
1093 
     | 
    
         
             
                include WorldPages
         
     | 
| 
       1086 
1094 
     | 
    
         
             
                WorldPages.instantiate_page_objects
         
     | 
| 
         @@ -1090,8 +1098,8 @@ executed: 
     | 
|
| 
       1090 
1098 
     | 
    
         | 
| 
       1091 
1099 
     | 
    
         
             
            ### Leveraging the PageManager in your Cucumber tests
         
     | 
| 
       1092 
1100 
     | 
    
         | 
| 
       1093 
     | 
    
         
            -
            Many Cucumber based automated tests suites include scenarios that verify that web pages are correctly loaded, displayed, or 
     | 
| 
       1094 
     | 
    
         
            -
            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:
         
     | 
| 
       1095 
1103 
     | 
    
         | 
| 
       1096 
1104 
     | 
    
         
             
                Scenario Outline:  Verify Home page navigation links
         
     | 
| 
       1097 
1105 
     | 
    
         
             
                  Given I am on the Home page
         
     | 
| 
         @@ -1107,8 +1115,8 @@ navigated to by clicking associated links. One such Cucumber navigation scenario 
     | 
|
| 
       1107 
1115 
     | 
    
         
             
                    |FAQs               |
         
     | 
| 
       1108 
1116 
     | 
    
         
             
                    |Contact Us         |
         
     | 
| 
       1109 
1117 
     | 
    
         | 
| 
       1110 
     | 
    
         
            -
            In the above example, the step definitions associated with the 3 steps might be implemented using a `page_dispatcher` method 
     | 
| 
       1111 
     | 
    
         
            -
            `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:
         
     | 
| 
       1112 
1120 
     | 
    
         | 
| 
       1113 
1121 
     | 
    
         
             
                Given(/^I am on the (.*) page$/) do |page_name|
         
     | 
| 
       1114 
1122 
     | 
    
         
             
                  target_page = page_dispatcher(page_name)
         
     | 
| 
         @@ -1147,14 +1155,15 @@ In the above example, the step definitions associated with the 3 steps might be 
     | 
|
| 
       1147 
1155 
     | 
    
         
             
                  end
         
     | 
| 
       1148 
1156 
     | 
    
         | 
| 
       1149 
1157 
     | 
    
         | 
| 
       1150 
     | 
    
         
            -
            While this approach may be effective for small web applications with only a few pages (and hence few `PageObjects`), it quickly 
     | 
| 
       1151 
     | 
    
         
            -
            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.
         
     | 
| 
       1152 
1160 
     | 
    
         | 
| 
       1153 
     | 
    
         
            -
            The `PageManager` class provides a `find_page` method that replaces the cumbersome and difficult to maintain `case` statement 
     | 
| 
       1154 
     | 
    
         
            -
            above example. The `PageManager.current_page` method allows you to set or get an instance of the currently active 
     | 
| 
      
 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.
         
     | 
| 
       1155 
1164 
     | 
    
         | 
| 
       1156 
     | 
    
         
            -
            To use these `PageManager` methods, include the step definitions and code below in a `page_steps.rb` or `generic_steps.rb` file 
     | 
| 
       1157 
     | 
    
         
            -
            `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:
         
     | 
| 
       1158 
1167 
     | 
    
         | 
| 
       1159 
1168 
     | 
    
         
             
                include TestCentricity
         
     | 
| 
       1160 
1169 
     | 
    
         | 
| 
         @@ -1183,18 +1192,19 @@ To use these `PageManager` methods, include the step definitions and code below 
     | 
|
| 
       1183 
1192 
     | 
    
         | 
| 
       1184 
1193 
     | 
    
         
             
            ## Connecting to a Web Browser
         
     | 
| 
       1185 
1194 
     | 
    
         | 
| 
       1186 
     | 
    
         
            -
            The `TestCentricity::WebDriverConnect.initialize_web_driver` method configures the appropriate Selenium-Webdriver capabilities 
     | 
| 
       1187 
     | 
    
         
            -
            establish a connection with a target web browser, and sets the base host URL of the web site you are running your 
     | 
| 
      
 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.
         
     | 
| 
       1188 
1198 
     | 
    
         | 
| 
       1189 
     | 
    
         
            -
            The `TestCentricity::WebDriverConnect.initialize_web_driver` method accepts a single optional parameter - the base host URL. 
     | 
| 
       1190 
     | 
    
         
            -
            **Environment Variables** are used to specify the target local or remote web browser, and the various webdriver 
     | 
| 
       1191 
     | 
    
         
            -
            to configure 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.
         
     | 
| 
       1192 
1202 
     | 
    
         | 
| 
       1193 
1203 
     | 
    
         | 
| 
       1194 
1204 
     | 
    
         
             
            ### Locally hosted desktop web browser
         
     | 
| 
       1195 
1205 
     | 
    
         | 
| 
       1196 
     | 
    
         
            -
            For locally hosted desktop web browsers running on macOS or Windows platforms, the `WEB_BROWSER` Environment Variable must 
     | 
| 
       1197 
     | 
    
         
            -
            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: 
         
     | 
| 
       1198 
1208 
     | 
    
         | 
| 
       1199 
1209 
     | 
    
         
             
            | `WEB_BROWSER`      | **Desktop Platform**                           |
         
     | 
| 
       1200 
1210 
     | 
    
         
             
            |--------------------|------------------------------------------------|
         
     | 
| 
         @@ -1212,7 +1222,8 @@ Refer to **section 8.6 (Using Browser specific Profiles in cucumber.yml)** below 
     | 
|
| 
       1212 
1222 
     | 
    
         | 
| 
       1213 
1223 
     | 
    
         
             
            #### Setting desktop browser window size
         
     | 
| 
       1214 
1224 
     | 
    
         | 
| 
       1215 
     | 
    
         
            -
            To set the size of a desktop browser window, you set the `BROWSER_SIZE` Environment Variable to the desired width and height 
     | 
| 
      
 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:
         
     | 
| 
       1216 
1227 
     | 
    
         | 
| 
       1217 
1228 
     | 
    
         
             
                BROWSER_SIZE=1600,1000
         
     | 
| 
       1218 
1229 
     | 
    
         | 
| 
         @@ -1223,8 +1234,9 @@ To maximize a desktop browser window, you set the `BROWSER_SIZE` Environment Var 
     | 
|
| 
       1223 
1234 
     | 
    
         | 
| 
       1224 
1235 
     | 
    
         
             
            #### Testing file downloads with desktop browsers
         
     | 
| 
       1225 
1236 
     | 
    
         | 
| 
       1226 
     | 
    
         
            -
            File download functionality can be tested with locally hosted instances of Chrome, Edge, or Firefox desktop browsers. Your 
     | 
| 
       1227 
     | 
    
         
            -
            a `/downloads` folder at the same level as the `/config` and `/features` folders, as depicted 
     | 
| 
      
 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:
         
     | 
| 
       1228 
1240 
     | 
    
         | 
| 
       1229 
1241 
     | 
    
         
             
                my_automation_project
         
     | 
| 
       1230 
1242 
     | 
    
         
             
                    ├── config
         
     | 
| 
         @@ -1234,9 +1246,9 @@ a `/downloads` folder at the same level as the `/config` and `/features` folders 
     | 
|
| 
       1234 
1246 
     | 
    
         
             
                    └── README.md
         
     | 
| 
       1235 
1247 
     | 
    
         | 
| 
       1236 
1248 
     | 
    
         | 
| 
       1237 
     | 
    
         
            -
            When running tests in multiple concurrent threads using the `parallel_tests` gem, a new folder will be created within the 
     | 
| 
       1238 
     | 
    
         
            -
            test thread. This is to ensure that files downloaded in each test thread are isolated from tests 
     | 
| 
       1239 
     | 
    
         
            -
            `/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:
         
     | 
| 
       1240 
1252 
     | 
    
         | 
| 
       1241 
1253 
     | 
    
         
             
                my_automation_project
         
     | 
| 
       1242 
1254 
     | 
    
         
             
                    ├── config
         
     | 
| 
         @@ -1250,10 +1262,10 @@ test thread. This is to ensure that files downloaded in each test thread are iso 
     | 
|
| 
       1250 
1262 
     | 
    
         
             
                    └── README.md
         
     | 
| 
       1251 
1263 
     | 
    
         | 
| 
       1252 
1264 
     | 
    
         | 
| 
       1253 
     | 
    
         
            -
            When testing file downloads using a local instance of Firefox, you will need to specify the MIME types of the various file types 
     | 
| 
       1254 
     | 
    
         
            -
            be downloading. This is accomplished by setting the `MIME_TYPES` Environment Variable to a comma-delimited 
     | 
| 
       1255 
     | 
    
         
            -
            be accepted. This list is required as it will prevent Firefox from displaying the 
     | 
| 
       1256 
     | 
    
         
            -
            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:
         
     | 
| 
       1257 
1269 
     | 
    
         | 
| 
       1258 
1270 
     | 
    
         
             
                MIME_TYPES='images/jpeg, application/pdf, application/octet-stream'
         
     | 
| 
       1259 
1271 
     | 
    
         | 
| 
         @@ -1262,10 +1274,11 @@ A detailed list of file MIME types can be found [here](https://www.freeformatter 
     | 
|
| 
       1262 
1274 
     | 
    
         | 
| 
       1263 
1275 
     | 
    
         
             
            ### Locally hosted emulated mobile web browser
         
     | 
| 
       1264 
1276 
     | 
    
         | 
| 
       1265 
     | 
    
         
            -
            You can run your tests against mobile device browsers that are emulated within a locally hosted instance of a Chrome desktop 
     | 
| 
       1266 
     | 
    
         
            -
            Windows. The specified mobile browser's user agent, CSS screen dimensions, and default screen orientation 
     | 
| 
       1267 
     | 
    
         
            -
            local Chrome browser instance. You may even specify the emulated device's screen orientation. 
     | 
| 
       1268 
     | 
    
         
            -
            the `WEB_BROWSER` Environment Variable must be set to one of the values from 
     | 
| 
      
 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: 
         
     | 
| 
       1269 
1282 
     | 
    
         | 
| 
       1270 
1283 
     | 
    
         
             
            | `WEB_BROWSER`         | `HOST_BROWSER` | **CSS Screen Dimensions** | **Default Orientation** | **OS Version**                            |
         
     | 
| 
       1271 
1284 
     | 
    
         
             
            |-----------------------|----------------|---------------------------|-------------------------|-------------------------------------------|
         
     | 
| 
         @@ -1317,18 +1330,20 @@ the `WEB_BROWSER` Environment Variable must be set to one of the values from the 
     | 
|
| 
       1317 
1330 
     | 
    
         
             
            | `blackberry_leap`     | `chrome`       | 360 x 640                 | portrait                | BlackBerry 10 OS                          |
         
     | 
| 
       1318 
1331 
     | 
    
         
             
            | `blackberry_passport` | `chrome`       | 504 x 504                 | square                  | BlackBerry 10 OS                          |
         
     | 
| 
       1319 
1332 
     | 
    
         | 
| 
       1320 
     | 
    
         
            -
            To change the emulated device's screen orientation from the default setting, set the `ORIENTATION` Environment Variable to 
     | 
| 
      
 1333 
     | 
    
         
            +
            To change the emulated device's screen orientation from the default setting, set the `ORIENTATION` Environment Variable to
         
     | 
| 
      
 1334 
     | 
    
         
            +
            either `portrait` or `landscape`.
         
     | 
| 
       1321 
1335 
     | 
    
         | 
| 
       1322 
     | 
    
         
            -
            To use a local instance of the Chrome desktop browser to host the emulated mobile web browser, you must set the `HOST_BROWSER` 
     | 
| 
       1323 
     | 
    
         
            -
            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`.
         
     | 
| 
       1324 
1338 
     | 
    
         | 
| 
       1325 
1339 
     | 
    
         
             
            Refer to **section 8.6 (Using Browser specific Profiles in cucumber.yml)** below.
         
     | 
| 
       1326 
1340 
     | 
    
         | 
| 
       1327 
1341 
     | 
    
         | 
| 
       1328 
1342 
     | 
    
         
             
            #### User defined mobile device profiles
         
     | 
| 
       1329 
1343 
     | 
    
         | 
| 
       1330 
     | 
    
         
            -
            User defined mobile device profiles can be specified in a `device.yml` file for testing locally hosted emulated mobile web 
     | 
| 
       1331 
     | 
    
         
            -
            of the Chrome desktop browser. The user specified device profiles must be located at 
     | 
| 
      
 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:
         
     | 
| 
       1332 
1347 
     | 
    
         | 
| 
       1333 
1348 
     | 
    
         
             
                my_automation_project
         
     | 
| 
       1334 
1349 
     | 
    
         
             
                    ├── config
         
     | 
| 
         @@ -1357,7 +1372,8 @@ The format for a new device profile is: 
     | 
|
| 
       1357 
1372 
     | 
    
         | 
| 
       1358 
1373 
     | 
    
         
             
            ### Selenium Grid 4 and Dockerized Selenium Grid 4 hosted desktop and emulated mobile web browsers
         
     | 
| 
       1359 
1374 
     | 
    
         | 
| 
       1360 
     | 
    
         
            -
            For remote desktop and emulated mobile web browsers running on Selenium Grid 4 or Dockerized Selenium Grid 4 environments 
     | 
| 
      
 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.
         
     | 
| 
       1361 
1377 
     | 
    
         | 
| 
       1362 
1378 
     | 
    
         
             
            | **Environment Variable** | **Description**                                                                                                                                                               |
         
     | 
| 
       1363 
1379 
     | 
    
         
             
            |--------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
         
     | 
| 
         @@ -1372,12 +1388,13 @@ Refer to **section 8.6 (Using Browser specific Profiles in cucumber.yml)** below 
     | 
|
| 
       1372 
1388 
     | 
    
         | 
| 
       1373 
1389 
     | 
    
         
             
            #### Mobile Safari browser on iOS Simulators or iOS Physical Devices
         
     | 
| 
       1374 
1390 
     | 
    
         | 
| 
       1375 
     | 
    
         
            -
            You can run your mobile web tests against the mobile Safari browser on simulated iOS devices or physically connected iOS devices 
     | 
| 
       1376 
     | 
    
         
            -
            macOS. You must install Appium, XCode, and the iOS version-specific device simulators for XCode. You 
     | 
| 
       1377 
     | 
    
         
            -
            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.
         
     | 
| 
       1378 
1394 
     | 
    
         | 
| 
       1379 
     | 
    
         
            -
            Information about Appium setup and configuration requirements for testing on physically connected iOS devices can be found 
     | 
| 
       1380 
     | 
    
         
            -
            The Appium server 
     | 
| 
      
 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.
         
     | 
| 
       1381 
1398 
     | 
    
         | 
| 
       1382 
1399 
     | 
    
         
             
            Once your test environment is properly configured, the following **Environment Variables** must be set as described in the table below.
         
     | 
| 
       1383 
1400 
     | 
    
         | 
| 
         @@ -1414,13 +1431,15 @@ Refer to **section 8.6 (Using Browser specific Profiles in cucumber.yml)** below 
     | 
|
| 
       1414 
1431 
     | 
    
         | 
| 
       1415 
1432 
     | 
    
         
             
            #### Mobile Chrome or Android browsers on Android Studio Virtual Device emulators
         
     | 
| 
       1416 
1433 
     | 
    
         | 
| 
       1417 
     | 
    
         
            -
            You can run your mobile web tests against the mobile Chrome or Android browser on emulated Android devices using Appium and 
     | 
| 
       1418 
     | 
    
         
            -
            must install Android Studio, the desired Android version-specific virtual device emulators, and 
     | 
| 
       1419 
     | 
    
         
            -
             
     | 
| 
       1420 
     | 
    
         
            -
             
     | 
| 
      
 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.
         
     | 
| 
       1421 
1439 
     | 
    
         | 
| 
       1422 
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)
         
     | 
| 
       1423 
     | 
    
         
            -
            for information on configuring Appium to use the correct version of Chromedriver required to work with the web browser supported 
     | 
| 
      
 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.
         
     | 
| 
       1424 
1443 
     | 
    
         | 
| 
       1425 
1444 
     | 
    
         
             
            Once your test environment is properly configured, the following **Environment Variables** must be set as described in the table below.
         
     | 
| 
       1426 
1445 
     | 
    
         | 
| 
         @@ -1447,8 +1466,8 @@ Refer to **section 8.6 (Using Browser specific Profiles in cucumber.yml)** below 
     | 
|
| 
       1447 
1466 
     | 
    
         
             
            #### Starting and stopping Appium Server
         
     | 
| 
       1448 
1467 
     | 
    
         | 
| 
       1449 
1468 
     | 
    
         
             
            The Appium server must be running prior to invoking Cucumber to run your features/scenarios on mobile simulators or physical
         
     | 
| 
       1450 
     | 
    
         
            -
            device. To programmatically control the starting and stopping of Appium server with the execution of your automated tests, 
     | 
| 
       1451 
     | 
    
         
            -
            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.
         
     | 
| 
       1452 
1471 
     | 
    
         | 
| 
       1453 
1472 
     | 
    
         
             
                BeforeAll do
         
     | 
| 
       1454 
1473 
     | 
    
         
             
                  # start Appium Server if APPIUM_SERVER = 'run' and target browser is a mobile simulator or device
         
     | 
| 
         @@ -1468,9 +1487,9 @@ the code shown below in your `hooks.rb` file. 
     | 
|
| 
       1468 
1487 
     | 
    
         
             
                end
         
     | 
| 
       1469 
1488 
     | 
    
         | 
| 
       1470 
1489 
     | 
    
         | 
| 
       1471 
     | 
    
         
            -
            The `APPIUM_SERVER` environment variable must be set to `run` in order to programmatically start and stop Appium server. This 
     | 
| 
       1472 
     | 
    
         
            -
            set by adding the following to your `cucumber.yml` file and including `-p run_appium` in your command line when starting 
     | 
| 
       1473 
     | 
    
         
            -
            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):
         
     | 
| 
       1474 
1493 
     | 
    
         | 
| 
       1475 
1494 
     | 
    
         
             
                run_appium: APPIUM_SERVER=run
         
     | 
| 
       1476 
1495 
     | 
    
         | 
| 
         @@ -1480,21 +1499,21 @@ Refer to **section 8.6 (Using Browser specific Profiles in cucumber.yml)** below 
     | 
|
| 
       1480 
1499 
     | 
    
         | 
| 
       1481 
1500 
     | 
    
         
             
            ### Remote cloud hosted desktop and mobile web browsers
         
     | 
| 
       1482 
1501 
     | 
    
         | 
| 
       1483 
     | 
    
         
            -
            You can run your automated tests against remote cloud hosted desktop and mobile web browsers using the BrowserStack, SauceLabs, 
     | 
| 
       1484 
     | 
    
         
            -
            LambdaTest services. If your tests are running against a web site hosted on your local computer (`localhost`), 
     | 
| 
       1485 
     | 
    
         
            -
            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`.
         
     | 
| 
       1486 
1505 
     | 
    
         | 
| 
       1487 
     | 
    
         
            -
            Due to lack of support for Selenium 4.x and the W3C browser capabilities protocol, support for CrossBrowserTesting and Gridlastic 
     | 
| 
       1488 
     | 
    
         
            -
            Selenium grid services was removed as of version 4.1 of this gem. If your testing requires access to either of those 
     | 
| 
       1489 
     | 
    
         
            -
            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.
         
     | 
| 
       1490 
1509 
     | 
    
         | 
| 
       1491 
1510 
     | 
    
         
             
            Refer to **section 8.6 (Using Browser specific Profiles in cucumber.yml)** below.
         
     | 
| 
       1492 
1511 
     | 
    
         | 
| 
       1493 
1512 
     | 
    
         | 
| 
       1494 
1513 
     | 
    
         
             
            #### Remote desktop browsers on the BrowserStack service
         
     | 
| 
       1495 
1514 
     | 
    
         | 
| 
       1496 
     | 
    
         
            -
            For remotely hosted desktop web browsers on the BrowserStack service, the following **Environment Variables** must be set as 
     | 
| 
       1497 
     | 
    
         
            -
            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)
         
     | 
| 
       1498 
1517 
     | 
    
         
             
            for information regarding the specific capabilities.
         
     | 
| 
       1499 
1518 
     | 
    
         | 
| 
       1500 
1519 
     | 
    
         
             
            | **Environment Variable** | **Description**                                                                                                                                                            |
         
     | 
| 
         @@ -1590,6 +1609,26 @@ regarding the specific capabilities. 
     | 
|
| 
       1590 
1609 
     | 
    
         
             
            | `BROWSER_SIZE`           | [Optional] Specify width, height of browser window                                                                |
         
     | 
| 
       1591 
1610 
     | 
    
         | 
| 
       1592 
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 
     | 
    
         
            +
             
     | 
| 
       1593 
1632 
     | 
    
         
             
            #### Remote desktop browsers on the LambdaTest service
         
     | 
| 
       1594 
1633 
     | 
    
         | 
| 
       1595 
1634 
     | 
    
         
             
            For remotely hosted desktop web browsers on the LambdaTest service, the following **Environment Variables** must be set as described in the table
         
     | 
| 
         @@ -1614,14 +1653,15 @@ to obtain information regarding the specific capabilities. 
     | 
|
| 
       1614 
1653 
     | 
    
         | 
| 
       1615 
1654 
     | 
    
         
             
            ### Using Browser specific Profiles in cucumber.yml
         
     | 
| 
       1616 
1655 
     | 
    
         | 
| 
       1617 
     | 
    
         
            -
            While you can set **Environment Variables** in the command line when invoking Cucumber, a preferred method of specifying and 
     | 
| 
       1618 
     | 
    
         
            -
            target web browsers is to create browser specific **Profiles** that set the appropriate **Environment Variables** for 
     | 
| 
       1619 
     | 
    
         
            -
            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.
         
     | 
| 
       1620 
1659 
     | 
    
         | 
| 
       1621 
     | 
    
         
            -
            Below is a list of Cucumber **Profiles** for supported locally and remotely hosted desktop and mobile web browsers (put these 
     | 
| 
       1622 
     | 
    
         
            -
            `cucumber.yml` file). Before you can use the BrowserStack, SauceLabs, TestingBot or LambdaTest services, you will 
     | 
| 
       1623 
     | 
    
         
            -
            *INSERT USER NAME HERE* and *INSERT PASSWORD HERE* placeholder text with your user account and authorization 
     | 
| 
       1624 
     | 
    
         
            -
            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
         
     | 
| 
       1625 
1665 
     | 
    
         | 
| 
       1626 
1666 
     | 
    
         | 
| 
       1627 
1667 
     | 
    
         
             
                <% desktop = "--tags @desktop --require features BROWSER_TILE=true BROWSER_SIZE=1500,1000" %>
         
     | 
| 
         @@ -1850,27 +1890,27 @@ that you intend to connect with. 
     | 
|
| 
       1850 
1890 
     | 
    
         
             
                lt_i0_win11:   --profile lt_win10 LT_BROWSER="Internet Explorer" LT_VERSION="11.0"
         
     | 
| 
       1851 
1891 
     | 
    
         | 
| 
       1852 
1892 
     | 
    
         | 
| 
       1853 
     | 
    
         
            -
            To specify a locally hosted target browser using a profile at runtime, you use the flag `--profile` or `-p` followed by the 
     | 
| 
       1854 
     | 
    
         
            -
            invoking Cucumber in the command line. For instance, the following command invokes Cucumber and specifies 
     | 
| 
       1855 
     | 
    
         
            -
            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:
         
     | 
| 
       1856 
1896 
     | 
    
         | 
| 
       1857 
1897 
     | 
    
         
             
                cucumber -p firefox
         
     | 
| 
       1858 
1898 
     | 
    
         | 
| 
       1859 
1899 
     | 
    
         | 
| 
       1860 
     | 
    
         
            -
            The following command specifies that Cucumber will run tests against an instance of Chrome hosted within a Dockerized Selenium 
     | 
| 
       1861 
     | 
    
         
            -
            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:
         
     | 
| 
       1862 
1902 
     | 
    
         | 
| 
       1863 
1903 
     | 
    
         
             
                cucumber -p chrome -p grid
         
     | 
| 
       1864 
1904 
     | 
    
         | 
| 
       1865 
1905 
     | 
    
         | 
| 
       1866 
     | 
    
         
            -
            The following command specifies that Cucumber will run tests against a local instance of Chrome, which will be used to emulate 
     | 
| 
       1867 
     | 
    
         
            -
            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:
         
     | 
| 
       1868 
1908 
     | 
    
         | 
| 
       1869 
1909 
     | 
    
         
             
                cucumber -p ipad_pro -p landscape
         
     | 
| 
       1870 
1910 
     | 
    
         | 
| 
       1871 
1911 
     | 
    
         | 
| 
       1872 
     | 
    
         
            -
            The following command specifies that Cucumber will run tests against an iPad Pro (12.9-inch) (5th generation) with iOS version 
     | 
| 
       1873 
     | 
    
         
            -
            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:
         
     | 
| 
       1874 
1914 
     | 
    
         | 
| 
       1875 
1915 
     | 
    
         
             
                cucumber -p ipad_pro_12_15_sim -p landscape
         
     | 
| 
       1876 
1916 
     | 
    
         | 
| 
         @@ -1881,8 +1921,8 @@ You can ensure that Appium Server is running by including `-p run_appium` in you 
     | 
|
| 
       1881 
1921 
     | 
    
         
             
                cucumber -p ipad_pro_12_15_sim -p landscape -p run_appium
         
     | 
| 
       1882 
1922 
     | 
    
         | 
| 
       1883 
1923 
     | 
    
         | 
| 
       1884 
     | 
    
         
            -
            The following command specifies that Cucumber will run tests against a remotely hosted Safari web browser running on a macOS 
     | 
| 
       1885 
     | 
    
         
            -
            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:
         
     | 
| 
       1886 
1926 
     | 
    
         | 
| 
       1887 
1927 
     | 
    
         
             
                cucumber -p bs_safari_monterey
         
     | 
| 
       1888 
1928 
     | 
    
         | 
| 
         @@ -1924,27 +1964,20 @@ area sub-folders as needed. Likewise, `PageSection` class definitions should be 
     | 
|
| 
       1924 
1964 
     | 
    
         
             
            TestCentricity™ Framework is Copyright (c) 2014-2022, Tony Mrozinski.
         
     | 
| 
       1925 
1965 
     | 
    
         
             
            All rights reserved.
         
     | 
| 
       1926 
1966 
     | 
    
         | 
| 
       1927 
     | 
    
         
            -
            Redistribution and use in source and binary forms, with or without
         
     | 
| 
       1928 
     | 
    
         
            -
             
     | 
| 
       1929 
     | 
    
         
            -
             
     | 
| 
       1930 
     | 
    
         
            -
            1. Redistributions of source code must retain the above copyright notice,
         
     | 
| 
       1931 
     | 
    
         
            -
             
     | 
| 
       1932 
     | 
    
         
            -
             
     | 
| 
       1933 
     | 
    
         
            -
             
     | 
| 
       1934 
     | 
    
         
            -
             
     | 
| 
       1935 
     | 
    
         
            -
             
     | 
| 
       1936 
     | 
    
         
            -
             
     | 
| 
       1937 
     | 
    
         
            -
             
     | 
| 
       1938 
     | 
    
         
            -
             
     | 
| 
       1939 
     | 
    
         
            -
             
     | 
| 
       1940 
     | 
    
         
            -
             
     | 
| 
       1941 
     | 
    
         
            -
             
     | 
| 
       1942 
     | 
    
         
            -
             
     | 
| 
       1943 
     | 
    
         
            -
             
     | 
| 
       1944 
     | 
    
         
            -
            IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
         
     | 
| 
       1945 
     | 
    
         
            -
            INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
         
     | 
| 
       1946 
     | 
    
         
            -
            NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
         
     | 
| 
       1947 
     | 
    
         
            -
            OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
         
     | 
| 
       1948 
     | 
    
         
            -
            WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
         
     | 
| 
       1949 
     | 
    
         
            -
            ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
         
     | 
| 
       1950 
     | 
    
         
            -
            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.
         
     | 
| 
         @@ -396,7 +396,6 @@ module TestCentricity 
     | 
|
| 
       396 
396 
     | 
    
         
             
                  @screen_shots = []
         
     | 
| 
       397 
397 
     | 
    
         
             
                end
         
     | 
| 
       398 
398 
     | 
    
         | 
| 
       399 
     | 
    
         
            -
                # :nocov:
         
     | 
| 
       400 
399 
     | 
    
         
             
                def self.report_header
         
     | 
| 
       401 
400 
     | 
    
         
             
                  report_header = "\n<b><u>TEST ENVIRONMENT</u>:</b> #{ENV['TEST_ENVIRONMENT']}\n"\
         
     | 
| 
       402 
401 
     | 
    
         
             
                  "  <b>Browser:</b>\t #{Environ.browser.capitalize}\n"
         
     | 
| 
         @@ -412,6 +411,5 @@ module TestCentricity 
     | 
|
| 
       412 
411 
     | 
    
         
             
                  report_header = "#{report_header}  <b>WCAG Accessibility Standard:</b>\t #{ENV['ACCESSIBILITY_STANDARD']}\n" if ENV['ACCESSIBILITY_STANDARD']
         
     | 
| 
       413 
412 
     | 
    
         
             
                  "#{report_header}\n\n"
         
     | 
| 
       414 
413 
     | 
    
         
             
                end
         
     | 
| 
       415 
     | 
    
         
            -
                # :nocov:
         
     | 
| 
       416 
414 
     | 
    
         
             
              end
         
     | 
| 
       417 
415 
     | 
    
         
             
            end
         
     | 
| 
         @@ -34,14 +34,12 @@ module TestCentricity 
     | 
|
| 
       34 
34 
     | 
    
         
             
                  # set downloads folder path
         
     | 
| 
       35 
35 
     | 
    
         
             
                  @downloads_path = "#{Dir.pwd}/downloads"
         
     | 
| 
       36 
36 
     | 
    
         
             
                  if ENV['PARALLEL']
         
     | 
| 
       37 
     | 
    
         
            -
                    # :nocov:
         
     | 
| 
       38 
37 
     | 
    
         
             
                    Environ.parallel = true
         
     | 
| 
       39 
38 
     | 
    
         
             
                    Environ.process_num = ENV['TEST_ENV_NUMBER']
         
     | 
| 
       40 
39 
     | 
    
         
             
                    if Dir.exist?(@downloads_path)
         
     | 
| 
       41 
40 
     | 
    
         
             
                      @downloads_path = "#{@downloads_path}/#{ENV['TEST_ENV_NUMBER']}"
         
     | 
| 
       42 
41 
     | 
    
         
             
                      Dir.mkdir(@downloads_path) unless Dir.exist?(@downloads_path)
         
     | 
| 
       43 
42 
     | 
    
         
             
                    end
         
     | 
| 
       44 
     | 
    
         
            -
                    # :nocov:
         
     | 
| 
       45 
43 
     | 
    
         
             
                  else
         
     | 
| 
       46 
44 
     | 
    
         
             
                    Environ.parallel = false
         
     | 
| 
       47 
45 
     | 
    
         
             
                  end
         
     | 
| 
         @@ -57,27 +55,28 @@ module TestCentricity 
     | 
|
| 
       57 
55 
     | 
    
         
             
                            when :appium
         
     | 
| 
       58 
56 
     | 
    
         
             
                              initialize_appium
         
     | 
| 
       59 
57 
     | 
    
         
             
                              'Appium'
         
     | 
| 
       60 
     | 
    
         
            -
             
     | 
| 
      
 58 
     | 
    
         
            +
                            when :webdriver
         
     | 
| 
      
 59 
     | 
    
         
            +
                              if ENV['SELENIUM'] == 'remote'
         
     | 
| 
      
 60 
     | 
    
         
            +
                                initialize_remote
         
     | 
| 
      
 61 
     | 
    
         
            +
                                'Selenium Grid'
         
     | 
| 
      
 62 
     | 
    
         
            +
                              else
         
     | 
| 
      
 63 
     | 
    
         
            +
                                initialize_local_browser
         
     | 
| 
      
 64 
     | 
    
         
            +
                                'local browser instance'
         
     | 
| 
      
 65 
     | 
    
         
            +
                              end
         
     | 
| 
       61 
66 
     | 
    
         
             
                            when :browserstack
         
     | 
| 
       62 
67 
     | 
    
         
             
                              initialize_browserstack
         
     | 
| 
       63 
68 
     | 
    
         
             
                              'Browserstack cloud service'
         
     | 
| 
      
 69 
     | 
    
         
            +
                            when :testingbot
         
     | 
| 
      
 70 
     | 
    
         
            +
                              initialize_testingbot
         
     | 
| 
      
 71 
     | 
    
         
            +
                              'TestingBot cloud service'
         
     | 
| 
      
 72 
     | 
    
         
            +
                              # :nocov:
         
     | 
| 
       64 
73 
     | 
    
         
             
                            when :lambdatest
         
     | 
| 
       65 
74 
     | 
    
         
             
                              initialize_lambdatest
         
     | 
| 
       66 
75 
     | 
    
         
             
                              'LambdaTest cloud service'
         
     | 
| 
       67 
76 
     | 
    
         
             
                            when :saucelabs
         
     | 
| 
       68 
77 
     | 
    
         
             
                              initialize_saucelabs
         
     | 
| 
       69 
78 
     | 
    
         
             
                              'Sauce Labs cloud service'
         
     | 
| 
       70 
     | 
    
         
            -
             
     | 
| 
       71 
     | 
    
         
            -
                              initialize_testingbot
         
     | 
| 
       72 
     | 
    
         
            -
                              'TestingBot cloud service'
         
     | 
| 
       73 
     | 
    
         
            -
                            when :webdriver
         
     | 
| 
       74 
     | 
    
         
            -
                              if ENV['SELENIUM'] == 'remote'
         
     | 
| 
       75 
     | 
    
         
            -
                                initialize_remote
         
     | 
| 
       76 
     | 
    
         
            -
                                'Selenium Grid'
         
     | 
| 
       77 
     | 
    
         
            -
                              else
         
     | 
| 
       78 
     | 
    
         
            -
                                initialize_local_browser
         
     | 
| 
       79 
     | 
    
         
            -
                                'local browser instance'
         
     | 
| 
       80 
     | 
    
         
            -
                              end
         
     | 
| 
      
 79 
     | 
    
         
            +
                              # :nocov:
         
     | 
| 
       81 
80 
     | 
    
         
             
                            end
         
     | 
| 
       82 
81 
     | 
    
         | 
| 
       83 
82 
     | 
    
         
             
                  # set browser window size only if testing with a desktop web browser
         
     | 
| 
         @@ -227,12 +226,14 @@ module TestCentricity 
     | 
|
| 
       227 
226 
     | 
    
         
             
                  Environ.os = case
         
     | 
| 
       228 
227 
     | 
    
         
             
                               when OS.osx?
         
     | 
| 
       229 
228 
     | 
    
         
             
                                 'OS X'
         
     | 
| 
      
 229 
     | 
    
         
            +
                                 # :nocov:
         
     | 
| 
       230 
230 
     | 
    
         
             
                               when OS.windows?
         
     | 
| 
       231 
231 
     | 
    
         
             
                                 'Windows'
         
     | 
| 
       232 
232 
     | 
    
         
             
                               when OS.linux?
         
     | 
| 
       233 
233 
     | 
    
         
             
                                 'Linux'
         
     | 
| 
       234 
234 
     | 
    
         
             
                               else
         
     | 
| 
       235 
235 
     | 
    
         
             
                                 'unknown'
         
     | 
| 
      
 236 
     | 
    
         
            +
                                 # :nocov:
         
     | 
| 
       236 
237 
     | 
    
         
             
                               end
         
     | 
| 
       237 
238 
     | 
    
         
             
                  browser = Environ.browser.downcase.to_sym
         
     | 
| 
       238 
239 
     | 
    
         | 
| 
         @@ -282,10 +283,12 @@ module TestCentricity 
     | 
|
| 
       282 
283 
     | 
    
         
             
                  @endpoint = ENV['REMOTE_ENDPOINT'] || 'http://127.0.0.1:4444/wd/hub' if @endpoint.nil?
         
     | 
| 
       283 
284 
     | 
    
         | 
| 
       284 
285 
     | 
    
         
             
                  case browser
         
     | 
| 
      
 286 
     | 
    
         
            +
                    # :nocov:
         
     | 
| 
       285 
287 
     | 
    
         
             
                  when :safari
         
     | 
| 
       286 
288 
     | 
    
         
             
                    options = Selenium::WebDriver::Safari::Options.new
         
     | 
| 
       287 
289 
     | 
    
         
             
                  when :ie
         
     | 
| 
       288 
290 
     | 
    
         
             
                    options = Selenium::WebDriver::IE::Options.new
         
     | 
| 
      
 291 
     | 
    
         
            +
                    # :nocov:
         
     | 
| 
       289 
292 
     | 
    
         
             
                  when :firefox, :firefox_headless
         
     | 
| 
       290 
293 
     | 
    
         
             
                    options = firefox_options(browser)
         
     | 
| 
       291 
294 
     | 
    
         
             
                  when :chrome, :chrome_headless, :edge, :edge_headless
         
     | 
| 
         @@ -320,11 +323,10 @@ module TestCentricity 
     | 
|
| 
       320 
323 
     | 
    
         
             
                  Capybara.default_driver = :remote_browser
         
     | 
| 
       321 
324 
     | 
    
         
             
                end
         
     | 
| 
       322 
325 
     | 
    
         | 
| 
       323 
     | 
    
         
            -
                # :nocov:
         
     | 
| 
       324 
326 
     | 
    
         
             
                def self.initialize_browserstack
         
     | 
| 
       325 
327 
     | 
    
         
             
                  browser = ENV['BS_BROWSER']
         
     | 
| 
       326 
328 
     | 
    
         
             
                  Environ.grid = :browserstack
         
     | 
| 
       327 
     | 
    
         
            -
             
     | 
| 
      
 329 
     | 
    
         
            +
                  Environ.os = "#{ENV['BS_OS']} #{ENV['BS_OS_VERSION']}"
         
     | 
| 
       328 
330 
     | 
    
         
             
                  if ENV['BS_REAL_MOBILE'] || ENV['BS_DEVICE']
         
     | 
| 
       329 
331 
     | 
    
         
             
                    Environ.platform    = :mobile
         
     | 
| 
       330 
332 
     | 
    
         
             
                    Environ.device_name = ENV['BS_DEVICE']
         
     | 
| 
         @@ -335,11 +337,10 @@ module TestCentricity 
     | 
|
| 
       335 
337 
     | 
    
         
             
                                     else
         
     | 
| 
       336 
338 
     | 
    
         
             
                                       :simulator
         
     | 
| 
       337 
339 
     | 
    
         
             
                                     end
         
     | 
| 
       338 
     | 
    
         
            -
                  elsif ENV['BS_OS']
         
     | 
| 
       339 
     | 
    
         
            -
                    Environ.os = "#{ENV['BS_OS']} #{ENV['BS_OS_VERSION']}"
         
     | 
| 
       340 
340 
     | 
    
         
             
                  end
         
     | 
| 
       341 
341 
     | 
    
         
             
                  # specify endpoint url
         
     | 
| 
       342 
342 
     | 
    
         
             
                  @endpoint = "http://#{ENV['BS_USERNAME']}:#{ENV['BS_AUTHKEY']}@hub-cloud.browserstack.com/wd/hub" if @endpoint.nil?
         
     | 
| 
      
 343 
     | 
    
         
            +
                  # :nocov:
         
     | 
| 
       343 
344 
     | 
    
         
             
                  # enable tunneling if specified
         
     | 
| 
       344 
345 
     | 
    
         
             
                  if ENV['TUNNELING']
         
     | 
| 
       345 
346 
     | 
    
         
             
                    @bs_local = BrowserStack::Local.new
         
     | 
| 
         @@ -351,6 +352,7 @@ module TestCentricity 
     | 
|
| 
       351 
352 
     | 
    
         
             
                      puts 'BrowserStack Local instance failed to start'
         
     | 
| 
       352 
353 
     | 
    
         
             
                    end
         
     | 
| 
       353 
354 
     | 
    
         
             
                  end
         
     | 
| 
      
 355 
     | 
    
         
            +
                  # :nocov:
         
     | 
| 
       354 
356 
     | 
    
         
             
                  # define BrowserStack options
         
     | 
| 
       355 
357 
     | 
    
         
             
                  options = if @capabilities.nil?
         
     | 
| 
       356 
358 
     | 
    
         
             
                              browser_options = {}
         
     | 
| 
         @@ -416,6 +418,61 @@ module TestCentricity 
     | 
|
| 
       416 
418 
     | 
    
         
             
                  Environ.device_type = ENV['DEVICE_TYPE'] if ENV['DEVICE_TYPE']
         
     | 
| 
       417 
419 
     | 
    
         
             
                end
         
     | 
| 
       418 
420 
     | 
    
         | 
| 
      
 421 
     | 
    
         
            +
                def self.initialize_testingbot
         
     | 
| 
      
 422 
     | 
    
         
            +
                  browser = ENV['TB_BROWSER']
         
     | 
| 
      
 423 
     | 
    
         
            +
                  Environ.grid = :testingbot
         
     | 
| 
      
 424 
     | 
    
         
            +
             
     | 
| 
      
 425 
     | 
    
         
            +
                  Environ.os = ENV['TB_OS']
         
     | 
| 
      
 426 
     | 
    
         
            +
                  if ENV['TB_PLATFORM']
         
     | 
| 
      
 427 
     | 
    
         
            +
                    Environ.device_orientation = ENV['ORIENTATION'] if ENV['ORIENTATION']
         
     | 
| 
      
 428 
     | 
    
         
            +
                    Environ.device_os   = ENV['TB_PLATFORM']
         
     | 
| 
      
 429 
     | 
    
         
            +
                    Environ.device_name = ENV['TB_DEVICE']
         
     | 
| 
      
 430 
     | 
    
         
            +
                    Environ.device      = :device
         
     | 
| 
      
 431 
     | 
    
         
            +
                    Environ.platform    = :mobile
         
     | 
| 
      
 432 
     | 
    
         
            +
                    Environ.device_type = ENV['DEVICE_TYPE'] if ENV['DEVICE_TYPE']
         
     | 
| 
      
 433 
     | 
    
         
            +
                  else
         
     | 
| 
      
 434 
     | 
    
         
            +
                    Environ.platform = :desktop
         
     | 
| 
      
 435 
     | 
    
         
            +
                  end
         
     | 
| 
      
 436 
     | 
    
         
            +
                  # specify endpoint url
         
     | 
| 
      
 437 
     | 
    
         
            +
                  if @endpoint.nil?
         
     | 
| 
      
 438 
     | 
    
         
            +
                    url = ENV['TUNNELING'] ? '@localhost:4445/wd/hub' : '@hub.testingbot.com/wd/hub'
         
     | 
| 
      
 439 
     | 
    
         
            +
                    @endpoint = "http://#{ENV['TB_USERNAME']}:#{ENV['TB_AUTHKEY']}#{url}"
         
     | 
| 
      
 440 
     | 
    
         
            +
                  end
         
     | 
| 
      
 441 
     | 
    
         
            +
                  # define TestingBot options
         
     | 
| 
      
 442 
     | 
    
         
            +
                  options = if @capabilities.nil?
         
     | 
| 
      
 443 
     | 
    
         
            +
                              # define the required set of TestingBot options
         
     | 
| 
      
 444 
     | 
    
         
            +
                              tb_options = { build: test_context_message }
         
     | 
| 
      
 445 
     | 
    
         
            +
                              # define the optional TestingBot options
         
     | 
| 
      
 446 
     | 
    
         
            +
                              tb_options[:name] = ENV['AUTOMATE_PROJECT'] if ENV['AUTOMATE_PROJECT']
         
     | 
| 
      
 447 
     | 
    
         
            +
                              tb_options['timeZone'] = ENV['TIME_ZONE'] if ENV['TIME_ZONE']
         
     | 
| 
      
 448 
     | 
    
         
            +
                              tb_options['testingbot.geoCountryCode'] = ENV['GEO_LOCATION'] if ENV['GEO_LOCATION']
         
     | 
| 
      
 449 
     | 
    
         
            +
                              tb_options[:screenrecorder] = ENV['RECORD_VIDEO'] if ENV['RECORD_VIDEO']
         
     | 
| 
      
 450 
     | 
    
         
            +
                              tb_options[:screenshot] = ENV['SCREENSHOTS'] if ENV['SCREENSHOTS']
         
     | 
| 
      
 451 
     | 
    
         
            +
                              # define mobile device options
         
     | 
| 
      
 452 
     | 
    
         
            +
                              if ENV['TB_PLATFORM']
         
     | 
| 
      
 453 
     | 
    
         
            +
                                tb_options[:platform] = ENV['TB_PLATFORM']
         
     | 
| 
      
 454 
     | 
    
         
            +
                                tb_options[:orientation] = ENV['ORIENTATION'].upcase if ENV['ORIENTATION']
         
     | 
| 
      
 455 
     | 
    
         
            +
                                tb_options[:deviceName] = ENV['TB_DEVICE'] if ENV['TB_DEVICE']
         
     | 
| 
      
 456 
     | 
    
         
            +
                              else
         
     | 
| 
      
 457 
     | 
    
         
            +
                                # define desktop browser options
         
     | 
| 
      
 458 
     | 
    
         
            +
                                tb_options['screen-resolution'] = ENV['RESOLUTION'] if ENV['RESOLUTION']
         
     | 
| 
      
 459 
     | 
    
         
            +
                                tb_options['selenium-version'] = '4.3.0'
         
     | 
| 
      
 460 
     | 
    
         
            +
                              end
         
     | 
| 
      
 461 
     | 
    
         
            +
                              {
         
     | 
| 
      
 462 
     | 
    
         
            +
                                browserName: browser,
         
     | 
| 
      
 463 
     | 
    
         
            +
                                browserVersion: ENV['TB_VERSION'],
         
     | 
| 
      
 464 
     | 
    
         
            +
                                platformName: ENV['TB_OS'],
         
     | 
| 
      
 465 
     | 
    
         
            +
                                'tb:options': tb_options
         
     | 
| 
      
 466 
     | 
    
         
            +
                              }
         
     | 
| 
      
 467 
     | 
    
         
            +
                            else
         
     | 
| 
      
 468 
     | 
    
         
            +
                              @capabilities
         
     | 
| 
      
 469 
     | 
    
         
            +
                            end
         
     | 
| 
      
 470 
     | 
    
         
            +
                  register_remote_driver(:testingbot, browser, options)
         
     | 
| 
      
 471 
     | 
    
         
            +
                  # configure file_detector for remote uploads if target is desktop web browser
         
     | 
| 
      
 472 
     | 
    
         
            +
                  config_file_uploads unless ENV['TB_PLATFORM']
         
     | 
| 
      
 473 
     | 
    
         
            +
                end
         
     | 
| 
      
 474 
     | 
    
         
            +
             
     | 
| 
      
 475 
     | 
    
         
            +
                # :nocov:
         
     | 
| 
       419 
476 
     | 
    
         
             
                def self.initialize_lambdatest
         
     | 
| 
       420 
477 
     | 
    
         
             
                  browser = ENV['LT_BROWSER']
         
     | 
| 
       421 
478 
     | 
    
         
             
                  Environ.grid = :lambdatest
         
     | 
| 
         @@ -522,60 +579,6 @@ module TestCentricity 
     | 
|
| 
       522 
579 
     | 
    
         
             
                  # configure file_detector for remote uploads
         
     | 
| 
       523 
580 
     | 
    
         
             
                  config_file_uploads
         
     | 
| 
       524 
581 
     | 
    
         
             
                end
         
     | 
| 
       525 
     | 
    
         
            -
             
     | 
| 
       526 
     | 
    
         
            -
                def self.initialize_testingbot
         
     | 
| 
       527 
     | 
    
         
            -
                  browser = ENV['TB_BROWSER']
         
     | 
| 
       528 
     | 
    
         
            -
                  Environ.grid = :testingbot
         
     | 
| 
       529 
     | 
    
         
            -
             
     | 
| 
       530 
     | 
    
         
            -
                  Environ.os = ENV['TB_OS']
         
     | 
| 
       531 
     | 
    
         
            -
                  if ENV['TB_PLATFORM']
         
     | 
| 
       532 
     | 
    
         
            -
                    Environ.device_orientation = ENV['ORIENTATION'] if ENV['ORIENTATION']
         
     | 
| 
       533 
     | 
    
         
            -
                    Environ.device_os   = ENV['TB_PLATFORM']
         
     | 
| 
       534 
     | 
    
         
            -
                    Environ.device_name = ENV['TB_DEVICE']
         
     | 
| 
       535 
     | 
    
         
            -
                    Environ.device      = :device
         
     | 
| 
       536 
     | 
    
         
            -
                    Environ.platform    = :mobile
         
     | 
| 
       537 
     | 
    
         
            -
                    Environ.device_type = ENV['DEVICE_TYPE'] if ENV['DEVICE_TYPE']
         
     | 
| 
       538 
     | 
    
         
            -
                  else
         
     | 
| 
       539 
     | 
    
         
            -
                    Environ.platform = :desktop
         
     | 
| 
       540 
     | 
    
         
            -
                  end
         
     | 
| 
       541 
     | 
    
         
            -
                  # specify endpoint url
         
     | 
| 
       542 
     | 
    
         
            -
                  if @endpoint.nil?
         
     | 
| 
       543 
     | 
    
         
            -
                    url = ENV['TUNNELING'] ? '@localhost:4445/wd/hub' : '@hub.testingbot.com/wd/hub'
         
     | 
| 
       544 
     | 
    
         
            -
                    @endpoint = "http://#{ENV['TB_USERNAME']}:#{ENV['TB_AUTHKEY']}#{url}"
         
     | 
| 
       545 
     | 
    
         
            -
                  end
         
     | 
| 
       546 
     | 
    
         
            -
                  # define TestingBot options
         
     | 
| 
       547 
     | 
    
         
            -
                  options = if @capabilities.nil?
         
     | 
| 
       548 
     | 
    
         
            -
                              # define the required set of TestingBot options
         
     | 
| 
       549 
     | 
    
         
            -
                              tb_options = { build: test_context_message }
         
     | 
| 
       550 
     | 
    
         
            -
                              # define the optional TestingBot options
         
     | 
| 
       551 
     | 
    
         
            -
                              tb_options[:name] = ENV['AUTOMATE_PROJECT'] if ENV['AUTOMATE_PROJECT']
         
     | 
| 
       552 
     | 
    
         
            -
                              tb_options[:timeZone] = ENV['TIME_ZONE'] if ENV['TIME_ZONE']
         
     | 
| 
       553 
     | 
    
         
            -
                              tb_options['testingbot.geoCountryCode'] = ENV['GEO_LOCATION'] if ENV['GEO_LOCATION']
         
     | 
| 
       554 
     | 
    
         
            -
                              tb_options[:screenrecorder] = ENV['RECORD_VIDEO'] if ENV['RECORD_VIDEO']
         
     | 
| 
       555 
     | 
    
         
            -
                              tb_options[:screenshot] = ENV['SCREENSHOTS'] if ENV['SCREENSHOTS']
         
     | 
| 
       556 
     | 
    
         
            -
                              # define mobile device options
         
     | 
| 
       557 
     | 
    
         
            -
                              if ENV['TB_PLATFORM']
         
     | 
| 
       558 
     | 
    
         
            -
                                tb_options[:platform] = ENV['TB_PLATFORM']
         
     | 
| 
       559 
     | 
    
         
            -
                                tb_options[:orientation] = ENV['ORIENTATION'].upcase if ENV['ORIENTATION']
         
     | 
| 
       560 
     | 
    
         
            -
                                tb_options[:deviceName] = ENV['TB_DEVICE'] if ENV['TB_DEVICE']
         
     | 
| 
       561 
     | 
    
         
            -
                              else
         
     | 
| 
       562 
     | 
    
         
            -
                                # define desktop browser options
         
     | 
| 
       563 
     | 
    
         
            -
                                tb_options['screen-resolution'] = ENV['RESOLUTION'] if ENV['RESOLUTION']
         
     | 
| 
       564 
     | 
    
         
            -
                                tb_options['selenium-version'] = '4.1.0'
         
     | 
| 
       565 
     | 
    
         
            -
                              end
         
     | 
| 
       566 
     | 
    
         
            -
                              {
         
     | 
| 
       567 
     | 
    
         
            -
                                browserName: browser,
         
     | 
| 
       568 
     | 
    
         
            -
                                browserVersion: ENV['TB_VERSION'],
         
     | 
| 
       569 
     | 
    
         
            -
                                platformName: ENV['TB_OS'],
         
     | 
| 
       570 
     | 
    
         
            -
                                'tb:options': tb_options
         
     | 
| 
       571 
     | 
    
         
            -
                              }
         
     | 
| 
       572 
     | 
    
         
            -
                            else
         
     | 
| 
       573 
     | 
    
         
            -
                              @capabilities
         
     | 
| 
       574 
     | 
    
         
            -
                            end
         
     | 
| 
       575 
     | 
    
         
            -
                  register_remote_driver(:testingbot, browser, options)
         
     | 
| 
       576 
     | 
    
         
            -
                  # configure file_detector for remote uploads if target is desktop web browser
         
     | 
| 
       577 
     | 
    
         
            -
                  config_file_uploads unless ENV['TB_PLATFORM']
         
     | 
| 
       578 
     | 
    
         
            -
                end
         
     | 
| 
       579 
582 
     | 
    
         
             
                # :nocov:
         
     | 
| 
       580 
583 
     | 
    
         | 
| 
       581 
584 
     | 
    
         
             
                def self.chrome_edge_options(browser)
         
     | 
| 
         @@ -622,7 +625,6 @@ module TestCentricity 
     | 
|
| 
       622 
625 
     | 
    
         
             
                  options
         
     | 
| 
       623 
626 
     | 
    
         
             
                end
         
     | 
| 
       624 
627 
     | 
    
         | 
| 
       625 
     | 
    
         
            -
                # :nocov:
         
     | 
| 
       626 
628 
     | 
    
         
             
                def self.test_context_message
         
     | 
| 
       627 
629 
     | 
    
         
             
                  context_message = if ENV['TEST_CONTEXT']
         
     | 
| 
       628 
630 
     | 
    
         
             
                                      "#{Environ.test_environment.to_s.upcase} - #{ENV['TEST_CONTEXT']}"
         
     | 
| 
         @@ -660,6 +662,5 @@ module TestCentricity 
     | 
|
| 
       660 
662 
     | 
    
         
             
                    str if File.exist?(str)
         
     | 
| 
       661 
663 
     | 
    
         
             
                  end
         
     | 
| 
       662 
664 
     | 
    
         
             
                end
         
     | 
| 
       663 
     | 
    
         
            -
                # :nocov:
         
     | 
| 
       664 
665 
     | 
    
         
             
              end
         
     | 
| 
       665 
666 
     | 
    
         
             
            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: 4.3. 
     | 
| 
      
 4 
     | 
    
         
            +
              version: 4.3.1
         
     | 
| 
       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: 2022-08- 
     | 
| 
      
 11 
     | 
    
         
            +
            date: 2022-08-19 00:00:00.000000000 Z
         
     | 
| 
       12 
12 
     | 
    
         
             
            dependencies:
         
     | 
| 
       13 
13 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       14 
14 
     | 
    
         
             
              name: appium_capybara
         
     |