Gwen DSL
DSL Reference
All Gherkin steps that match the DSL expressions described here are readily executable by Gwen. The DSL matched is the operation that will be performed at execution time.
Bindings
Text bindings
<name> is "<value>"
Binds the given value to a name in the global scope.
<name> is "<value>"
<name> is <blank|true|false>
Binds a literal value to a name in the global scope.
<name> is <blank|true|false>
File bindings
<name> is defined by file "<filepath>"
Associates a name with the contents of a file. The value is resolved every time the name is referenced.
<name> is defined by file "<filepath>"
Where
<name>
is the name to associated the file contents<filepath>
the path to the file (can be in DocString position)
Optionally accepts the @Eager
or @Lazy
annotations.
@Eager
immediately evaluates the<expression>
and binds the result to<name>
@Lazy
evaluates the<expression>
and binds the result to<name>
when it is first referenced- In the absence of either annotation,
<expression>
is evaluated every time<name>
is referenced
Example
Given the content is defined by file "path/to/file.txt"
<name> is defined by <encoding> file "<filepath>"
Associates a name with the contents of a file using a given character encoding. The value is resolved every time the name is referenced.
<name> is defined by <encoding> file "<filepath>"
Where
<name>
is the name to associated the file contents<encoding>
is the encoding to use when reading the file<filepath>
the path to the file (can be in DocString position)
Optionally accepts the @Eager
or @Lazy
annotations.
@Eager
immediately evaluates the<expression>
and binds the result to<name>
@Lazy
evaluates the<expression>
and binds the result to<name>
when it is first referenced- In the absence of either annotation,
<expression>
is evaluated every time<name>
is referenced
Example
Given the content is defined by UTF-8 file "path/to/file.txt"
Regex bindings
<name> is defined in <textRef> by regex "<expression>"
Captures text from a text reference using the given regex expression and associates it with the given name. The value is resolved every time the name is referenced.
<name> is defined in <textRef> by regex "<expression>"
Where
<name>
is the name of the name to associate the captured value to<textRef>
is the name of the binding containing the source text- Can be the name of any binding that contains or resolves to a text value, including a web element in which case the text in the element will be dynamically retrieved and used.
<expression>
is the regex selector expression
Optionally accepts the @Eager
, @Lazy
or @Masked
annotations.
@Eager
immediately evaluates the<expression>
and binds the result to<name>
@Lazy
evaluates the<expression>
and binds the result to<name>
when it is first referenced- In the absence of either of the above annotations,
<expression>
is evaluated every time<name>
is referenced @Masked
masks the captured value to prevent it from being logged as clear text
Example
Given the date is "2021-09-22"
And the year is defined in the date by regex "(\d{4})"
Then the year should be "2021"
XML bindings
<name> is defined by the <nodeType> in <xmlRef> by xpath "<expression>"
Captures content from a referenced XML value using the given XPath expression and associates it with the given name. The value is resolved every time the name is referenced.
<name> is defined by the <nodeType> in <xmlRef> by xpath "<expression>"
Where
<name>
is the name of the name to associate the captured value to<nodeType>
is one of:text
to capture the text nodenode
to capture a single nodenodeset
to capture multiple nodes
<xmlRef>
is the name of the binding containing the XML source- Can be the name of any binding that contains or resolves to XML text, including a web element in which case the text in the element will be dynamically retrieved and used.
<expression>
is the XPath selector expression
Optionally accepts the @Eager
, @Lazy
or @Masked
annotations.
@Eager
immediately evaluates the<expression>
and binds the result to<name>
@Lazy
evaluates the<expression>
and binds the result to<name>
when it is first referenced- In the absence of either of the above annotations,
<expression>
is evaluated every time<name>
is referenced @Masked
masks the captured value to prevent it from being logged as clear text
Example
Given the xml is "<result><status>passed</status></result>"
And status is defined by the text in the xml by xpath "//result/status"
Then the status should be "passed"
JSON bindings
<name> is defined in <jsonRef> by json path "<expression>"
Captures content from a referenced JSON value using the given JSON path expression and associates it with the given name. The value is resolved every time the name is referenced.
<name> is defined in <jsonRef> by json path "<expression>"
Where
<name>
is the name of the name to associate the captured value to<nodeType>
is one of:text
to capture the text nodenode
to capture a single nodenodeset
to capture multiple nodes
<sourceRef>
is the name of the binding containing the XML source- Can be the name of any binding that contains or resolves to XML text, including a web element in which case the text in the element will be dynamically retrieved and used.
<expression>
is the XPath selector expression
Optionally accepts the @Eager
, @Lazy
or @Masked
annotations.
@Eager
immediately evaluates the<expression>
and binds the result to<name>
@Lazy
evaluates the<expression>
and binds the result to<name>
when it is first referenced- In the absence of either of the above annotations,
<expression>
is evaluated every time<name>
is referenced @Masked
masks the captured value to prevent it from being logged as clear text
Example
Given the json is "{ "status": "passed" }"
And the status is defined in the json by json path "$.status"
Then the status should be "passed"
I capture the content in <element> by json path "<expression>" as <name>
Captures JSON content from a web element using the given JSON Path expression and binds it to the given name in the global scope.
I capture the content in <element> by json path "<expression>" as <name>
Where
<element>
is the name of the element containing the JSON content<expression>
is the JSON selector expression<name>
is the name to bind the captured value to
Example
# assuming a web element contains json: { "status": "passed" }
Given the json web element can be located by id "json"
When I capture the content in the json web element by json path "$.status" as the status
Then the status should be "passed"
JS bindings
<name> is defined by <javascript|js> "<script>"
Associates a name with the return value of a JavaScript expression or function.
<name> is defined by <javascript|js> "<script>"
Where
<name>
is the name to associate<javascript|js>
isjavascript
(orjs
since v2.46.0)<script>
is the javascript expression or function that will return the value (can be in DocString position)- For a one liner expression, no function, arrow declaration or
return
prefix is required For a function, use either:
- Arrow syntax (preferred):
(arg1, arg2, ..argN) => { body }
(Since v3.56.0) - Or anonymous function syntax (legacy):
(function(arg1, arg2, ..argN){ body })(arguments[0], arguments[1], ..arguments[N])
- Arrow syntax (preferred):
- For a one liner expression, no function, arrow declaration or
Optionally accepts the @Eager
, @Lazy
or @Masked
annotations.
@Eager
immediately evaluates the<expression>
and binds the result to<name>
@Lazy
evaluates the<expression>
and binds the result to<name>
when it is first referenced- In the absence of either of the above annotations,
<expression>
is evaluated every time<name>
is referenced @Masked
masks the captured value to prevent it from being logged as clear text
Examples
Given iso date is defined by js "new Date().toISOString().substring(0, 10)"
Then iso date should match regex "^\d{4}-([0]\d|1[0-2])-([0-2]\d|3[01])$"
<name> is defined by <javascriptRef> applied to "<argument>"
Applies a JavaScript function to an argument and binds the result to <name>
in the global scope.
<name> is defined by <javascriptRef> applied to "<argument>"
<name>
in the global scope.Where
<name>
is the name to bind the function result to<javascriptRef>
is the name of the binding containing the javascript function to apply<argument>
argument to apply the function
Optionally accepts the @Eager
, @Lazy
or @Masked
annotations.
@Eager
immediately evaluates the<expression>
and binds the result to<name>
@Lazy
evaluates the<expression>
and binds the result to<name>
when it is first referenced- In the absence of either of the above annotations,
<expression>
is evaluated every time<name>
is referenced @Masked
masks the captured value to prevent it from being logged as clear text
Examples
Given iso date is defined by js "new Date().toISOString().substring(0, 10)"
And toDMY is defined by js
"""
(ymd) => {
var parts = ymd.split('-');
return parts[2] + '/' + parts[1] + '/' + parts[0];
}
"""
And dmy date is defined by toDMY applied to "${iso date}"
Then dmy date should match regex "^([0-2]\d|3[01])/([0]\d|1[0-2])/\d{4}$"
Given toMDY is defined by js
"""
(ymd) => {
var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
var parts = ymd.split('-');
return months[parseInt(parts[1]) - 1] + ' ' + parts[2] + ' ' + parts[0];
}
"""
And dmy date is defined by toMDY applied to "2022-04-05"
Then dmy date should be "Apr 05 2022"
<name> is defined by <javascriptRef> applied to "<arguments>" delimited by "<delimiter>"
Applies a JavaScript function to mutiple arguments using a customer delimiter and binds the result to <name>
in the global scope.
<name> is defined by <javascriptRef> applied to "<arguments>" delimited by "<delimiter>"
<name>
in the global scope.Where
<name>
is the name to bind the function result to<javascriptRef>
is the name of the binding containing the javascript function to apply<arguments>
a delimited list of arguments to apply the function to<delimiter>
is the delmiter used in<arguments>
- The 1st agrument is referenced in the JavaScript as
arguments[0]
, the 2nd argument asarguments[1]
, the 3rd asarguments[2]
and so on.
- The 1st agrument is referenced in the JavaScript as
Optionally accepts the @Eager
, @Lazy
or @Masked
annotations.
@Eager
immediately evaluates the<expression>
and binds the result to<name>
@Lazy
evaluates the<expression>
and binds the result to<name>
when it is first referenced- In the absence of either of the above annotations,
<expression>
is evaluated every time<name>
is referenced @Masked
masks the captured value to prevent it from being logged as clear text
Examples
Given iso date is defined by js "new Date().toISOString().substring(0, 10)"
And toDMY is defined by js "(y,m,d) => d + '/' + m + '/' + y"
And dmy date is defined by toDMY applied to "${iso date}" delimited by "-"
Then dmy date should match regex "^([0-2]\d|3[01])/([0]\d|1[0-2])/\d{4}$"
Given toISO is defined by js
"""
(m,d,y) => {
var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
var mNo = months.indexOf(m) + 1;
if (mNo < 10) mNo = '0' + mNo;
return y + '-' + mNo + '-' + d;
}
"""
And iso date is defined by toISO applied to "Apr 05 2022" delimited by " "
Then iso date should be "2022-04-05"
System Processes bindings
<name> is defined by system process "<expression>"
Associates a name with the return value of a local system process. The value is resolved every time the name is referenced.
<name> is defined by system process "<expression>"
Where
<name>
is the name to associated the returned value to<expression>
is the system process that will return the value to assign (can be in DocString position)
Optionally accepts the @Eager
, @Lazy
or @Masked
annotations.
@Eager
immediately evaluates the<expression>
and binds the result to<name>
@Lazy
evaluates the<expression>
and binds the result to<name>
when it is first referenced- In the absence of either of the above annotations,
<expression>
is evaluated every time<name>
is referenced @Masked
masks the captured value to prevent it from being logged as clear text
Example
Given my hostname is defined by system process "hostname"
Then my hostname should not be ""
<name> is defined by system process "<expression>" delimited by "<delimiters>"
Associates a name with the return value of a delimited local system process. The value is resolved every time the name is referenced.
<name> is defined by system process "<expression>" delimited by "<delimiters>"
Where
<name>
is the name to associated the returned value to<expression>
is the system process that will return the value to assign (can be in DocString position)- Delmiters are required for special cases such as when unbalanced quoted strings are passed as arguments (see example).
<delmiters>
is a regex pattern defining the delimiter(s) used in<expression>
Optionally accepts the @Eager
, @Lazy
or @Masked
annotations.
@Eager
immediately evaluates the<expression>
and binds the result to<name>
@Lazy
evaluates the<expression>
and binds the result to<name>
when it is first referenced- In the absence of either of the above annotations,
<expression>
is evaluated every time<name>
is referenced @Masked
masks the captured value to prevent it from being logged as clear text
Example
Given my message is defined by system process "echo,"quoted text " and orphan quote"" delimited by ","
Then my message should be ""quoted text " and orphan quote""
<name> is defined by unix system process "<expression>"
Associates a name with the return value of a local unix system process. The value is resolved every time the name is referenced.
<name> is defined by unix system process "<expression>"
Where
<name>
is the name to associated the returned value to<expression>
is the unix system process that will return the value to assign (can be in DocString position)
Optionally accepts the @Eager
, @Lazy
or @Masked
annotations.
@Eager
immediately evaluates the<expression>
and binds the result to<name>
@Lazy
evaluates the<expression>
and binds the result to<name>
when it is first referenced- In the absence of either of the above annotations,
<expression>
is evaluated every time<name>
is referenced @Masked
masks the captured value to prevent it from being logged as clear text
Example
Given a file.csv with content:
Word1,Word2,Compound
basket,ball,basketball
sun,flower,sunflower
The following will print the data and line up each column
Given my table is defined by unix system process "cat file.csv | column -t -s\,"
Then my table should be
"""
Word1 Word2 Compound
basket ball basketball
sun flower sunflower
"""
Element locators
<element> can be located by <selector> "<expression>"
Binds a selector for a web element to the current scope with a default lookup timeout.
<element> can be located by <selector> "<expression>"
Where
<element>
is the web element name<selector>
is the selector type, one of:id
for selecting by id attributename
for selecting by name attributetag name
(ortag
since v2.46.0) for selecting by tag namecss selector
(orcss
since v2.46.0) for selecting by css expressionclass name
(orclass
since v2.46.0) for selecting by class attributexpath
for selecting by XPathlink text
for selecting by link textpartial link text
for selecting by partial link textjavascript
(orjs
since v2.46.0) for selecting by JavaScript
<expression>
is the selector expression
Example
Given the todo field can be located by class "new-todo"
When I enter "Walk the dog" in the todo field
<element> can be located by <selector> "<expression>" with no <wait|timeout>
Binds a selector for a web element to the current scope with no lookup timeout.
<element> can be located by <selector> "<expression>" with no <wait|timeout>
Where
<element>
is the web element name<selector>
is the selector type, one of:id
for selecting by id attributename
for selecting by name attributetag name
(ortag
since v2.46.0) for selecting by tag namecss selector
(orcss
since v2.46.0) for selecting by css expressionclass name
(orclass
since v2.46.0) for selecting by class attributexpath
for selecting by XPathlink text
for selecting by link textpartial link text
for selecting by partial link textjavascript
(orjs
since v2.46.0) for selecting by JavaScript
<expression>
is the selector expression<wait|timeout>
is eitherwait
ortimeout
Example
Given the todo field can be located by css ".new-todo" with no lookup timeout
When I enter "Walk the dog" in the todo field
<element> can be located by <selector> "<expression>" with <timeoutSecs> second <wait|timeout>
Binds a selector for a web element to the current scope with a given lookup timeout.
<element> can be located by <selector> "<expression>" with <timeoutSecs> second <wait|timeout>
Where
<element>
is the web element name<selector>
is the selector type, one of:id
for selecting by id attributename
for selecting by name attributetag name
(ortag
since v2.46.0) for selecting by tag namecss selector
(orcss
since v2.46.0) for selecting by css expressionclass name
(orclass
since v2.46.0) for selecting by class attributexpath
for selecting by XPathlink text
for selecting by link textpartial link text
for selecting by partial link textjavascript
(orjs
since v2.46.0) for selecting by JavaScript
<expression>
is the selector expression<timeoutSecs>
is the timeout period in seconds<wait|timeout>
is eitherwait
ortimeout
Example
Given the todo field can be located by css ".new-todo" with 5 second timeout
When I enter "Walk the dog" in the todo field
<element> can be located by <selector> "<expression>" at index <index>
Binds an indexed selector for a web element to the current scope with a default lookup timeout.
<element> can be located by <selector> "<expression>" at index <index>
Where
<element>
is the web element name<selector>
is the selector type, one of:id
for selecting by id attributename
for selecting by name attributetag name
(ortag
since v2.46.0) for selecting by tag namecss selector
(orcss
since v2.46.0) for selecting by css expressionclass name
(orclass
since v2.46.0) for selecting by class attributexpath
for selecting by XPathlink text
for selecting by link textpartial link text
for selecting by partial link textjavascript
(orjs
since v2.46.0) for selecting by JavaScript
<expression>
is the selector expression<index>
is the index of the element to select in list returned by<expression>
Example
Given the first item can be located by css ".todo-list label" at index 0
Then the first item should contain "Walk the dog"
<element> can be located by <selector> "<expression>" at index <index> with no <wait|timeout>
Binds an indexed selector for a web element to the current scope with no lookup timeout.
<element> can be located by <selector> "<expression>" at index <index> with no <wait|timeout>
Where
<element>
is the web element name<selector>
is the selector type, one of:id
for selecting by id attributename
for selecting by name attributetag name
(ortag
since v2.46.0) for selecting by tag namecss selector
(orcss
since v2.46.0) for selecting by css expressionclass name
(orclass
since v2.46.0) for selecting by class attributexpath
for selecting by XPathlink text
for selecting by link textpartial link text
for selecting by partial link textjavascript
(orjs
since v2.46.0) for selecting by JavaScript
<expression>
is the selector expression<index>
is the index of the element to select in list returned by<expression>
<wait|timeout>
is eitherwait
ortimeout
Example
Given the first item can be located by css ".todo-list label" at index 0 with no lookup timeout
Then the first item should contain "Walk the dog"
<element> can be located by <selector> "<expression>" at index <index> with <timeoutSecs> second <wait|timeout>
Binds an indexed selector for a web element to the current scope with a given lookup timeout.
<element> can be located by <selector> "<expression>" at index <index> with <timeoutSecs> second <wait|timeout>
Where
<element>
is the web element name<selector>
is the selector type, one of:id
for selecting by id attributename
for selecting by name attributetag name
(ortag
since v2.46.0) for selecting by tag namecss selector
(orcss
since v2.46.0) for selecting by css expressionclass name
(orclass
since v2.46.0) for selecting by class attributexpath
for selecting by XPathlink text
for selecting by link textpartial link text
for selecting by partial link textjavascript
(orjs
since v2.46.0) for selecting by JavaScript
<expression>
is the selector expression<index>
is the index of the element to select in list returned by<expression>
<timeoutSecs>
is the timeout period in seconds<wait|timeout>
is eitherwait
ortimeout
Example
Given the first item can be located by css ".todo-list label" at index 0 with 5 second timeout
Then the first item should contain "Walk the dog"
<element> can be located by <selector> "<expression>" at index <index> in <otherElement>
Binds an indexed selector for a web element (contained in another) to the current scope with a default lookup timeout.
<element> can be located by <selector> "<expression>" at index <index> in <otherElement>
Where
<element>
is the web element name<selector>
is the selector type, one of:id
for selecting by id attributename
for selecting by name attributetag name
(ortag
since v2.46.0) for selecting by tag namecss selector
(orcss
since v2.46.0) for selecting by css expressionclass name
(orclass
since v2.46.0) for selecting by class attributexpath
for selecting by XPathlink text
for selecting by link textpartial link text
for selecting by partial link textjavascript
(orjs
since v2.46.0) for selecting by JavaScript
<expression>
is the selector expression<index>
is the index of the element to select in list returned by<expression>
<otherElement>
is the name of the web element that this one is relative to
Example
Given the count info can be located by class "todo-count"
And the count unit can be located by tag "span" at index 1 in the count info
Then the count unit should contain "item"
<element> can be located by <selector> "<expression>" at index <index> in <otherElement> with no <wait|timeout>
Binds an indexed selector for a web element (contained in another) to the current scope with no lookup timeout.
<element> can be located by <selector> "<expression>" at index <index> in <otherElement> with no <wait|timeout>
Where
<element>
is the web element name<selector>
is the selector type, one of:id
for selecting by id attributename
for selecting by name attributetag name
(ortag
since v2.46.0) for selecting by tag namecss selector
(orcss
since v2.46.0) for selecting by css expressionclass name
(orclass
since v2.46.0) for selecting by class attributexpath
for selecting by XPathlink text
for selecting by link textpartial link text
for selecting by partial link textjavascript
(orjs
since v2.46.0) for selecting by JavaScript
<expression>
is the selector expression<index>
is the index of the element to select in list returned by<expression>
<otherElement>
is the name of the web element that this one is relative to<wait|timeout>
is eitherwait
ortimeout
Example
Given the count info can be located by class "todo-count"
And the count unit can be located by tag "span" at index 1 in the count info with no wait
Then the count unit should contain "item"
<element> can be located by <selector> "<expression>" at index <index> in <otherElement> with <timeoutSecs> second <wait|timeout>
Binds an indexed selector for a web element (contained in another) to the current scope with a given lookup timeout.
<element> can be located by <selector> "<expression>" at index <index> in <otherElement> with <timeoutSecs> second <wait|timeout>
Where
<element>
is the web element name<selector>
is the selector type, one of:id
for selecting by id attributename
for selecting by name attributetag name
(ortag
since v2.46.0) for selecting by tag namecss selector
(orcss
since v2.46.0) for selecting by css expressionclass name
(orclass
since v2.46.0) for selecting by class attributexpath
for selecting by XPathlink text
for selecting by link textpartial link text
for selecting by partial link textjavascript
(orjs
since v2.46.0) for selecting by JavaScript
<expression>
is the selector expression<index>
is the index of the element to select in list returned by<expression>
<otherElement>
is the name of the web element that this one is relative to<timeoutSecs>
is the timeout period in seconds<wait|timeout>
is eitherwait
ortimeout
Example
Given the count info can be located by class "todo-count"
And the count unit can be located by tag "span" at index 1 in the count info with 5 second wait
Then the count unit should contain "item"
<element> can be located by
| selector | expression |
| <selector 1> | <expression 1> |
| <selector 2> | <expression 2> |
| .. | .. |
| <selector n> | <expression n> |
Binds primary and fallback selectors for a web element to the current scope with a default lookup timeout.
Lookups will be attempted in the order specified until one succeeds.
<element> can be located by
| selector | expression |
| <selector 1> | <expression 1> |
| <selector 2> | <expression 2> |
| .. | .. |
| <selector n> | <expression n> |
Where
<element>
is the web element name<selector n>
is the nth selector type, one of:id
for selecting by id attributename
for selecting by name attributetag name
(ortag
since v2.46.0) for selecting by tag namecss selector
(orcss
since v2.46.0) for selecting by css expressionclass name
(orclass
since v2.46.0) for selecting by class attributexpath
for selecting by XPathlink text
for selecting by link textpartial link text
for selecting by partial link textjavascript
(orjs
since v2.46.0) for selecting by JavaScript
<expression n>
is the nth selector expression
Example
Given the todo field can be located by
| selector | expression |
| name | todo-field |
| css | .todo input |
| class | new-todo |
When I type "Feed the cat" in the todo field
<element> can be located at index <index> by
| selector | expression |
| <selector 1> | <expression 1> |
| <selector 2> | <expression 2> |
| .. | .. |
| <selector n> | <expression n> |
Binds indexed primary and fallback selectors for a web element to the current scope with a default lookup timeout.
Lookups will be attempted in the order specified until one succeeds.
<element> can be located at index <index> by
| selector | expression |
| <selector 1> | <expression 1> |
| <selector 2> | <expression 2> |
| .. | .. |
| <selector n> | <expression n> |
Where
<element>
is the web element name<selector n>
is the nth selector type, one of:id
for selecting by id attributename
for selecting by name attributetag name
(ortag
since v2.46.0) for selecting by tag namecss selector
(orcss
since v2.46.0) for selecting by css expressionclass name
(orclass
since v2.46.0) for selecting by class attributexpath
for selecting by XPathlink text
for selecting by link textpartial link text
for selecting by partial link textjavascript
(orjs
since v2.46.0) for selecting by JavaScript
<expression n>
is the nth selector expression<index>
is the index of the element to select in list returned by<expression n>
Example
Given the second item can be located at index 1 by
| selector | expression |
| name | todo-label |
| class | todo-label |
| css | .todo-list label |
Then the second item should contain "Feed the cat"
<element> can be located at index <index> with no <wait|timeout> by
| selector | expression |
| <selector 1> | <expression 1> |
| <selector 2> | <expression 2> |
| .. | .. |
| <selector n> | <expression n> |
Binds indexed primary and fallback selectors for a web element to the current scope with no lookup timeout.
Lookups will be attempted in the order specified until one succeeds.
<element> can be located at index <index> with no <wait|timeout> by
| selector | expression |
| <selector 1> | <expression 1> |
| <selector 2> | <expression 2> |
| .. | .. |
| <selector n> | <expression n> |
Where
<element>
is the web element name<selector n>
is the nth selector type, one of:id
for selecting by id attributename
for selecting by name attributetag name
(ortag
since v2.46.0) for selecting by tag namecss selector
(orcss
since v2.46.0) for selecting by css expressionclass name
(orclass
since v2.46.0) for selecting by class attributexpath
for selecting by XPathlink text
for selecting by link textpartial link text
for selecting by partial link textjavascript
(orjs
since v2.46.0) for selecting by JavaScript
<expression n>
is the nth selector expression<index>
is the index of the element to select in list returned by<expression n>
<wait|timeout>
is eitherwait
ortimeout
Example
Given the second item can be located at index 1 with no lookup timeout by
| selector | expression |
| name | todo-label |
| class | todo-label |
| css | .todo-list label |
Then the second item should contain "Feed the cat"
<element> can be located at index <index> with <timeoutSecs> second <wait|timeout> by
| selector | expression |
| <selector 1> | <expression 1> |
| <selector 2> | <expression 2> |
| .. | .. |
| <selector n> | <expression n> |
Binds indexed primary and fallback selectors for a web element to the current scope with a given lookup timeout.
Lookups will be attempted in the order specified until one succeeds.
<element> can be located at index <index> with <timeoutSecs> second <wait|timeout> by
| selector | expression |
| <selector 1> | <expression 1> |
| <selector 2> | <expression 2> |
| .. | .. |
| <selector n> | <expression n> |
Where
<element>
is the web element name<selector n>
is the nth selector type, one of:id
for selecting by id attributename
for selecting by name attributetag name
(ortag
since v2.46.0) for selecting by tag namecss selector
(orcss
since v2.46.0) for selecting by css expressionclass name
(orclass
since v2.46.0) for selecting by class attributexpath
for selecting by XPathlink text
for selecting by link textpartial link text
for selecting by partial link textjavascript
(orjs
since v2.46.0) for selecting by JavaScript
<expression n>
is the nth selector expression<index>
is the index of the element to select in list returned by<expression n>
<timeoutSecs>
is the timeout period in seconds<wait|timeout>
is eitherwait
ortimeout
Example
Given the second item can be located at index 1 with 5 second timeout by
| selector | expression |
| name | todo-label |
| class | todo-label |
| css | .todo-list label |
Then the second item should contain "Feed the cat"
Relative Locators
<element> can be located by <selector> "<expression>" <relativeTo> <otherElement>
Binds a selector for a web element (relative to another) to the current scope with a default lookup timeout.
<element> can be located by <selector> "<expression>" <relativeTo> <otherElement>
Where
<element>
is the web element name<selector>
is the selector type, one of:id
for selecting by id attributename
for selecting by name attributetag name
(ortag
since v2.46.0) for selecting by tag namecss selector
(orcss
since v2.46.0) for selecting by css expressionclass name
(orclass
since v2.46.0) for selecting by class attributexpath
for selecting by XPathlink text
for selecting by link textpartial link text
for selecting by partial link textjavascript
(orjs
since v2.46.0) for selecting by JavaScript
<expression>
is the selector expression<relativeTo>
is one ofin
to select element contained in<otherElement>
Or since Gwen 3
above
to select element above<otherElement>
below
to select element below<otherElement>
to left of
to select element to the left of<otherElement>
to right of
to select element to the right of<otherElement>
near
to select element near<otherElement>
near and within <noOfPixels> pixel[s] of
to select element near and within a given number of pixels of<otherElement>
- Where
<noOfPixels>
is a postive integer denoting a number of pixels (max proximity to<otherElement>
)
- Where
<otherElement>
is the name of the web element that this one is relative to
Example
Given the button can be located by tag "button"
And the left field can be located by css "input" to left of the button
When I navigate to "https://chercher.tech/practice/relative-locators"
And I type "I am left of the button" in the left field
Then the left field should contain "I am left of the button"
<element> can be located by <selector> "<expression>" <relativeTo> <otherElement> with no <wait|timeout>
Binds a selector for a web element (relative to another) to the current scope with no lookup timeout.
<element> can be located by <selector> "<expression>" <relativeTo> <otherElement> with no <wait|timeout>
Where
<element>
is the web element name<selector>
is the selector type, one of:id
for selecting by id attributename
for selecting by name attributetag name
(ortag
since v2.46.0) for selecting by tag namecss selector
(orcss
since v2.46.0) for selecting by css expressionclass name
(orclass
since v2.46.0) for selecting by class attributexpath
for selecting by XPathlink text
for selecting by link textpartial link text
for selecting by partial link textjavascript
(orjs
since v2.46.0) for selecting by JavaScript
<expression>
is the selector expression<relativeTo>
is one ofin
to select element contained in<otherElement>
Or since Gwen 3
above
to select element above<otherElement>
below
to select element below<otherElement>
to left of
to select element to the left of<otherElement>
to right of
to select element to the right of<otherElement>
near
to select element near<otherElement>
near and within <noOfPixels> pixel[s] of
to select element near and within a given number of pixels of<otherElement>
- Where
<noOfPixels>
is a postive integer denoting a number of pixels (max proximity to<otherElement>
)
- Where
<otherElement>
is the name of the web element that this one is relative to<wait|timeout>
is eitherwait
ortimeout
Example
Given the button can be located by tag "button"
And the right field can be located by css "input" to right of the button with no wait
When I navigate to "https://chercher.tech/practice/relative-locators"
And I type "I am right of the button" in the right field
Then the right field should contain "I am right of the button"
<element> can be located by <selector> "<expression>" <relativeTo> <otherElement> with <timeoutSecs> second <wait|timeout>
Binds a selector for a web element (relative to another) to the current scope with a given lookup timeout.
<element> can be located by <selector> "<expression>" <relativeTo> <otherElement> with <timeoutSecs> second <wait|timeout>
Where
<element>
is the web element name<selector>
is the selector type, one of:id
for selecting by id attributename
for selecting by name attributetag name
(ortag
since v2.46.0) for selecting by tag namecss selector
(orcss
since v2.46.0) for selecting by css expressionclass name
(orclass
since v2.46.0) for selecting by class attributexpath
for selecting by XPathlink text
for selecting by link textpartial link text
for selecting by partial link textjavascript
(orjs
since v2.46.0) for selecting by JavaScript
<expression>
is the selector expression<relativeTo>
is one ofin
to select element contained in<otherElement>
Or since Gwen 3
above
to select element above<otherElement>
below
to select element below<otherElement>
to left of
to select element to the left of<otherElement>
to right of
to select element to the right of<otherElement>
near
to select element near<otherElement>
near and within <noOfPixels> pixel[s] of
to select element near and within a given number of pixels of<otherElement>
- Where
<noOfPixels>
is a postive integer denoting a number of pixels (max proximity to<otherElement>
)
- Where
<otherElement>
is the name of the web element that this one is relative to<timeoutSecs>
is the timeout period in seconds<wait|timeout>
is eitherwait
ortimeout
Example
Given the button can be located by tag "button"
And the above field can be located by css "input" above the button with 5 second wait
When I navigate to "https://chercher.tech/practice/relative-locators"
And I type "I am above the button" in the above field
Then the above field should contain "I am above the button"
Settings overrides
my <name> setting is "<value>"
Overrides a Gwen setting.
my <name> setting is "<value>"
Where
<name>
is name of the setting to override<value>
is the value to set
Notes
Or as of v2.21.0, this DSL stores all values as thread local settings (instead of system properties).
- This supports different settings for different features in the case of parallel execution.
- Settings loaded from properties files and system properties at startup time are not replaced, but can be overridden with values set here.
- Setting arbitrary system properties (that is: non Gwen settings that do not start with
gwen.
) is not supported.
- Prior to v2.21.0, this DSL stored all values as JVM-global system properties and caution was advised because race conditions could occur if multiple features changed the same system property.
Example
Given my gwen.web.useragent setting is "I am robot"
I reset my <name> setting
Resets a Gwen setting to remove a previous override.
I reset my <name> setting
Capture
Text capture
I capture <textRef> as <name>
Captures the referenced text and binds it to the given name in the global scope.
I capture <textRef> as <name>
Where
<textRef>
is the name of the binding containing the source text- Can be the name of any binding that contains or resolves to a text value, including a web element in which case the text in the element will be dynamically retrieved and used.
<name>
is the name to bind the captured value to
Example
Given the username is "Gwen"
When I capture the username as my username
Then my username should be the username
I capture <element>
Captures the text value of an element and binds it to the element name in the global scode.
I capture <element>
I capture <element> as <name>
Captures the text value of an element and binds it to the given name in the global scope.
I capture <element> as <name>
I capture <name> <of|on|in> <element> by <javascript|js> "<script>"
Executes a JavaScript expression or function on an element and binds the result to the given name.
I capture <name> <of|on|in> <element> by <javascript|js> "<script>"
Where
<name>
is the name to bind the javascript return value to<of|on|in>
isof
,on
orin
<element>
is the name of the element to execute the javascript on<javascript|js>
isjavascript
(orjs
, since v2.46.0)<script>
is the javascript expression or function that will return the value (can be in DocString position)- The reference to the element will be provided to the javascript through an implicit object named
element
. - For a one liner expression, no function, arrow declaration or
return
prefix is required For a function, use either:
- Arrow syntax (preferred):
() => { body }
(Since v3.56.0) - Or anonymous function syntax (legacy):
(function(){ body })()
- Arrow syntax (preferred):
- The reference to the element will be provided to the javascript through an implicit object named
Example
Given the red checkbox can be located by id "red"
When I navigate to "https://automationintesting.com/selenium/testpage"
And I click the red checkbox
And I capture my favorite color in the red checkbox by js
"""
() => {
var color = element.value
if (!element.checked) color = "Blue"
return color;
}
"""
Then my favorite color should be "Red"
Regex capture
I capture the text in <textRef> by regex "<expression>" as <name>
Captures the referenced text using the given regex expression and binds it to the given name in the global scope.
I capture the text in <textRef> by regex "<expression>" as <name>
Where
<textRef>
is the name of the binding containing the source text- Can be the name of any binding that contains or resolves to a text value, including a web element in which case the text in the element will be dynamically retrieved and used.
<expression>
is the regex selector expression<name>
is the name to bind the captured value to
Example
Given the date is "2021-09-22"
When I capture the text in the date by regex "(\d{4})" as the year
Then the year should be "2021"
I capture the text in <element> by regex "<expression>" as <name>
Captures text content from a web element using the given regex expression and binds it to the given name in the global scope.
I capture the text in <element> by regex "<expression>" as <name>
Where
<element>
is the name of the element to capture text from<expression>
is the regex selector expression<name>
is the name to bind the captured value to
Example
# assuming a web element contains date: 2021-09-22
Given the date field can be located by class "date"
When I capture the text in the date field by regex "(\d{4})" as the year
Then the year should be "2021"
XPath capture
I capture the <nodeType> in <xmlRef> by xpath "<expression>" as <name>
Captures XML content from a referenced XML string using the given XPath expression and binds it to the given name in the global scope.
I capture the <nodeType> in <xmlRef> by xpath "<expression>" as <name>
Where
<nodeType>
is one of:text
to capture the text nodenode
to capture a single nodenodeset
to capture multiple nodes
<xmlRef>
is the name of the binding containing the XML text- Can be the name of any binding that contains or resolves to an XML text value, including a web element in which case the text in the element will be dynamically retrieved and used.
<expression>
is the XPath selector expression<name>
is the name to bind the captured value to
Example
Given the xml is "<result><status>passed</status></result>"
When I capture the text in the xml by xpath "//result/status" as the status
Then the status should be "passed"
I capture the <nodeType> in <element> by xpath "<expression>" as <name>
Captures XML content from a web element using the given XPath expression and binds it to the given name in the global scope.
I capture the <nodeType> in <element> by xpath "<expression>" as <name>
Where
<nodeType>
is one of:text
to capture the text nodenode
to capture a single nodenodeset
to capture multiple nodes
<element>
is the name of the element containing the XML content<expression>
is the XPath selector expression<name>
is the name to bind the captured value to
Example
# assuming a web element contains xml: <result><status>passed</status></result>
Given the xml web element can be located by id "xml"
When I capture the text in the xml web element by xpath "//result/status" as the status
Then the status should be "passed"
JSON capture
I capture the content in <jsonRef> by json path "<expression>" as <name>
Captures JSON content from a referenced JSON string using the given JSON Path expression and binds it to the given name in the global scope.
I capture the content in <jsonRef> by json path "<expression>" as <name>
Where
<jsonRef>
is the name of the binding containing the source JSON source- Can be the name of any binding that contains or resolves to a JSON text value, including a web element in which case the text in the element will be dynamically retrieved and used.
<expression>
is the JSON selector expression<name>
is the name to bind the captured value to
Example
Given the json is "{ "status": "passed" }"
When I capture the content in the json by json path "$.status" as the status
Then the status should be "passed"
Similarity capture
I capture the similarity score of <textRef> compared to "<text>" as <name>
Compares a text reference with a text value for similarity using the DSC (Dice Similarity Coefficient) algorithm and binds the calculated score to name
in the global scope.
I capture the similarity score of <textRef> compared to "<text>" as <name>
name
in the global scope.Where
<textRef>
is the name of the binding containing a text reference- Can be the name of any binding that contains or resolves to a text value, including a web element in which case the text in the element will be dynamically retrieved and used.
<text>
is the text to compare<textRef>
against<name>
is the name to bind the calculated score to
Example
Given the phrase is "Hello world!"
When I capture the similarity score of the phrase compared to "Hello world" as similarity score 1
And I capture the similarity score of the phrase compared to "hello world" as similarity score 2
And @IgnoreCase I capture the similarity score of the phrase compared to "hello world" as similarity score 3
Then similarity score 1 should be "0.9411764705882353"
And similarity score 2 should be "0.8235294117647058"
And similarity score 3 should be "0.9411764705882353"
Trimming and ignoring case (since v3.62.0)
- The
@Trim
annotation can be used on step to trim strings when comparing - The
@IgnoreCase
annotation can be used on step to ignore case when comparing
I capture the similarity score of <textRef1> compared to <textRef2> as <name>
Compares a text reference with another for similarity using the DSC (Dice Similarity Coefficient) algorithm and binds the calculated score to name
in the global scope.
I capture the similarity score of <textRef1> compared to <textRef2> as <name>
name
in the global scope.Where
<textRef1>
is the name of the binding containing a text reference- Can be the name of any binding that contains or resolves to a text value, including a web element in which case the text in the element will be dynamically retrieved and used.
<textRef2>
is the name of the binding containing the second text reference to compare <textRef1> against- Can be the name of any binding that contains or resolves to a text value, including a web element in which case the text in the element will be dynamically retrieved and used.
<name>
is the name to bind the calculated score to
Example
Given phrase 1 is "Hello world!"
And phrase 2 is "hello world"
When I capture the similarity score of phrase 1 compared to phrase 2 as similarity score 1
And @IgnoreCase I capture the similarity score of phrase 1 compared to phrase 2 as similarity score 2
Then similarity score 1 should be "0.8235294117647058"
And similarity score 2 should be "0.9411764705882353"
Trimming and ignoring case (since v3.62.0)
- The
@Trim
annotation can be used on step to trim strings when comparing - The
@IgnoreCase
annotation can be used on step to ignore case when comparing
I capture the similarity score of <textRef> compared to "<text>"
Compares a text reference with a text value for similarity using the DSC (Dice Similarity Coefficient) algorithm and binds the calculated score to the similarity score
attribute in the global scope.
I capture the similarity score of <textRef> compared to "<text>"
similarity score
attribute in the global scope.Where
<textRef>
is the name of the binding containing a text reference- Can be the name of any binding that contains or resolves to a text value, including a web element in which case the text in the element will be dynamically retrieved and used.
<text>
is the text to compare<textRef>
against
Example
Given the phrase is "Hello world!"
When I capture the similarity score of the phrase compared to "Hello world"
Then similarity score should be "0.9411764705882353"
Trimming and ignoring case (since v3.62.0)
- The
@Trim
annotation can be used on step to trim strings when comparing - The
@IgnoreCase
annotation can be used on step to ignore case when comparing
I capture the similarity score of <textRef1> compared to <textRef2>
Compares a text reference with another for similarity using the DSC (Dice Similarity Coefficient) algorithm and binds the calculated score to the similarity score
attribute in the global scope.
I capture the similarity score of <textRef1> compared to <textRef2>
similarity score
attribute in the global scope.Where
<textRef1>
is the name of the binding containing a text reference- Can be the name of any binding that contains or resolves to a text value, including a web element in which case the text in the element will be dynamically retrieved and used.
<textRef2>
is the name of the binding containing the second text reference to compare <textRef1> against- Can be the name of any binding that contains or resolves to a text value, including a web element in which case the text in the element will be dynamically retrieved and used.
Example
Given phrase 1 is "Hello world!"
And phrase 2 is "hello world"
When I capture the similarity score of phrase 1 compared to phrase 2
Then similarity score should be "0.8235294117647058"
Trimming and ignoring case (since v3.62.0)
- The
@Trim
annotation can be used on step to trim strings when comparing - The
@IgnoreCase
annotation can be used on step to ignore case when comparing
PDF capture
I capture the PDF text from the current URL
Captures the text in a PDF document from the current URL in the browser and binds it to the PDF text
variable in the global scope.
I capture the PDF text from the current URL
the PDF text
variable in the global scope.I capture the PDF text from the current URL as <name>
Captures the text in a PDF document from the current URL in the browser and binds it to the given name in the global scope.
I capture the PDF text from the current URL as <name>
I capture the PDF text from url "<url>"
Captures the text in a PDF document from a given URL location and binds it to the PDF text
variable in the global scope.
I capture the PDF text from url "<url>"
the PDF text
variable in the global scope.I capture the PDF text from url "<url>" as <name>
Captures the text in a PDF document from a given URL location and binds it to the given name in the global scope.
I capture the PDF text from url "<url>" as <name>
I capture the PDF text from file "<filepath>"
Captures the text in a PDF document from a local file and binds it to the PDF text
variable in the global scope.
I capture the PDF text from file "<filepath>"
the PDF text
variable in the global scope.I capture the PDF text from file "<filepath>" as <name>
Captures the text in a PDF document from a local file and binds it to the given name in the global scope.
I capture the PDF text from file "<filepath>" as <name>
Base64 capture
I base64 decode <textRef>
Base64 decodes the text reference and binds the result to the same name in the global scope.
I base64 decode <textRef>
Where
<textRef>
is the name of the binding containing the text to decode- Can be the name of any binding that contains or resolves to a text value, including a web element in which case the text in the element will be dynamically retrieved and used.
Example
Given the data is "c29tZSBiaW5hcnkgZGF0YQ=="
When I base64 decode the data
Then the data should be "some binary data"
I base64 decode <textRef> as <name>
Base64 decodes the text reference and binds the result to the give name in the global scope.
I base64 decode <textRef> as <name>
Where
<textRef>
is the name of the binding containing the text to decode- Can be the name of any binding that contains or resolves to a text value, including a web element in which case the text in the element will be dynamically retrieved and used.
<name>
is the name to bind the decoded value to
Example
Given the encoded data is "c29tZSBiaW5hcnkgZGF0YQ=="
When I base64 decode the encoded data as the decoded data
Then the decoded data should be "some binary data"
I base64 decode <element>
Base64 decodes the text in the given element and binds the result to the same name in the global scope.
I base64 decode <element>
I base64 decode <element> as <name>
Base64 decodes the text in the given element and binds the result to the give name in the global scope.
I base64 decode <element> as <name>
Where
<element>
is the name of the element containing the text to decode<name>
is the name to bind the decoded value to
Example
Given the encoded data field can be located by class "encoded-data"
When I base64 decode the encoded data as the decoded data
Then the decoded data should be "some binary data"
URL capture
I capture the current URL
Captures the current browser URL and binds it as the current URL
in the global scope.
I capture the current URL
the current URL
in the global scope.I capture the current URL as <name>
Captures the current browser URL and binds it to the given name in the global scope.
I capture the current URL as <name>
I capture the text in the current URL by regex "<expression>" as <name>
Extracts a substring from the current browser URL using the given regex and binds it to the given name in the global scope.
I capture the text in the current URL by regex "<expression>" as <name>
Dropdown capture
I capture <dropdown> <text|value>
Captures the selected text or value of a dropdown element and binds it to the element name in the global scode.
I capture <dropdown> <text|value>
Where
<dropdown>
is the name of the dropdown element to capture the text or value of<dropdown>
is one of:text
to captured the displayed text of the selectionvalue
to captured the option value of the selection
Example
Given the age dropdown can be located by id "challenger_age"
When I navigate to "https://challengers.flood.io/step/2"
And I capture the age dropdown text
I capture <dropdown> <text|value> as <name>
Captures the selected text or value of a dropdown element and binds it to the given name in the global scope.
I capture <dropdown> <text|value> as <name>
Where
<dropdown>
is the name of the dropdown element to capture the text or value of<dropdown>
is one of:text
to captured the displayed text of the selectionvalue
to captured the option value of the selection
Example
Given the age dropdown can be located by id "challenger_age"
When I navigate to "https://challengers.flood.io/step/2"
And I capture the age dropdown text my age
Screenshot capture
I capture the current screenshot
Captures the current screenshot and attaches it to the Gwen report.
I capture the current screenshot
I capture the current screenshot as <name>
Captures the current screenshot, attaches it to the Gwen report, and binds the filepath of the saved image to the given name in the global scope.
I capture the current screenshot as <name>
Where
<name>
the name to bind the captured image filepath to
Example
Given the todo field can be located by class "new-todo"
When I navigate to "https://todomvc.com/examples/react/dist"
And I enter "Walk the dog" in the todo field
And I capture the current screenshot as the screenshot image
Then the screenshot image should contain "path/to/image.png"
Element capture
I capture element screenshot of <element>
Captures the screenshot of a web element and attaches it to the Gwen report.
I capture element screenshot of <element>
Where
<element>
the name of the web element to capture the screenshot of
Example
Given the todo field can be located by class "new-todo"
When I navigate to "https://todomvc.com/examples/react/dist"
And I type "Walk the dog" in the todo field
And I capture element screenshot of the todo field
I capture element screenshot of <element> as <name>
Captures the screenshot of a web element, attaches it to the Gwen report, and binds the filepath of the saved image to the given name in the global scope.
I capture element screenshot of <element> as <name>
Where
<element>
the name of the web element to capture the screenshot of<name>
the name to bind the captured image filepath to
Example
Given the todo field can be located by class "new-todo"
When I navigate to "https://todomvc.com/examples/react/dist"
And I type "Walk the dog" in the todo field
And I capture element screenshot of the todo field as my element screenshot
Data lookups
I lookup <name> in the "<filepath>" file where "<predicate>"
Looks up a named data value in a CSV or JSON file based on a predicate function and binds its value to the same name in the global scope.
I lookup <name> in the "<filepath>" file where "<predicate>"
Where
<name>
the name of the data to look up the value of and the name to bind it to<filepath>
the path to the CSV or JSON file to look up<predicate>
is the javascript predicate expression that will returntrue
when a match is found for a record orfalse
otherwise (can be in DocString position) Data fields can be referenced in the predicate using either:${data.record.NAME}
(since v3.47.0)${csv.record.NAME}
for CSV data or${json.record.NAME}
for JSON data (for prior versions)
The data value contained in the first record that satisifes the given predicate will be bound to the global scope. Otherwise if no records match, then no value will be bound.
Examples
CSV Lookup
Given the CSV file: lookup/StateCodes.csv
Code,Name
ACT,Australian Capital Territory
NSW,New South Wales
NT,Northern Territory
QLD,Queensland
SA,South Australia
TAS,Tasmania
VIC,Victoria
WA,Western Australia
The following will bind "Western Australia" in the last record to Name
in the global scope
When I lookup Name in the "lookup/StateCodes.csv" file where "'${data.record.Code}' == 'WA'"
Then Name should be "Western Australia"
JSON Lookup
Since v3.47.0
Given the JSON file: lookup/StateCodes.json
[
{ "Code": "ACT", "Name": "Australian Capital Territory" },
{ "Code": "NSW", "Name": "New South Wales" },
{ "Code": "NT", "Name": "Northern Territory" },
{ "Code": "QLD", "Name": "Queensland" },
{ "Code": "SA", "Name": "South Australia" },
{ "Code": "TAS", "Name": "Tasmania" },
{ "Code": "VIC", "Name": "Victoria" },
{ "Code": "WA", "Name": "Western Australia" }
]
The following will bind "Western Australia" in the last record to Name
in the global scope
When I lookup Name in the "lookup/StateCodes.json" file where "'${data.record.Code}' == 'WA'"
Then Name should be "Western Australia"
I lookup <name> in <filepathRef> file where "<predicate>"
Looks up a named data value in a referenced CSV or JSON file based on a predicate function and binds its value to the same name in the global scope.
I lookup <name> in <filepathRef> file where "<predicate>"
Where
<name>
the name of the data to look up the value of and the name to bind it to<filepathRef>
is the name of the binding containing the path of the CSV or JSON file to look up<predicate>
is the javascript predicate expression that will returntrue
when a match is found for a record orfalse
otherwise (can be in DocString position) Data fields can be referenced in the predicate using either:${data.record.NAME}
(since v3.47.0)${csv.record.NAME}
for CSV data or${json.record.NAME}
for JSON data (for prior versions)
The data value contained in the first record that satisifes the given predicate will be bound to the global scope. Otherwise if no records match, then no value will be bound.
Examples
CSV Lookup
Given the CSV file: lookup/StateCodes.csv
Code,Name
ACT,Australian Capital Territory
NSW,New South Wales
NT,Northern Territory
QLD,Queensland
SA,South Australia
TAS,Tasmania
VIC,Victoria
WA,Western Australia
The following will bind "QLD" in the 4th record to Code
in the global scope
Given mapping file is "lookup/StateCodes.csv"
When I lookup Code in mapping file where "'${data.record.Name}' == 'Queensland'"
Then Code should be "QLD"
JSON Lookup
Since v3.47.0
Given the JSON file: lookup/StateCodes.json
[
{ "Code": "ACT", "Name": "Australian Capital Territory" },
{ "Code": "NSW", "Name": "New South Wales" },
{ "Code": "NT", "Name": "Northern Territory" },
{ "Code": "QLD", "Name": "Queensland" },
{ "Code": "SA", "Name": "South Australia" },
{ "Code": "TAS", "Name": "Tasmania" },
{ "Code": "VIC", "Name": "Victoria" },
{ "Code": "WA", "Name": "Western Australia" }
]
The following will bind "QLD" in the 4th record to Code
in the global scope
Given mapping file is "lookup/StateCodes.json"
When I lookup Code in mapping file where "'${data.record.Name}' == 'Queensland'"
Then Code should be "QLD"
I lookup <dataName> in the "<filepath>" file as <name> where "<predicate>"
Looks up a named data value in a CSV or JSON file based on a predicate function and binds its value to a given name in the global scope.
I lookup <dataName> in the "<filepath>" file as <name> where "<predicate>"
Where
<dataName>
the name of the data to look up the value of<filepath>
the path to the CSV or JSON file to look up<name>
the name to bind the looked up value to in the global scope<predicate>
is the javascript predicate expression that will returntrue
when a match is found for a record orfalse
otherwise (can be in DocString position) Data fields can be referenced in the predicate using either:${data.record.NAME}
(since v3.47.0)${csv.record.NAME}
for CSV data or${json.record.NAME}
for JSON data (for prior versions)
The data value contained in the first record that satisifes the given predicate will be bound to the global scope. Otherwise if no records match, then no value will be bound.
Examples
CSV Lookup
Given the CSV file: lookup/StateCodes.csv
Code,Name
ACT,Australian Capital Territory
NSW,New South Wales
NT,Northern Territory
QLD,Queensland
SA,South Australia
TAS,Tasmania
VIC,Victoria
WA,Western Australia
The following will bind "New South Wales" in the 2nd record to state name
in the global scope
When I lookup Name in the "lookup/StateCodes.csv" file as state name where "'${data.record.Code}' == 'NSW'"
Then state name should be "New South Wales"
JSON Lookup
Since v3.47.0
Given the JSON file: lookup/StateCodes.json
[
{ "Code": "ACT", "Name": "Australian Capital Territory" },
{ "Code": "NSW", "Name": "New South Wales" },
{ "Code": "NT", "Name": "Northern Territory" },
{ "Code": "QLD", "Name": "Queensland" },
{ "Code": "SA", "Name": "South Australia" },
{ "Code": "TAS", "Name": "Tasmania" },
{ "Code": "VIC", "Name": "Victoria" },
{ "Code": "WA", "Name": "Western Australia" }
]
The following will bind "New South Wales" in the 2nd record to state name
in the global scope
When I lookup Name in the "lookup/StateCodes.json" file as state name where "'${data.record.Code}' == 'NSW'"
Then state name should be "New South Wales"
I lookup <dataName> in <filepathRef> file as <name> where "<predicate>"
Looks up a named column value in a referenced CSV or JSON file based on a predicate function and binds its value to a given name in the global scope.
I lookup <dataName> in <filepathRef> file as <name> where "<predicate>"
Where
<dataName>
the name of the data in the CSV or JSON file to look up the value of<filepathRef>
is the name of the binding containing the path of the CSV or JSON file to look up<name>
the name to bind the looked up value to in the global scope<predicate>
is the javascript predicate expression that will returntrue
when a match is found for a record orfalse
otherwise (can be in DocString position) Data fields can be referenced in the predicate using either:${data.record.NAME}
(since v3.47.0)${csv.record.NAME}
for CSV data or${json.record.NAME}
for JSON data (for prior versions)
The data value contained in the first record that satisifes the given predicate will be bound to the global scope. Otherwise if no records match, then no value will be bound.
Examples
CSV Lookup
Given the CSV file: lookup/StateCodes.csv
Code,Name
ACT,Australian Capital Territory
NSW,New South Wales
NT,Northern Territory
QLD,Queensland
SA,South Australia
TAS,Tasmania
VIC,Victoria
WA,Western Australia
The following will bind "VIC" in the 7th record to state code
in the global scope
Given mapping file is "lookup/StateCodes.csv"
When I lookup Code in mapping file as state code where "'${data.record.Name}' == 'Victoria'"
Then state code should be "VIC"
JSON Lookup
Since v3.47.0
Given the JSON file: lookup/StateCodes.json
[
{ "Code": "ACT", "Name": "Australian Capital Territory" },
{ "Code": "NSW", "Name": "New South Wales" },
{ "Code": "NT", "Name": "Northern Territory" },
{ "Code": "QLD", "Name": "Queensland" },
{ "Code": "SA", "Name": "South Australia" },
{ "Code": "TAS", "Name": "Tasmania" },
{ "Code": "VIC", "Name": "Victoria" },
{ "Code": "WA", "Name": "Western Australia" }
]
The following will bind "VIC" in the 7th record to state code
in the global scope
Given mapping file is "lookup/StateCodes.json"
When I lookup Code in mapping file as state code where "'${data.record.Name}' == 'Victoria'"
Then state code should be "VIC"
Actions
Page actions
I refresh the current page
Refreshes the current page in the browser.
I refresh the current page
Element actions
I <click|right click|double click> <element>
Clicks a web element.
I <click|right click|double click> <element>
Where
<click|right click|double click>
is one of:<element>
is the name of the element to click
Example
Given the start button can be located by name "commit"
When I navigate to "https://challengers.flood.io/start"
And I click the start button
I <click|right click|double click> <element> of <context>
Clicks a context sensitive web element.
I <click|right click|double click> <element> of <context>
Where
<click|right click|double click>
is one of:<element>
is the name of the element to click<context>
is the context element to focus into (in order to click<element>
)
Example
Given the menu item can be located by id "menu-item-id"
And the action button can be located by id "action-button-id"
When I click the action button of the menu item
I <modifierKeys> <click|right click|double click> <element>
Holds down the specified modifier keys and clicks an element.
I <modifierKeys> <click|right click|double click> <element>
Where
<modifierKeys>
is a+
separated list of modifier keys to hold down during the click- Modifier keys can be single keyboard characters or any supported key constants
- Node: Keys behave differently on different platforms
<click|right click|double click>
is one of:click
to click the elementright click
to right click the elementdouble click
to double click the element, since v2.12.0
<element>
is the name of the element to click
Example
Given the button can be located by tag "button"
And I COMMAND+SHIFT click the button
I <check|uncheck|tick|untick> <checkbox>
Ticks or unticks a checkbox element.
I <check|uncheck|tick|untick> <checkbox>
Where
<check|uncheck|tick|untick>
is one of:<checkbox>
is the name of the checkbox element
Example
Given the email checkbox can be located by id "checkbox1"
When I navigate to "https://automationintesting.com/selenium/testpage"
And I tick the email checkbox
I move to <element>
Moves to a web element and gives it the focus.
I move to <element>
I <enter|type> "<text>" in <element>
Enters or types text into a web element.
I <enter|type> "<text>" in <element>
Where
<enter|type>
is one of:enter
to send the text to the field followed by the enter keytype
to send the text to the field only (without trailing enter key)
<text>
is the text to send to the field<element>
is the name of the field to send the text to
Example
Given the todo field can be located by class "new-todo"
When I navigate to "https://todomvc.com/examples/react/dist"
And I enter "Walk the dog" in the todo field
I <enter|type> <textRef> in <element>
Enters or types a text reference value into a web element.
I <enter|type> <textRef> in <element>
Where
<enter|type>
is one of:enter
to send the text to the field followed by the enter keytype
to send the text to the field only (without trailing enter key)
<textRef>
is the name of the binding containing the text to send to the field- Can be the name of any binding that contains or resolves to a text value, including a web element in which case the text in the element will be dynamically retrieved and used.
<element>
is the name of the field to send the text to
Example
Given the todo field can be located by class "new-todo"
And my item is "Walk the dog"
When I navigate to "https://todomvc.com/examples/react/dist"
And I enter my item in the todo field
I append "<text>" to <element>
Appends the given text to the current text value of an element.
I append "<text>" to <element>
I append <textRef> to <element>
Appends the given referenced text to the current text value of an element.
I append <textRef> to <element>
Where
<textRef>
is the name of the binding containing the text to append to the element- Can be the name of any binding that contains or resolves to a text value, including a web element in which case the text in the element will be dynamically retrieved and used.
<element>
is name of the element to append the text to
Example
Given the search field can be located by name "q"
And my additional search term is " automation"
When I navigate to "https://google.com"
And I type "Gwen" in the search field
And I append my additional search term to the search field
I press <enter|tab> in <element>
Send the enter or tab key to a web element.
I press <enter|tab> in <element>
Where
<enter|tab>
is one of:enter
to send the enter keytab
to send the tab key
<element>
is the name of the element to send the key to
Example
Given the surname field can be located by id "surname"
When I navigate to "https://automationintesting.com/selenium/testpage"
And I press tab in the surname field
I send "<keys>" to <element>
Sends a sequence of keys to an element (for emulating keyboard shortcuts).
I send "<keys>" to <element>
Where
<keys>
is a,
or+
(since v2.53.0) separated list of keys to send.- Keys can be single keyboard characters or any supported key constants
- Note: Keys behave differently on different platforms
<element>
is the name of the element to send the keys to
Example
Given the search field can be located by name "q"
When I navigate to "https://google.com"
And I type "Gwen automation" in the search field
And I send "COMMAND+A" to the search field
And I send "COMMAND+C" to the search field
And I clear the search field
And I send "COMMAND+V" to the search field
And I send "ARROW_DOWN" to the search field
And I press enter in the search field
I insert a new line in <textarea>
Inserts a new line into a textarea element.
I insert a new line in <textarea>
Where
<textarea>
is the name of the textarea element to insert the new line into
Example
Given the more field can be located by tag "textarea"
When I navigate to "https://automationintesting.com/selenium/testpage"
And I type "Hi," in the more field
And I insert a new line in the more field
And I type "I like Gwen." in the more field
And I insert a new line in the more field
And I type "Bye!" in the more field
Then the more field should contain
"""
Hi,
I like Gwen.
Bye!
"""
I clear <element>
Clears a text element.
I clear <element>
Dropdown actions
I <select|deselect> the <position><st|nd|rd|th> option in <dropdown>
Selects an option in a dropdown by position.
I <select|deselect> the <position><st|nd|rd|th> option in <dropdown>
Where
<select|deselect>
is one of:select
to select the optiondeselect
to deselect the option, since v2.13.0- Note: Deselect will only work for multi-select dropdowns.
<position>
is the position number of the option(1 for first position)<st|nd|rd|th>
is one of:st
if the position number ends in 1nd
if the position number ends in 2rd
if the position number ends in 3th
if the position number is greater than 3
<dropdown>
is the name of the dropdown element
Example
Given the age dropdown can be located by id "challenger_age"
When I navigate to "https://challengers.flood.io/step/2"
And I select the 2nd option in the age dropdown
I <select|deselect> "<option>" in <dropdown>
Selects an option in a dropdown by displayed text.
I <select|deselect> "<option>" in <dropdown>
Where
<select|deselect>
is one of:select
to select the optiondeselect
to deselect the option, since v2.13.0- Note: Deselect will only work for multi-select dropdowns.
<option>
is the displayed option text<dropdown>
is the name of the dropdown element
Example
Given the age dropdown can be located by id "challenger_age"
When I navigate to "https://challengers.flood.io/step/2"
And I select "18" in the age dropdown
I <select|deselect> <optionRef> in <dropdown>
Selects an option in a dropdown by a displayed text reference.
I <select|deselect> <optionRef> in <dropdown>
Where
<select|deselect>
is one of:select
to select the optiondeselect
to deselect the option, since v2.13.0- Note: Deselect will only work for multi-select dropdowns.
<optionRef>
is the name of the binding containing the displayed option text- Can be the name of any binding that contains or resolves to a text value, including a web element in which case the text in the element will be dynamically retrieved and used.
<dropdown>
is the name of the dropdown element
Example
Given the age dropdown can be located by id "challenger_age"
And my age is "24"
When I navigate to "https://challengers.flood.io/step/2"
And I select my age in the age dropdown
I <select|deselect> "<option>" in <dropdown> by value
Selects an option in a dropdown by hidden value.
I <select|deselect> "<option>" in <dropdown> by value
Where
<select|deselect>
is one of:select
to select the optiondeselect
to deselect the option, since v2.13.0- Note: Deselect will only work for multi-select dropdowns.
<option>
is the hidden option value<dropdown>
is the name of the dropdown element
Example
Given the age dropdown can be located by id "challenger_age"
When I navigate to "https://challengers.flood.io/step/2"
And I select "21" in the age dropdown by value
I <select|deselect> <optionRef> in <dropdown> by value
Selects an option in a dropdown by hidden value reference.
I <select|deselect> <optionRef> in <dropdown> by value
Where
<select|deselect>
is one of:select
to select the optiondeselect
to deselect the option, since v2.13.0- Note: Deselect will only work for multi-select dropdowns.
<optionRef>
is the name of the binding containing the hidden option value- Can be the name of any binding that contains or resolves to a text value, including a web element in which case the text in the element will be dynamically retrieved and used.
<dropdown>
is the name of the dropdown element
Example
Given the age dropdown can be located by id "challenger_age"
And the age is "24"
When I navigate to "https://challengers.flood.io/step/2"
And I deselect the age in the age dropdown
Form actions
I submit <form>
Submits a web form.
I submit <form>
Window and tab actions
I have an open browser
Opens a browser if none are open
I have an open browser
I have no open browser
Closes all open browsers
I have no open browser
I start a new browser
Starts a new browser session (or switches to exising one if it is already open).
I start a new browser
I close the[ current] browser
Closes the current browser session (or does nothing if one is not open).
I close the[ current] browser
I start a browser for <name>
Starts a new browser session with the given name (closes any existing browser of that name first).
I start a browser for <name>
I switch to <name>
Switches to a named browser session (starts a new browser if one of that name is not already open). All browser actions performed after this will execute in the named session.
I switch to <name>
Where
<name>
is the name of the browser session to switch to
Example
When I start a browser for React
And I navigate to "https://todomvc.com/examples/react/dist"
And I start a browser for Vue
And I navigate to "https://todomvc.com/examples/vue/"
And I switch to React
Then the current URL should contain "react"
I close the browser for <name>
Closes a named browser session (does nothing if one of that name is not open).
I close the browser for <name>
I start a new browser <tab|window>
Starts a new browser tab or window (or starts a new browser session if one is not open).
I start a new browser <tab|window>
I switch to <tab|window> <occurrence>
Switches to a previously opened tab or window occurrence.
I switch to <tab|window> <occurrence>
Where
<tab|window>
is eithertab
orwindow
<occurrence>
is the tab or window occurrence to switch to (1st opened is occurrence 1, 2nd is 2, ..)- Note: the occurrence number of the default tab/window in a new browser session is 0
Example
When I navigate to "https://google.com"
And I start a new browser tab
And I navigate to "https://todomvc.com/examples/react/dist"
And I switch to window 1
Then the page title should contain "Google"
I close <tab|window> <occurrence>
Closes a previously opened tab or window occurrence.
I close <tab|window> <occurrence>
Where
<tab|window>
is eithertab
orwindow
<occurrence>
is the tab or window occurrence to close to (1st opened is occurrence 1, 2nd is 2, ..)- Note: you cannot close the default tab/window opened by starting a new browser session with this DSL. Use
I close the[ current] browser
instead in that case.
- Note: you cannot close the default tab/window opened by starting a new browser session with this DSL. Use
Example
When I navigate to "https://google.com"
And I start a new browser tab
And I navigate to "https://todomvc.com/examples/react/dist"
And I close tab 1
Then the page title should contain "Google"
If used in conjunction with @Try
, will switch to the parent window regardless of whether or not a tab or window was closed (since 3.12.4).
I switch to the child <tab|window>
Switches to the most recently opened child tab or window (without closing the parent window)
I switch to the child <tab|window>
I close the child <tab|window>
Closes the currently active child tab or window and passes control back to the parent window.
I close the child <tab|window>
Where
<tab|window>
is eithertab
orwindow
Example
Given the new tab button can be located by name "newbrowsertab453"
When I navigate to "https://nxtgenaiacademy.com/multiplewindows/"
And I click the new tab button
And I switch to the child tab
And I close the child tab
If used in conjunction with @Try
, will switch to the parent window regardless of whether or not a child window was closed (since 3.12.4).
I switch to child <tab|window> <occurrence>
Switches to a child tab or window occurrence (without closing the parent window).
I switch to child <tab|window> <occurrence>
Where
<tab|window>
is eithertab
orwindow
<occurrence>
is the tab or window occurrence to switch to (1st opened is occurrence 1, 2nd is 2, ..)
Example
Given the new window button can be located by name "newbrowserwindow123"
When I navigate to "https://nxtgenaiacademy.com/multiplewindows/"
And I click the new window button
And I switch to child window 1
I close child <tab|window> <occurrence>
Closes a child tab or window occurrence and passes control back to the parent window.
I close child <tab|window> <occurrence>
Where
<tab|window>
is eithertab
orwindow
<occurrence>
is the tab or window occurrence to close (1st opened is occurrence 1, 2nd is 2, ..)
Example
Given the new tab button can be located by name "newbrowsertab453"
When I navigate to "https://nxtgenaiacademy.com/multiplewindows/"
And I click the new tab button
And I switch to child tab 1
And I close child tab 1
If used in conjunction with @Try
, will switch to the parent window regardless of whether or not a child window was closed (since 3.12.4).
I switch to the <parent|root> <tab|window>
Switches to the parent window (without closing the currently active child window).
I switch to the <parent|root> <tab|window>
Where
<parent|root>
is eitherparent
(orroot
since v2.49.0)<tab|window>
is eithertab
orwindow
Example
Given the new window button can be located by name "newbrowserwindow123"
When I navigate to "https://nxtgenaiacademy.com/multiplewindows/"
And I click the new window button
And I switch to child window 1
And I switch to the parent window
I <maximize|maximise> the window
Maximizes the currently active browser window to fill the entire screen area.
I <maximize|maximise> the window
I resize the window to width <w> and height <h>
Resizes the currently active browser window to the given dimensions.
I resize the window to width <w> and height <h>
I send "<keys>"
Sends a sequence of keys to the browser (for emulating keyboard shortcuts).
I send "<keys>"
Where
<keys>
is a,
or+
(since v2.53.0) separated list of keys to send.- Keys can be single keyboard characters or any supported key constants
- Note: Keys behave differently on different platforms
Example
When I navigate to "https://google.com"
And I send "COMMAND+t"
Frame actions
I switch to the default content
Switches to either the first frame on the page, or the main document when a page contains iframes.
I switch to the default content
I switch to <frame> content
Switches the context to a frame.
I switch to <frame> content
Alert and Popup actions
I accept the <alert|confirmation> popup
Accepts and closes an alert or confirmation popup by clicking OK.
I accept the <alert|confirmation> popup
Where
<alert|confirmation>
is either:alert
for an alert box with an OK buttonconfirmation
for a confirmation box with OK and Cancel buttons
Example
Given the alert button can be located by css ".btn" at index 0
When I navigate to "https://www.seleniumeasy.com/test/javascript-alert-box-demo.html"
And I click the alert button
And I accept the alert popup
I dismiss the confirmation popup
Dismisses and closes a confirmation popup by clicking Cancel.
I dismiss the confirmation popup
I capture the <alert|confirmation> popup message
Captures the alert or confirmation popup message and binds it to the <alert|confirmation> popup message
in the global scope.
I capture the <alert|confirmation> popup message
the <alert|confirmation> popup message
in the global scope.Where
<alert|confirmation>
is either:alert
for an alert box with an OK buttonconfirmation
for a confirmation box with OK and Cancel buttons
Example
Given the alert button can be located by css ".btn" at index 0
When I navigate to "https://www.seleniumeasy.com/test/javascript-alert-box-demo.html"
And I click the alert button
And I capture the alert popup message
I capture the <alert|confirmation> popup message as <name>
Captures the alert or confirmation popup message and binds it to the given name in the global scope.
I capture the <alert|confirmation> popup message as <name>
Where
<alert|confirmation>
is either:alert
for an alert box with an OK buttonconfirmation
for a confirmation box with OK and Cancel buttons
Example
Given the confirmation button can be located by css ".btn" at index 1
When I navigate to "https://www.seleniumeasy.com/test/javascript-alert-box-demo.html"
And I click the confirmation button
And I capture the confirmation popup message as the alert message
Scroll actions
I scroll to the <top|bottom> of the page
Scrolls to the top or bottom of the current page.
I scroll to the <top|bottom> of the page
I scroll to the <top|bottom> of <element>
Scrolls to the top or bottom of the given element.
I scroll to the <top|bottom> of <element>
Where
<top|bottom>
is one of:top
to scroll to the top of the elementbottom
to scroll to the bottom of the element
<element>
the name of the element to scroll to
Example
Given the surname field can be located by id "surname"
When I navigate to "https://automationintesting.com/selenium/testpage"
And I scroll to the top of the surname field
Drag Drop actions
I drag and drop <sourceElement> to <targetElement>
Drags and drops a source element onto a target element.
I drag and drop <sourceElement> to <targetElement>
Where
<sourceElement>
is the name of the source element to drag<targetElement>
is the name of the target element to drop the<sourceElement>
into
Example
Given the box can be located by xpath "//*[@id='credit2']/a"
And the cell can be located by xpath "//*[@id='bank']/li"
When I navigate to "http://demo.guru99.com/test/drag_drop.html"
And I capture the box as the box text
And I drag and drop the box to the cell
Then the cell should contain "${the box text}"
JS actions
<element> can be <actioned> by <javascript|js> "<script>"
Registers a javascript action on an element. When the action is performed, then the javascript will execute in place of the default behaviour.
<element> can be <actioned> by <javascript|js> "<script>"
Where
<element>
is the name of the element to register the action on<actioned>
is one of:clicked
to perform the action when the element is clickedright clicked
to perform the action when the element is right clicked, since v2.8.0double clicked
to perform the action when the element is double clicked, since v2.12.0submitted
to perform the action when the form element is submittedchecked
(orticked
since v2.4.0) to perform the action when the checkbox element is tickedunchecked
(orunticked
since v2.4.0) to perform the action when the checkbox element is untickedselected
to perform the action when a dropdown option is selected in the elementdeselected
to perform the action when a mutli-select dropdown option is deselected in the element, since v2.13.0typed
to perform the action when text is typed into the elemententered
to perform the action when text is entered into the elementtabbed
to perform the action when the tab key is pressed in the element, since v2.17.1cleared
to perform the action when the text is cleared in the elementmoved to
to perform the action when the focus is moved to the element
<javascript|js>
isjavascript
(orjs
, since v2.46.0)<script>
is the javascript expression or function that will perform the action (can be in DocString position)- The reference to the element will be provided to the javascript through an implicit object named
element
. - For a one liner expression, no function, arrow declaration or
return
prefix is required For a function, use either:
- Arrow syntax (preferred):
() => { body }
(Since v3.56.0) - Or anonymous function syntax (legacy):
(function(){ body })()
- Arrow syntax (preferred):
- The reference to the element will be provided to the javascript through an implicit object named
Example
Given the submit button can be located by css ".submit"
And the submit button can be clicked by js "element.click()"
When I click the submit button
Download actions
I download "<url>" to "<filepath>"
Downloads a resource from a URL to a file.
I download "<url>" to "<filepath>"
I download "<url>" to <filepathRef>
Downloads a resource from a URL to a referenced file.
I download "<url>" to <filepathRef>
Where
<url>
is URL to the resource to download<filepathRef>
is the name of the binding containing the path of the file to download the resource to
Example
Given my out file is "output/download/gwen-reportportal-userguide.pdf"
When I download "https://gweninterpreter.org/assets/docs/gwen-reportportal-userguide.pdf" to my out file
I download the current URL to "<filepath>"
Downloads the resource at the current URL to a file.
I download the current URL to "<filepath>"
I download the current URL to <filepathRef>
Downloads a resource at the current URL to a referenced file.
I download the current URL to <filepathRef>
Where
<filepathRef>
is the name of the binding containing the path of the file to download the resource to
Example
Given my out file is "output/download/gwen-reportportal-userguide.pdf"
When I navigate to "https://gweninterpreter.org/assets/docs/gwen-reportportal-userguide.pdf"
And I download the current URL to my out file
File actions
I attach "<filepath>" as "<name>"
or since v3.0.0
I attach "<filepath>" as <name>
Attaches a local file to the Gwen report and assigns it a name. The link to the attachment in the report will have the given name.
I attach "<filepath>" as "<name>"
I attach "<filepath>" as <name>
I <write|append> "<text>" to "<filepath>" file
Writes or appends text to a file.
I <write|append> "<text>" to "<filepath>" file
Where
<write|append>
is one of:<write>
to overwrite entire content of file with the provided text<append>
to append the provided text to existing content in file
<text>
the text to write or append to the file<filepath>
the path to the local file to write or append the text to
Example
When I write "Gwen automation" to "path/to/file.txt" file
I <write|append> <textRef> to "<filepath>" file
Writes or appends a text reference value to a file.
I <write|append> <textRef> to "<filepath>" file
Where
<write|append>
is one of:<write>
to overwrite entire content of file with the provided text<append>
to append the provided text to existing content in file
<textRef>
is the name of the binding containing the text to write or append to the file- Can be the name of any binding that contains or resolves to a text value, including a web element in which case the text in the element will be dynamically retrieved and used.
<filepath>
the path to the local file to write or append the text to
Example
Given my content is
"""
Gwen automation and robotics
for Gherkin
"""
When I write my content to "path/to/file.txt" file
I <write|append> new line to "<filepath>" file
Writes or appends a new line to a file.
I <write|append> new line to "<filepath>" file
I <write|append> "<text>" to <filepathRef> file
Writes or appends text to a referenced file.
I <write|append> "<text>" to <filepathRef> file
Where
<write|append>
is one of:<write>
to overwrite entire content of file with the provided text<append>
to append the provided text to existing content in file
<text>
the text to write or append to the file<filepathRef>
is the name of the binding containing the path of the file to write or append the provided text to
Example
Given my file is "path/to/file.txt"
When I append "Gwen automation" to my file
I <write|append> <textRef> to <filepathRef> file
Writes or appends a text reference value to a referenced file.
I <write|append> <textRef> to <filepathRef> file
Where
<write|append>
is one of:<write>
to overwrite entire content of file with the provided text<append>
to append the provided text to existing content in file
<textRef>
is the name of the binding containing the text to write or append to the file- Can be the name of any binding that contains or resolves to a text value, including a web element in which case the text in the element will be dynamically retrieved and used.
<filepathRef>
is the name of the binding containing the path of the file to write or append the provided text to
Example
Given my file is "path/to/file.txt"
And my content is
"""
Gwen automation and robotics
for Gherkin
"""
When I write my content to my file
I <write|append> new line to <filepathRef> file
Writes or appends a new line to a referenced file.
I <write|append> new line to <filepathRef> file
Where
<write|append>
is one of:<write>
to overwrite entire content of file with a new line<append>
to append a new line to existing content in file
<filepathRef>
is the name of the binding containing the path of the file to write or append the new line to
Example
Given my file is "path/to/file.txt"
When I append new line to my file
Sleeps and waits
I wait <duration> second[s] when <element> is <actioned>
Triggers a sleep for a given number of seconds whenever a specific action is performed on an element.
I wait <duration> second[s] when <element> is <actioned>
Where
<duration>
is the number of seconds to sleep<element>
the name of the web element<actioned>
is one of:clicked
to sleep when the element is clickedright clicked
to sleep when the element is right clicked, since v2.8.0double clicked
to sleep when the element is double clicked, since v2.12.0submitted
to sleep when the form element is submittedchecked
(orticked
since v2.4.0) to sleep when the checkbox element is tickedunchecked
(orunticked
since v2.4.0) to sleep when the checkbox element is untickedselected
to sleep when a dropdown option is selected in the elementdeselected
to sleep when a mutli-select dropdown option is deselected in the element, since v2.13.0typed
to sleep when text is typed into the elemententered
to sleep when text is entered into the elementcleared
to sleep when the text is cleared in the elementmoved to
to sleep when the focus is moved to the element
- Include
s
aftersecond
when specifying a<duration>
that is not 1, omit otherwise
Example
Given the submit button can be located by id "submit"
And I wait 3 seconds when the submit button is clicked
When I navigate to "${token.website}"
And I click the submit button
I wait until <condition> when <element> is <actioned>
Triggers a wait for a condition whenever a specific action is performed on an element.
I wait until <condition> when <element> is <actioned>
Where
<condition>
is either:Since v3.54.0
- the name of any binding that will return
true
when the condition is satisfied orfalse
when it is not
- the name of any binding that will return
Or in prior versions
- the name of a binding containing a javascript function or expression that will return
true
when the condition is satisfied orfalse
when it is not - the name of a binding containing a
true
orfalse
value literal, since v3.50.0
- the name of a binding containing a javascript function or expression that will return
<element>
the name of the web element<actioned>
is one of:clicked
to wait when the element is clickedright clicked
to wait when the element is right clicked, since v2.8.0double clicked
to wait when the element is double clicked, since v2.12.0submitted
to wait when the form element is submittedchecked
(orticked
since v2.4.0) to wait when the checkbox element is tickedunchecked
(orunticked
since v2.4.0) to wait when the checkbox element is untickedselected
to wait when a dropdown option is selected in the elementdeselected
to wait when a mutli-select dropdown option is deselected in the element, since v2.13.0typed
to wait when text is typed into the elemententered
to wait when text is entered into the elementcleared
to wait when the text is cleared in the elementmoved to
to wait when the focus is moved to the element
- Include
s
aftersecond
when specifying a<duration>
that is not 1, omit otherwise
Example
Given the submit button can be located by name "submit"
And the token field can be located by class "token"
And the submit button is displayed is defined by javascript "!!document.getElementById('submit')"
And I wait until the submit button is displayed when the token field is entered
When I navigate to "${token.website}"
And I enter "my token" in the token field
And I click the submit button
I wait for <element>
Waits for an element to appear on a page for a default number of seconds before timing out.
I wait for <element>
I wait for <element> for <duration> second[s]
Waits for an element to appear on a page for a given number of seconds before timing out.
I wait for <element> for <duration> second[s]
Where
<element>
is the name of the element to wait for<duration>
is the number of seconds to wait before timing out- Include trailing
s
when specifying a<duration>
that is not 1, omit otherwise
Example
# Wait for a dynamically rendered input field
Given the dynamic input field can be located by tag "input"
When I wait for the dynamic input field for 3 seconds
Then the dynamic input field should be displayed
I wait for <element> text
Waits for the text of an element to appear on a page for a default number of seconds before timing out.
I wait for <element> text
I wait for <element> text for <duration> second[s]
Waits for the text of an element to appear on a page for a given number of seconds before timing out.
I wait for <element> text for <duration> second[s]
Where
<element>
is the name of the element to wait for the text to appear<duration>
is the number of seconds to wait before timing out- Include trailing
s
when specifying a<duration>
that is not 1, omit otherwise
Example
# Wait for a dynamically displayed token
Given the one time token can be located by javascript "$('.token').get(0)"
When I wait for the one time token text for 3 seconds
And I capture the one time token
I wait until <element> is[ not] <state>
Waits for an element to transition to a given state.
I wait until <element> is[ not] <state>
Where
<element>
is the name of the element to wait fornot
negates the state if included<state>
is one of:displayed
to wait until the element is displayedhidden
to wait until the element is not displayedchecked
(orticked
since v2.4.0) to wait until a checkbox is tickedunchecked
(orunticked
since v2.4.0) to wait until a checkbox is not tickedenabled
to wait until the element is enableddisabled
to wait until the element is disabled
Example
Given my todo list can be located by css ".todo-list"
And the todo field can be located by class "new-todo"
When I navigate to "https://todomvc.com/examples/react/dist"
And I enter "Get the milk" in the todo field
And I wait until my todo list is displayed
I wait until "<javascript>"
Repeatedly executes the given javascript expression or function until true is returned using no delay interval and default timeout period. The default timeout period is equal to the configured gwen.web.wait.seconds
setting value.
I wait until "<javascript>"
gwen.web.wait.seconds
setting value.Where
<javascript>
is the javascript expression or function that will return a boolean value (can be in DocString position)- For a one liner expression, no function, arrow declaration or
return
prefix is required For a function, use either:
- Arrow syntax (preferred):
() => { body }
(Since v3.56.0) - Or anonymous function syntax (legacy):
(function(){ body })()
- Arrow syntax (preferred):
- For a one liner expression, no function, arrow declaration or
Example
Given the heading can be located by tag "h1"
When I navigate to "https://challengers.flood.io/start"
And I wait until "!!$('h1')"
Then the heading should be "Welcome to our Script Challenge"
I wait until "<javascript>" using <delay> <delayUnit> delay
Repeatedly executes the given javascript expression or function until true is returned using the given delay interval and default timeout period. The default timeout period is equal to the configured gwen.web.wait.seconds
setting value.
I wait until "<javascript>" using <delay> <delayUnit> delay
gwen.web.wait.seconds
setting value.Where
<javascript>
is the javascript expression or function that will return a boolean value (can be in DocString position)- For a one liner expression, no function, arrow declaration or
return
prefix is required For a function, use either:
- Arrow syntax (preferred):
() => { body }
(Since v3.56.0) - Or anonymous function syntax (legacy):
(function(){ body })()
- Arrow syntax (preferred):
- For a one liner expression, no function, arrow declaration or
<delay>
is the delay period between repetitive checks<delayUnit>
is one of:second
millisecond
Example
Given the heading can be located by tag "h1"
When I navigate to "https://challengers.flood.io/start"
And I wait until "!!$('h1')" using 200 millisecond delay
Then the heading should be "Welcome to our Script Challenge"
I wait until "<javascript>" using <timeout> <timeoutUnit> timeout
Repeatedly executes the given javascript expression or function until true is returned using no delay interval and the given timeout period.
I wait until "<javascript>" using <timeout> <timeoutUnit> timeout
Where
<javascript>
is the javascript expression or function that will return a boolean value (can be in DocString position)- For a one liner expression, no function, arrow declaration or
return
prefix is required For a function, use either:
- Arrow syntax (preferred):
() => { body }
(Since v3.56.0) - Or anonymous function syntax (legacy):
(function(){ body })()
- Arrow syntax (preferred):
- For a one liner expression, no function, arrow declaration or
<timeout>
is the timeout period<timeoutUnit>
is one of:minute
second
millisecond
Example
Given the heading can be located by tag "h1"
When I navigate to "https://challengers.flood.io/start"
And I wait until "!!$('h1')" using 3 second timeout
Then the heading should be "Welcome to our Script Challenge"
I wait until "<javascript>" using <delay> <delayUnit> delay and <timeout> <timeoutUnit> timeout
Repeatedly executes the given javascript expression or function until true is returned using the given delay interval and timeout period.
I wait until "<javascript>" using <delay> <delayUnit> delay and <timeout> <timeoutUnit> timeout
Where
<javascript>
is the javascript expression or function that will return a boolean value (can be in DocString position)- For a one liner expression, no function, arrow declaration or
return
prefix is required For a function, use either:
- Arrow syntax (preferred):
() => { body }
(Since v3.56.0) - Or anonymous function syntax (legacy):
(function(){ body })()
- Arrow syntax (preferred):
- For a one liner expression, no function, arrow declaration or
<delay>
is the delay period between repetitive checks<delayUnit>
is one of:second
millisecond
<timeout>
is the timeout period<timeoutUnit>
is one of:minute
second
millisecond
Example
Given the heading can be located by tag "h1"
When I navigate to "https://challengers.flood.io/start"
And I wait until "!!$('h1')" using 250 millisecond delay and 3 second timeout
Then the heading should be "Welcome to our Script Challenge"
I wait until <condition>
Waits until a condition is satisfied.
I wait until <condition>
Where
<condition>
is either:Since v3.54.0
- the name of any binding that will return
true
when the condition is satisfied orfalse
when it is not
- the name of any binding that will return
Or in prior versions
- the name of a binding containing a javascript function or expression that will return
true
when the condition is satisfied orfalse
when it is not - the name of a binding containing a
true
orfalse
value literal, since v3.50.0
- the name of a binding containing a javascript function or expression that will return
Example
Given the heading can be located by tag "h1"
And the heading is displayed is defined by javascript "!!$('h1')"
When I navigate to "https://challengers.flood.io/start"
And I wait until the heading is displayed
Then the heading should be "Welcome to our Script Challenge"
I wait until <condition> using <delay> <delayUnit> delay
Repeatedly waits until the given condition is satisfied using the given delay interval and default timeout period. The default timeout period is equal to the configured gwen.web.wait.seconds
setting value.
I wait until <condition> using <delay> <delayUnit> delay
gwen.web.wait.seconds
setting value.Where
<condition>
is either:Since v3.54.0
- the name of any binding that will return
true
when the condition is satisfied orfalse
when it is not
- the name of any binding that will return
Or in prior versions
- the name of a binding containing a javascript function or expression that will return
true
when the condition is satisfied orfalse
when it is not - the name of a binding containing a
true
orfalse
value literal, since v3.50.0
- the name of a binding containing a javascript function or expression that will return
<delay>
is the delay period between repetitive checks<delayUnit>
is one of:second
millisecond
Example
Given the heading can be located by tag "h1"
And the heading is displayed is defined by javascript "!!$('h1')"
When I navigate to "https://challengers.flood.io/start"
And I wait until the heading is displayed using 200 millisecond delay
Then the heading should be "Welcome to our Script Challenge"
I wait until <condition> using <timeout> <timeoutUnit> timeout
Repeatedly waits until the given condition is satisfied using no delay interval and the given timeout period.
I wait until <condition> using <timeout> <timeoutUnit> timeout
Where
<condition>
is either:Since v3.54.0
- the name of any binding that will return
true
when the condition is satisfied orfalse
when it is not
- the name of any binding that will return
Or in prior versions
- the name of a binding containing a javascript function or expression that will return
true
when the condition is satisfied orfalse
when it is not - the name of a binding containing a
true
orfalse
value literal, since v3.50.0
- the name of a binding containing a javascript function or expression that will return
<timeout>
is the timeout period<timeoutUnit>
is one of:minute
second
millisecond
Example
Given the heading can be located by tag "h1"
And the heading is displayed is defined by javascript "!!$('h1')"
When I navigate to "https://challengers.flood.io/start"
And I wait until the heading is displayed using 3 second timeout
Then the heading should be "Welcome to our Script Challenge"
I wait until <condition> using <delay> <delayUnit> delay and <timeout> <timeoutUnit> timeout
Repeatedly waits until the given condition is satisfied using the given delay interval and timeout period.
I wait until <condition> using <delay> <delayUnit> delay and <timeout> <timeoutUnit> timeout
Where
<condition>
is either:Since v3.54.0
- the name of any binding that will return
true
when the condition is satisfied orfalse
when it is not
- the name of any binding that will return
Or in prior versions
- the name of a binding containing a javascript function or expression that will return
true
when the condition is satisfied orfalse
when it is not - the name of a binding containing a
true
orfalse
value literal, since v3.50.0
- the name of a binding containing a javascript function or expression that will return
<delay>
is the delay period between repetitive checks<delayUnit>
is one of:second
millisecond
<timeout>
is the timeout period<timeoutUnit>
is one of:minute
second
millisecond
Example
Given the heading can be located by tag "h1"
And the heading is displayed is defined by javascript "!!$('h1')"
When I navigate to "https://challengers.flood.io/start"
And I wait until the heading is displayed using 250 millisecond delay and 3 second timeout
Then the heading should be "Welcome to our Script Challenge"
I wait <duration> second[s]
Sleeps for the given number of seconds.
I wait <duration> second[s]
JS execution
I execute <javascript|js> "<script>"
Executes a JavaScript expression or function.
I execute <javascript|js> "<script>"
Where
<javascript|js>
isjavascript
(orjs
since v2.46.0)<script>
is the javascript expression or function to execute (can be in DocString position)- For a one liner expression, no function, arrow declaration or
return
prefix is required For a function, use either:
- Arrow syntax (preferred):
() => { body }
(Since v3.56.0) - Or anonymous function syntax (legacy):
(function(){ body })()
- Arrow syntax (preferred):
- For a one liner expression, no function, arrow declaration or
Example
When I execute js "alert('Hello Gwen World')"
System process execution
I execute system process "<expression>"
Executes a local system process or script.
I execute system process "<expression>"
I execute system process "<expression>" delimited by "<delimiters>"
Executes a delimited local system process or script.
I execute system process "<expression>" delimited by "<delimiters>"
Where
<expression>
the delimited system process to execute- Delmiters are required for special cases such as when unbalanced quoted strings are passed as arguments (see example).
<delmiters>
is a regex pattern defining the delimiter(s) used in<expression>
Example
When I execute system process "echo,"quoted text " and orphan quote"" delimited by ","
I execute a unix system process "<expression>"
or since v3.14.2
I execute unix system process "<expression>"
Executes a local unix system process or shell script.
I execute a unix system process "<expression>"
I execute unix system process "<expression>"
Dropped since v3.19.0
I execute a unix system process "<expression>" delimited by "<delimiters>"
or since v3.14.2
I execute unix system process "<expression>" delimited by "<delimiters>"
Executes a delimited local unix system process or script.
I execute a unix system process "<expression>" delimited by "<delimiters>"
I execute unix system process "<expression>" delimited by "<delimiters>"
Where
<expression>
the delimited system process to execute- Delmiters are required for special cases such as when unbalanced quoted strings are passed as arguments (see example).
<delmiters>
is a regex pattern defining the delimiter(s) used in<expression>
Example
When I execute a unix system process "echo,"quoted text " and orphan quote"" delimited by ","
SQL execution
<name> is defined in the <dbName> database by sql "<selectStmt>"
Associates the result of an SQL database query to the given name in the global scope. The value is resolved every time the name is referenced.
<name> is defined in the <dbName> database by sql "<selectStmt>"
Where
<name>
is the name to bind the SQL query result to<dbName>
the name of the configured database to execute the query on<selectStmt>
is the SQL query that will return the value to assign (can be in DocString position)
Configuration
- The
GWEN_CLASSPATH
environment variable must be set to include a path to the JDBC driver JAR - A
gwen.db.<dbName>.driver
setting must be set to the name of the JDBC driver implementation class - A
gwen.db.<dbName>.url
setting must be set to the JDBC URL of the database
Optionally accepts the @Eager
, @Lazy
or @Masked
annotations.
@Eager
immediately evaluates the<expression>
and binds the result to<name>
@Lazy
evaluates the<expression>
and binds the result to<name>
when it is first referenced- In the absence of either of the above annotations,
<expression>
is evaluated every time<name>
is referenced @Masked
masks the captured value to prevent it from being logged as clear text
Example
Given the email address is defined in the feedback database by sql
"""
select email from comments
"""
Then the email address should be "some.person@example.com"
- Linux
- Windows
Set GWEN_CLASSPATH variable in the environment to include the JDBC driver JAR
export GWEN_CLASSPATH=/path-to-driver/mysql-connector-java-5.1.40-bin.jar
Set GWEN_CLASSPATH variable in the environment to include the JDBC driver JAR
set GWEN_CLASSPATH c:/path-to-driver/mysql-connector-java-5.1.40-bin.jar
Configure the database in your settings. In this example, <dbName>
=feedback
gwen.db.feedback.driver = com.mysql.jdbc.Driver
gwen.db.feedback.url = jdbc:mysql://localhost/feedback?user=myUser&password=myPassword&
I update the <dbName> database by sql "<updateStmt>"
Executes an SQL udpate statement on a configured database.
I update the <dbName> database by sql "<updateStmt>"
Where
<dbName>
the name of the configured database to run the update statement on<updateStmt>
is the SQL update statement to execute (can be in DocString position)
Returns
<dbName> rows affected
= the number of rows affected by the update
Configuration
- The
GWEN_CLASSPATH
environment variable must be set to include a path to the JDBC driver JAR - A
gwen.db.<dbName>.driver
setting must be set to the name of the JDBC driver implementation class - A
gwen.db.<dbName>.url
setting must be set to the JDBC URL of the database
Example
When I update the feedback database by sql
"""
update comments set email='new@example.com' where email='old@example.com'
"""
Then feedback rows affected should be "1"
- Linux
- Windows
Set GWEN_CLASSPATH variable in the environment to include the JDBC driver JAR
export GWEN_CLASSPATH=/path-to-driver/mysql-connector-java-5.1.40-bin.jar
Set GWEN_CLASSPATH variable in the environment to include the JDBC driver JAR
set GWEN_CLASSPATH c:/path-to-driver/mysql-connector-java-5.1.40-bin.jar
Configure the database in your settings. In this example, <dbName>
=feedback
gwen.db.feedback.driver = com.mysql.jdbc.Driver
gwen.db.feedback.url = jdbc:mysql://localhost/feedback?user=myUser&password=myPassword&
Assertions
Text asserts
<textRef> should[ not] be blank
Checks whether or not the text reference matches a blank string. Reports an assertion error if the match fails.
<textRef> should[ not] be blank
Or with custom assertion error message (as of v3.9.0):
<textRef> should[ not] be blank @Message("my custom assert fail message")
Or with no timeout (as of v3.41.0):
<textRef> should[ not] be blank with no <wait|timeout>
Or with custom timeout (as of v3.41.0):
<textRef> should[ not] be blank with <timeoutSecs> second <wait|timeout>
Where
<textRef>
is the name of the binding containing the text to check- Can be the name of any binding that contains or resolves to a text value, including a web element in which case the text in the element will be dynamically retrieved and used.
not
negates the match if included<timeoutSecs>
is the timeout period in seconds<wait|timeout>
is eitherwait
ortimeout
Example
Given the todo field can be located by class "new-todo"
And my todo list can be located by css ".todo-list"
When I navigate to "https://todomvc.com/examples/react/dist"
And I enter "Get the milk" in the todo field
And I capture my todo list as current items
Then current items should not be blank
Trimming (since v3.62.0)
- The
@Trim
annotation can be used on step to trim strings when comparing
<textRef> should[ not] <match> "<expression>"
Checks whether or not the text reference matches a given expression. Reports an assertion error if the match fails.
<textRef> should[ not] <match> "<expression>"
Or with custom assertion error message (as of v3.9.0):
<textRef> should[ not] <match> "<expression>" @Message("my custom assert fail message")
Or with no timeout (as of v3.41.0):
<textRef> should[ not] <match> "<expression>" with no <wait|timeout>
Or with custom timeout (as of v3.41.0):
<textRef> should[ not] <match> "<expression>" with <timeoutSecs> second <wait|timeout>
Where
<textRef>
is the name of the binding containing the text to check- Can be the name of any binding that contains or resolves to a text value, including a web element in which case the text in the element will be dynamically retrieved and used.
not
negates the match if included<match>
is the type of match to perform, one of:be
for exact matchcontain
for partial matchstart with
for partial leading matchend with
for partial trailing matchmatch regex
for regex matchmatch xpath
for XML matchmatch json path
for JSON match, since v1.4.0match template
for template match, since v2.16.0match template file
for template file match, since v2.16.0
<expression>
is the expression to match (can be in DocString position)<timeoutSecs>
is the timeout period in seconds<wait|timeout>
is eitherwait
ortimeout
Example
Given the todo field can be located by class "new-todo"
And my todo list can be located by css ".todo-list"
When I navigate to "https://todomvc.com/examples/react/dist"
And I enter "Get the milk" in the todo field
And I capture my todo list as current items
Then current items should contain "Get the milk"
Trimming and ignoring case (since v3.62.0)
- The
@Trim
annotation can be used on step to trim strings when comparing - The
@IgnoreCase
annotation can be used on step to ignore case when comparing
<textRef> should[ not] <match> <expressionRef>
Checks whether or not the value of a variable or setting matches a referenced expression. Reports an assertion error if the match fails.
<textRef> should[ not] <match> <expressionRef>
Or with custom assertion error message (as of v3.9.0):
<textRef> should[ not] <match> <expressionRef> @Message("my custom assert fail message")
Or with no timeout (as of v3.41.0):
<textRef> should[ not] <match> <expressionRef> with no <wait|timeout>
Or with custom timeout (as of v3.41.0):
<textRef> should[ not] <match> <expressionRef> with <timeoutSecs> second <wait|timeout>
Where
<variable>
is the name of the variable or setting to checknot
negates the match if included<match>
is the type of match to perform, one of:be
for exact matchcontain
for partial matchstart with
for partial leading matchend with
for partial trailing matchmatch regex
for regex matchmatch xpath
for XML matchmatch json path
for JSON match, since v1.4.0match template
for template match, since v2.16.0match template file
for template file match, since v2.16.0
<expressionRef>
is the name of the binding containing the expression to match- Can be the name of any binding that contains or resolves to an expression value, including a web element in which case the text in the element will be dynamically retrieved and used.
<timeoutSecs>
is the timeout period in seconds<wait|timeout>
is eitherwait
ortimeout
Example
Given the todo field can be located by class "new-todo"
And my todo list can be located by css ".todo-list"
And my item is "Feed the cat"
When I navigate to "https://todomvc.com/examples/react/dist"
And I enter my item in the todo field
And I capture my todo list as current items
Then current items should contain my item
Trimming and ignoring case (since v3.62.0)
- The
@Trim
annotation can be used on step to trim strings when comparing - The
@IgnoreCase
annotation can be used on step to ignore case when comparing
<textRef> should[ not] <match> <percentage>% similar to "<text>"
Compares a text reference with a text value for similarity using the DSC (Dice Similarity Coefficient) algorithm.
<textRef> should[ not] <match> <percentage>% similar to "<text>"
Or with custom assertion error message (as of v3.9.0):
<textRef> should[ not] <match> <percentage>% similar to "<text>" @Message("my custom assert fail message")
Or with no timeout (as of v3.41.0):
<textRef> should[ not] <match> <percentage>% similar to "<text>" with no <wait|timeout>
Or with custom timeout (as of v3.41.0):
<textRef> should[ not] <match> <percentage>% similar to "<text>" with <timeoutSecs> second <wait|timeout>
Where
<textRef>
is the name of the binding containing a text reference- Can be the name of any binding that contains or resolves to a text value, including a web element in which case the text in the element will be dynamically retrieved and used.
not
negates the match if includedmatch
is one of:be
for exact matchbe less than
for less than matchbe at most
for less than or equal to matchbe more than
for greater than matchbe at least
for greater than or equal to match
<text>
is the text to compare<textRef>
against<timeoutSecs>
is the timeout period in seconds<wait|timeout>
is eitherwait
ortimeout
The calculated similarity score is implicity bound to the similarity score
attribute in the global scope.
Examples
Given the phrase is "Hello world!"
Then the phrase should be more than 90% similar to "Hello world"
And @IgnoreCase the phrase should be at least 90% similar to "hello world"
And the phrase should be 94.12% similar to "Hello world"
And @IgnoreCase the phrase should be 94.12% similar to "hello world"
And the phrase should be 82.35% similar to "hello world"
And the phrase should not be less than 90% similar to "Hello world"
Trimming and ignoring case (since v3.62.0)
- The
@Trim
annotation can be used on step to trim strings when comparing - The
@IgnoreCase
annotation can be used on step to ignore case when comparing
<textRef1> should[ not] <match> <percentage>% similar to <textRef2>
Compares a text reference with another for similarity using the DSC (Dice Similarity Coefficient) algorithm.
<textRef1> should[ not] <match> <percentage>% similar to <textRef2>
Or with custom assertion error message (as of v3.9.0):
<textRef1> should[ not] <match> <percentage>% similar to <textRef2> @Message("my custom assert fail message")
Or with no timeout (as of v3.41.0):
<textRef1> should[ not] <match> <percentage>% similar to <textRef2> with no <wait|timeout>
Or with custom timeout (as of v3.41.0):
<textRef1> should[ not] <match> <percentage>% similar to <textRef2> with <timeoutSecs> second <wait|timeout>
Where
<textRef1>
is the name of the binding containing the first text reference- Can be the name of any binding that contains or resolves to a text value, including a web element in which case the text in the element will be dynamically retrieved and used.
not
negates the match if includedmatch
is one of:be
for exact matchbe less than
for less than matchbe at most
for less than or equal to matchbe more than
for greater than matchbe at least
for greater than or equal to match
<percentage>
is a percentage number between 0 and 100 (internally rounded to 2 decimal places)<textRef2>
is the name of the binding containing the second text reference to compare<textRef1>
against- Can be the name of any binding that contains or resolves to a text value, including a web element in which case the text in the element will be dynamically retrieved and used.
<timeoutSecs>
is the timeout period in seconds<wait|timeout>
is eitherwait
ortimeout
The calculated similarity score is implicity bound to the similarity score
attribute in the global scope.
Examples
Given phrase 1 is "Hello world!"
And phrase 2 is "Hello world"
And phrase 3 is "hello world"
Then phrase 1 should be more than 90% similar to phrase 2
And @IgnoreCase phrase 1 should be at least 90% similar to phrase 2
And phrase 1 should be 94.12% similar to phrase 2
And @IgnoreCase phrase 1 should be 94.12% similar to phrase 3
And phrase 1 should be 82.35% similar to phrase 3
And phrase 1 should not be less than 90% similar to phrase 2
Trimming and ignoring case (since v3.62.0)
- The
@Trim
annotation can be used on step to trim strings when comparing - The
@IgnoreCase
annotation can be used on step to ignore case when comparing
XML asserts
<xmlRef> at xpath "<path>" should[ not] be blank
Extracts text from the referenced XML value using the given XPath and checks whether or not it matches a blank string. Reports an assertion error if the match fails.
<xmlRef> at xpath "<path>" should[ not] be blank
Or with custom assertion error message (as of v3.9.0):
<xmlRef> at xpath "<path>" should[ not] be blank @Message("my custom assert fail message")
Or with no timeout (as of v3.41.0):
<xmlRef> at xpath "<path>" should[ not] be blank with no <wait|timeout>
Or with custom timeout (as of v3.41.0):
<xmlRef> at xpath "<path>" should[ not] be blank with <timeoutSecs> second <wait|timeout>
Where
<xmlRef>
is the name of the binding containing the XML source text- Can be the name of any binding that contains or resolves to an XML text value, including a web element in which case the text in the element will be dynamically retrieved and used.
path
is the XPath selector expressionnot
negates the match if included<timeoutSecs>
is the timeout period in seconds<wait|timeout>
is eitherwait
ortimeout
Example
Given the xml is "<result><status>passed</status></result>"
Then the xml at xpath "//result/status" should not be blank
Trimming (since v3.62.0)
- The
@Trim
annotation can be used on step to trim strings when comparing
<xmlRef> at xpath "<path>" should[ not] <match> "<expression>"
Extracts text from the referenced XML value using the given XPath and checks that it matches a given expression. Reports an assertion error if the match fails.
<xmlRef> at xpath "<path>" should[ not] <match> "<expression>"
Or with custom assertion error message (as of v3.9.0):
<xmlRef> at xpath "<path>" should[ not] <match> "<expression>" @Message("my custom assert fail message")
Or with no timeout (as of v3.41.0):
<xmlRef> at xpath "<path>" should[ not] <match> "<expression>" with no <wait|timeout>
Or with custom timeout (as of v3.41.0):
<xmlRef> at xpath "<path>" should[ not] <match> "<expression>" with <timeoutSecs> second <wait|timeout>
Where
<xmlRef>
is the name of the binding containing the XML source text- Can be the name of any binding that contains or resolves to an XML text value, including a web element in which case the text in the element will be dynamically retrieved and used.
path
is the XPath selector expressionnot
negates the match if included<match>
is the type of match to perform, one of:be
for exact matchcontain
for partial matchstart with
for partial leading matchend with
for partial trailing matchmatch regex
for regex matchmatch xpath
for XML matchmatch json path
for JSON match, since v1.4.0match template
for template match, since v2.16.0match template file
for template file match, since v2.16.0
<expression>
is the expression to match<timeoutSecs>
is the timeout period in seconds<wait|timeout>
is eitherwait
ortimeout
Example
Given the xml is "<result><status>passed</status></result>"
Then the xml at xpath "//result/status" should be "passed"
Trimming and ignoring case (since v3.62.0)
- The
@Trim
annotation can be used on step to trim strings when comparing - The
@IgnoreCase
annotation can be used on step to ignore case when comparing
JSON asserts
<jsonRef> at json path "<path>" should[ not] be blank
Extracts text from the referenced JSON value using the given JSON path and checks whether or not it matches a blank string. Reports an assertion error if the match fails.
<jsonRef> at json path "<path>" should[ not] be blank
Or with custom assertion error message (as of v3.9.0):
<jsonRef> at json path "<path>" should[ not] be blank @Message("my custom assert fail message")
Or with no timeout (as of v3.41.0):
<jsonRef> at json path "<path>" should[ not] be blank with no <wait|timeout>
Or with custom timeout (as of v3.41.0):
<jsonRef> at json path "<path>" should[ not] be blank with <timeoutSecs> second <wait|timeout>
Where
<jsonRef>
is the name of the binding containing the JSON source text- Can be the name of any binding that contains or resolves to a JSON text value, including a web element in which case the text in the element will be dynamically retrieved and used.
path
is the JSON path selector expressionnot
negates the match if included<timeoutSecs>
is the timeout period in seconds<wait|timeout>
is eitherwait
ortimeout
Example
Given the json is "{ "status": "passed" }"
Then the json at json path "$.status" should not be blank
Trimming (since v3.62.0)
- The
@Trim
annotation can be used on step to trim strings when comparing
<jsonRef> at json path "<path>" should[ not] <match> "<expression>"
Extracts text from the referenced JSON value using the given JSON path and checks that it matches a given expression. Reports an assertion error if the match fails.
<jsonRef> at json path "<path>" should[ not] <match> "<expression>"
Or with custom assertion error message (as of v3.9.0):
<jsonRef> at json path "<path>" should[ not] <match> "<expression>" @Message("my custom assert fail message")
Or with no timeout (as of v3.41.0):
<jsonRef> at json path "<path>" should[ not] <match> "<expression>" with no <wait|timeout>
Or with custom timeout (as of v3.41.0):
<jsonRef> at json path "<path>" should[ not] <match> "<expression>" with <timeoutSecs> second <wait|timeout>
Where
<jsonRef>
is the name of the binding containing the JSON source text- Can be the name of any binding that contains or resolves to a JSON text value, including a web element in which case the text in the element will be dynamically retrieved and used.
path
is the JSON path selector expressionnot
negates the match if included<match>
is the type of match to perform, one of:be
for exact matchcontain
for partial matchstart with
for partial leading matchend with
for partial trailing matchmatch regex
for regex matchmatch xpath
for XML matchmatch json path
for JSON match, since v1.4.0match template
for template match, since v2.16.0match template file
for template file match, since v2.16.0
<expression>
is the expression to match<timeoutSecs>
is the timeout period in seconds<wait|timeout>
is eitherwait
ortimeout
Example
Given the json is "{ "status": "passed" }"
Then the json at json path "$.status" should be "passed"
Trimming and ignoring case (since v3.62.0)
- The
@Trim
annotation can be used on step to trim strings when comparing - The
@IgnoreCase
annotation can be used on step to ignore case when comparing
URL asserts
the current URL should[ not] be blank
Checks whether or not the current browser URL matches a blank string. Reports an assertion error if the match fails.
the current URL should[ not] be blank
Or with custom assertion error message (as of v3.9.0):
the current URL should[ not] be blank @Message("my custom assert fail message")
Or with no timeout (as of v3.41.0):
the current URL should[ not] be blank with no <wait|timeout>
Or with custom timeout (as of v3.41.0):
the current URL should[ not] be blank with <timeoutSecs> second <wait|timeout>
Where
not
negates the match if included<timeoutSecs>
is the timeout period in seconds<wait|timeout>
is eitherwait
ortimeout
Example
When I navigate to "https://todomvc.com/examples/react/dist"
Then the current URL should not be blank
Trimming (since v3.62.0)
- The
@Trim
annotation can be used on step to trim strings when comparing
the current URL should[ not] <match> "<expression>"
Checks whether or not the current browser URL matches a given expression. Reports an assertion error if the match fails.
the current URL should[ not] <match> "<expression>"
Or with custom assertion error message (as of v3.9.0):
the current URL should[ not] <match> "<expression>" @Message("my custom assert fail message")
Or with no timeout (as of v3.41.0):
the current URL should[ not] <match> "<expression>" with no <wait|timeout>
Or with custom timeout (as of v3.41.0):
the current URL should[ not] <match> "<expression>" with <timeoutSecs> second <wait|timeout>
Where
not
negates the match if included<match>
is the type of match to perform, one of:be
for exact matchcontain
for partial matchstart with
for partial leading matchend with
for partial trailing matchmatch regex
for regex matchmatch xpath
for XML matchmatch json path
for JSON match, since v1.4.0match template
for template match, since v2.16.0match template file
for template file match, since v2.16.0
<expression>
is the expression to match (can be in DocString position)<timeoutSecs>
is the timeout period in seconds<wait|timeout>
is eitherwait
ortimeout
Example
When I navigate to "https://todomvc.com/examples/react/dist"
Then the current URL should contain "todomvc.com"
And the current URL should not contain "other.com"
Trimming and ignoring case (since v3.62.0)
- The
@Trim
annotation can be used on step to trim strings when comparing - The
@IgnoreCase
annotation can be used on step to ignore case when comparing
the current URL should[ not] <match> <expressionRef>
Checks whether or not the current URL in the browser matches a referenced expression. Reports an assertion error if the match fails.
the current URL should[ not] <match> <expressionRef>
Or with custom assertion error message (as of v3.9.0):
the current URL should[ not] <match> <expressionRef> @Message("my custom assert fail message")
Or with no timeout (as of v3.41.0):
the current URL should[ not] <match> <expressionRef> with no <wait|timeout>
Or with custom timeout (as of v3.41.0):
the current URL should[ not] <match> <expressionRef> with <timeoutSecs> second <wait|timeout>
Where
not
negates the match if included<match>
is the type of match to perform, one of:be
for exact matchcontain
for partial matchstart with
for partial leading matchend with
for partial trailing matchmatch regex
for regex matchmatch xpath
for XML matchmatch json path
for JSON match, since v1.4.0match template
for template match, since v2.16.0match template file
for template file match, since v2.16.0
<expressionRef>
is the name of the binding containing the expression to match- Can be the name of any binding that contains or resolves to an expression value, including a web element in which case the text in the element will be dynamically retrieved and used.
<timeoutSecs>
is the timeout period in seconds<wait|timeout>
is eitherwait
ortimeout
Example
Given my domain is "todomvc.com"
And some other domain is "someother.com"
When I navigate to "https://todomvc.com/examples/react/dist"
Then the current URL should contain my domain
And the current URL should not contain some other domain
Trimming and ignoring case (since v3.62.0)
- The
@Trim
annotation can be used on step to trim strings when comparing - The
@IgnoreCase
annotation can be used on step to ignore case when comparing
Page title asserts
the page title should[ not] be blank
Checks whether or not the title of the current page matches a blank string. Reports an assertion error if the match fails.
the page title should[ not] be blank
Or with custom assertion error message (as of v3.9.0):
the page title should[ not] be blank @Message("my custom assert fail message")
Or with no timeout (as of v3.41.0):
the page title should[ not] be blank with no <wait|timeout>
Or with custom timeout (as of v3.41.0):
the page title should[ not] be blank with <timeoutSecs> second <wait|timeout>
Where
not
negates the match if included<timeoutSecs>
is the timeout period in seconds<wait|timeout>
is eitherwait
ortimeout
Example
When I navigate to "https://todomvc.com/examples/react/dist"
Then the page title should not be blank
Trimming (since v3.62.0)
- The
@Trim
annotation can be used on step to trim strings when comparing
the page title should[ not] <match> "<expression>"
Checks whether or not the title of the current page in the browser matches a given expression. Reports an assertion error if the match fails.
the page title should[ not] <match> "<expression>"
Or with custom assertion error message (as of v3.9.0):
the page title should[ not] <match> "<expression>" @Message("my custom assert fail message")
Or with no timeout (as of v3.41.0):
the page title should[ not] <match> "<expression>" with no <wait|timeout>
Or with custom timeout (as of v3.41.0):
the page title should[ not] <match> "<expression>" with <timeoutSecs> second <wait|timeout>
Where
not
negates the match if included<match>
is the type of match to perform, one of:be
for exact matchcontain
for partial matchstart with
for partial leading matchend with
for partial trailing matchmatch regex
for regex matchmatch xpath
for XML matchmatch json path
for JSON path match, since v1.4.0match template
for template match, since v2.16.0match template file
for template file match, since v2.16.0
<expression>
is the expression to match (can be in DocString position)<timeoutSecs>
is the timeout period in seconds<wait|timeout>
is eitherwait
ortimeout
Example
When I navigate to "https://todomvc.com/examples/react/dist"
Then the page title should contain "TodoMVC"
Trimming and ignoring case (since v3.62.0)
- The
@Trim
annotation can be used on step to trim strings when comparing - The
@IgnoreCase
annotation can be used on step to ignore case when comparing
the page title should[ not] <match> <expressionRef>
Checks whether or not the title of the current page in the browser matches a referenced expression. Reports an assertion error if the match fails.
the page title should[ not] <match> <expressionRef>
Or with custom assertion error message (as of v3.9.0):
the page title should[ not] <match> <expressionRef> @Message("my custom assert fail message")
Or with no timeout (as of v3.41.0):
the page title should[ not] <match> <expressionRef> with no <wait|timeout>
Or with custom timeout (as of v3.41.0):
the page title should[ not] <match> <expressionRef> with <timeoutSecs> second <wait|timeout>
Where
not
negates the match if included<match>
is the type of match to perform, one of:be
for exact matchcontain
for partial matchstart with
for partial leading matchend with
for partial trailing matchmatch regex
for regex matchmatch xpath
for XML matchmatch json path
for JSON path match, since v1.4.0match template
for template match, since v2.16.0match template file
for template file match, since v2.16.0
<expressionRef>
is the name of the binding containing the expression to match- Can be the name of any binding that contains or resolves to an expression value, including a web element in which case the text in the element will be dynamically retrieved and used.
<timeoutSecs>
is the timeout period in seconds<wait|timeout>
is eitherwait
ortimeout
Example
Given the app name is "TodoMVC"
When I navigate to "https://todomvc.com/examples/react/dist"
Then the page title should contain the app name
Trimming and ignoring case (since v3.62.0)
- The
@Trim
annotation can be used on step to trim strings when comparing - The
@IgnoreCase
annotation can be used on step to ignore case when comparing
Element asserts
<element> should[ not] be <state>
Checks whether or not an element is in a given state.
<element> should[ not] be <state>
Or with custom assertion error message (as of v3.9.0):
<element> should[ not] be <state> @Message("my custom assert fail message")
Or with no timeout (as of v3.41.0):
<element> should[ not] be <state> with no <wait|timeout>
Or with custom timeout (as of v3.41.0):
<element> should[ not] be <state> with <timeoutSecs> second <wait|timeout>
Where
<element>
is the name of the element to checknot
negates the state if included<state>
is one of:displayed
to check if the element is displayedhidden
to check if the element is not displayedchecked
(orticked
since v2.4.0) to check if a checkbox is tickedunchecked
(orunticked
since v2.4.0) to check if a checkbox is not tickedenabled
to check if the element is enableddisabled
to check if the element is disabled
<timeoutSecs>
is the timeout period in seconds<wait|timeout>
is eitherwait
ortimeout
Example
Given my todo list can be located by css ".todo-list"
When I navigate to "https://todomvc.com/examples/react/dist"
Then my todo list should not be displayed
<element> should[ not] <match> "<expression>"
Checks whether or not the text value of an element matches a given expression. Reports an assertion error if the match fails.
<element> should[ not] <match> "<expression>"
Or with custom assertion error message (as of v3.9.0):
<element> should[ not] <match> "<expression>" @Message("my custom assert fail message")
Or with no timeout (as of v3.41.0):
<element> should[ not] <match> "<expression>" with no <wait|timeout>
Or with custom timeout (as of v3.41.0):
<element> should[ not] <match> "<expression>" with <timeoutSecs> second <wait|timeout>
Where
<element>
is the name of the element to checknot
negates the match if included<match>
is the type of match to perform, one of:be
for exact matchcontain
for partial matchstart with
for partial leading matchend with
for partial trailing matchmatch regex
for regex matchmatch xpath
for XML matchmatch json path
for JSON match, since v1.4.0match template
for template match, since v2.16.0match template file
for template file match, since v2.16.0
<expression>
is the expression to match (can be in DocString position)<timeoutSecs>
is the timeout period in seconds<wait|timeout>
is eitherwait
ortimeout
Example
Given the todo field can be located by class "new-todo"
And my todo list can be located by css ".todo-list"
When I navigate to "https://todomvc.com/examples/react/dist"
And I enter "Get the milk" in the todo field
Then my todo list should contain "Get the milk"
Trimming and ignoring case (since v3.62.0)
- The
@Trim
annotation can be used on step to trim strings when comparing - The
@IgnoreCase
annotation can be used on step to ignore case when comparing
<element> should[ not] <match> <expressionRef>
Checks whether or not the text value of an element matches a referenced expression. Reports an assertion error if the match fails.
<element> should[ not] <match> <expressionRef>