quilla/docs/cookbook.md

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"
}
```