# Step Library: Every TestOwl Step Type

:::lead
The Step Library is the catalogue of every building block you can add to a Test Case or Flow. Each step does one thing — click a button, check some text, call an API, run a loop — and you combine them to describe a complete test.
:::

You'll find the library in the **Step Palette** of the [Step Editor](/docs/building-tests/the-editor). Drag a step into your test, or click it to add it at the end, then configure it in the **Properties Panel**. Use the palette's search box to find a step by name.

The [Recorder](/docs/building-tests/recording-a-test) creates many of these steps for you automatically as you use your application.

## Settings every step has

Almost every step includes these general settings in the Properties Panel:

| Setting | What it does |
| --- | --- |
| **Name** | The step's label in the Step Tree and in reports. |
| **Description** | An optional note explaining the step. |
| **On Failure** | What happens if the step fails: **Fail Immediately** (the default) stops the test; **Continue But Fail Test** keeps running the remaining steps but marks the test as failed; **Warn But Continue Execution** logs a warning and carries on as if nothing happened. |
| **Use Smart Timeout** | On by default. TestOwl automatically adjusts how long it waits for the step. |
| **Timeout Value** | Shown when Smart Timeout is off. How long to wait, in milliseconds (default 60000). |

Step-specific fields (the target element, the text to type, the value to expect, and so on) appear below these.

:::callout{title="Use Variables and Secrets"}
Most fields accept `{{variableName}}` references so you don't hard-code values. See [Variables](/docs/data/variables) and [Secrets](/docs/data/secrets).
:::

## Steps by category

### Navigation

Move around the browser, tabs, and windows.

| Step | What it does |
| --- | --- |
| **Visit Page** | Open a page URL. |
| **Navigate Back** | Go back in the browser history. |
| **Navigate Forward** | Go forward in the browser history. |
| **Refresh Page** | Reload the current page. |
| **Open New Tab** | Open a new browser tab. |
| **Switch Tab** | Switch to another open tab. |
| **Close Tab** | Close a browser tab. |
| **Switch Window** | Switch to another browser window. |
| **Close Window** | Close a browser window. |
| **Handle Dialog** | Accept or dismiss a native alert/confirm/prompt dialog. Add this BEFORE the step that opens it. |

### Mouse

Click, hover, scroll, and select with the mouse.

| Step | What it does |
| --- | --- |
| **Left Click** | Click an element with the primary mouse button. |
| **Double Click** | Double-click an element. |
| **Right Click** | Open the context menu on an element. |
| **Mouse Over** | Move the mouse over an element. |
| **Scroll** | Scroll the page or an element to a position. |
| **Text Selection** | Select a range of text on the page. |
| **Mouse Down** | Press and hold a mouse button over an element. |
| **Mouse Up** | Release a mouse button over an element. |
| **Move Mouse To Element** | Move the pointer over an element. |

### Keyboard

Press keys and move focus.

| Step | What it does |
| --- | --- |
| **Key Down** | Press a keyboard key. |
| **Focus Change** | Move keyboard focus to an element via Tab. |
| **Press Key Combination** | Press a key combination (e.g. Control+S). |

### Input

Fill in and change form controls.

| Step | What it does |
| --- | --- |
| **Type Text** (palette search: "Type") | Type text into an element. |
| **Select Option** (palette search: "Select") | Select option values from a dropdown. |
| **Checkbox** | Set checkbox values. |
| **Rich Text Input** (palette search: "Rich Text") | Type text into a contenteditable element. |
| **Range Change** (palette search: "Range") | Move a range slider to a value. |
| **Radio** | Select a radio button. |
| **Clear** | Clear the value of an input element. |
| **Blur Element** | Remove focus from an element. |
| **Set Date** | Set the value of a date input. |
| **Set Time** | Set the value of a time input. |
| **Set Date Time** | Set the value of a datetime input. |

### Form

Submit forms.

| Step | What it does |
| --- | --- |
| **Form Submit** | Submit a form. |

