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
|