VIVIDUS is all in one test automation tool
All users are welcomed to migrate to Java 21. If version of Java is lower than 17, the notification warning will be printed. In case of issues please report bugs as earlier as possible. The target date when support of Java versions lower than 21 will be dropped is July 1, 2024 (the first release after this date will require Java 21+). The old versions of VIVIDUS will start slowing down the tests intentionally after August 1, 2023 in order to push users to the migration.
New steps:
When I remove item with key `$key` from $storageType storage
When I clear $storageType storage
where $storageType
is one of the web storage mechanisms: either local
or session
.
New property:
web.headless.chrome.window-size=800,600
sets the initial window size, it is ignored when custom CLI arguments are set using web.driver.chrome.command-line-arguments
property.
Since Internet Explorer 11 has retired and is officially out of support, web/desktop/iexplore
profile is deprecated and will be removed in VIVIDUS 0.8.0.
Jump links using anchors based on name
attribute are included into validation scope.
Validation of jump links is skipped when the current context is restricted to a portion of the document (it's not possible to find target with the given anchor as it may belong to a rest part of the document): such resources are marked as filtered.
Now all redirect chains filtered during the crawling by the corresponding transformers are logged.
If master or readonly key is not configured to authenticate to Cosmos database service, the default Azure authentication mechanism described will be used.
This enhancement reduces number of test case re-openings and as result helps to avoid JIRA history pollution.
The reporting of steps as ReportPortal test cases is deprecated. As such, system.rp.test-entity
property is deprecated and will be removed in VIVIDUS 0.8.0. The default behavior will be to report scenarios as test cases (system.rp.test-entity= SCENARIO
).
Now resource excluded from validation scope via property resource-checker.uri-to-ignore-regex
are correctly filtered out.
New step:
When I save coordinates and size of element located by `$locator` to $scopes variable `$variableName`
New dynamic variable:
${context-source-code}
provides source code of the current UI context of the application under test.
New steps:
Then all resources found by $htmlLocatorType `$htmlLocator` are valid on:$pages
Then all resources found by $htmlLocatorType `$htmlLocator` in $html are valid
where $htmlLocatorType
is either CSS selector
or XPath
.
New transformer parameter mainPageUrl
is supported by FROM_SITEMAP
and FROM_HEADLESS_CRAWLING
table transformers. The corresponding properties are:
transformer.from-sitemap.main-page-url
transformer.from-headless-crawling.main-page-url
New property (default value is true
):
mobitru.resign-ios-app=true
#{generate($data-provider-and-its-arguments)}
expressionJoke
Joke.knockKnock
Joke.pun
LanguageCode
LanguageCode.iso639
Tire
Tire.aspectRatio
Tire.code
Tire.code
Tire.construction
Tire.loadIndex
Tire.rimSize
Tire.speedrating
Tire.vehicleType
Tire.width
Aviation
provider
Aviation.engineType
Aviation.flightStatus
Aviation.gate
Aviation.manufacturer
Aviation.specialTypeDesignator
Internet
provider
Internet.emailSubject
Internet.username
Name
provider
Name.femaleFirstName
Name.maleFirstName
Now an attempt to terminate the application which is not running results in the failed step instead of broken one. Having this behaviour users can mark this failure as known issue.
script
elementsDeprecated step | Replacement pattern |
---|---|
Then a javascript file with the name '$jsFileName' is included in the source code |
Then number of elements found by `xpath(.//script[contains(@src()='%1$s']):a` is equal to `1` |
Then a javascript with the text '$jsText' is included in the source code |
Then number of elements found by `xpath(.//script[text()='%1$s']):a` is equal to `1` |
Then a javascript with the textpart '$jsTextPart' is included in the source code |
Then number of elements found by `xpath(.//script[contains(text(),'%1$s')]):a` is equal to `1` |
The dynamic variables:
${context-height}
${context-width}
${context-x-coordinate}
${context-y-coordinate}
are deprecated in favour of step:
When I save coordinates and size of element located by `$locator` to $scopes variable `$variableName`
The dynamic variable:
${source-code}
is deprecated in favour of another dynamic variable:
${context-source-code}
cssSelector
only.Deprecated step | Replacement pattern |
---|---|
Then all resources by selector `$cssSelector` from $html are valid |
Then all resources found by CSS selector `<cssSelector>` in <html> are valid |
Then all resources by selector `$cssSelector` are valid on:$pages |
Then all resources found by CSS selector `<cssSelector>` are valid on:<pages> |
The use of web-application.main-page-url
property for setting of main page for crawling by FROM_SITEMAP
and FROM_HEADLESS_CRAWLING
table transformers is deprecated. mainPageUrl
transformer parameter or corresponding properties transformer.from-sitemap.main-page-url
and transformer.from-headless-crawling.main-page-url
must be used instead.
NullPointerException
occurred when running a particular composite step inside another composite step is fixed.
New steps:
When I emulate mobile device with configuration:`$jsonConfiguration`
When I reset mobile device emulation
Mouse click is retried if page has dynamically loaded content which results in invalid (sometimes negative) coordinates for click, e.g:
Element is not clickable at point (498, -377)
or Element is not clickable at point (550, -11228)
.
chrome-headless-shell
browser as ChromeThis change is explained on the Chrome for Developers blog: Download old Headless Chrome as chrome-headless-shell
distinct()
JSON path functionGiven JSON:
{
"type": [
"b",
"b",
"a",
"c",
"a"
],
"name": [
"abc"
]
}
When the following JSON path with distinct()
function is applied:
$.type.distinct()
The resulting JSON is:
[
"b",
"a",
"c"
]
FROM_HEADLESS_CRAWLING
table transformerNew property:
transformer.from-headless-crawling.exclude-urls-regex=.*(css\|gif\|gz\|ico\|jpeg\|jpg\|js\|mp3\|mp4\|pdf\|png\|svg\|zip\|woff2
\|woff\|ttf\|doc\|docx\|xml\|json\|webmanifest)$
The property transformer.from-headless-crawling.exclude-extensions-regex
is deprecated and will be removed in VIVIDUS 0.7.0, please use new property instead.
FROM_HTML
table transformerNew parameter variableName
is introduced. It's a name of the variable containing source HTML, only variables of scopes global
and next_batches
are allowed.
The pageUrl
parameter is deprecated and will be removed in VIVIDUS 0.7.0, please use new parameter instead.
Deprecated step | Replacement pattern |
---|---|
When I drag element located `$draggable` and drop it at $location of element located `$target` |
When I drag element located by `<draggable>` and drop it at <location> of element located by `<target>` |
When I simulate drag of element located `$draggable` and drop at element located `$target` |
When I simulate drag of element located by `<draggable>` and drop at element located by `<target>` |
URI user info provided as a part of SiteMap URI is treated as non-preemptive basic authentication now,
decrypt
expressionNew expression decrypts an input string using the same algorithm and password employed for the decryption of properties.
Any chars (excluding system ones reservered to identify parameters) can be used in ExamplesTable
headers names.
New profile is added: web/headless/edge
.
New property pattern:
transformer.from-headless-crawling.http.headers.<header name>=<header value>
FROM_HTML
table transformerNew transformer generates a table based on the text content, HTML content or attributes of HTML elements found in the provided HTML page.
New property rest-api.http.extended-logging
enables logging of HTTP request/response headers and bodies (applied to the following content types only: text/*
, application/json
, application/xml
).
New alias
Given request body:`$content`
is introduced for the step Given request body: $content
.
The broken link to HTML CodeSniffer standard in the report attachment is fixed to point WCAG 2.1 standard.
Now the steps typing text into field can work with web forms using CKEditor of version 5
Composite steps used in Lifecycle section with Examples are parsed and run correctly now (only Windows users were affected).
Within the report section Suites > Overview > Parameters] houses input data from both the scenario-level and story-level ExamplesTable if any of them is available. When the test data contains numerous records, the Parameters section can become lengthy, thus increasing the difficulty of navigating to the actual Execution body. The property report.show-parameters-section
can be used to hide the Parameters section, making navigation easier.
New property is selenium.grid.http.read-timeout
.
Now browser info is not retrieved at web application open stage, it's collected lazily upon the need.
The size of single log file is increased from 1 MB to 10 MB.
Deprecated step | Replacement pattern |
---|---|
When I play video in video player located `$locator` |
When I play video in video player located by `<locator>` |
When I pause video in video player located `$locator` |
When I pause video in video player located by `<locator>` |
When I rewind time to `$number` seconds in video player located `$locator` |
When I rewind time to `<number>` seconds in video player located by `<locator>` |
When I save info from video player located `$locator` to $scopes variable `$variableName` |
When I save info from video player located by `<locator>` to <scopes> variable `<variableName>` |
Deprecated step | Replacement pattern |
---|---|
When I wait until an alert appears |
When I wait until alert appears |
When I wait until an alert disappears |
When I wait until alert disappears |
When I wait until a frame with the name '$frameName' appears |
When I wait until element located by `xpath(//*[(local-name()='frame' or local-name()='iframe') and @*='<frameName>'])` appears |
When I wait until a frame with the name '$frameName' appears and I switch to it |
When I wait until frame with name `$frameName` appears and I switch to it |
When I wait until the page has the title '$title' |
When I wait until page title is equal to `<title>` |
When I wait until the page title contains the text '$text' |
When I wait until page title contains `<text>` |
Deprecated step | Replacement pattern |
---|---|
When I set value `$value` in slider located by `$locator` |
When I select the value '<value>' in a slider by the xpath '<xpath>' |
Then value `$value` is selected in slider located by `$locator` |
Then the value '<value>' is selected in a slider by the xpath '<xpath>' |
Affected step: When I switch to new tab
Assertion message like Fail: New tab is found
was ambiguous. The step is improved to have clear log and assertion messages.
NOTE: Updated of step patterns in known issues may be required.
Logger frameworks conflict is resolved, exporters work as expected.
New step:
Then SSL rating for URL `$url` is $comparisonRule `$gradeName`
Lighthouse performance scores are changed due to inherent variability in web and network technologies, even if there hasn't been a code change, to alleviate these effects this property allows to run several Lighthouse measurements and perform metrics validation on a measurement selected by user. Properties:
lighthouse.performance.percentile
- allows to choose a measurement for validation based on the specified percentile.lighthouse.performance.measurements-number
- specifies the number of Lighthouse measurements performed for validation.Single step can be used to upload both text and binary data to S3:
When I upload data `$data` with key `$objectKey` and content type `$contentType` to S3 bucket `$bucketName`
Deprecated step | Replacement pattern |
---|---|
Then the text matches '$regex' |
Then text matches `<regex>` |
#{removeWrappingDoubleQuotes(..)}
expression#{removeWrappingDoubleQuotes(..)}
expression is deprecated and will be removed in VIVIDUS 0.7.0. Please use JSON steps validating and saving JSON element values instead
Deprecated step | Replacement pattern |
---|---|
When I upload resource `$resourcePath` with key `$objectKey` and content type `$contentType` to S3 bucket `$bucketName` |
When I upload data `#{loadResource(<resourcePath>)}` with key `<objectKey>` and content type `<contentType>` to S3 bucket `<bucketName>` |
The workaround was added for Chrome/Chromium driver/browser bug: MoveTargetOutOfBoundsException
is caught while scrolling to element and attempt to scroll via JS is performed.
Fix NullPointerException
occurred at scans which do not collect performance metrics
New Gradle task allowing to replace deprecated properties automatically is created:
./gradlew replaceDeprecatedProperties
Find more details in the documentation. NOTE: Make sure to update VIVIDUS build system before.
Bill of Materials (BOM) file is added to the project. It simplifies management of dependencies, see vividus-starter
and vividus-sample-tests
projects for details how to use VIVIDUS BOM.
Now Lifecycle Before/After scenario steps can use parameters from scenario ExamplesTable
Now transparent parts are rendered as a chessboard.
New profile is added: web/headless/firefox
.
New property can be used to set Edge browser CLI arguments: web.driver.edge.command-line-arguments
New step:
When I save text of element located by `$locator` to $scopes variable `$variableName`
New step:
When I wait until element located by `$locator` has text matching `$regex`
New step:
Then I validate HTTP redirects: $expectedRedirects
Now steps validating resources checks jump links in fully-automated way
formatDate
expressionNew property is added: expression.format-date.locale
.
New step:
Then Lighthouse $scanType audit scores for `$checkpointPage` page are not less than for `$baselinePage` page
Breaking change: all users must migrate to Java 17 or higher. Support of Java 11 is dropped (Java 11 will reach EOL on 30 Sep 2023).
Breaking change: all users must migrate to VIVIDUS Build System 2.0 See Migration Guide for more details
If story execution timeout is not configured explicitly, then it defaults to 2 hours now
Now batch include patterns default to **/*.story
, in other words all stories from all subfolders are included in batch by default. Previously it was empty value meaning no stories are included in batch by default.
Now the encryption password is sought in the following sequence: first the OS environment variable, then the password set via the command line, and finally the project system property. If the password is discovered at any point in this sequence, the search stops, and additional options are not considered.
eval
expressionNow only restricted (explicitly listed) set of actions invoking Java code can be executed via eval
expression
Now more characters are visible in cell by default (the left text tail is hidden with ... more
abbreviation and button)
Removed properties | Replacement |
---|---|
selenium.timeout.page-load-timeout selenium.timeout.page-load-timeout-unit |
web.timeouts.page-load |
selenium.timeout.async-script-timeout selenium.timeout.async-script-timeout-unit |
web.timeouts.async-script |
The profile web/desktop/safari
is configured to use macOS Ventura (previously it was macOS Big Sur)
Appium 2.0.0 is configured to be used for web/phone/*
and web/tablet/*
profiles by default.
The default value of mobile.screenshot.android.append-bottom-navigation-bar
property was changed from true
(deprecated in 0.5.1
) to false
. In future this property will be removed, users are needed to re-establish affected baselines. The fallback can be used only temporarily.
The assertion message on failed wait was revised and cleaned up to do not include any duplicated info, also its readability was improved. All users relying on such messages in known issues are recommended to review them to make sure known issues are still properly detected. An example of changes are shown below.
Before:
After:
FROM_JSON
table transformer to JSON pluginFROM_JSON
table transformer is moved from vividus-plugin-rest-api
to vividus-plugin-json
@severity
meta tag in favor of @priority
meta tag@priority
meta tag should be used to mark importance of the test where, most usually, the smallest number is the most important test, the highest number is the least important one.
Deprecated step | Replacement pattern |
---|---|
Then dropdown located `$locator` contains options:$options |
Then dropdown located by `<locator>` contains options:$options |
Then dropdown located `$locator` exists and selected option is `$option` |
Then dropdown located by `<locator>` exists and selected option is `<option>` |
When I add `$option` to selection in dropdown located `$locator` |
When I add `<option>` to selection in dropdown located by `<locator>` |
When I select `$option` in dropdown located `$locator` |
When I select `<option>` in dropdown located by `<locator>` |
Deprecated step | Replacement pattern |
---|---|
When I switch back to the page |
When I switch back to page |
When I switch to frame located `$locator` |
When I switch to frame located by `<locator>` |
Deprecated step | Replacement pattern |
---|---|
When I select element located `$locator` and upload file `$filePath` |
When I select element located by `<locator>` and upload `<filePath>` |
When I click on an element '$locator' then the page does not refresh |
When I click on element located by `<locator>` then page does not refresh |
When I perform right click on element located `$locator` |
When I perform right-click on element located by `<locator>` |
When I hover mouse over element located `$locator` |
When I hover mouse over element located by `<locator>` |
Then the context element has the CSS property '$cssName'='$cssValue' |
Then context element has CSS property `<cssName>` with value that is equal to `<cssValue>` |
Then the context element has the CSS property '$cssName' containing '$cssValue' |
Then context element has CSS property `<cssName>` with value that contains `<cssValue>` |
Then each element located `$locator` has same `$dimension` |
Then each element located by `<locator>` has same `<dimension>` |
Then the context has a width of '$widthInPerc'% |
Then context element has width of <widthInPerc>% |
Then the context element has a width of '$widthInPerc'% relative to the parent element |
Then context element has width of <widthInPerc>% relative to parent element |
radioButton
Deprecated step | Replacement pattern |
---|---|
Then a radio button with the name '$radioOption' exists |
Then number of elements found by `radioButton(<radioOption>)` is equal to `1` |
When I select a radio button with the name '$radioOption' |
When I click on element located by `radioButton(<radioOption>)` |
Then a [$state] radio button with the name '$radioOption' exists |
Then number of <state> elements found by `radioButton(<radioOption>)` is equal to `1` |
Then an element contains the radio buttons:$radioOptions |
Use several steps Then number of elements found by `radioButton(<radioOption>)` is equal to `1` executed one by one |
Deprecated step | Replacement pattern |
---|---|
When I save `$attributeName` attribute value of element located `$locator` to $scopes variable `$variableName` |
When I save `<attributeName>` attribute value of element located by `<locator>` to <scopes> variable `<variableName>` |
When I save number of elements located `$locator` to $scopes variable `$variableName` |
When I save number of elements located by `<locator>` to <scopes> variable `<variableName>` |
All passwords should be defined by users and be stored on user's side.
Removed property (deprecated in 0.5.2 ) |
Replacement |
---|---|
bdd.batch.fail-fast |
batch.fail-fast |
bdd.story.fail-fast |
story.fail-fast |
bdd.scenario.fail-fast |
scenario.fail-fast |
Removed property (deprecated in 0.5.2 ) |
Replacement |
---|---|
bdd.story-loader.batch-<batch-number>.* |
batch-<batch-number>.* |
bdd.batch-<batch-number>.* |
batch-<batch-number>.* |
Removed property (deprecated in 0.5.2 ) |
Replacement |
---|---|
bdd.variables.global.* |
variables.* |
bdd.variables.batch-<batch-number>.* |
batch-<batch-number>.variables.* |
Removed property (deprecated in 0.5.2 ) |
Replacement |
---|---|
bdd.configuration.composite-paths |
engine.composite-paths |
Previously property bdd.configuration.all-composite-paths
was internal (it's not expected to be used by end-users) and it's used to configure composite files paths: both internal and external. But it's turned out users misused the property and overrode default VIVIDUS composite steps, the decision was taken to drop the property and it was implemented in #3436. The property was deprecated in 0.5.2
in favour of engine.composite-paths
to do not break backward compatibility.
Removed step (deprecated in 0.5.0 ) |
Replacement pattern |
---|---|
When I initialize the $scopes variable `$variableName` with value `$variableValue` |
Given I initialize <scopes> variable `<variableName>` with value `<variableValue>` |
Given I initialize the $scopes variable `$variableName` using template `$templatePath` with parameters:$templateParameters |
Given I initialize <scopes> variable `<variableName>` using template `<templatePath>` with parameters:<templateParameters> |
limit
property of ITERATING
table transformerThe replacement for limit
property (deprecated in 0.5.0
):
{transformer=ITERATING, limit=5}
is a combination of 2 properties:
{transformer=ITERATING, startInclusive=0, endInclusive=4}
The profiles deprecated in 0.5.0
and listed below are removed:
web/phone/iphone/landscape
web/phone/iphone/portrait
web/tablet/ipad/landscape
web/tablet/ipad/portrait
selenium.grid.capabilities.deviceOrientation
property should be used to configure device orientation and custom meta tags and meta filters should be used to configure test suite to execute.
web/desktop/edge/chromium
profile in favor of web/desktop/edge
web/desktop/edge/chromium
profile deprecated in 0.5.0
is removed in favor of web/desktop/edge
.
EdgeHTML was retired a long time ago, so only Chromium backed Edge is available now, thus there is no need to distinguish Edge builds anymore.
Removed step (deprecated in 0.5.0 ) |
Replacement |
---|---|
Then context contains list of link items with the text and link: $expectedLinkItems |
Then number of elements found by `$locator` is $comparisonRule `$quantity` |
Then context contains list of link items with the text: $expectedLinkItems |
Then number of elements found by `$locator` is $comparisonRule `$quantity` |
Removed step (deprecated in 0.5.0 ) |
Replacement |
---|---|
When I $checkboxAction all checkboxes located by `$checkboxesLocator` |
When I $checkBoxAction checkbox located by `$checkboxLocator` and When I find $comparisonRule `$number` elements by `$locator` and for each element do$stepsToExecute |
StaleElementReferenceException
Removed step (deprecated in 0.5.0 ) |
Replacement |
---|---|
When I click on element located `$locator` |
When I click on element located by `<locator>` |
Removed step (deprecated in 0.5.0 ) |
Replacement pattern |
---|---|
Then invisible element by xpath '$xpath' exists |
Then number of invisible elements `By.xpath(<xpath>)` is equal to `1` |
When I set the number of elements found by xpath '$xpath' to the '$scopes' variable '$variableName' |
When I save number of elements located `By.xpath(<xpath>)` to <scopes> variable `<variableName>` |
Then the number of elements found by the xpath '$xpath' is $comparisonRule '$quantity' |
Then number of elements found by `By.xpath(<xpath>)` is <comparisonRule> `<quantity>` |
When I add '$text' to a field by the xpath '$xpath' |
When I add `<text>` to field located `By.xpath(<xpath>)` |
When I clear a field by the xpath '$xpath' |
When I clear field located `By.xpath(<xpath>)` |
When I clear a field by the xpath '$xpath' using keyboard |
When I clear field located `By.xpath(<xpath>)` using keyboard |
When I enter '$text' in a field by the xpath '$xpath' |
When I enter `<text>` in field located `By.xpath(<xpath>)` |
When I select '$text' from a drop down by the xpath '$xpath' |
When I select `<text>` from drop down located `By.xpath(<xpath>)` |
Then an element by the xpath '$xpath' does not exist |
Then number of elements found by `By.xpath(<xpath>)` is equal to `0` |
When I click on an element by the xpath '$xpath' |
When I click on element located by `xpath(<xpath>)` |
When I click on all elements by xpath '$xpath' |
When I click on all elements located `By.xpath(<xpath>)` |
Then each element by the xpath '$xpath' has same '$dimension' |
Then each element located `By.xpath(<xpath>)` has same `<dimension>` |
Then each element by the xpath '$elementXpath' has '$number' child elements by the xpath '$childXpath' |
Then each element with locator `By.xpath(<elementXpath>)` has `<number>` child elements with locator `By.xpath(<childXpath>)` |
Then at least one element by the xpath '$xpath' exists |
Then number of elements found by `By.xpath(<xpath>)` is greater than or equal to `1` |
Then an element by the xpath '$xpath' exists |
Then number of elements found by `By.xpath(<xpath>)` is equal to `1` |
When I hover a mouse over an element with the xpath '$xpath' |
When I hover mouse over element located `By.xpath(<xpath>)` |
When I perform right click on an element by the xpath '$xpath' |
When I perform right click on element located `By.xpath(<xpath>)` |
When I wait until an element with the xpath '$xpath' appears |
When I wait until element located `By.xpath(<xpath>)` appears |
When I wait until an element with the xpath '$xpath' disappeares |
When I wait until element located `By.xpath(<xpath>)` disappears |
Removed step (deprecated in 0.5.1 ) |
Replacement pattern |
---|---|
When I wait until an element with the text '$text' appears |
When I wait until element located by `caseSensitiveText(<text>)` appears |
When I wait until an element with the text '$text' disappears |
When I wait until element located by `caseSensitiveText(<text>)` disappears |
When I wait until an element with the name '$elementName' disappears |
When I wait until element located by `elementName(<elementName>)` disappears |
When I wait until an element with the name '$elementName' appears |
When I wait until element located by `elementName(<elementName>)` appears |
When I wait until the state of an element with the name '$elementName' becomes [$state] |
When I wait until state of element located by `elementName(<elementName>)` is <state> |
When I wait until an element with the name '$elementName' is stale |
When I wait until element located by `elementName(<elementName>)` is stale |
When I wait until an element with the name '$elementName' contains the text '$text' |
When I wait until element located by `elementName(<elementName>)` contains text `<text>` |
Then an element with the name '$elementName' disappears in '$timeout' seconds |
Then element located by `elementName(<elementName>)` disappears in `<timeout>` |
When I wait `$duration` with `$pollingDuration` polling until element located `$locator` becomes $state |
When I wait `<duration>` with `<pollingDuration>` polling until element located by `<locator>` becomes <state> |
When I wait until state of element located `$locator` is $state |
When I wait until state of element located by `<locator>` is <state> |
When I wait until element located `$locator` is stale |
When I wait until element located by `<locator>` is stale |
When I wait until element located `$locator` contains text '$text' |
When I wait until element located by `<locator>` contains text `<text>' |
Then element located '$locator' disappears in '$timeout' |
Then element located by `<locator>` disappears in `<timeout>` |
Removed step (deprecated in 0.5.1 ) |
Replacement |
---|---|
When I wait until an element with the tag '$elementTag' and attribute '$attributeType'='$attributeValue' disappears |
When I wait until element located `$locator` disappears |
When I wait until an element with the tag '$elementTag' and attribute '$attributeType'='$attributeValue' appears |
When I wait until element located `$locator` appears |
Then an element with the id '$id' disappears |
When I wait until element located `$locator` disappears |
The step
When I click on all elements located `$locator`
is removed (deprecated in 0.5.1
).
The combination of steps
When I click on element located by `$locator`
and
When I find $comparisonRule `$number` elements by `$locator` and for each element do$stepsToExecute
should be used instead.
Removed step (deprecated in 0.5.1 ) |
Replacement |
---|---|
When I clear field located `$locator` |
When I clear field located by `$locator` |
When I clear field located `$locator` using keyboard |
When I clear field located by `$locator` using keyboard |
When I add `$text` to field located `$locator` |
When I add `$text` to field located by `$locator` |
When I enter `$text` in field located `$locator` |
When I enter `$text` in field located by `$locator` |
Removed step (deprecated in 0.5.1 ) |
Replacement pattern |
---|---|
Then field located `$locator` does not exist |
Then number of elements found by `<locator>` is equal to `0` |
Then field located `$locator` exists |
Then number of elements found by `<locator>` is equal to `1` |
Then a field with the name '$fieldName' exists |
Then number of elements found by `fieldName(<fieldName>)` is equal to `1` |
When I clear a field with the name '$fieldName' |
When I clear field located by `fieldName(<fieldName>)` |
When I clear a field with the name '$fieldName' using keyboard |
When I clear field located by `fieldName(<fieldName>)` using keyboard |
When I add '$text' to a field with the name '$fieldName' |
When I add `<text>` to field located by `fieldName(<fieldName>)` |
When I enter '$text' in a field with the name '$fieldName' |
When I enter `<text>` in field located by `fieldName(<fieldName>)` |
Then a field with the name '$fieldName' and text containing '$textpart' exists |
Then number of elements found by `fieldName(<fieldName>):a->filter.fieldTextPart(<textpart>)` is equal to `1` |
Then a field with the name '$fieldName' does not exist |
Then number of elements found by `fieldName(<fieldName>)` is equal to `0` |
Then a [$state] field with the name '$fieldName' and text '$text' exists |
Then number of elements found by `fieldName(<fieldName>)->filter.fieldText(<text>).state(<state>)` is equal to `1` |
Then a field with the name '$fieldName' and text '$text' does not exist |
Then number of elements found by `fieldName(<fieldName>):a->filter.fieldText(<text>)` is equal to `0` |
Then a field with the name '$fieldName' and text '$text' exists |
Then number of elements found by `fieldName(<fieldName>)->filter.fieldText(<text>)` is equal to `1` |
Then a field with the name '$fieldName' and placeholder text '$text' exists |
Then number of elements found by `fieldName(<fieldName>):a->filter.placeholder(<text>)` is equal to `1` |
Then a [$state] field with the name '$fieldName' and placeholder text '$text' exists |
Then number of elements found by `fieldName(<fieldName>)->filter.placeholder(<text>).state(<state>)` is equal to `1` |
Then a field with the name '$fieldName' placeholder text '$text' does not exist |
Then number of elements found by `fieldName(<fieldName>):a->filter.placeholder(<text>)` is equal to `0` |
Then a [$state] field with the name '$fieldName' exists |
Then number of elements found by `fieldName(<fieldName>):a->filter.state(<state>)` is equal to `1` |
Removed step (deprecated in 0.5.0 ) |
Replacement pattern |
---|---|
Then elements located `$locator` are sorted by text in $sortingOrder order |
Then elements located by `<locator>` are sorted by text in <sortingOrder> order |
Removed step (deprecated in 0.5.1 ) |
Replacement pattern |
---|---|
When I wait until element located `$locator` appears |
When I wait until element located by `<locator>` appears |
When I wait until element located `$locator` disappears |
When I wait until element located by `<locator>` disappears |
Then element located `$locator` exists for `$duration` duration |
Then element located by `<locator>` exists for `<duration>` duration |
Removed step (deprecated in 0.5.8 ) |
Replacement |
---|---|
When I refresh the page |
When I refresh page |
Removed step (deprecated in 0.5.8 ) |
Replacement |
---|---|
Then the page title $comparisonRule '$text' |
Then page title <comparisonRule> `<text>` |
iOS platform correctly handles and waits for web page load, additional explicit waits are removed (the behaviour is deprecated in 0.5.4
).
Removed step (deprecated in 0.5.0 ) |
Replacement pattern |
---|---|
When I tap on element located `$locator` with duration `$duration` |
When I tap on element located by `<locator>` with duration `<duration>` |
When I tap on element located `$locator` |
When I tap on element located by `<locator>` |
When I swipe $direction to element located `$locator` with duration $swipeDuration |
When I swipe <direction> to element located by `<locator>` with duration <swipeDuration> |
nativeFooterToCut
is removed, use cutBottom
parameter for mobile applications.Removed property (deprecated in 0.4.16 ) |
Replacement |
---|---|
mobile.screenshot.strategy.<YOUR_STRATEGY_NAME>.native-footer-to-cut |
mobile.screenshot.strategy.<YOUR_STRATEGY_NAME>.cut-bottom |
Breaking change: the downscaling was deprecated in 0.4.0 and since 0.5.0 downscaling functionality was disabled by default.
Removed property (deprecated in 0.4.0 ) |
Replacement |
---|---|
mobile.screenshot.downscale=false |
Not available, all mobile app screenshots must be used as is |
Removed screenshooting strategy (deprecated in 0.5.4 ) |
Replacement |
---|---|
SIMPLE |
VIEWPORT |
Removed step (deprecated in 0.5.0 ) |
Replacement pattern |
---|---|
When I send HTTP $httpMethod to the relative URL '$relativeURL' |
When I execute HTTP <httpMethod> request for resource with relative URL `<relativeURL>` |
When I save response body to the $scopes variable '$variableName' |
Given I initialize <scopes> variable `<variableName>` with value `${response}` |
Then the response does not contain body |
Then response does not contain body |
Then the response body $comparisonRule '$content' |
Then `${response}` is <comparisonRule> `<content>` |
Then the response body $validationRule resource at '$resourcePath' |
Then response body <validationRule> resource at `<resourcePath>` |
Then the response code is $comparisonRule '$responseCode' |
Then response code is <comparisonRule> `<responseCode>` |
Then the response time should be less than '$responseTimeThresholdMs' milliseconds |
Then response time is less than `<responseTimeThresholdMs>` milliseconds |
Then response header '$httpHeaderName' contains attribute: $attributes |
Then response header `<httpHeaderName>` contains elements:<attributes> |
Then the value of the response header '$httpHeaderName' $comparisonRule '$value' |
Then value of response header `<httpHeaderName>` <comparisonRule> `<value>` |
Then the number of the response headers with the name '$headerName' is $comparisonRule $value |
Then number of response headers with name `<httpHeaderName>` is <comparisonRule> <value> |
When I save response header '$httpHeaderName' value to $scopes variable '$variableName' |
When I save response header `<httpHeaderName>` value to <scopes> variable `<variableName>` |
Then the connection is secured using $securityProtocol protocol |
Then connection is secured using <securityProtocol> protocol |
FROM_JSON
transformerParameter name | Replacing parameter |
---|---|
url (deprecated in 0.5.3 ) |
variableName |
variable (deprecated in 0.5.7 ) |
variableName |
Removed step (deprecated in 0.5.1 ) |
Replacement pattern |
---|---|
When I save JSON element value from context by JSON path `$jsonPath` to $scopes variable `$variableName` |
When I save JSON element value from `${json-context}` by JSON path `<jsonPath>` to <scopes> variable `<variableName>` |
When I save JSON element from context by JSON path `$jsonPath` to $scopes variable `$variableName` |
When I save JSON element from `${json-context}` by JSON path `<jsonPath>` to <scopes> variable `<variableName>` |
When I convert JSON from context to $scopes variable `$variableName` |
When I convert JSON `${json-context}` to <scopes> variable `<variableName>` |
When I set number of elements found by JSON path `$jsonPath` to $scopes variable `$variableName` |
When I save number of elements from `${json-context}` found by JSON path `<jsonPath>` to <scopes> variable `<variableName>` |
When I find $comparisonRule `$elementsNumber` JSON elements by `$jsonPath` and for each element do$stepsToExecute |
When I find <comparisonRule> `<elementsNumber>` JSON elements from `${json-context}` by `<jsonPath>` and for each element do<stepsToExecute> |
When I find $comparisonRule '$elementsNumber' JSON elements by '$jsonPath' and for each element doa$stepsToExecute |
When I find <comparisonRule> '<elementsNumber>' JSON elements from '${json-context}' by '<jsonPath>' and for each element do<stepsToExecute> |
When I find $comparisonRule `$elementsNumber` JSON elements in context by `$jsonPath` and until variable `$variableName` $variableMatcher `$expectedValue` for each element I do:$stepsToExecute |
When I find <comparisonRule> `<elementsNumber>` JSON elements in `${json-context}` by `<jsonPath>` and until variable `<variableName>` <variableMatcher> `<expectedValue>` for each element I do:<stepsToExecute> |
When I find $comparisonRule '$elementsNumber' JSON elements in context by '$jsonPath' and until variable '$variableName' $variableMatcher '$expectedValue' for each element I do:$stepsToExecute |
When I find <comparisonRule> '<elementsNumber>' JSON elements in '${json-context}' by '<jsonPath>' and until variable '<variableName>' <variableMatcher> '<expectedValue>' for each element I do:<stepsToExecute> |
Then JSON element value from context by JSON path `$jsonPath` $comparisonRule `$expectedValue` |
Then JSON element value from `${json-context}` by JSON path `<jsonPath>` <comparisonRule> `<expectedValue>` |
Then JSON element by JSON path `$jsonPath` is equal to `$expectedJson`$options |
Then JSON element from `${json-context}` by JSON path `<jsonPath>` is equal to `<expectedJson>`<options> |
Then number of JSON elements by JSON path `$jsonPath` is $comparisonRule $elementsNumber |
Then number of JSON elements from `${json-context}` by JSON path `<jsonPath>` is <comparisonRule> <elementsNumber> |
Remove step (deprecated in 0.5.0 ) |
Replacement pattern |
---|---|
When I collect system topics in resource group `$resourceGroupName` and save them as JSON to $scopes variable `$variableName` |
When I get Azure resource with identifier `resourceGroups/<resourceGroupName>/providers/Microsoft.EventGrid/systemTopics` using API version `2021-12-01` and save it to <scopes> variable `<variableName>` |
When I retrieve properties of key vault with name `$keyVaultName` from resource group `$resourceGroupName` and save them as JSON to $scopes variable `$variableName` |
When I get Azure resource with identifier `resourceGroups/<resourceGroupName>/providers/Microsoft.KeyVault/vaults/<keyVaultName>` using API version `2021-10-01` and save it to <scopes> variable `<variableName>` |
When I collect SQL Servers from resource group `$resourceGroupName` and save them as JSON to $scopes variable `$variableName` |
When I get Azure resource with identifier `resourceGroups/<resourceGroupName>/providers/Microsoft.Sql/servers` using API version `2021-08-01-preview` and save it to <scopes> variable `<variableName>` |
When I collect databases from SQL Server `$sqlServerName` from resource group `$resourceGroupName` and save them as JSON to $scopes variable `$variableName` |
When I get Azure resource with identifier `resourceGroups/<resourceGroupName>/providers/Microsoft.Sql/servers/<sqlServerName>/databases` using API version `2021-08-01-preview` and save it to <scopes> variable `<variableName>` |
When I retrieve properties of database with name `$databaseName` from SQL Server `$sqlServerName` from resource group `$resourceGroupName` and save them as JSON to $scopes variable `$variableName` |
When I get Azure resource with identifier `resourceGroups/<resourceGroupName>/providers/Microsoft.Sql/servers/<sqlServerName>/databases/<databaseName>` using API version `2021-08-01-preview` and save it to <scopes> variable `<variableName>` |
When I collect storage accounts in resource group `$resourceGroupName` and save them as JSON to $scopes variable `$variableName` |
When I get Azure resource with identifier `resourceGroups/<resourceGroupName>/providers/Microsoft.Storage/storageAccounts` using API version `2021-08-01` and save it to <scopes> variable `<variableName>` |
When I retrieve blob service properties of storage account with name `$storageAccountName` from resource group `$resourceGroupName` and save them as JSON to $scopes variable `$variableName` |
When I get Azure resource with identifier `resourceGroups/<resourceGroupName>/providers/Microsoft.Storage/storageAccounts/<storageAccountName>/blobServices/default` using API version `2021-08-01` and save it to <scopes> variable `<variableName>` |
Removed step (deprecated in 0.5.6 ) |
Replacement pattern |
---|---|
When I send data `$data` to `$producerKey` Kafka topic `$topic` |
When I send event with value `$value` to `$producerKey` Kafka topic `$topic` |
When I start consuming messages from `$consumerKey` Kafka topics `$topics` |
When I start consuming events from `$consumerKey` Kafka topics `$topics` |
When I $queueOperation consumed `$consumerKey` Kafka messages to $scopes variable `$variableName` |
When I $queueOperation consumed `$consumerKey` Kafka events to $scopes variable `$variableName` |
When I wait with `$timeout` timeout until count of consumed `$consumerKey` Kafka messages is $comparisonRule `$expectedCount` |
When I wait with `$timeout` timeout until count of consumed `$consumerKey` Kafka events is $comparisonRule `$expectedCount` |
When I stop consuming messages from `$consumerKey` Kafka |
When I stop consuming events from `$consumerKey` Kafka |
SauceLabs added more data Centers and updated naming of the current ones to make them more specific
Removed SauceLabs Data Center (deprecated in 0.5.5 ) |
Replacement |
---|---|
US |
US_WEST |
EU |
EU_CENTRAL |
TIP: SauceLabs Data Center is configured via mandatory saucelabs.data-center
property.
CrossBrowserTesting cloud was sunset on July 2023:
...we have also announced that we will be sunsetting the CrossBrowserTesting cloud in July 2023, as this new product will replace CrossBrowserTesting.
vividus-plugin-cross-browser-testing
plugin deprecated in 0.5.3
is removed.
JS scrollIntoView
method may break application UI, thus JS scroll was replaced with native scroll via mouse.
An explicit scroll to element to click was removed (Scroll to element to click should be done automatically), scroll of element into viewport center was left only in case of error saying that element to click is overlapped with another element.
The typo in default property configuring CLI arguments was fixed.
Default HTTP config and properties are used to configure interactions with Applitools, previously HTTP config from REST API plugin was used.
Errors on Applitools session start are properly propagated to the top level and not hidden anymore.