### Clipboard

Copy, cut, and paste.

| Step | What it does |
| --- | --- |
| **Copy** | Copy from a target element. |
| **Cut** | Cut from a target element. |
| **Paste** | Paste into a target element. |

### Drag

Drag and drop elements.

| Step | What it does |
| --- | --- |
| **Drag and Drop** (palette search: "Drag Drop") | Drag an element and drop it onto a target. |
| **Drag By Offset** | Drag an element by a pixel offset. |

### Gesture

Touch gestures for mobile and tablet tests.

| Step | What it does |
| --- | --- |
| **Gesture** | Perform a touch gesture. |
| **Double Tap** | Double-tap an element (touch devices). |
| **Zoom** | Pinch-zoom in or out (touch devices). |
| **Change Orientation** | Change the device orientation. |

### File

Upload and download files.

| Step | What it does |
| --- | --- |
| **File Input** | Upload one or more files via a file input. |
| **File Remove** | Remove an attached file from a file input. |
| **Download File** | Download a file triggered by a click or URL. |

### Media

Control audio and video playback.

| Step | What it does |
| --- | --- |
| **Media** | Control audio or video playback. |

### Viewport

Resize the window, go fullscreen, and take screenshots.

| Step | What it does |
| --- | --- |
| **Resize Viewport** | Resize the browser viewport to specific dimensions. |
| **Fullscreen** | Enter or exit fullscreen mode. |
| **Take Screenshot** | Capture a screenshot of the page or an element. |

### Wait

Pause until something is ready, or for a fixed time.

| Step | What it does |
| --- | --- |
| **Wait/Delay** | Wait for a fixed duration. |
| **Wait for Visible** | Wait until an element is visible. |
| **Wait for Hidden** | Wait until an element is hidden. |
| **Wait for Enabled** | Wait until an element is enabled. |
| **Wait for Animation** | Wait until a CSS animation settles. |
| **Wait for Count** | Wait until a number of matching elements exists. |
| **Wait for URL** | Wait until the page URL matches a pattern. |
| **Wait for Function** | Wait until a JavaScript expression returns truthy. |
| **Wait For Element** | Wait for an element to appear. |
| **Wait For Element Attached** | Wait for an element to be attached to the DOM. |
| **Wait For Element Detached** | Wait for an element to be detached from the DOM. |
| **Wait For Element Disabled** | Wait for an element to become disabled. |
| **Wait For Page Load** | Wait for the page load event. |
| **Wait For DOM Ready** | Wait for the DOM to be ready. |
| **Wait For Title Change** | Wait for the page title to change. |
| **Wait For Condition** | Wait until a JavaScript condition holds. |
| **Wait For Variable Value** | Wait until a variable has the expected value. |
| **Wait For API Completion** | Wait for a pending API call to complete. |
| **Wait For Request** | Wait for a matching network request. |
| **Wait For Response** | Wait for a matching network response. |
| **Wait For Download** | Wait for a download to complete. |
| **Wait For Upload** | Wait for an upload to complete. |

### Assertion

Check that your application behaves as expected.

