518 строки
9.3 KiB
Markdown
518 строки
9.3 KiB
Markdown
|
# Quilla Step Cookbook
|
||
|
|
||
|
To make it easier to use Quilla, included below is a "cookbook" that showcases examples for every step definition that Quilla contains.
|
||
|
|
||
|
## Refreshing the page
|
||
|
|
||
|
```json
|
||
|
{
|
||
|
"action": "Refresh"
|
||
|
}
|
||
|
```
|
||
|
|
||
|
## Navigate Back to the Last Page
|
||
|
|
||
|
```json
|
||
|
{
|
||
|
"action": "NavigateBack"
|
||
|
}
|
||
|
```
|
||
|
|
||
|
## Navigate Forward to the Next Page
|
||
|
|
||
|
```json
|
||
|
{
|
||
|
"action": "NavigateForward"
|
||
|
}
|
||
|
```
|
||
|
|
||
|
## Navigate to a Page Given Its URL
|
||
|
|
||
|
```json
|
||
|
{
|
||
|
"action": "NavigateTo",
|
||
|
"target": "https://bing.com"
|
||
|
}
|
||
|
```
|
||
|
|
||
|
## Clicking on a Page Element
|
||
|
|
||
|
```json
|
||
|
{
|
||
|
"action": "Click",
|
||
|
"target": "${{ Definitions.SubmitButton }}"
|
||
|
}
|
||
|
```
|
||
|
|
||
|
## Clearing an Input Box
|
||
|
|
||
|
```json
|
||
|
{
|
||
|
"action": "Clear",
|
||
|
"target": "${{ Definitions.UsernameInputBox }}"
|
||
|
}
|
||
|
```
|
||
|
|
||
|
## Hovering Over an Element
|
||
|
|
||
|
```json
|
||
|
{
|
||
|
"action": "Hover",
|
||
|
"target": "${{ Definitions.InfoIcon }}"
|
||
|
}
|
||
|
```
|
||
|
|
||
|
## Writing Text Into an Input
|
||
|
|
||
|
### Using Static Data
|
||
|
|
||
|
```json
|
||
|
{
|
||
|
"action": "SendKeys",
|
||
|
"target": "${{ Definitions.UsernameField }}",
|
||
|
"parameters": {
|
||
|
"data": "test_user1"
|
||
|
}
|
||
|
}
|
||
|
```
|
||
|
|
||
|
### Using Environment Data
|
||
|
|
||
|
```json
|
||
|
{
|
||
|
"action": "SendKeys",
|
||
|
"target": "${{ Definitions.PasswordField }}",
|
||
|
"parameters": {
|
||
|
"data": "${{ Environment.TEST_USER_PASSWORD }}"
|
||
|
}
|
||
|
}
|
||
|
```
|
||
|
|
||
|
## Waiting
|
||
|
|
||
|
### Wait for an Element to Exist
|
||
|
|
||
|
Waiting for at most 5 seconds
|
||
|
|
||
|
```json
|
||
|
{
|
||
|
"action": "WaitForExistence",
|
||
|
"target": "${{ Definitions.SubmitButton }}",
|
||
|
"parameters": {
|
||
|
"timeoutInSeconds": 5
|
||
|
}
|
||
|
}
|
||
|
```
|
||
|
|
||
|
### Wait for an Element to be Visible
|
||
|
|
||
|
Waiting for at most 5 seconds
|
||
|
|
||
|
```json
|
||
|
{
|
||
|
"action": "WaitForVisibility",
|
||
|
"target": "${{ Definitions.HeaderBannerImage }}",
|
||
|
"parameter": {
|
||
|
"timeoutInSeconds": 5
|
||
|
}
|
||
|
}
|
||
|
```
|
||
|
|
||
|
## Setting Browser Size
|
||
|
|
||
|
Setting the window to be 800px by 600px
|
||
|
|
||
|
```json
|
||
|
{
|
||
|
"action": "SetBrowserSize",
|
||
|
"parameters": {
|
||
|
"width": 800,
|
||
|
"height": 600
|
||
|
}
|
||
|
}
|
||
|
```
|
||
|
|
||
|
## Creating Outputs
|
||
|
|
||
|
### Creating a Literal Output
|
||
|
|
||
|
`Literal` outputs take the *exact* value provided by the `target` field, after any context expressions are reslved, and provide them as an output.
|
||
|
|
||
|
```json
|
||
|
{
|
||
|
"action": "OutputValue",
|
||
|
"target": "This is some text that will be output exactly",
|
||
|
"parameters": {
|
||
|
"source": "Literal",
|
||
|
"outputName": "ExampleOutput"
|
||
|
}
|
||
|
}
|
||
|
```
|
||
|
|
||
|
It can then be consumed through the `Validation` context object like so:
|
||
|
|
||
|
```json
|
||
|
{
|
||
|
"action": "SendKeys",
|
||
|
"target": "${{ Definitions.TextBox }}",
|
||
|
"parameters": {
|
||
|
"data": "${{ Validation.ExampleOutput }}"
|
||
|
}
|
||
|
}
|
||
|
```
|
||
|
|
||
|
The `"SendKeys"` example above would evaluate to be equivalent to:
|
||
|
|
||
|
```json
|
||
|
{
|
||
|
"action": "SendKeys",
|
||
|
"target": "${{ Definitions.TextBox }}",
|
||
|
"parameters": {
|
||
|
"data": "This is some text that will be output exactly"
|
||
|
}
|
||
|
}
|
||
|
```
|
||
|
|
||
|
### Creating Output from XPath Text
|
||
|
|
||
|
`XPathText` outputs retrieve the inner text value of the element described by the `target` XPath.
|
||
|
|
||
|
Assuming that `${{ Definitions.SomeLabel }}` points to a label that has the text "This is some example text", then the following step would create the output `${{ Validation.SomeLabelText }}` with value "This is some example text".
|
||
|
|
||
|
```json
|
||
|
{
|
||
|
"action": "OutputValue",
|
||
|
"target": "${{ Definitions.SomeLabel }}",
|
||
|
"parameters": {
|
||
|
"source": "XPathText",
|
||
|
"outputName": "SomeLabelText"
|
||
|
}
|
||
|
}
|
||
|
```
|
||
|
|
||
|
### Creating output from XPath Property
|
||
|
|
||
|
Similarly, the `XPathProperty` source can be used to retrieve a property of an XPath
|
||
|
|
||
|
```json
|
||
|
{
|
||
|
"action": "OutputValue",
|
||
|
"target": "${{ Definitions.SomeLabel }}",
|
||
|
"parameters": {
|
||
|
"parameterName": "className",
|
||
|
"source": "XPathProperty",
|
||
|
"outputName": "SomeLabelClassName"
|
||
|
}
|
||
|
}
|
||
|
```
|
||
|
|
||
|
## XPath Validations
|
||
|
|
||
|
### Validating an Element Exists on the Page
|
||
|
|
||
|
```json
|
||
|
{
|
||
|
"action": "Validate",
|
||
|
"type": "XPath",
|
||
|
"target": "${{ Definitions.UsernameField }}",
|
||
|
"state": "Exists"
|
||
|
}
|
||
|
```
|
||
|
|
||
|
### Validating an Element Does Not Exist on the Page
|
||
|
|
||
|
```json
|
||
|
{
|
||
|
"action": "Validate",
|
||
|
"type": "XPath",
|
||
|
"target": "${{ Definitions.SignInButton }}",
|
||
|
"state": "NotExists"
|
||
|
}
|
||
|
```
|
||
|
|
||
|
### Validating an Element is Visible on the Page
|
||
|
|
||
|
```json
|
||
|
{
|
||
|
"action": "Validate",
|
||
|
"type": "XPath",
|
||
|
"target": "${{ Definitions.SignInButton }}",
|
||
|
"state": "Visible"
|
||
|
}
|
||
|
```
|
||
|
|
||
|
### Validating an Element is Not Visisble on the Page
|
||
|
|
||
|
```json
|
||
|
{
|
||
|
"action": "Validate",
|
||
|
"type": "XPath",
|
||
|
"target": "${{ Definitions.HiddenInputField }}",
|
||
|
"state": "NotVisible"
|
||
|
}
|
||
|
```
|
||
|
|
||
|
### Validating the XPath Text Matches a Pattern
|
||
|
|
||
|
Checking that it contains some text
|
||
|
|
||
|
```json
|
||
|
{
|
||
|
"action": "Validate",
|
||
|
"type": "XPath",
|
||
|
"target": "${{ Definitions.SignInButton }}",
|
||
|
"state": "TextMatches",
|
||
|
"parameters": {
|
||
|
"pattern": "Sign In"
|
||
|
}
|
||
|
}
|
||
|
```
|
||
|
|
||
|
Checking that it matches the text exactly
|
||
|
|
||
|
```json
|
||
|
{
|
||
|
"action": "Validate",
|
||
|
"type": "XPath",
|
||
|
"target": "${{ Definitions.SignInButton }}",
|
||
|
"state": "TextMatches",
|
||
|
"parameters": {
|
||
|
"pattern": "^Sign In$"
|
||
|
}
|
||
|
}
|
||
|
```
|
||
|
|
||
|
Matching a more advanced regular expression:
|
||
|
|
||
|
```json
|
||
|
{
|
||
|
"action": "Validate",
|
||
|
"type": "XPath",
|
||
|
"target": "${{ Definitions.SignInButton }}",
|
||
|
"state": "TextMatches",
|
||
|
"parameters": {
|
||
|
"pattern": "^[Ss]ign[ -]?[Ii]n!?$"
|
||
|
}
|
||
|
}
|
||
|
```
|
||
|
|
||
|
The above example will match "Sign in", "sign in", "signin", "sign-In", "Sign In!", etc.
|
||
|
|
||
|
Quilla uses Python syntax regular expressions for text matching. For more information on how to write regular expressions, refer to the [regular expression HOWTO](https://docs.python.org/3/howto/regex.html)
|
||
|
|
||
|
### Validating that the XPath Text Does Not Match a Pattern
|
||
|
|
||
|
The inverse of the `TextMatches` operation. The following example will be a success if and only if the text does not include the text "Sign In" anywhere.
|
||
|
|
||
|
```json
|
||
|
{
|
||
|
"action": "Validate",
|
||
|
"type": "XPath",
|
||
|
"target": "${{ Definitions.SignInButton }}",
|
||
|
"state": "NotTextMatches",
|
||
|
"parameters": {
|
||
|
"pattern": "Sign In"
|
||
|
}
|
||
|
}
|
||
|
```
|
||
|
|
||
|
### Validating that the XPath Has Some Property
|
||
|
|
||
|
```json
|
||
|
{
|
||
|
"action": "Validate",
|
||
|
"type": "XPath",
|
||
|
"target": "${{ Definitions.SignInButton }}",
|
||
|
"state": "HasProperty",
|
||
|
"parameters": {
|
||
|
"name": "className"
|
||
|
}
|
||
|
}
|
||
|
```
|
||
|
|
||
|
### Validating that the XPath Does Not Have Some Property
|
||
|
|
||
|
```json
|
||
|
{
|
||
|
"action": "Validate",
|
||
|
"type": "XPath",
|
||
|
"target": "${{ Definitions.SignInButton }}",
|
||
|
"state": "NotHasProperty",
|
||
|
"parameters": {
|
||
|
"name": "className"
|
||
|
}
|
||
|
}
|
||
|
```
|
||
|
|
||
|
### Validating that the XPath Has Some Attribute
|
||
|
|
||
|
```json
|
||
|
{
|
||
|
"action": "Validate",
|
||
|
"type": "XPath",
|
||
|
"target": "${{ Definitions.SignInButton }}",
|
||
|
"state": "HasAttribute",
|
||
|
"parameters": {
|
||
|
"name": "class"
|
||
|
}
|
||
|
}
|
||
|
```
|
||
|
|
||
|
### Validating that the XPath Does Not Have Some Attribute
|
||
|
|
||
|
```json
|
||
|
{
|
||
|
"action": "Validate",
|
||
|
"type": "XPath",
|
||
|
"target": "${{ Definitions.SignInButton }}",
|
||
|
"state": "NotHasAttribute",
|
||
|
"parameters": {
|
||
|
"name": "class"
|
||
|
}
|
||
|
}
|
||
|
```
|
||
|
|
||
|
### Validating that the XPath Has Some Property With a Specific Value
|
||
|
|
||
|
```json
|
||
|
{
|
||
|
"action": "Validate",
|
||
|
"type": "XPath",
|
||
|
"target": "${{ Definitions.SignInButton }}",
|
||
|
"state": "PropertyHasValue",
|
||
|
"parameters": {
|
||
|
"name": "className",
|
||
|
"value": "mr-3"
|
||
|
}
|
||
|
}
|
||
|
```
|
||
|
|
||
|
### Validating that the XPath Does Not Have Some Property With a Specific Value
|
||
|
|
||
|
```json
|
||
|
{
|
||
|
"action": "Validate",
|
||
|
"type": "XPath",
|
||
|
"target": "${{ Definitions.SignInButton }}",
|
||
|
"state": "NotPropertyHasValue",
|
||
|
"parameters": {
|
||
|
"name": "className",
|
||
|
"value": "mr-3"
|
||
|
}
|
||
|
}
|
||
|
```
|
||
|
|
||
|
### Validating that the XPath Has Some Attribute With a Specific Value
|
||
|
|
||
|
```json
|
||
|
{
|
||
|
"action": "Validate",
|
||
|
"type": "XPath",
|
||
|
"target": "${{ Definitions.SignInButton }}",
|
||
|
"state": "AttributeHasValue",
|
||
|
"parameters": {
|
||
|
"name": "class",
|
||
|
"value": "mr-3"
|
||
|
}
|
||
|
}
|
||
|
```
|
||
|
|
||
|
### Validating that the XPath Does Not Have Some Attribute With a Specific Value
|
||
|
|
||
|
```json
|
||
|
{
|
||
|
"action": "Validate",
|
||
|
"type": "XPath",
|
||
|
"target": "${{ Definitions.SignInButton }}",
|
||
|
"state": "NotAttributeHasValue",
|
||
|
"parameters": {
|
||
|
"name": "class",
|
||
|
"value": "mr-3"
|
||
|
}
|
||
|
}
|
||
|
```
|
||
|
|
||
|
## Performing VisualParity Validation
|
||
|
|
||
|
Although it is a form of XPath validation, VisualParity require additional setup.
|
||
|
|
||
|
It is *not* required to give a specific target the same name in a Definition file/section and in the Baseline ID used for the target. However, doing so makes it easier to navigate the resulting images.
|
||
|
|
||
|
Performing VisualParity validation on a page element
|
||
|
|
||
|
```json
|
||
|
{
|
||
|
"action": "Validate",
|
||
|
"type": "XPath",
|
||
|
"target": "${{ Definitions.HomePageContentContainer }}",
|
||
|
"state": "VisualParity",
|
||
|
"parameters": {
|
||
|
"baselineID": "HomePageContentContainer"
|
||
|
}
|
||
|
}
|
||
|
```
|
||
|
|
||
|
Performing VisualParity validation on a page element while ignoring some sub-elements
|
||
|
|
||
|
```json
|
||
|
{
|
||
|
"action": "Validate",
|
||
|
"type": "XPath",
|
||
|
"target": "${{ Definitions.HomePageContentContainer }}",
|
||
|
"state": "VisualParity",
|
||
|
"parameters": {
|
||
|
"baselineID": "HomePageContentContainer",
|
||
|
"excludeXPaths": [
|
||
|
"${{ Definitions.TodaysDateLabel }}",
|
||
|
"${{ Definitions.TodaysWeatherIcon }}",
|
||
|
]
|
||
|
}
|
||
|
}
|
||
|
```
|
||
|
|
||
|
## Performing URL Validations
|
||
|
|
||
|
### Validating URL Constains Some Text
|
||
|
|
||
|
```json
|
||
|
{
|
||
|
"action": "Validate",
|
||
|
"type": "URL",
|
||
|
"state": "Contains",
|
||
|
"target": "?q=${{ Validation.SearchQuery }}"
|
||
|
}
|
||
|
```
|
||
|
|
||
|
### Validating URL Does Not Contain Some Text
|
||
|
|
||
|
```json
|
||
|
{
|
||
|
"action": "Validate",
|
||
|
"type": "URL",
|
||
|
"state": "NotContains",
|
||
|
"target": "?q=${{ Validation.SearchQuery }}"
|
||
|
}
|
||
|
```
|
||
|
|
||
|
### Validating URL Matches Some Text Exactly
|
||
|
|
||
|
```json
|
||
|
{
|
||
|
"action": "Validate",
|
||
|
"type": "URL",
|
||
|
"state": "Equals",
|
||
|
"target": "https://www.bing.com"
|
||
|
}
|
||
|
```
|
||
|
|
||
|
### Validating URL Does Not Match Some Text Exactly
|
||
|
|
||
|
```json
|
||
|
{
|
||
|
"action": "Validate",
|
||
|
"type": "URL",
|
||
|
"state": "NotEquals",
|
||
|
"target": "http://www.bing.com"
|
||
|
}
|
||
|
```
|