testcentricity_web 4.3.0 → 4.3.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
![Gem Downloads](https://img.shields.io/gem/dt/testcentricity_web) ![Maintained](https://img.shields.io/maintenance/yes/2022)
|
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
|