| Step | What it does |
| --- | --- |
| **Assert Text** | Assert element text content. |
| **Assert Visible** | Assert element visibility. |
| **Assert Enabled** | Assert element enabled state. |
| **Assert Checked** | Assert element checked state. |
| **Assert Select** | Assert select element value. |
| **Assert Order** | Assert the order of items in a list. |
| **Assert Column** | Assert a Kanban/grid item belongs to a column. |
| **Assert Network** | Assert a network request URL, method, and payload. |
| **Assert Visual Diff** | Compare a screenshot against a stored baseline. |
| **Assert Attribute** | Assert an HTML attribute value. |
| **Assert Value** | Assert an input or form control current value. |
| **Assert CSS** | Assert a computed CSS property value. |
| **Assert Count** | Assert the number of matching elements. |
| **Assert URL** | Assert the current page URL. |
| **Assert Title** | Assert the page title. |
| **Assert Local Storage** | Assert local storage values. |
| **Assert Session Storage** | Assert session storage values. |
| **Assert Cookie** | Assert a browser cookie value. |
| **Element Exists** | Assert that an element exists in the DOM. |
| **Element Not Exists** | Assert that an element does not exist in the DOM. |
| **Element Editable** | Assert that an element is editable. |
| **Element Focused** | Assert that an element has focus. |
| **Attribute Not Exists** | Assert that an element attribute is absent. |
| **Count Between** | Assert that the element count falls within a range. |
| **Page Contains Text** | Assert that the page contains the given text. |
| **Page Not Contains Text** | Assert that the page does not contain the given text. |
| **Expression** | Assert that a JS expression evaluated in the page returns the expected boolean. |
| **Status Code Equals** | Assert the captured API response status code. |
| **Response Time Less Than** | Assert the captured API response time. |
| **Response Header Equals** | Assert a captured API response header. |
| **Response Body Contains** | Assert the captured API response body content. |
| **JSON Path Equals** | Assert a JSONPath value in the captured API response. |
| **JSON Schema Valid** | Validate the captured API response against a JSON schema. |
| **Response Body Size** | Assert the byte size of the captured API response body. |
| **Record Exists** | Assert that a database record exists. |
| **Record Not Exists** | Assert that a database record does not exist. |
| **Record Count Equals** | Assert a database record count. |
| **File Exists** | Assert that a downloaded file exists. |
| **File Contains Text** | Assert that a downloaded file contains text. |
| **Email Received** | Assert that an email was received in the test inbox. |
| **Email Subject Equals** | Assert a received email’s subject. |
| **Email Body Contains** | Assert a received email’s body content. |
| **No Accessibility Violations** | Run an axe-core scan and assert no violations at or above the impact level. |
| **ARIA Attribute Exists** | Assert that an ARIA attribute exists on an element. |
| **Valid Contrast Ratio** | Assert an element’s text contrast ratio meets the threshold. |
| **Pixel Comparison** | Compare a screenshot against a stored baseline pixel-by-pixel. |
| **Region Comparison** | Compare a page region against a stored baseline, with exclusions. |

### Control Flow

Add conditions, loops, and retries.

| Step | What it does |
| --- | --- |
| **If / End** | Create an if block with an end branch. |
| **If / Else** | Create true and else branches. |
| **For Loop** | Create a loop branch. |
| **Switch** | Run the case matching the subject value. |
| **For Each** | Loop over the items of a list or JSON array. |
| **While Loop** | Loop while the condition holds. |
| **Repeat Until** | Loop until the condition holds (runs at least once). |
| **Break** | Exit the innermost loop. |
| **Continue** | Skip to the next loop iteration. |
| **Return** | Stop executing the current flow or test body. |
| **Stop Test** | Stop the test with the given result. |
| **Retry Step** | Retry a single wrapped step until it passes. |
| **Retry Block** | Retry a block of steps until it passes. |

### Extraction

Read values from the page into variables.

| Step | What it does |
| --- | --- |
| **Get Text** | Extract an element’s text content into a variable. |
| **Get Inner Text** | Extract an element’s rendered innerText into a variable. |
| **Get Inner HTML** | Extract an element’s innerHTML into a variable. |
| **Get Attribute** | Extract an element attribute into a variable. |
| **Get CSS Property** | Extract a computed CSS property into a variable. |
| **Get Value** | Extract an input’s value into a variable. |
| **Get Element Count** | Count matching elements into a variable. |
| **Get Table Data** | Extract a table’s rows into a variable. |
| **Get List Data** | Extract a list’s items into a variable. |
| **Get Current URL** | Extract the browser’s current URL into a variable. |

### Data & Variables

Create, change, and generate values while the test runs.

