> For the complete documentation index, see [llms.txt](https://docs.wem.io/platform/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.wem.io/platform/wemreference/regression-test-framework/wem-test-script.md).

# WEM Test Script

{% hint style="info" %}
This part is a limited first edition to describe some of the WEM Test Script DSL features as part of the WEM Regression Test Framework.

In future, we plan to provide a Portal in which you can manage your own testsuites and scripts, request test-executions and review test-results. This WEM Test Script will be an important part.
{% endhint %}

## Statements

Statements that can be used in the WEM Test Scripts to perform specific actions.

### Assignment

Use **:=** to assign an expression/value or a web element (an element on your page in the Runtime to work with) to a local variable.

```
$<variable-name> := <expr>
$<variable-name> := <webEl>
```

### Screenshot

Make a screenshot of the current page. Screenshots will be compared to check differences between the test environment and the reference environment.

```
screenshot <name>
screenshot
```

If no name is given, a default name will be used like: "*#-screenshot".*

The resulting screenshots can be accessed in the Artifacts collection of the Job Execution Result.

### Navigate

Navigate to a specified page (perform an HTTP-GET request).

```
navigate to <page>
```

The `<page>` value will be added to the end of the given base URL (test/reference host + relative path). If `<page>` starts with *https\://* or *http\://*, the base URL will be ignored and `<page>` will be considered an absolute path (which may be an external URL).

{% hint style="info" %}
Every script should start with a *Navigate to* statement.
{% endhint %}

### Click

Perform a Click-action on specified (web) element.

```
click on <webEl>
```

### Hover

Hover over a web element, to test tooltips.

```
hover over <webEl>
```

### Select

Select value or text from specified web element, like a dropdown.

```
select <value> from <webEl>
select text <value> from <webEl>
select value <value> from <webEl>
```

Optional keyword **text** or **value**, determines which attribute is used for \<value>, default is text.

### Enter

Put a value into specified web element, most useful to perform adding values to Input Fields.

```
enter <value> into <webEl>
```

### Capture

Capture text or html of specified web element.

```
capture <webEl> <name>
capture text <webEl>
capture html <webEl>
```

Optional keyword **text** or **html**, determines whether outer-html or text is captured, default is text.

### Wait

Wait for a duration specified in milliseconds. This may be required if certain actions (loading a page, retrieving data) take a longer time. With Test Automation it is sometimes necessary to put in manual wait statements to make sure that the test can perform realistically and this means to have to wait until some longer running process is finished before the next step should be executed. Often this is a matter of trying a few times until the optimal waiting time is found...

```
wait <millisec>
```

### Download

Tries to download specified link.

{% hint style="info" %}
Use *Wait* at the end of the script if it's a big download.
{% endhint %}

{% hint style="danger" %}
Download does not work in Edge browser.
{% endhint %}

```
Download "<link>"
```

The `<link>` parameter should be the Text attribute of the link (the visible text that is clickable).

The resulting file can be accessed in the Artifacts collection of the Job Execution Result.

### Resize

Resize browser viewport (to test responsive elements) to indicated width and height. When no arguments are present it will revert back to full screen. If height is not present, the width-value will be used for height as well.

```
Resize
Resize <width>
Resize <width> <height>
```

### While

Continues executing statement block while `<condition>` is true.

```
while <condition>
...
break
...
end
```

Keyword **`end`** specifies end of statement block.\
Optional keyword **`break`**, if this is reached, the loop is ended and flow continues after the `end`.

### If

If `<condition>` is true, executes statement block.

```
if <condition>
...
elseif <condition>
...
else
...
end
```

Keyword **`end`** specifies end of statement block.\
Optional keyword **`elseif`**, if previous conditions are false, execute the statements in the `elseif` block, if its specified condition is true.\
Optional keyword **`else`**,  if previous conditions are false, execute the statements in the `else` block.

{% hint style="info" %}
Every new statement should be on a new line.
{% endhint %}

## Expressions

### \<element> In

Get the web element in another web element.

```
click on <webEl> in <webEl>
```

### Logical Or

Check if one or the other is true.

```
if <condition> or <condition>
...
end
```

### Logical And

Check if both are true.

```
while <condition> and <condition>
...
end
```

### Logical Not

Negates expression.

```
if not <expr>
...
end
```

### Compare `=` , `!=`

Compare values with each other. Equal (`=`) or Not-Equal (`!=`)

```
if <expr> = <expr>
...
end
```

### Compare `<` , `>` , `>=` , `<=`

Check if values are greater or less than (or equals).

```
while <expr> >= <expr>
...
end
```

### Calculation `+` , `-` , `*` , `/`

Calculation symbols.

```
$var := 1 + 2
$var := 1 * 2 - 3
$var := "Hello " + "world"
$var := "I am " + 42 + "years old"
$var := -$var
```

If **+** is used with a string, it concatenates all values into a string.

## Elements

### WebElements

WebElements are html elements that can be interacted with using the above named **statements**.

* Button
* Panel
* Input
* FormItem
* Tab
* Link
* DataGrid (class=table)
* Pagination
* Element

{% hint style="info" %}
To click on a datagrid or repeater "page", use the **Pagination** element: \
**click on pagination\[text=42]**
{% endhint %}

Using selectors, the correct WebElement can be specified. If no selectors are present the first displayed element will be used.

Selectors available are: *text*, *title*, *class*, *label*, *index* and all html attributes. *Index* is a special selector, starting from 1 it chooses the element on the given index All other selectors after *index* will be ignored.

A special WebElement is ***Element***. It has it's own **special selectors**, all other selectors won't work.\
These selectors are: ***id, xpath*****&#x20;and&#x20;*****css***.

To avoid a "stale" WebElement exception (the specified element is no longer part of the current HTML Document in the Browser Session) use **\*** in front of the WebElement to create a lazy expression, this will execute the expression only when needed. Only works on WebElements.

```
$var := button
$var := button[]
$var := button[class="succes", index=3, text="Ok"] #text="Ok" will not be reached
$var := *button[attr=<expr>, ...] #lazy webelement expression
```

### Literals:

* Boolean (true or false)
* Number
* String

### Other:

* `$Variable`
* `Function(<expr>, ...)`
* `Exists(<webEl>)`\
  Checks if \<webEl> hasn't gotten stale and still exists in the current HTML Document.\
  Returns true or false.

{% hint style="info" %}
Functions always have a return value
{% endhint %}

## Examples

### Perform clicks on buttons

A lazy assignment of a button element to a variable using *index* as a selector.\
Using the function *Exists()* to check if the current button is still valid, and increasing the index selector by 1 to loop through all button elements on the page. Making a screenshot of all overlays and closing them using *click on button\[text="close"]*.

```
navigate to "/data/legacy-lists"
screenshot "legacy-lists"

$i := 1
$button := *button[index=$i]
while (Exists($button))

	click on $button
	screenshot "test_" + $i

	click on button[text="close"]
	$i := $i + 1
end
```

![Overlays](/files/NgEzwe5P2Lvhx5B8QpZO)

### Perform sorting on datagrid

Using *click on datagrid\[title="ID"]* to sort specified columns of a Datagrid.

```
navigate to "/data/advanceddatatests"
screenshot

click on button[text="Test Filters"]
click on button[text="Test Filter 4: FilteredPaging"]
wait 1500
screenshot

click on datagrid[title="ID"]
screenshot "Sort ID"

click on datagrid[title="Count Orgs"]
wait 3000
screenshot "Sort Orgs"

click on pagination[text=11] in panel
screenshot "Page 11"

click on pagination[text="next"]
screenshot "Page Next"
```

![Sorting datagrid](/files/gt8WuzH4mvqgp4rNDFTY)

### Download a file

```
navigate to "/flowcharts/export-to-excel"

download "export.xls"
wait 500
```

### Form Input

Entering "hello world" into a form-item. Afterwards collapsing the panel.

```
navigate to "/ui/input-components"

click on button[text="Texts"]
screenshot "inputs"

enter "hello world" into formitem[label="Text 03"] in panel
screenshot

click on panel
screenshot
```

![Enter values into form-input](/files/say4F1QYffML6cdtYTRS)

### Change Language

Change language to Italian using the dropdown and capturing the html of a web element.

```
navigate to "/ui/built-in-components"

click on button[text="Labels"]
screenshot "labels"

$table := *element[css="body>form>main>div:nth-child(5)"]

select "Italian (Italy)" from input[name="wmtlang"]
capture html $table
```

![](/files/S71K5IhRbnykkFNse0md)


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.wem.io/platform/wemreference/regression-test-framework/wem-test-script.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