| Step | What it does |
| --- | --- |
| **Create Variable** | Create a runtime variable. |
| **Update Variable** | Update a runtime variable. |
| **Delete Variable** | Delete a runtime variable. |
| **Generate Random String** | Generate a random string into a variable. |
| **Generate Random Number** | Generate a random number into a variable. |
| **Generate Random Email** | Generate a random email address into a variable. |
| **Generate UUID** | Generate a UUID into a variable. |
| **Current Date** | Store the current date/time into a variable. |
| **Add Days** | Add days to a date variable. |
| **Subtract Days** | Subtract days from a date variable. |
| **Format Date** | Format a date value into a variable. |
| **Parse JSON** | Parse a JSON string into a variable. |
| **String Replace** | Replace text within a string variable. |
| **String Split** | Split a string into an array variable. |
| **String Join** | Join array items into a string variable. |
| **String Trim** | Trim whitespace from a string variable. |
| **Array Push** | Append an item to an array variable. |
| **Array Remove** | Remove an item from an array variable. |
| **Array Length** | Store an array’s length into a variable. |
| **Object Get** | Read a property from an object variable. |
| **Object Set** | Set a property on an object variable. |
| **Add** | Add two numbers into a variable. |
| **Subtract** | Subtract one number from another into a variable. |
| **Multiply** | Multiply two numbers into a variable. |
| **Divide** | Divide one number by another into a variable. |
| **Modulo** | Store the remainder of dividing one number by another into a variable. |
| **Calculate Expression** | Evaluate an arithmetic expression into a variable. |

### Browser Storage

Work with cookies, local storage, and session storage.

| Step | What it does |
| --- | --- |
| **Set Cookie** | Set a browser cookie. |
| **Get Cookie** | Read a cookie value into a variable. |
| **Delete Cookie** | Delete a cookie by name. |
| **Clear Cookies** | Clear all cookies for the current context. |
| **Set Local Storage** | Set a localStorage entry. |
| **Get Local Storage** | Read a localStorage entry into a variable. |
| **Remove Local Storage** | Remove a localStorage entry. |
| **Clear Local Storage** | Clear all localStorage entries. |
| **Set Session Storage** | Set a sessionStorage entry. |
| **Get Session Storage** | Read a sessionStorage entry into a variable. |
| **Clear Session Storage** | Clear all sessionStorage entries. |

### API

Send HTTP requests and check the response.

| Step | What it does |
| --- | --- |
| **Send API Request** | Send an HTTP request and capture the response. |

### Network

Intercept, change, mock, or block network traffic.

| Step | What it does |
| --- | --- |
| **Intercept Request** | Intercept matching network requests. |
| **Mock Response** | Mock the response for matching requests. |
| **Modify Request** | Modify matching requests before they are sent. |
| **Modify Response** | Modify matching responses before the page sees them. |
| **Block Request** | Block matching network requests. |

### Database

Run queries against a configured database.

| Step | What it does |
| --- | --- |
| **Execute Query** | Execute a SQL query against a configured database. |
| **Execute Stored Procedure** | Execute a stored procedure against a configured database. |

### Util

Notes and custom code.

| Step | What it does |
| --- | --- |
| **Comment** | Add a note. Never executed. |
| **Code Execution** | Run custom JavaScript in the page. |

## Reusing steps as Flows

A **Flow** is a saved group of steps you can drop into any test as a single block. Flows appear in their own **Flows** list in the Step Palette. See [Flows](/docs/building-tests/flows).

:::info{title="The library keeps growing"}
New steps are added over time. What you see in the Step Palette is always the current list, so if a step here doesn't appear yet in your palette, refresh the page.
:::

## Next steps

::::cardgrid
:::card{title="The Step Editor" href="/docs/building-tests/the-editor"}
Learn how to arrange and configure steps.
:::

:::card{title="Variables" href="/docs/data/variables"}
Reuse values across steps.
:::

:::card{title="Flows" href="/docs/building-tests/flows"}
Group steps you use often.
:::
::::
