# Documentation

Step into the BugBug documentation section, where you'll find complete resources on how to use our tool and how to start with test automation for your website.

BugBug is a modern browser-based app for software testers, developers, or product managers in need of quick & reliable test automation — powered by an AI-Assisted Test Recorder that captures stable tests without XPath or CSS expertise.

BugBug allows you to effortlessly create and run end-to-end and regression tests for web applications, marketplaces, e-commerce, landing pages, etc.&#x20;

* Are you new to the concept of automated browser tests? Read our step-by-step[ tutorial for beginners](/in-depth-guides/beginners-tutorial-to-automation-testing).&#x20;
* Are you a seasoned QA engineer? Learn more about BugBug [best practices](/best-practices) and advanced features such as [components](/editing-tests/components), [variables](/editing-tests/variables), and [waiting conditions](/preventing-failed-tests/waiting-conditions).
* Are you a CEO, CTO or project manager? See our [tech leader's guide to automation testing.](https://bugbug.io/blog/guides/tech-leaders-guide-to-automation-testing/)

![](/files/BkhBQnRFOzrIuByPkYPx)


# Best practices

## How to prepare your app for testing

#### 1) Ensure your environment is reachable from where tests run

Before you invest time in test coverage, decide where you will run tests:

* **Local** runs are fast for debugging.
* **Cloud** runs are best for schedules and uninterrupted monitoring.

If your app is behind a [VPN, firewall, or private network,](https://docs.bugbug.io/troubleshooting/vpn-or-a-firewall) cloud runners may not reach it without preparation. In that case, plan allowlisting or an accessible test environment.&#x20;

{% hint style="info" %}
[Read if cloud runs are intermittently failing.](/troubleshooting/cloud-tests-sometimes-failing)
{% endhint %}

#### 2) Add stable selectors (before you record tests)

Unstable selectors are the #1 cause of “element not found / element not visible” failures. Avoid relying on auto-generated CSS classes, dynamic IDs, or positional selectors (“second row”, “third button”). Instead, add stable attributes to key UI elements (for example `data-testid` or `data-test`).

What to tag first (Level 1 smoke paths):

* Primary CTA buttons (save, submit, checkout, confirm)
* Login inputs and submit button
* Navigation items
* Critical page headings and section titles you assert on
* Notifications/toasts and error banners

{% hint style="info" %}
Learn more about [Selectors](https://docs.bugbug.io/preventing-failed-tests/selectors) and [Common selectors issues](https://docs.bugbug.io/troubleshooting/common-selectors-issues).&#x20;
{% endhint %}

#### 3) Make UI behavior deterministic (remove randomness)

Automation works best when the same inputs produce the same UI every time. The usual sources of randomness are:

* A/B tests and feature flags that change layout or labels per session
* Personalization based on cookies/localStorage
* Non-deterministic data ordering in lists/tables

Practical patterns that work well:

* Disable experiments for automation traffic, or force a single variant.
* Provide a “test mode” parameter (for example `?e2e=1`) that disables non-essential UI variability.
* Keep a stable test dataset (seeded data, predictable records).

If experiments are involved, address them early, otherwise “flaky” becomes permanent background noise.

#### 4) Treat CAPTCHA as an environment constraint (not a test step)

CAPTCHA is designed to block automation. If your flows include CAPTCHA (signup, password reset, forms), plan a bypass for test runs.

A reliable approach is to implement a backend “skip CAPTCHA” mechanism that activates only when a secret custom header is present in requests from BugBug.

{% hint style="info" %}
Learn more about [CAPTCHA in automation testing.](https://docs.bugbug.io/troubleshooting/captcha-in-automation-testing)
{% endhint %}

#### 5) Secure your environment with HTTPS

Ensure your testing environment has a valid SSL certificate, as BugBug runs in incognito mode, which can block access to non-HTTPS sites or trigger security warnings that interfere with the test.

#### 6) Set up dedicated test accounts

Create specialized "test user" accounts dedicated solely to automation. If your product has different combinations of preferences or roles, create a separate user for each combination to reduce the number of steps in each test.

#### 7) Use waiting conditions and timeouts intentionally

Many failures are timing-related: the UI is correct, but the test attempts the next action before the element is ready.

Two levers matter most:

* [Waiting conditions](/preventing-failed-tests/waiting-conditions) (reduce the need for fragile “sleep” steps)
* [Timeouts](/preventing-failed-tests/timeout) (especially in cloud, where pages can load slower)

#### 8) Whitelisting for cloud access

If your application is behind a firewall or uses services like Cloudflare, you must whitelist BugBug cloud runner IP addresses to prevent "No Internet" or 403 errors during cloud execution.

#### 9) Manage MFA Exceptions

You should either create security exceptions for BugBug IPs or use specific testing accounts configured to bypass MFA.

#### 10) Parameterize environments and test data with variables

Hardcoding URLs and values across many tests becomes a maintenance trap (especially when you have staging/pre-prod variants).

Use variables to store:

* Base URL / domain
* Test user emails
* Common input values (product names, ZIP codes, etc.)

{% hint style="info" %}
Learn more about [Variables](/editing-tests/variables) and [Local Variables](/editing-tests/local-variables).
{% endhint %}

#### 11) Optimize network traffic

Investigate if your app sends frequent background requests (like monitoring pings). If these stack up, they can trigger timeouts because the runner waits for network requests to finish before moving to the next step.

{% hint style="info" %}
In BugBug, you can set the number of background requests as a waiting condition and adjust it to the specifics of your app.
{% endhint %}

#### 12) Build in observable checkpoints (assertions)

Stable automation is not only about clicking; it’s about verifying that the app is in the expected state.

Add assertions to confirm:

* Correct page/section is visible
* Expected text is present
* Error banners are absent (or present when expected)

{% hint style="info" %}
Learn more about [Assertions](/editing-tests/assertions).
{% endhint %}

## Mistakes to avoid

#### 1) Automation overload

Avoid the mistake of trying to automate every single feature immediately. Start with 5 to 10 short, simple tests that cover your "core features" - functions used by more than 80% of your users.

#### 2) Recording long “do-everything” tests too early

Long tests are hard to debug and fail for unrelated reasons. Prefer short, atomic tests that validate one intent at a time (login, create record, checkout, etc.). This improves signal and reduces maintenance.

#### 3) Relying on volatile selectors (dynamic classes, structure, position)

Avoid selectors that depend on:

* Auto-generated CSS class names
* Dynamic IDs
* Deep DOM structure that changes with minor UI refactors
* Positional targeting (“the second button in the row”)

#### 4) Forgetting "GoTo" steps

Every test or suite run must begin with a navigation to a URL. Skipping this step will cause immediate failure.

#### 5) Treating CAPTCHA as “something to click through”

If your flow has CAPTCHA, it will eventually block automated runs. Use a controlled bypass in a test environment (or a secure “test mode” mechanism).

#### 6) Running locally and minimizing the test window

Chrome may put minimized tabs into standby mode, which can stop JavaScript execution and break local runs. For uninterrupted operation, run tests in the cloud.

{% hint style="info" %}
Learn more about [Prohibited behaviors](/troubleshooting/prohibited-behaviors).
{% endhint %}

#### 7) Using static sleeps instead of waiting conditions

Hard-coded delays make tests slow and still unreliable (too short fails; too long wastes time). Prefer waiting conditions and tune timeouts where needed.

#### 8) Neglecting manual "Hover" recording

Do not assume the recorder will automatically catch all menu interactions; if your navigation relies on mouse movements, you must manually click the "Hover" action during recording.

{% hint style="info" %}
Learn more about [Hover test step](https://docs.bugbug.io/recording-tests-steps/recording-hover).
{% endhint %}

#### 9) Using shared accounts for Parallel runs

Do not use a single shared account for multiple tests intended to run in parallel. This often causes users to be suddenly logged out when another runner attempts to sign in. Unique accounts should be assigned to each test to maximize parallel potential.

#### 10) Ignoring the “cloud vs local” reality

Cloud environments can be slower than your laptop. If a test is stable locally but fails in the cloud:

1. Increase timeout for cloud runs.&#x20;
2. Confirm waiting conditions are enabled and appropriate.&#x20;
3. Check cloud [troubleshooting guidance](/troubleshooting/prohibited-behaviors).

#### 11) Ignoring test data cleanup

A common mistake is failing to clean up data created by a test. If a test creates a record but fails before it can archive it, the next run may fail due to duplicate entries; set up an initial group to check for and clean existing records as a failsafe.

#### 12) Duplicating shared flows everywhere instead of reusing them

If you copy/paste the same login flow into many tests, maintenance cost grows linearly. When you reach repeated blocks, consider extracting shared flows into reusable [components](/editing-tests/components).

###

### When something breaks: fast triage

If a test fails, this sequence resolves most issues quickly:

1. Confirm selector stability: [Selectors](https://docs.bugbug.io/preventing-failed-tests/selectors).
2. Check responsive duplicates / hidden elements: [Common selectors issues](https://docs.bugbug.io/troubleshooting/common-selectors-issues).&#x20;
3. Review timing and cloud differences: [Timeout](https://docs.bugbug.io/preventing-failed-tests/timeout) and [Cloud tests sometimes failing](https://docs.bugbug.io/troubleshooting/cloud-tests-sometimes-failing).
4. If the flow includes CAPTCHA: [CAPTCHA in automation testing](https://docs.bugbug.io/troubleshooting/captcha-in-automation-testing).&#x20;
5. Contact our helpful [Customer Support Team](https://bugbug.io/contact/).

{% hint style="danger" %}
[Check the list of error codes.](/debugging-tests/error-codes)
{% endhint %}

## Discover how to work with BugBug

We’ve prepared a short guide with essential recommendations on test automation that we created specifically for startups. We divided the guide into 3 levels:

[★☆☆ Level 1: get the most out of basic automation](https://bugbug.io/blog/software-testing/automation-testing-guide-for-startups-level-1/)

[★★☆ Level 2: automate hundreds of regression tests](https://bugbug.io/blog/software-testing/automation-testing-guide-for-startups-level-2/)

[★★★ Level 3: integrate with CI/CD builds](https://bugbug.io/blog/software-testing/automation-testing-guide-for-startups-level-3/)

## Also see&#x20;

If you're a beginner, don't forget to check our guide dedicated to non-technical people: [beginner's tutorial to automation testing with BugBug](https://docs.bugbug.io/in-depth-guides/beginners-tutorial-to-automation-testing)

<figure><img src="/files/28In1dtUxSPtju3dRb2G" alt="" width="375"><figcaption></figcaption></figure>


# BugBug App FAQ

<details>

<summary>What is BugBug, and how can it help me?</summary>

[BugBug](https://bugbug.io/) is a user-friendly, codeless test automation tool that enables teams to create and run automated tests for web applications — **no programming skills required**.

With BugBug, you can perform end-to-end (E2E), regression, functional, and UI testing, among others.

BugBug's [AI-Assisted Test Recorder](https://bugbug.io/ai-test-recorder/) handles selector picking, smart waits, and dynamic UI interactions automatically, so you get stable tests from the first recording, not after multiple debugging sessions.

It's ideal for fast-growing **startups**, **SaaS** teams, and **e-commerce** businesses, BugBug eliminates the complexity of enterprise solutions.&#x20;

BugBug is perfect for QAs, developers, and product managers looking for an efficient, hassle-free testing tool.

</details>

<details>

<summary>Do I need any technical skills to use BugBug?</summary>

No, BugBug is designed for technical but also non-technical users. With its intuitive, AI-assisted test recorder ([BugBug Chrome extension](https://chromewebstore.google.com/detail/bugbug-automation-testing/oiedehaafceacbnnmindilfblafincjb?hl=en)), you can easily create and manage tests— no programming experience required.

</details>

<details>

<summary>What is the BugBug Chrome extension?</summary>

[The BugBug Chrome extension](https://chromewebstore.google.com/detail/bugbug-automation-testing/oiedehaafceacbnnmindilfblafincjb?hl=en) is a user-friendly **AI-Assisted Test Recorder** you can add to your browser to record and execute tests.&#x20;

During recording, it automatically:

* Picks the most stable selector for each element (Adaptive Locators — no XPath or CSS needed)
* Mimics real user behavior when clicking and scrolling through dynamic UIs (Smart Click & Scroll)
* Handles slow and async pages with AI-assisted waits — no manual delays or timeouts required (Smart Waiting)

[Learn more about the AI test recorder](https://bugbug.io/ai-test-recorder/).

**Important!** To maintain test independence, BugBug launches each test in a fresh incognito window, ensuring a clean session free of cookies, cache, and local storage.

</details>

<details>

<summary>Can BugBug handle more complex testing scenarios?</summary>

Yes! BugBug is a simple yet powerful app, capable of testing even complex web applications.

With BugBug, you can use custom selectors, variables, and manually add advanced step types or assertions.&#x20;

You can also incorporate custom JavaScript code—giving you the flexibility to handle more demanding testing scenarios.

</details>

<details>

<summary>Do you offer unlimited users/seats?</summary>

Yes — **Pro** and **Business** include **unlimited users**, so you can invite your whole team without paying per seat.

On **Free**, you get **1 user**. On **Core**, you get **3 users**. Pro and Business remove seat limits entirely. Business also adds project access management, so larger teams can control who can access specific projects.

</details>

<details>

<summary>How do I record a test?</summary>

To record an automated test with BugBug, follow these steps:

1. **Install AI test recorder** (the BugBug Chrome extension): Download and install the BugBug Chrome extension to enable test recording.
2. **Create a new test:** In the BugBug app, click the “New test” button to create a new test and enter then the URL of the web application or website you want to test.
3. **Start recording:** Click the "Start recording" button; an incognito Chrome window will open, and BugBug will automatically record your interactions, such as clicks and form inputs.
4. **Perform test actions:** Navigate through your application, performing the actions you want to include in the test. BugBug captures each step.\
   While you interact with your app, BugBug's AI automatically selects the most stable locator for each element and handles smart waiting — so you don't need to worry about timing or selector quality during recording.
5. **Finish and save:** Once you've completed the desired actions, click the "Finish and close" button in the recorder menu to save your test.

**New to the AI-Assisted Test Recorder?** See the [AI Test Recorder FAQ](/recording-tests-steps/ai-test-recorder-faq) → for questions about Adaptive Locators, Smart Waiting, plan availability, and how BugBug compares to autonomous AI testing tools.

For more detailed guidance, refer to BugBug's[ Beginners tutorial to automation testing](https://docs.bugbug.io/in-depth-guides/beginners-tutorial-to-automation-testing) or watch the [demo video](https://bugbug.io/demo/).

</details>

<details>

<summary>How do I run a test?</summary>

To run an automated test with BugBug, follow these steps:

1. **Execute the test run:** Once you’ve recorded your test, click the “Run” button from the level of the recorded test steps.
2. **Observe BugBug repeating your actions:** Don't move your mouse cursor over the running test window. Don't minimize the window, as Chrome may stop executing the test if it's not visible.
3. **Check the test run result:** If your test passed, congrats! If your test failed, don’t worry; there might be several reasons for that. [Check the most common reasons here](https://docs.bugbug.io/in-depth-guides/beginners-tutorial-to-automation-testing#does-the-test-fail-fix-it-with-record-from-here).

</details>

<details>

<summary>How do I fix a failed test?</summary>

It really depends on the type of error.&#x20;

Check [how to prepare your app for testing](/best-practices) and [the most common pitfalls](https://docs.bugbug.io/best-practices#mistakes-to-avoid) .

Check other ways to troubleshoot your test [here](https://docs.bugbug.io/troubleshooting/prohibited-behaviors).

</details>

<details>

<summary>Does BugBug support parallel test run execution?</summary>

Yes, you can run your tests [in the cloud](https://docs.bugbug.io/running-tests/in-cloud-on-server) *in parallel*, which means that more than one test will be executed at the same time.&#x20;

You can purchase parallel runs on the **PRO** and **BUSINESS** plans—either directly in the BugBug app or when selecting your plan.

Simply go to the **Subscription tab**, choose the number of parallel runs you need, and proceed to checkout.

Each additional parallel run costs **$80/month** for users on a monthly subscription.

If you're on an annual plan, you’ll receive a **15% discount** on this price.

</details>

<details>

<summary>How do I generate a test run report?</summary>

1. Go to `Runs History`
2. Switch to the `Suites` tab
3. Select a test suite.&#x20;
4. Click `Download PDF Report` button to generate and download the report.

**Learn more** about suite run reports [here](https://docs.bugbug.io/debugging-tests/runs-history#download-a-suite-run-report).

</details>

<details>

<summary>Can I export test results (PDF/CSV/JUnit XML)?</summary>

Yes.

* **PDF + JUnit XML:** Available as [Standard reports](/organizing-tests/reporting/standard-reports) (downloadable from Runs history) in the PRO plan.
* **CSV:** Available via [Advanced reports](/organizing-tests/reporting/advanced-reports) (includes CSV/JSON/ZIP + detailed PDF with step screenshots) and is limited to the BUSINESS plan.

</details>

<details>

<summary>Can I add my own JavaScript code in a test run?</summary>

Yes, adding a step with any JavaScript code as part of a test run is possible.

**Read more** about [custom JavaScript actions here](https://docs.bugbug.io/editing-tests/custom-javascript-actions).

</details>

<details>

<summary>Can recorded test runs be exported as code?</summary>

Not right now, but we're planning to add this feature soon.

</details>

<details>

<summary>Can I run BugBug tests in CI/CD pipelines?</summary>

Yes, you can integrate BugBug with your CI/CD build pipelines, such as Github, Gitlab, Travis, Jenkins, or Bitbucket, via Command Line Interface (CLI) or BugBug's public API.

</details>

<details>

<summary>Does BugBug integrate with other tools we use?</summary>

Yes, BugBug seamlessly integrates with popular tools like Slack, Zapier, GitHub, GitLab, Bitbucket, JIRA, and Trello, making your workflow more efficient.

**Learn more** about BugBug's [integrations](https://docs.bugbug.io/integrations/api).

</details>

<details>

<summary>Do you support testing native applications for Windows, iOS or Android?</summary>

No, BugBug is specifically designed for **testing web applications**. At this moment, we do not support testing native mobile or desktop applications.

</details>

<details>

<summary>Which browsers are compatible with BugBug?</summary>

BugBug supports all **Chromium-based** browsers, including Google Chrome, Edge, Opera, and Brave.&#x20;

We don't support Firefox or Safari. This is a conscious trade-off. We are dedicated to providing the best-in-class experience of creating and running tests, and Chrome is the most popular browser with the best API to achieve that.

</details>

<details>

<summary>Where is customer data hosted (EU/US)?</summary>

BugBug’s primary infrastructure is hosted in the EU specifically, BugBug's servers are located in Gdańsk, Poland.

</details>

<details>

<summary>How is data from recorded test runs stored?</summary>

The data used in test runs is securely recorded in our database and stored in the **IQ cloud** (Poland -[ https://www.iq.pl/data-center](https://www.iq.pl/data-center)).&#x20;

**Important!** Access to the database is **strictly limited** to the BugBug application infrastructure. We take every precaution to prevent data leaks.

</details>

<details>

<summary>How secure is BugBug?</summary>

We've put a lot of effort into securing BugBug. Most of our team have experience in security or compliance. Even the CEO has a security background.

* We built BugBug with the best software practices (SSL, encrypted passwords).
* We do security audits yearly, with a top security researcher (who is a shareholder of BugBug, by the way).
* BugBug uses physical infrastructure with Proxmox virtualization, giving us extra secure containerization.
* Our servers are located in Gdansk (Poland - <https://www.iq.pl/data-center>).
* Tests in the cloud are run separately from each other, which significantly reduces the risks.
* We have an internal policy with different roles for our employees. Only the IT department has access to the customers' data.&#x20;

</details>

<details>

<summary>Is a standalone version of BugBug available?</summary>

Currently, BugBug is only available as a cloud-based Software as a Service (SaaS), meaning it cannot be installed on-premises or on a local network. However, we plan to introduce this option in the future.&#x20;

</details>

<details>

<summary>Is it possible to make a request to the external API?</summary>

Yes, it is possible to make a request to the external API and check the result as a part of a test run when you use your own JavaScript code, such as &#x61;**`fetch()`** function.

</details>

<details>

<summary>What kind of support is available if I encounter issues?</summary>

BugBug provides fast and reliable support via email. Need assistance? Contact our Customer Support team at <info@bugbug.io> or use [contact form](https://bugbug.io/contact/).

</details>

<details>

<summary>Where can I find tutorials or guides to help me learn BugBug?</summary>

BugBug provides comprehensive [documentation](https://docs.bugbug.io/) and [in-depth guides](https://docs.bugbug.io/best-practices), including a beginner's tutorial to automation testing.

**Tip!** Watch the full BugBug demo video [here](https://bugbug.io/demo/).

</details>


# Setup BugBug

Start your test automation for free with BugBug. Sign up for a free plan with unlimited local test runs and try our advanced features for 14 days.

## **Quick and hassle-free setup**

* BugBug set-up takes only a few minutes
* It doesn't require any engineering skills, you just need a basic knowledge of HTML
* You can try BugBug for free, no credit card is required
* The free 14-day trial will start automatically and give you access to premium features right away
* After the trial ends you can stay on a free plan or start a subscription - see [pricing](https://bugbug.io/pricing/)

## Sign up

You have few options to [sign up](https://app.bugbug.io/sign-up/)&#x20;

* with your email address
* with GitHub account
* with Micrsoft account
* with your Google account.

![](/files/SBkkuBCe1NVDsGAa08j5)

After registration go to your email inbox and **confirm your BugBug account.**

![](/files/FGF7BVoe64hVsPaa1VFU)

## Install Test Recorder

To run and record tests, BugBug requires you to install the [BugBug Chrome Extension Test Recorder](https://chromewebstore.google.com/detail/bugbug-automation-testing/oiedehaafceacbnnmindilfblafincjb?hl=en-US\&utm_source=ext_sidebar) and enable it in Incognito mode.

<figure><img src="/files/SNrM4jnGnR5T1K6KSRhN" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
[Read the BugBug Test Recorder guide.](/quick-start/install-test-recorder)
{% endhint %}


# Install Test Recorder

Run and record your tests with BugBug Chrome Extension in incognito mode. See how easy is the process of setting up BugBug for your test automation.

### Why do you need the test recorder?

To run and record the tests, BugBug requires you to install a Chrome Extension-based test recorder.

This extension must be installed and **enabled** **in** **Incognito** **mode**.

![](/files/hE7nkVVItc1QuyLutNfT)

### Why does the extension require incognito mode?

Each test should run in complete isolation to ensure reliability and consistency. This means starting every test with a clean environment — free of cookies, cache, localStorage, and other session data.

To achieve this, BugBug executes tests in Incognito mode. Every test run begins by closing any existing Incognito session and opening a new window, guaranteeing a fresh, clean state each time.

### Install the extension

Go to [BugBug Extension on the Chrome Webstore](https://chrome.google.com/webstore/detail/bugbug-no-code-test-autom/oiedehaafceacbnnmindilfblafincjb/related) and install it.

![If you try to run or record the test without the extension you will see a prompt](/files/SNrM4jnGnR5T1K6KSRhN)

### Enable the extension in Incognito mode

![If you don't enable the extension in incognito mode, you will ba asked to do so before running a test](/files/nfA4n6KQ1dfKd7g5hv9o)

1. Go to extension settings by clicking the **"Go to extension settings"** button or use the link below

`chrome://extensions/?id=oiedehaafceacbnnmindilfblafincjb`

Scroll down, then enable the switch near **"Allow in Incognito"**

![](/files/YNmKL87g6EDqqd0osJyf)

That's it! You're ready to run and record the tests now.

***

#### \[Opera Only] Allow access to search page results

The BugBug extension requires the 'Allow access to search page results' permission to function properly in Opera. When this option is disabled, Opera blocks access to sandboxed iframes, such as reCAPTCHA. Therefore, attaching to tabs containing these types of frames is not allowed.

{% hint style="info" %}
We take your privacy seriously. This permission is used solely for recording and running tests.\
We never collect, store, or share your search queries or personal data.
{% endhint %}

1. Go to extension settings by clicking the "Go to extension settings" button or use the link below

   `chrome://extensions/?id=oiedehaafceacbnnmindilfblafincjb`&#x20;
2. Scroll down, then enable the switch near "Allow access to search page results"

<figure><img src="/files/W1fEBkp7PSbDOjwKoYgK" alt=""><figcaption></figcaption></figure>


# Your first automated flow

Setting up a fully automated regression workflow ensures that your critical user flows are continuously tested without manual effort. It helps you catch issues early, reduce the risk of regressions, and maintain confidence in every release.&#x20;

With test automation in place, your team can move faster while keeping product quality consistent.

Follow the steps below to set up your first automated test workflow with BugBug.

### 1. Install Test Recorder

To record and run tests in BugBug, you need to install [**the BugBug Chrome Extension**](https://chromewebstore.google.com/detail/bugbug-automation-testing/oiedehaafceacbnnmindilfblafincjb?hl=en-US\&utm_source=ext_sidebar) and enable it in Incognito mode.

1. Install the **BugBug Chrome Extension** from the Chrome Web Store.

<figure><img src="/files/hE7nkVVItc1QuyLutNfT" alt=""><figcaption></figcaption></figure>

2. Open Chrome Extensions settings and enable **Allow in Incognito** for BugBug.

{% hint style="info" %}
**Why this matters**

BugBug runs tests in an incognito window to ensure a clean, isolated environment without cached data, cookies, or extensions interfering with your test results.
{% endhint %}

3. Make sure the extension is pinned for quick access while recording tests.

{% hint style="success" %}
**Tip:** Before recording your first test, close any unnecessary tabs and make sure you’re logged out of your app—this helps simulate a real user journey more accurately.
{% endhint %}

***

### 2. Record test

With the BugBug Test Recorder, you can now create your first automated test.

1. Enter the URL of the web app or website you want to test.
2. Click the **Start recording** button.<br>

<figure><img src="/files/Gv25paTnZVyvB1Rbt9AB" alt=""><figcaption></figcaption></figure>

Your application will open in a new incognito window, and you’ll see the BugBug recorder overlay in recording mode.<br>

3. **Interact with your app** just like a real user would—click, type, navigate between pages, and complete actions. BugBug automatically captures these interactions and converts them into test steps.

<figure><img src="/files/aizNQeF5kqQZ9Bms64Vs" alt=""><figcaption></figcaption></figure>

{% hint style="warning" %}
**Important**

Hover actions are not recorded automatically. If your test depends on hover states (e.g., dropdown menus), you’ll need to add those steps manually.
{% endhint %}

\
4\.  **Add assertions** to verify key elements of your flow like: login success, dashboard visible, checkout confirmation, etc.

5. When you’ve finished recording all necessary steps, click **Finish and close** in the recorder overlay. Your test will be saved automatically.&#x20;

You now have your first automated test 🎉

{% hint style="info" %}
[Read the full test creation guide.](/creating-tests/recording-the-tests)
{% endhint %}

***

### 3. Run your test

To validate that the steps you’ve recorded work correctly, you need to run the test.

We recommend starting with a local run, and then verifying the results again in the cloud.

1. Open your test in the editor view (where your recorded steps are visible).
2. Click the **Run** button.

<figure><img src="/files/lEovSqzOkkVeicMtDffC" alt=""><figcaption></figcaption></figure>

BugBug will open a new *incognito* *window* and replay all recorded actions exactly as they were captured.

3. You can watch the test execution in real time. If everything works correctly, you’ll see a **Test Passed** status in the BugBug recorder overlay.

<figure><img src="/files/AZFX5U2WJ01ZHs8WXsKR" alt=""><figcaption></figcaption></figure>

**If the test fails:**

* Review the step where the failure occurred
* [Check the error codes](https://docs.bugbug.io/debugging-tests/error-codes)
* Check selectors, timing, or missing assertions
* Update the test and run it again

{% hint style="success" %}
**Tip:** It’s normal for the first run to reveal small issues (e.g., timing or dynamic elements).&#x20;

[Read this best practices guide on how to prepare your app for automated testing.](https://docs.bugbug.io/best-practices)
{% endhint %}

Once your test passes locally, you’re ready to move on to the next step.

***

### 4. Create test suite

Once your first test is ready and validated, the next step is to **group it into a test suite**.&#x20;

Test suites allow you to organize multiple tests and run them together as a regression workflow.

1. Go to the **Suites** section.
2. Click the **New suite** button.
3. Give your suite a clear name, for example: Regression - Core flows.
4. Add your recorded test to the suite.

{% hint style="success" %}
**Tip:** Group tests by feature or user journey (e.g., login, checkout, onboarding) to keep your suites maintainable and easy to scale.
{% endhint %}

You now have a basic regression suite.

{% hint style="info" %}
[Learn more about Suites.](/organizing-tests/suites)
{% endhint %}

***

### 5. Run the suite in the cloud

Running tests locally is useful for quick validation, but to **fully automate** regression testing, you should run your suite in the cloud.

1. Open your test suite.
2. Click the **Run in cloud** button.
3. After the run finishes, review the results, screenshots, and logs to verify everything works as expected.

<figure><img src="/files/BcT1CidYotF7VCboowdh" alt=""><figcaption></figcaption></figure>

{% hint style="success" %}
**Tip:** Cloud runs eliminate dependency on your local machine and allow faster execution, especially as your test suite grows.
{% endhint %}

***

### &#x20;6. Schedule automated runs

Automated testing becomes **powerful when it runs automatically**. To turn your suite into a true regression workflow, you need to run it automatically on a schedule.

1. Go to the **Schedules** tab.
2. Click the **Create schedule** button.
3. Choose the suite you want to run automatically.

<figure><img src="/files/xsZCikmH1Cp9X2NiXgaT" alt=""><figcaption></figcaption></figure>

4. Choose how often you want to run your tests (e.g., every day, every hour, or after each deployment).

{% hint style="success" %}
**Tip:** Start with daily runs and increase frequency as your confidence in test stability grows.
{% endhint %}

Your regression suite will now run automatically without manual intervention.

<figure><img src="/files/8SUDNmUErVZWU1tIU1Xh" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
[Learn more about Schedules.](/running-tests/schedules)
{% endhint %}

***

### &#x20;7. Set up alerts

To stay informed about failures, configure notifications so your team can react quickly.

1. Go to **Alerts** in the left menu.
2. Click the **New alert** button
3. Choose when the alerts should be sent
4. Choose your preferred notification channel (e.g., email, webhook, Slack).

{% hint style="success" %}
**Tip:** Send alerts to a shared team channel to ensure visibility and faster response times.
{% endhint %}

<figure><img src="/files/3PpgeaSNKHVZd1bEtfPm" alt=""><figcaption></figcaption></figure>

5. Save your configuration and create an alert.

{% hint style="info" %}
[ Learn more about Alerts.](/collaboration/alerts)
{% endhint %}

**You now have your first automated regression workflow up and running 🎉**

Your tests are recorded, grouped, executed in the cloud, scheduled, and monitored—fully automated.

<br>


# Create your project

You have logged in to BugBug and let's take a ride! Create your first project to organize your automated tests and suites.

## What is a project?

* Use projects to organize your tests and suites
* Each project has separate independent project settings
* Everyone in your organization can access all projects

### **How to name a project?**&#x20;

Usually, project name is the same as the name of the app or a website that you want to test. For example if you want to test the ticket reservation system of `ExampleAirlines.com` name your project "Example Airlines"

### **How many projects should I have?**&#x20;

If you work on one product only, you probably only need one project. Add more projects if you work for several clients, different products or very complex products that require splitting for multiple setups.

![](/files/AUoPkmK5McmfQiL4s65G)

## Create a new project

1. Click the BugBug logo in the top-left to see the list of projects
2. Click `New Project` button.
3. Enter the name of a new project. Usually, this is just the name of your product brand.
4. Enter the URL of the product you are about to test.
5. Submit by clicking the `Create project` button.

## Check out the Example Project

You can also learn about BugBug features by exploring the Example Project, that is immediately available after you register your new account.

The example project shows a couple of simple tests on a fake registration page. After you see these simple examples, learn more about [testing registration & login with variables](/editing-tests/variables#test-user-registration-and-login-using-variables).

### **Where is the example project?**

1. Click the BugBug logo to see the list of projects
2. Click `Example Project`
3. You can see or modify existing test cases or start your own test


# Your first test

Learn the basics of creating your first automated test with BugBug. The process is very simple and doesn't require any coding knowledge. See how easy it is to run your first test.

## Learn the basics

If you're new to test automation, see our "[**how to" guide -->**](/in-depth-guides/beginners-tutorial-to-automation-testing)

{% hint style="success" %}
[Read how to prepare your app for automated testing and avoid common pitfalls.](/best-practices#how-to-prepare-your-app-for-testing)
{% endhint %}

## Create your first test

1. Think upfront of what do you want to test - choose a one simple use case
2. Create a new test
3. Enter the URL of the web app or website that you want to test
4. Click "Record" - if you [installed the extension](/quick-start/install-test-recorder), the incognito Chrome browser window should appear
5. Carefully click the elements to navigate - each click will be recorded automatically
6. Don't forget that [hovers are not automatically recorded](/recording-tests-steps/recording-hover)
7. When you are ready with the test case click the `Finish and close` button in the [overlay menu](/recording-tests-steps/bugbug-ai-test-recorder) on the right
8. Now run the test to see if everything was correctly recorded

{% hint style="danger" %}
**Hovers are not automatically recorded!** You need to [record in hover mode](/recording-tests-steps/recording-hover) by activating it in the [recording overlay](/recording-tests-steps/bugbug-ai-test-recorder).
{% endhint %}

<figure><img src="/files/Tby73ubyCoKecRhkYd5y" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/QVQH1a36TeGh9F9YO2aA" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/nwrMrOAtZDzyYxRZdGFp" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/PG0RWtbJa2ZWfKyF95yS" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
BugBug recording does not support multiple browser window testing. You can only record in one window, but we support multiple tabs and user movement between them.
{% endhint %}

## Manually reviewing and adding steps after the recording

You don't need to use recording, you can also create your tests step by step by adding particular actions and their parameters. This is however much slower!&#x20;

You can [manually edit steps](/editing-tests/manually-creating-the-test) anywhere in your test by clicking the plus symbol between the rows.

![](/files/3MQCd5iBZMXCPhcM7zHH)

You can modify the particular step when some element is not correctly caught by the BugBug's recording. Edit, run the test again, and check if it is working!&#x20;


# Independent tests

Learn why independent tests are crucial for end-to-end testing process. A good practice in automation testing is that every test is completely independent of other tests.

## Why create atomic, independent tests?

A good practice in automation testing is that every test is completely independent of other tests.

**Atomic tests:**

* do not rely on their order&#x20;
* have no dependencies between them, no shared variables
* do not require any additional manual preparation
* they are small, they should verify just one feature

**Benefits of independent end-to-end test cases:**

* Easier debugging
* Can be run in[ parallel](/running-tests/parallel-mode)
* Easier team collaboration

## Can I order tests?

Ordering tests it's not recommended practice, because end-to-end tests should be atomic (see [above](#why-create-atomic-independent-tests)).

**Example test case:** \
[register a new user](/editing-tests/variables#test-user-registration-and-login-using-variables) --> login to an admin panel --> check if the user exists --> delete the user&#x20;

You might be tempted to create one test for user registration and one for checking if the user is created. **But all of these steps should be in one test only.** You can't split it because one of the tests would need to wait until the first is finished. You won't be able to run the second test without running the first one, it will just lead to problems and so-called *spaghetti* between the tests.&#x20;

Solution: simply create a single test with all of these steps, no dependencies, no problems :smile:

That's why BugBug doesn't allow you to order tests and combine them or create separate "before & after" steps, even in a [test suite](/organizing-tests/suites). It's better to [duplicate the tests](/creating-tests/duplicating-tests) and use [components to share steps between tests](/editing-tests/components).

Here's an e


# Duplicating tests

See how to duplicate your tests with BugBug without a need to create them from scratch.

You don't need to create tests from scratch. You can duplicate them and then edit them. You can also use "[New test from here](/creating-tests/new-test-from-here)". This will keep all the shared [components](/editing-tests/components).

You can duplicate tests

* from the tests list
* from the test details, when editing a test

![Duplicate from the tests list](/files/3EcYuSaljGD0o0gM4Qcx)

&#x20;

![Duplicate from test details](/files/QJjj5nTR0bEbVx3k2drm)


# New test from here

See how to avoid recording the same test steps multiple times. With BugBug you can duplicate them so that only part of the steps is copied over.

To avoid recording the same test steps multiple times you can duplicate them so that only part of the steps is copied over.&#x20;

This is useful if you want to test different variants of the same user flow or if you want to reuse your previously recorded [components](/editing-tests/components).

{% hint style="info" %}
**Important!** "New test from here" action is not available between individual steps of a group. Use it before or after a group, so between the groups.&#x20;
{% endhint %}

See the image below - all the groups below the purple line will be removed in the newly duplicated test.&#x20;

![](/files/0pj4cq5mDPXzkpqm5wGw)


# BugBug AI test recorder

Learn how BugBug overlay works while recording your test. Record all clicks, catch selecting form elements, navigate to URLs and record typing in the text fields.

The BugBug Chrome extension records your interactions with a web app and turns them into automated test steps. Three **AI capabilities** run automatically in the background during every recording — no configuration needed.

{% hint style="info" %}
To run or record the tests, you need to install[ **BugBug Chrome extension**](/quick-start/install-test-recorder)**.**
{% endhint %}

### Recording overlay

<figure><img src="/files/qII4M02QmWNPvsSkQ26P" alt=""><figcaption><p>BugBug AI test recorder</p></figcaption></figure>

When recording starts, a BugBug panel appears on the right side of the page. By default, BugBug captures all clicks, form inputs, URL navigation, and keyboard typing automatically.

Use the panel buttons to record additional action types:

* [Assertion](/editing-tests/assertions) — to check that specific content is visible on the page
* [Hover](/recording-tests-steps/recording-hover) — for menus or elements that only appear on mouse-over
* [Use email testing inbox ](https://docs.bugbug.io/editing-tests/variables#user-registration-and-login-using-the-bugbug-testing-inbox) — test signup and login flows with built-in email testing inbox&#x20;
* [Variables](/editing-tests/variables)  — for inserting dynamic pieces of text that you can use in your tests
* [Drag & drop](about:blank) — for drag-based interactions

{% hint style="info" %}
Learn more about BugBug [**AI test recorder**](https://bugbug.io/ai-test-recorder/)**.**
{% endhint %}

### What gets recorded automatically

| Action                                 | Recorded automatically?            |
| -------------------------------------- | ---------------------------------- |
| Clicks                                 | Yes                                |
| Keyboard typing                        | Yes                                |
| Form selection (dropdowns, checkboxes) | Yes                                |
| URL navigation                         | Yes                                |
| Hover                                  | Must be added manually via overlay |
| Scroll                                 | Yes                                |
| Drag & drop                            | Must be added manually via overlay |

{% hint style="warning" %}
**Important!** To maintain test independence, BugBug launches each test in a fresh incognito window, ensuring a clean session free of cookies, cache, and local storage.
{% endhint %}

### Recorder's AI capabilities

#### Adaptive Locators

When you click an element, BugBug generates multiple selectors and uses AI to pick the most stable one. It prioritizes data-testid attributes, semantic roles, and visible text — avoiding fragile dynamic IDs or positional CSS that break when the UI changes.

You don't need to write or edit any selectors. BugBug handles it during recording.

{% hint style="info" %}
Learn more about [Selectors](/preventing-failed-tests/selectors#adaptive-locators)
{% endhint %}

#### Smart Click & Scroll

BugBug mimics real user behavior instead of dispatching raw JavaScript events. Before each click, it checks whether the element is visible and reachable, retries if it's temporarily covered (e.g. by a cookie banner or animation), and automatically scrolls the page to bring the element into the viewport.

{% hint style="info" %}
Learn more about [Smart click](/preventing-failed-tests/smart-click) & [Smart scroll](/preventing-failed-tests/smart-scroll)
{% endhint %}

#### Smart Waiting

Before each test step, BugBug checks a series of conditions: Is the page done loading? Is the element visible? Is it finished animating? Is it active (not disabled)?

If the conditions aren't met yet, BugBug waits — so you don't need to add manual delay steps or tune timeouts.

{% hint style="info" %}
Learn more about [Waiting conditions](/preventing-failed-tests/waiting-conditions)
{% endhint %}


# Recording clicks

See how recording clicks work. By default, when you record a test, BugBug records all your clicks. You don't need to activate any recording mode.

By default, when you record a test, BugBug records all your clicks. You don't need to activate any recording mode.

When hovering over an item you will see a subtle border - this helps you to see which element you're about to click.

Clicking in the form elements is also automatically recorded, selecting radio buttons, checkboxes, and select options.

<figure><img src="/files/NiSviX17mz3iITQ8aLp9" alt=""><figcaption><p>Border around element pointed by mouse coursor</p></figcaption></figure>


# Recording hover

BugBug won't record hover events automatically. There is no reliable way of automatically detecting that something changed on the page because of cursor movement.

BugBug will not record hover (mouseover) events automatically. There is no reliable way of automatically detecting that something changed on the page because of cursor movement. You need to record a specific instruction that you want to hover an element.&#x20;

1. During the recording, click "Hover" in the [recording overlay](/recording-tests-steps/bugbug-ai-test-recorder).
2. Click the element that you want to hover.
3. Click "Exit hover mode".

<figure><img src="/files/SMgqbjKvUhpgnIafs8EW" alt=""><figcaption><p>To record mouseover steps you have to use Add hover</p></figcaption></figure>

{% hint style="info" %}
**Tip!** When you are in the hover mode, the elements are highlighted with a yellow color.
{% endhint %}


# Recording keyboard typing

See how to record keyboard typing with BugBug. During the recording, BugBug will automatically record everything you type in the text fields. You don't need to activate anything.

During the recording, BugBug will automatically record everything you type in the text fields. You don't need to activate anything.&#x20;

You can later [edit the recorded text manually](/editing-tests/manually-creating-the-test) if needed. Typing is reflected by `Type text` type of action.

{% hint style="info" %}
**Did you know?** When running a test, BugBug will simulate every keystroke, as if the user was really typing the text letter by letter. Learn more about [running tests](/running-tests/running-tests).
{% endhint %}

![](/files/M0KNbkQWlasAj2GGBaGn)


# Recording assertions

Learn what an assertion is and how to use it during recording your test with BugBug. Use assertions to check if your page behaves as it should, without interacting with it.

## What is an assertion?

You assert that some condition is met, and if it isn't, the test should fail.

## How to record an assertion?

You can add more advanced assertions manually - learn more about [assertions and their types](/editing-tests/assertions).

1. Start [recording test steps](/recording-tests-steps/bugbug-ai-test-recorder)
2. Click `Add assert`
3. Click the element that you want to check: every time the test is run BugBug will check if this element contains the same text or is visible on the page

<figure><img src="/files/VRktxIQXXnPZWuWc4BcS" alt=""><figcaption><p>Add assert option on the recorder</p></figcaption></figure>

You can also enable the "**Add multiple**" toggle, to select various elements on the page at once. Such as checking if all the elements are in place in the main navigation menu.

<figure><img src="/files/1Kk7YtDiZjYh82hllSSk" alt=""><figcaption><p>"Add multiple" toggle disabled</p></figcaption></figure>

<figure><img src="/files/qbYYwGHSrjrclkqxjbI7" alt=""><figcaption><p>"Add multiple" toggle enabled</p></figcaption></figure>


# Recording drag & drop

{% hint style="warning" %}
**Coming soon!** We are working hard to add support for recording of drag & drop soon.
{% endhint %}


# Record from here

Read about Record from here feature. BugBug allows you to start recording from any step in your test. No need to record from scratch every time.

You do not need to record from scratch every time! Need that in the middle of an existing test? No problem!  ✨

You can start recording from any step in an existing test. Go to the test details and:

1. Hover on a step you want to record from
2. Click `+` icon
3. Click `Record from here` option
4. The recording window will open, and the test will run until the given step
5. The recording mode will activate, and you can continue recording new steps *from here*

<figure><img src="/files/sbze0kWCcGXMv0Wa3WKj" alt=""><figcaption><p>Click "Record from here" to execute test to a given position and enable recording mode</p></figcaption></figure>

<figure><img src="/files/RVw3DlpYE36SQDJXZRwC" alt=""><figcaption><p>Recording mode in the webapp UI</p></figcaption></figure>

<figure><img src="/files/fsavrsuXpjLfIM82EnKF" alt=""><figcaption><p>Recording mode is activated in the browser window with a test</p></figcaption></figure>

All newly recorded steps will be automatically added to a test without any extra confirmation and will have a `NEW` badge, as shown in the screenshot below.

<figure><img src="/files/8ul6layuAJqx5vE8fzsd" alt=""><figcaption><p>Newly recorded steps with the NEW badge</p></figcaption></figure>

### Changing the recording position

BugBug also allows you to **change the current recording position**. To do this, drag & drop the recording position from the web app UI.

<figure><img src="/files/wbBfUZIsgwJJNkXLcxiM" alt=""><figcaption><p>Movable recoding position</p></figcaption></figure>

This feature lets you record new steps in multiple test positions within a single recording session. If you want to pause the recording to set your application state manually and continue recording again, you can do this by clicking `Pause` button, and then you can continue recording by clicking the `Record` button.&#x20;

<figure><img src="/files/8z5sYUIVhKUeOVQBPz4G" alt=""><figcaption><p>You can pause recording and enable it again by clicking Record button</p></figcaption></figure>

You can also continue recording from the current end of a test case - just click the button `Record from here` at the end of a test. Newly recorded steps will appear in the new group.&#x20;

![Record from here at the end of the test](/files/EM4iPTk8sUvKRgSNGRUx)

### Resume execution after recording new steps

BugBug allows you to resume executing the test after recording without starting the test from the beginning. This awesome feature significantly reduces the time spent on fixing the test.

The common scenario looks like this:

* Record new steps inside the test
* Pause recording
* Change playback position before newly recorded steps
* Resume a test

<figure><img src="/files/2eoFpuO4qPVMs0aFUOuy" alt=""><figcaption><p>Change playback position and click Resume button to execute newly recorded steps</p></figcaption></figure>

<figure><img src="/files/2hStAUvktX177bE4p8tl" alt=""><figcaption><p>You can resume execution from BugBug overlay</p></figcaption></figure>

You can repeat the record and replay sequence as many times as you like. Enjoy BugBug's flexibility!

{% hint style="info" %}
We also recommend reading about [Edit & Rewind](/workflow-tips/edit-and-rewind) feature that explains more about how to fix broken tests easily.
{% endhint %}


# Re-recording steps

See how easy it is to re-record test steps with BugBug. If your test failed and you need to fix it, it's way faster to record the steps "from here" rather than edit them manually.

If your test failed and you need to fix it, it's faster to [record the steps "from here"](/recording-tests-steps/record-from-here) rather than [edit them manually](/editing-tests/manually-creating-the-test).

1. Find the step that failed
2. Delete it
3. Record from here
4. Record a new step(s)
5. Stop recording

![](/files/Wm9RjP3WoOELohgp76Fj)

New recorded steps will have the `NEW` badge. BugBug allows you to record & execute recorded steps in the same session using [Edit & Rewind](/workflow-tips/edit-and-rewind) feature.


# Recording pop-up window actions

## Problem statement

Currently, you can record actions on pop-up windows both during the recording process and while running tests.

This is especially helpful in scenarios where, for example, the user logs in to his or her account using authorization from an external third-party service - e.g. *Google authentication* or similar.

### How does it work?

To put it simply, BugBug forces the opening of a pop-up window in a new browser tab and changes the context for it, e.g. in the scenario of logging in with an external account *(e.g. Google auth.)*,  and after correct authorization, the browser tab is automatically closed as if it had happened with a pop-up window.<br>

{% hint style="info" %}
As an example, we used the Podio page.
{% endhint %}

#### **Regular view:**

<figure><img src="/files/x96EtB4n9RWUosDqhKYv" alt=""><figcaption><p>Regular pop-up window</p></figcaption></figure>

####

#### While recording the same step/flow in BugBug:

<figure><img src="/files/9yXPbI2HidfQpgImFRuO" alt=""><figcaption><p>The tab pop-up doesn't appear yet</p></figcaption></figure>

<figure><img src="/files/dZnmGK85nqNlLnwElcxY" alt=""><figcaption><p>The pop-up opens in a new browser tab</p></figcaption></figure>

## Recording a test with pop-up window handling

1. Create a new test (or edit an existing one)
2. Start recording new steps&#x20;
3. Record a click action on a button/element that opens a new popup window. Instead of a new pop-up, the page will open in a new browser tab, and the context will automatically switch to that tab as the active tab
4. Perform all actions on this tab, i.e. provide login details and complete the whole flow. Based on the login flow using an external 3rd party account (e.g. Google account), the tab will be automatically closed when it is completed - just as it would be in a pop-up window, and all actions will be recorded.&#x20;
5. When you automatically switch to the currently active tab, you can continue to record actions on that tab


# Using keyboard shortcuts

## Overview

To make it easier to work around the recording action, we have added keyboard shortcuts that can be used during test recording. This should make it easier to switch between different options within the BugBug test ecorder.

{% hint style="info" %}
Generally, the shortcut *number* represents the button position for each option.
{% endhint %}

![BugBug Recorder](/files/nod0duN6kqEPzxEyxuPp)<br>

## Possible uses and combinations of keyboard shortcuts

{% hint style="info" %}
This description and keyboard shortcuts are based on a **Windows and Linux** operating system.

If you are using a different operating system, please note that you will need to use an appropriate related shortcut, e.g. for **MacOS** users use i.e. ***"Control + Option + ${key}"***.&#x20;

However, in BugBug Recorder we display shortcuts that are adapted to the system you are working on.
{% endhint %}

| Shortcut combination | Feature           | Comments                                                                                                                                                                                                                                                                                                                        |
| -------------------- | ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Ctrl + Alt + 1**   | *Add assert*      | If *"Add Assert"* mode is enabled and you use the shortcut again, it will be disabled.                                                                                                                                                                                                                                          |
| **Ctrl + Alt + 2**   | *Add hover*       | As before, using the shortcut again will disable this mode.                                                                                                                                                                                                                                                                     |
| **Ctrl + Alt + 3**   | *Inbox*           | It will show you the "*Open Inbox for a special test email address"* view with realted options.                                                                                                                                                                                                                                 |
| **Ctrl + Alt + 4**   | *Variables*       | It will show you the "*Variables"* view with realted options.                                                                                                                                                                                                                                                                   |
| **Ctrl + Alt + 5**   | *Pause recording* | <p>This will bring up the "<em>Pause recording"</em> view with its associated options.<br><br>While you are in this view, you can alternatively use two other shortcuts:<br>\* <strong>Ctrl + Alt + 1</strong> to resume recording<br>\* <strong>Ctrl + Alt + 2</strong> that will finish and close your recording session.</p> |
| **Ctrl + Alt + 6**   | Finish and close  | It will end and close your recording session.                                                                                                                                                                                                                                                                                   |

##

## Workflow tips

Some of the shortcuts are also available in the BugBug Runner view, so you can use them there as well.

Meaning:

* **Ctrl + Alt + 1** to start recording additional steps
* **Ctrl + Alt + 2** to finish the test and close the window

<figure><img src="/files/MMyJnHEMXjQUe108jQBr" alt=""><figcaption><p>BugBug Runner</p></figcaption></figure>


# AI test recorder FAQ

<details>

<summary><strong>What is the AI-Assisted Test Recorder?</strong></summary>

BugBug's [AI-Assisted Test Recorder](https://bugbug.io/ai-test-recorder/) is the Chrome extension that records your interactions and automatically applies three AI-powered capabilities to make tests stable from the first run:

* [Adaptive Locators](/preventing-failed-tests/selectors) — AI evaluates multiple selector strategies for each element and picks the most stable one. It prioritizes data-testid attributes, semantic roles, and visible text over fragile dynamic IDs or positional CSS.
* [Smart Click & Scroll](/preventing-failed-tests/smart-click) — AI mimics real user behavior when interacting with dynamic UIs, reducing failures caused by elements that appear only on hover or after scroll.
* [Smart Waiting](/preventing-failed-tests/waiting-conditions) — AI detects when a page or element isn't ready and waits appropriately — no manual sleep steps or timeout tuning required.

These features work automatically during recording. You don't configure them; you just click through your app as you normally would.<br>

</details>

<details>

<summary><strong>Does the AI recorder fix failed tests automatically?</strong></summary>

Not automatically, but it significantly reduces why tests fail in the first place. Adaptive Locators choose stable selectors at recording time, and Smart Waiting eliminates the most common timing-related failures.

When a test does fail, BugBug gives you the tools to fix it quickly:

* [Edit & Rewind ](/workflow-tips/edit-and-rewind)— re-record from any specific step without starting over.
* [Record from here](/recording-tests-steps/record-from-here) — add missing steps (like a forgotten hover) at the exact point of failure.
* [Screenshots](/debugging-tests/screenshots) — captured at each failed step so you can see what BugBug saw.

</details>

<details>

<summary><strong>Are the AI features available on all plans, including the Free plan?</strong></summary>

Yes. The [AI-Assisted Test Recorder](https://bugbug.io/ai-test-recorder/) — including Adaptive Locators, Smart Click & Scroll, and Smart Waiting — is available on all plans, including Free. These features are part of the core recording experience, not a paid add-on.

Features that require a paid plan are cloud test runs, parallel execution, scheduling, and advanced reporting.

\
See full plan comparison: [bugbug.io/pricing](https://bugbug.io/pricing/)

</details>

<details>

<summary><strong>How does BugBug handle dynamic UIs and pages that change frequently?</strong></summary>

Dynamic UIs are one of the most common causes of broken tests in other tools. BugBug's AI recorder addresses this at three levels:

* **Adaptive Locators** avoid brittle CSS class names and dynamic IDs — the selectors it generates are much less likely to break when your UI is updated.
* **Smart Click** handles elements that only appear on hover, after animations, or inside modals — it mimics real user behavior rather than blindly targeting a DOM coordinate.
* **Smart Waiting** detects when the page is still loading or an element isn't yet interactive, and waits accordingly instead of failing immediately.

\
For highly dynamic content (live lists, search results, real-time data), you may still want to use [variables](https://docs.bugbug.io/editing-tests/variables) or [conditional logic](https://docs.bugbug.io/editing-tests/actions) for the most reliable results.

</details>

<details>

<summary><strong>Does BugBug generate tests automatically from a URL or description?</strong></summary>

Not currently. BugBug's AI assists and stabilizes the recording process — it doesn't generate test steps from a prompt or crawl your app autonomously. You record tests by interacting with your application yourself, and the AI works in the background to make those recorded steps stable and reliable.

This is a deliberate design choice: you stay in control of what gets tested, and every step is transparent and auditable by your team.

\
If fully autonomous AI test generation is a priority, we recommend checking out our [roadmap](https://bugbug.io/contact/) or contacting support to share your use case.

</details>

<details>

<summary><strong>Will using BugBug's AI features send my app's data to a third-party AI provider?</strong></summary>

BugBug's infrastructure is hosted in the EU (Gdańsk, Poland) and access to the database is strictly limited to the BugBug application. The AI capabilities in the test recorder (Adaptive Locators, Smart Click & Scroll, Smart Waiting) operate within BugBug's own infrastructure — your app's content and test data are not passed to external LLM providers as part of normal recording or test execution.

\
For more on data security, see: [How secure is BugBug?](https://docs.bugbug.io/bugbug-app-faq) and [How is data from recorded test runs stored?](https://docs.bugbug.io/bugbug-app-faq)

</details>

<details>

<summary><strong>How is BugBug different from AI testing tools like Momentic or KaneAI?</strong></summary>

Most AI testing tools in 2026 fall into two camps: fully autonomous agents (Momentic, KaneAI, QA Wolf) that generate tests without any human input and typically cost $40K–$250K/year, or code-based tools (Playwright + Claude Code) that require developer fluency.

BugBug sits in neither camp. It's designed for the 20–150 person SaaS team where nobody or a few people owns QA full-time:

* **You stay in control** — AI assists the recording, but you define what gets tested. Tests are auditable step-by-step, not black-box generated.
* **No Playwright required** — non-technical team members (QA, PMs, product owners) can record, run, and read tests without writing code.
* **Flat, transparent pricing** — BugBug's plans don't hide pricing behind "contact sales." You pay a flat subscription; AI features are included, not billed per-agent-session or per-AI-call.
* **Human-on-the-loop** — BugBug's AI augments your judgment rather than replacing it. You confirm, edit, and own the test steps.

\
Learn more: [BugBug pricing](https://bugbug.io/pricing/)

</details>


# How BugBug AI works

BugBug's AI capabilities are built into the test recorder and test execution engine. They activate automatically — during recording, before each test step, and at run time. You don't configure or enable them separately.<br>

There are three AI features:

| **Feature**          | **When it runs**       | **What it does**                                                            |
| -------------------- | ---------------------- | --------------------------------------------------------------------------- |
| Adaptive Locators    | During recording       | Generates the most stable selector for each element you click               |
| Smart Click & Scroll | During test execution  | Mimics real user behavior; handles dynamic, covered, or off-screen elements |
| Smart Waiting        | Before every test step | Checks that the page and element are ready before acting                    |

### Adaptive Locators

When you click an element during recording, BugBug generates multiple selectors for it simultaneously and evaluates which is most likely to stay stable across UI changes.

Priority order:

1. `data-testid` / `data-test` and custom attributes defined by the user (most stable — tied to developer intent, not visual structure)
2. Visible text content (e.g. a button labeled "Save")
3. Names, ids, semantic tags, roles and ARIA labels (e.g. `role="button"`, `aria-label="Submit"`)
4. Other `data-*`
5. Unique parent-related selector
6. CSS classes and IDs (only if stable — dynamic or auto-generated ones are deprioritized)
7. DOM position (last resort — most fragile)

BugBug skips dynamic values. The selected locator is stored with the test step. You can view and override it manually if needed.

BugBug also automatically prioritizes element attributes and properties that are unique on the page.

For example, if an element has a `data-testid`, but another earlier element uses the same value, BugBug treats it as non-unique. The selector then gets an index, making it less preferred because indexed selectors are more likely to break when the page structure changes.

When BugBug detects an indexed selector, it still tries to make it more reliable — for example, by finding a unique parent element and combining it with the target element selector. This can create a more stable selector path and move it higher in the selector priority order.

{% hint style="info" %}
**Tip:** If your app has `data-testid` or ARIA attributes on key elements, BugBug will always prefer them. Ask your frontend team to add them to primary CTAs, form fields, and navigation items — it's the single most effective way to make tests long-lived.
{% endhint %}

[Learn more about selectors →](/preventing-failed-tests/selectors)

***

### Smart Click & Scroll

BugBug simulates real cursor movement instead of dispatching JavaScript click events directly. This means:

* It will not click an element that a real user couldn't click — if the element is covered by a modal, cookie banner, or overlay, BugBug detects this and retries.
* It scrolls automatically — if the target element is outside the viewport, BugBug scrolls to bring it into view before clicking. You don't need to add scroll steps manually.
* It avoids covered elements — if another element overlaps the target, BugBug scrolls the page until it finds a clear position where the target can be clicked safely.
* It finds the clickable area — if the center of an element is covered, BugBug looks for an uncovered point within the element's bounds and clicks there.&#x20;
* It avoids accidental clicks on nested elements — if the target element contains another clickable element, BugBug finds a safe position within the target so the intended element is clicked, not the element inside it.

[Learn more about Smart click →](/preventing-failed-tests/smart-click)&#x20;

[Learn more about Smart scroll →](/preventing-failed-tests/smart-scroll)

***

### Smart Waiting

Before executing each step, BugBug checks a series of conditions. If they aren't met yet, it waits — up to the configured timeout — before proceeding.

**Conditions checked automatically:**

* Document readyState is complete (Page has finished loading)
* Page network requests are finished
* Element must have expected attributes
* Element exists in the DOM
* Element is visible (not hidden with `display:none` or `visibility:hidden`)
* Element is not animating
* Element is not covered by the other one
* Element must be active
* Element has focus
* Page URL has changed (for steps that trigger navigation)
* Page will navigate after step execution<br>

This is why you don't need manual `sleep` or `delay` steps in most cases.

You can view, enable, or disable individual waiting conditions per step, and set global defaults in Project Settings.

[Learn more about Waiting conditions →](/preventing-failed-tests/waiting-conditions)

***

### Security & AI FAQ

<details>

<summary>Is BugBug AI based on generative AI or LLMs?</summary>

No. BugBug AI does not use large language models to generate, rewrite, or execute your tests. The AI features are built into the recorder and execution engine to improve selector choice, waiting, scrolling, and clicking behavior. They are designed to make tests more stable and human-like, not to send your test data to an external AI model.

When BugBug creates locators, it uses prepared, structured data about DOM elements instead of processing a DOM snapshot of the entire page.

</details>

<details>

<summary>Does BugBug send my app's data to third-party AI providers like OpenAI or Anthropic? </summary>

No. BugBug's AI features (Adaptive Locators, Smart Click & Scroll, Smart Waiting) run within BugBug's own infrastructure. Your app content, test steps, and recorded interactions are not sent to external AI or LLM providers as part of the test recording or execution process.

</details>

<details>

<summary>Is my test data used to train AI models?</summary>

No. Your recorded tests and test run data are used solely to execute your tests. BugBug does not use customer test data to train or improve AI models.

</details>

<details>

<summary>Can I disable BugBug AI features?</summary>

Some behaviors can be adjusted at the step or project level. For example, waiting conditions can be enabled, disabled, or customized per step, and global defaults can be managed in Project Settings. Adaptive Locators are part of how BugBug records stable tests, but you can manually review and override selectors when needed.

</details>

<details>

<summary>Does BugBug AI automatically rewrite or change my tests?</summary>

No. BugBug does not silently rewrite your test steps. During recording, Adaptive Locators choose the most stable selector for each element. During execution, Smart Waiting, Smart Click, and Smart Scroll help the existing step run more reliably. You can still review, edit, or override selectors manually.

</details>

<details>

<summary>What if BugBug selects the wrong element or selector?</summary>

You can inspect the selector saved with each test step and override it manually. BugBug prioritizes stable selectors such as data-testid, ARIA labels, visible text, and stable IDs/classes, but manual editing is available when your application needs a more precise locator.

</details>

<details>

<summary>Does BugBug self-heal broken selectors at run time?</summary>

BugBug improves selector stability during recording by choosing the most reliable locator available. During execution, Smart Waiting, Smart Click, and Smart Scroll help the step run under real page conditions. If the application changes so much that the saved selector no longer identifies the right element, you may still need to update the step manually.

</details>

<details>

<summary>Where does AI processing happen?</summary>

BugBug's infrastructure is hosted in the EU — specifically in Gdańsk, Poland ([IQ Data Center](https://www.iq.pl/data-center)). AI processing for the test recorder runs within this infrastructure. No data is transferred outside the EU as part of normal recording or cloud test execution.

</details>

<details>

<summary>What data does BugBug collect during recording? </summary>

During recording, BugBug captures:

* The interactions you perform (clicks, typing, navigation, form selections)
* The DOM selectors of elements you interact with
* Screenshots taken at each step (during cloud runs)
* URLs visited during the test

BugBug does not record audio, video of your screen outside the test window, or any data from browser tabs other than the active incognito test window.

{% hint style="info" %}
**Hint:** Each test runs in a fresh incognito window — no cookies, cache, or localStorage from your regular browser session are present.
{% endhint %}

</details>

<details>

<summary>Does BugBug AI process passwords, form values, or sensitive test data?</summary>

BugBug records the data required to replay your test steps, including typed values if they are part of the test. These values are not sent to third-party AI providers or used to train AI models. For sensitive data, use test accounts, variables, and non-production credentials wherever possible.

</details>

<details>

<summary>Who at BugBug can access my recorded tests? </summary>

Access to the BugBug database is strictly limited to the BugBug application infrastructure. Within the BugBug team, only the IT department has access to customer data. BugBug conducts annual security audits, and internal access is governed by role-based policies.

</details>

<details>

<summary>Is BugBug GDPR compliant? </summary>

BugBug's servers are located in the EU (Gdańsk, Poland), which means your data is stored within EU jurisdiction. BugBug is built with data privacy in mind — encrypted connections (SSL), encrypted passwords, and strict access controls are standard.

For formal GDPR documentation or a Data Processing Agreement (DPA), contact <info@bugbug.io>.

</details>

<details>

<summary>Can I use BugBug's AI features if my app is behind a firewall or VPN? </summary>

The AI features in the test recorder work locally during recording — they don't require outbound calls to external services, so a firewall or VPN doesn't affect them.

For cloud test runs, BugBug's cloud runners must be able to reach your application. If your app is behind a firewall, you'll need to whitelist BugBug's cloud runner IPs.

[IPs list of cloud runners →](/troubleshooting/ips-list-of-cloud-runners)&#x20;

[VPN or Firewall →](/troubleshooting/vpn-or-a-firewall)

</details>

<details>

<summary>Is there any AI processing during cloud test runs that's different from local runs? </summary>

No. AI processing does not differ between local and cloud runs. In both cases, BugBug uses the same Chrome extension to replay tests, so selector handling, waiting, scrolling, and clicking behavior work the same way.

Local and cloud runs capture screenshots at each step by default. These screenshots are stored securely in BugBug’s infrastructure and are available in every test step’s details.

[Runs history →](/debugging-tests/runs-history)&#x20;

[Run in cloud →](/running-tests/in-cloud-on-server)

</details>

<br>


# Grouping steps

Learn how to group your test steps. BugBug supports "step groups" to make sure you can easily navigate in large projects. Very useful feature if you work on a large amount of test cases.

## Why group your steps?

If you work on a large amount of test cases and complex user flows, you need to [organize your tests](/organizing-tests/organising-your-tests) and keep your project nice and tidy.&#x20;

Use "step groups" to make sure you can easily navigate in large projects. Most importantly **you need to use groups to use** [**components**](/editing-tests/components)**.**

{% hint style="info" %}
**Important! All steps are always inside a group**\
In BugBug all your steps are always in some kind of a group. By default when you record a test, all your steps will be in just one "Unnamed group" that you can later split into more groups.&#x20;
{% endhint %}

## Creating a group

The most productive way is to use "Split group here" action.&#x20;

1. Move your mouse between the step rows
2. Click the "plus" icon
3. Click "Split here"
4. Name the group

![](/files/cI1TZYbBG0UPHd9tNhz4)

**Result:** you will get 2 new groups. The first one keeps the old name. You can immediately rename the new group.

![](/files/IlrwDB03Gt9GCWyrkSsn)

![](/files/V4WjrFLWkJyUp668kQgC)

You can have multiple groups in one test. Each group can be converted to [components - reusable test steps that allow you to edit multiple tests at once.](/editing-tests/components)

![](/files/RntJvjJUU1ILRNGghv4p)

## Renaming a group

Click the name of the group - that's it, you can edit the name. No need to click "Save" button.

## Groups vs. components

Groups are just organizing your test steps. They become powerful when you convert them to [components - a group of steps that is shared across multiple tests](/editing-tests/components).


# Components

Learn about BugBug Components that can save a lot of your time when you want to work with test automation for complex products. BugBug always make the test automation process ultra-simple.

## What are components?

Components are groups of steps that are shared across multiple tests. So basically, if you don't want to repeat the most often-used steps, such as visiting the main page and logging in using valid credentials, you create a new component that will contain all those steps and use it easily, and fast across all your tests that will require this action.

## Why use components?

Once you create a new component, remember that **when you change something inside that group it will be changed in all tests where you used that group.**

**To save time!** This can save you time when you want to work with test automation for complex products. With components, you can change your test only once, instead of [re-recording the steps](/recording-tests-steps/re-recording-steps) hundreds of times or manually copy-pasting them between tests.

**How many components do you need?** It's better to have more than less. It's not a problem if all your groups are components.

{% hint style="info" %}
**Example:** make a component from `click` action on your "Sign up" button. All your tests that [test user registration](/editing-tests/variables#test-user-registration-and-login-using-variables) can now use such a component and if you change the "Sign up" button [selector](/preventing-failed-tests/selectors) in the future you can do it only once.
{% endhint %}

## Where are the components?

The "Components" module can be found under the same name in the main navigation. For starters, the list is empty, but this will change as soon as new components are added.

<figure><img src="/files/JB1gkdNaYLe0JCvTnSPK" alt=""><figcaption><p>Components page</p></figcaption></figure>

### Components list

When new components are added, they will be displayed on the list, where those that are used in the most tests are displayed at the top.

<figure><img src="/files/RUXa9JseHcCbuLIaFivS" alt=""><figcaption><p>Components list</p></figcaption></figure>

## How to make a reusable component?

Firstly you need to have a group of steps that are repeatable and useful in many tests.

1. [Group test steps](/editing-tests/grouping-steps)
2. Make a component from this group

To create a component go to test view and choose the group of steps that will become your one component. Then click on the `MAKE COMPONENT` button on their group name.&#x20;

**From now on, every change you make in this component will also apply to other tests that have this component.**&#x20;

{% hint style="info" %}
**Tip:** Use "[new test from here](/creating-tests/new-test-from-here)" to quickly work with tests that use components.
{% endhint %}

<figure><img src="/files/NyQLEKmmq2TmveZORqhe" alt=""><figcaption></figcaption></figure>

## Insert an existing component

You can also add an existing component to an existing test:&#x20;

<figure><img src="/files/Q0Y82neRowYWp0KzW3nZ" alt=""><figcaption></figcaption></figure>

This can be also done when creating a completely new test:

<figure><img src="/files/snzdLOJHW7AJsr6BvqK4" alt=""><figcaption><p>Insert a component to a new test</p></figcaption></figure>

You can browse all your components here and search for a specific one that you want to add:

<figure><img src="/files/ppPN6ChHAZXtSBtwBB4Q" alt=""><figcaption><p>List of existing components when adding to a new test</p></figcaption></figure>

<figure><img src="/files/t4i4qHkmAXnWHYA3rO5t" alt=""><figcaption><p>Inserting component</p></figcaption></figure>

## Inserting the same component multiple times

You can add the same component multiple times in a single test.&#x20;

As with components in general, a change to one instance will be reflected in the others.

<figure><img src="/files/XrqkohzFwPeiLQ2rpTPT" alt=""><figcaption><p>Inserting component multiple times in a single test</p></figcaption></figure>

### Parametrizing components

If you want to reuse the same component in a test multiple times but with different parameters, you can achieve that using variables and the ability to override them. A typical scenario involves reusing the login component for various roles within the same application. To do that, you have to:

1. Create a `{{login}}` [variable](/editing-tests/variables) (could be empty by default).
2. Create a `{{password}}` [variable](/editing-tests/variables) (could be empty by default).
3. Create a component that uses those variables to log in to the application.
4. Create a group **before** the instance of the component that you want to parametrize.
5. Override login and password variables using the `Set variable` step.

<figure><img src="/files/KbaDumyDqEvtUk4egqad" alt=""><figcaption><p>Parametrizing components with overrided variables</p></figcaption></figure>

## Unlinking components

When you unlink a component, it will convert it to a regular group and append a "duplicate" to the group name. **This will only unlink it in this specific test!** Use it for making a small modification that is not required in any other test.

<figure><img src="/files/bYxfRA5Hchz0UIWKoIhY" alt=""><figcaption><p>Unlink a component from a test</p></figcaption></figure>

## Splitting components

This works exactly the same as splitting a group. You will get two new components after splitting a component and you can immediately rename them. **All instances of this component in all tests will also be split.**&#x20;

<figure><img src="/files/nLF5VMD7ayiWKNdVT5yh" alt=""><figcaption></figcaption></figure>

## Removing components from a test

You can remove the component from a specific test.

<figure><img src="/files/4qJL7oTtoAfYisEf0ArI" alt=""><figcaption><p>Removing a component from a test</p></figcaption></figure>

* "Remove from this test" - This will only remove it from this test, but not from other tests.

{% hint style="info" %}
**Important!** When you remove the last instance of a component, it is **not** removed from your project and will still appear in the "Components" and be available through "Insert an existing component".
{% endhint %}

### Changing back the component to a regular group

You can always change your group back to being a regular one and not a component anymore, simply by clicking on the yellow label with "Component" text:

<figure><img src="/files/EDdNlCgoHrTkuF6Dy9AL" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
**Important!** This won't delete the created component, so you can still preview it on the "Components" page, and use it in your tests.
{% endhint %}

## Edit components

{% hint style="warning" %}
You can edit a component in the context of a specific test. However, remember that this will affect other tests that use it.
{% endhint %}

Edit is located within the test, and there are two ways to get there - by navigating to the test via the "Tests" page, or by searching for the component in the "Components" page, and then through the list of tests that use it.

&#x20;Here on its details page click on the "**Edit component**" button:

<figure><img src="/files/Bzz3mBuU14x9TYGxnWQZ" alt=""><figcaption><p>Component's details page</p></figcaption></figure>

Next, click on the linked test from the list to enter the edit mode. \
\
On this screen, you will see a list of all the tests in which this component has been used, and you can choose one that best suits you when editing the component.

<figure><img src="/files/WfZ8Hi0h2jwz36Ayce3o" alt=""><figcaption><p>List of connected tests</p></figcaption></figure>

<figure><img src="/files/NaoOhv2d24FwQntPWVtt" alt=""><figcaption><p>Edit mode of a component used in a test</p></figcaption></figure>

{% hint style="info" %}
Editing a component won't be possible if it's not linked with any test. To enable editing link it first to any of your tests.
{% endhint %}

#### Preview steps that are within a component

When you are in the details of the component, you can see a preview of each step by clicking on it. This is done in the read-only view.

## Additional actions on single component

Being on the list of all components or on a view of a single component you can perform additional actions by clicking on the more menu, such as:

* **Duplicate** - This will duplicate the selected component by adding `- duplicate` prefix in its name. \
  Also, please remember that by default the duplicated item **won't** be connected to any test.<br>
* **Rename** - This will let you change the name of the selected component, which will apply to all tests that use it. Furthermore, the name must be unique.<br>
* **Show related tests** - This will show you a preview of all related tests with that component. They can be previewed by clicking on any of them in the list (which will open in a new tab). If there are a lot of them, you may also find the search box useful.<br>

  \
  This is accessible in the details of the component:

<figure><img src="/files/7xRTX1XRY3LgqzPKsEjk" alt=""><figcaption><p>Show related tests</p></figcaption></figure>

Also from the "Actions" menu:

<figure><img src="/files/smRzY87VxJrUYwwEdYHT" alt=""><figcaption><p>Show related tests</p></figcaption></figure>

<figure><img src="/files/1QCj1lIDWW9iAMBZgDKs" alt=""><figcaption><p>List of related tests with a component</p></figcaption></figure>

If a component isn't linked to any test, this field will be disabled:

<figure><img src="/files/ebXPmJIG2TqYm7bsOwYu" alt=""><figcaption><p>No related tests with a component</p></figcaption></figure>

* **Delete** - This allows you to delete components you no longer need, to keep the list tidy. Please note that deleting a component will permanently delete all instances of that component and cannot be undone.

Yet to not do it accidentally we distinguish two scenarios.&#x20;

1. Deleting a component when **it's not** linked to any test. A confirmation modal will show up:

<figure><img src="/files/zFayCPWLMKySyT6sPOpl" alt=""><figcaption><p>Deleting a component without any connected test</p></figcaption></figure>

2. Deleting a component when **it's** linked to a test you need to additionally confirm this action by typing the safe word on the confirmation modal:

<figure><img src="/files/F2ONfc2R9ESt3VnfDDce" alt=""><figcaption><p>Deleting a component with multiple connected tests</p></figcaption></figure>

## Additional bulk actions on components

For now, you can select multiple components from the list on the Components page and perform bulk actions such as:

* Delete - This will delete all selected components from the list

<figure><img src="/files/EKwrsc5o90sV5vx8aeNS" alt=""><figcaption><p>Delete in bulk</p></figcaption></figure>

* Deselect all - This will remove the selection&#x20;


# Manually editing steps

BugBug allows users to manually edit test steps. Although this is not a recommended way of updating tests. It's often much faster to fix the tests by removing the failed steps and recording them again

Before you jump into manually editing, make sure you learn [how to re-record test steps](/recording-tests-steps/re-recording-steps), as this is a recommended way of updating your tests. It's often much faster to fix the tests by removing the failed steps and recording them again, rather than manually updating step settings.

## Manually adding steps

You don't need to use recording, you can also create your tests step by step by adding particular actions and their parameters. You can manually add steps anywhere in your test by clicking the plus symbol between the rows.

![](/files/3MQCd5iBZMXCPhcM7zHH)

## Step details panel

Make your manual changes to the tests in the step details sidebar. Here you can see all the parameters for a selected step.

![](/files/TmsdGtojm9e0ZnSKUTfs)

{% hint style="info" %}
**Important!** Don't forget to save your changes after editing a step.
{% endhint %}

{% hint style="success" %}
When editing the actions don't forget that you can use [variables](/editing-tests/variables).
{% endhint %}

### Operations on the test steps

* `Duplicate` step
* `Run to this place`
* `Deactivate step`
* `Delete` step

### Reordering steps

You can also `Drag to reorder` the steps within the test:

![](/files/MP7TVWOFEBVZoMaeqaVW)

###


# Actions

Learn about Actions that you can choose while adding test steps manually. BugBug provides mouse actions, input actions, window actions and some advanced actions like running custom JavaScript.

When you [manually add steps](/editing-tests/manually-creating-the-test), first you need to choose a type of step.

There are two basic types of steps:

* [Actions](#action-types-available-for-a-step)&#x20;
* [Assertions](/editing-tests/assertions)

<figure><img src="/files/qKTJ2OvaNHQjtqo1PD1Z" alt=""><figcaption></figcaption></figure>

## Action types available for a step

### [**Mouse actions**](#mouse-actions-details)

* [Click ](#click)
* [Double click](#double-click)
* [Right click](#right-click)
* [Hover](#hover)
* [Scroll](#scroll)
* [Drag\&Drop (BETA)](#drag-and-drop-beta)
* [Press mouse button](#press-mouse-button)
* [Release mouse button](#release-mouse-button)

### [**Input actions**](#input-actions-details)

* [Type text](#type-text)
* [Select option](#select-option)
* [Clear input](#clear-input)
* [Change value](#change-value)
* [Upload file](#upload-file)
* [Paste from clipboard](#paste-from-clipboard)

### [**Window actions**](#window-actions-details)

* [Go to URL](#go-to-url)
* [Go back](#go-back)
* [Go forward](#go-forward)
* [New tab](#new-tab)
* [Close tab](#close-tab)
* [Reload page](#reload-page)

### [**Advanced actions**](#advanced-actions-details)

* [Set variable](#set-variable)
* [Switch context](#switch-context)
* [Run custom JavaScript](#run-custom-javascript)
* [Answer a prompt](#answer-a-prompt)

## Actions - detailed descriptions & tips

### Mouse actions - details

#### Click

When you want to click a specific element.

This is the most common action for navigating the web. This also serves as a "tap" action if you [test mobile resolutions](/workflow-tips/mobile-version-testing).

<div align="left"><figure><img src="/files/UeVXgahpJH2Pylvysks6" alt=""><figcaption><p>Click parameters</p></figcaption></figure></div>

Parameter&#x73;*:*

* *Position (default: Smart detection)* - By default, BugBug utilizes its own mechanism to calculate the correct x,y position for clicking on the given element (selector). If you wish, you can modify this parameter and choose where to click (Top Left, Top Center, Top Right, Left, Center, Right, Bottom Left, Bottom Center, Bottom Right).&#x20;
* *Modifier keys (default: None) -* If you need to click with an extra keyboard modifier, it's possible to set it here (Ctrl, Shift, Alt, Meta / Command).

#### Double click&#x20;

When your app has a specific interaction, such as a double-click, for example, to open a file.

#### Right click

When your app has a custom context menu on right-click.

#### Hover

{% hint style="warning" %}
**Important! This action is not recorded automatically. You need to** [**enter "Hover" mode during the recording**](/recording-tests-steps/recording-hover)**.**&#x20;
{% endhint %}

Examples when to use it:

* Navigation bar with menus that appear on mouseover
* Cart preview that appears  on hover
* Actions that only appear when you move your mouse over a table row&#x20;

#### Scroll

When you need to force BugBug to scroll to specific coordinates.

Usually, you don't need to add it manually, because BugBug [handles the scroll automatically](/preventing-failed-tests/smart-scroll).

#### Drag\&Drop (BETA)

When your app has a slider that is interacted with by a drag-and-drop interaction.

#### Press mouse button

This action will initiate the `mouseDown` event.

You can use it in combination with "hover" and "Release mouse button" to simulate drag & drop from one element to another element.&#x20;

#### Release mouse button

Release the mouse button (`mouseUp`) on a specific element.

### Input actions - details

#### Type text

Type text into `input`, `textarea` or `contenteditable` fields. Simulates keyboard presses, entering characters one by one.

To escape text like {{ }}, you must put it between `{% raw %}` and `{% endraw %}` blocks.

Example:\
This is not a {% raw %}{{not\_a\_variable}}{% endraw %}

#### Select option

Chooses a specific option in a native HTML `select` dropdown (also called "combobox" menu).

#### Clear input

Removes all characters from a text `input` field, `textarea` or `contenteditable` .

#### Change value

Sets a value of any form element. HTML has many form controls, and some of them can be set to a specific value, for example, radio groups. Technically, a JS "change" event is triggered and the value is updated immediately, without typing letter by letter. Use it for typing longer texts.

#### Upload file

Simulates the "choose file" action in a form type `file` for uploading in forms. You can customize the file that will be uploaded.

#### Paste from clipboard

This step simulates the paste action (Ctrl+V) that the user can perform using the keyboard or mouse.

It's useful when you have "*Copy to clipboard*" actions in your app's UI and you want to use the value later in your test scenario.

### Window actions - details

#### Go to URL

Load the given page URL.

The step is marked as *passed* when the browser emits the [`onDOMContentLoaded`](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/webNavigation/onDOMContentLoaded) event.

This action doesn't verify the status of the loaded page. If the URL returns an HTTP status different than 200 (OK), for example, 404, but still loads correctly (browser emits the [`onDOMContentLoaded`](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/webNavigation/onDOMContentLoaded) event), the step will be marked as "*passed*".&#x20;

Parameters:

* *Password protected* - If your application is behind [basic auth](https://en.wikipedia.org/wiki/Basic_access_authentication), you can add those credentials by enabling this checkbox.\
  \
  ![](/files/R4G7YSnuqaO59LxffYrh)

#### Go back

The **Go back** action navigates the browser to the previous page in the session's history, exactly like clicking the browser's back button (or pressing `Alt + ←`).

#### Go forward

The **Go forward** action navigates the browser to the next page in the session's history, exactly like clicking the browser's forward button (or pressing `Alt + →`). It is the counterpart to [**Go back**](#go-back).

#### New tab

Open a new tab and load the given page URL.

This step works similarly to [Go to URL](#go-to-url), but opens in a new tab.

#### Close tab

Close the current, active tab. Focus will be switched to the previous tab.

If the browser has only one active tab, the browser will be closed and the test will be stopped.

#### Reload page

Reload the page. Nothing less, nothing more.

This step is helpful if you expect that the previous step changed something in the app, but your app is not refreshing automatically (i.e., an asynchronous action).&#x20;

### Advanced actions - details

#### **Set variable**

This action can be used to store local variables from tested sources. You can use a selector to find a text value on the tested web application.\
Now you can store any text value from the tested web page in a variable and use it in feature steps. For example, to find out newly registered unique users in your CRM. This variable is also cross-domain.

{% hint style="info" %}
For more detailed information, check out "[Variables during recording](/editing-tests/local-variables)".
{% endhint %}

#### **Switch context**

You can use this action for [working with iframes](/editing-tests/tabs-and-iframes) or [multiple tabs](/editing-tests/tabs-and-iframes).

#### Run custom JavaScript

#### **Answer a prompt**

Accept or decline browser alerts initiated by `alert()`, `confirm()` or provide a custom text answer for a browser `prompt()`.

This action is automatically [recorded](/recording-tests-steps/bugbug-ai-test-recorder), and most of the time you don't need to edit it manually.

* To confirm the window prompt, enter `true` in the answer field.&#x20;
* To reject enter `false`.&#x20;
* For `prompt()` questions, enter a custom text that should be provided as an answer

<figure><img src="/files/jjJ9k1C26fBHjE3LFigN" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/euZHgdR1HgGFWEthydGD" alt=""><figcaption></figcaption></figure>


# Assertions

Enhance your software testing with BugBug's Tests Assertions. Discover how to create powerful assertions to validate your test behavior. Streamline your debugging process.

## Why add assertions?

Use assertions to **observe** if everything works as it should.&#x20;

An assertion is a check that does not interact with your page, for example, you can check if your page shows a specific text without clicking anything.

{% hint style="info" %}
[Here](/recording-tests-steps/recording-assertions) you can read about how to record assertions for a test.
{% endhint %}

## Types of assertions

By default, BugBug records two types of assertions:

1. `Element is visible`
2. `Element has text`

which you can edit later in your recorded test details view, and switch between a wider list of available ones, such as:

<figure><img src="/files/aN2QYZrsjnmaFPJSlnV9" alt=""><figcaption><p>List of available assertions</p></figcaption></figure>

Select one of the following assertion types.

{% hint style="info" %}
We are regularly adding more assertion types to this list - please contact us if you need a new assertion type.
{% endhint %}

| Type of assertion                | What happens                                                                                                                                                         |
| -------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Element is visible               | BugBug checks if the element is actually visible on the screen, if the element is not covered or scrolled outside of the viewport                                    |
| Element is not visible           | BugBug checks if the element isn't visible on the screen                                                                                                             |
| Element has text                 | BugBug checks if the element is visible, but also checks if it has a specific text                                                                                   |
| Form field has value             | BugBug checks if any form input has a specific value, for example, you can check if your radio buttons group is selected to "No" after the user clicks "No" button   |
| Form input is checked            | BugBug checks if the checkbox is checked. You can claim that your radio button was checked after the user clicked it                                                 |
| Form input is not checked        | BugBug checks if the checkbox is unchecked. You can claim that your radio button was disabled after the user clicked it twice                                        |
| Page shows specific text         | BugBug checks if there is text anywhere on the page                                                                                                                  |
| Page does not show specific text | BugBug checks if there is no text anywhere on the page. Helpful with negative assertions                                                                             |
| Page has title                   | BugBug checks the document.title                                                                                                                                     |
| URL address                      | BugBug checks the URL of the page. You can verify that the redirect works fine                                                                                       |
| Download started                 | BugBug checks if the download process for a selected file has started within the browser *(however, there is no verification that the download has been successful)* |
| Custom JavaScript                | Run any JS function and if it returns true, the assertion is passed - learn more in [custom javascript actions](/editing-tests/custom-javascript-actions)            |
| \</> DOM element does exist      | BugBug checks if there is an element on the page you're looking for                                                                                                  |
| \</> DOM element does not exist  | BugBug checks if there is no element on the page you're looking for. Helpful with negative assertions                                                                |
| Number of elements in DOM        | BugBug checks if there are a certain number of elements on the page you're looking for                                                                               |
| Variable value                   | BugBug checks if the variable's output value matches the set condition                                                                                               |

## Editing assertions

By default, BugBug records assertions that are best suited to what you are looking for. But you can also create advanced assertions, such as checking if a number is greater than a certain value. Select options from the drop-down menu to perform a more thorough check of your test case.

<figure><img src="/files/3PKvYsFysQAfUewOdd17" alt=""><figcaption><p>Example of assertion modification after recording</p></figcaption></figure>

<figure><img src="/files/ChVCk3JUHBZOicHcBaT3" alt=""><figcaption><p>Values can be confirmed under certain conditions</p></figcaption></figure>

| Assertion                        | Use it when                                                                                                                                                                                                                                                                                                             |
| -------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Element is visible               | You want to check if an element is visible, meaning that it's in the viewport, opacity is not 0, and its visibility is not set to hidden. For example, you can assert that some error message is shown and visible to the user                                                                                          |
| Element is not visible           | You want to check if an element is in DOM but not visible, meaning that it's not in the viewport or opacity is 0 or its visibility is set to hidden                                                                                                                                                                     |
| Element has text                 | You want to assert the text in an element, for example, if a registration button contains a "`Sign up"` text. This is the most common type of assertion                                                                                                                                                                 |
| Form input has value             | You want to check if the value of the form element matches specific conditions. Only works with `form` elements like `input`, `select`, `checkbox`, `radio`, etc.                                                                                                                                                       |
| Form input is checked            | You want to check if a checkbox or radio button is checked, meaning that it is selected, enabled                                                                                                                                                                                                                        |
| Form input is not checked        | You want to check if a checkbox or radio button is unselected, unchecked                                                                                                                                                                                                                                                |
| Download started                 | You want to check whether the download process for a selected file has started from the server. Additional settings for this assertion focus on the file name                                                                                                                                                           |
| Custom JavaScript                | You need to do an advanced assertion, ex. comparing the element text with [variables](/editing-tests/variables), making an API request, or using `localStorage`. When your JS function returns `true`, the assertion will be marked as `passed.` Also see [custom JS actions](/editing-tests/custom-javascript-actions) |
| \</> DOM element exists          | You want to check if an element exists in the DOM (HTML structure), but not necessarily is visible                                                                                                                                                                                                                      |
| \</> DOM element does not exists | You want to check if an element is not present in the DOM (HTML structure), ex. you want to make sure that some element disappeared completely from the page, and that it's not just set to `"display: none"`                                                                                                           |
| Number of elements in DOM        | You want to check the number of elements that match a given selector, for example, you want to assert that a list shows 10 elements                                                                                                                                                                                     |
| Variable value                   | You want to check if its computed value matches the set condition between: is/is not/contains/does not contain/matches regex                                                                                                                                                                                            |

&#x20;


# Tabs & iframes

Enhance your test editing skills with BugBug's comprehensive guide on Tabs and iframes. Learn how to effectively optimize your test scenarios. Discover valuable tips to streamline your testing process

BugBug <mark style="color:green;">**fully supports testing in iframes or multiple tabs**</mark>. This is handled automatically during the recording but can also be controlled manually. You will notice the `Switch context` action if you work with iframes or multiple tabs.&#x20;

### What is the "Switch context" action?

When you record something in a different tab or iframe, an additional step will be recorded before the actual action for switching the context to this new frame or tab.

This defines the context for all the following test steps until you switch the context again to a different frame or a tab.

### Locating the right frame

The first tab you visit during the test is `Tab number` **0** and `context` identified as **`Top`**. This is the **default text execution context**, and if you don't interact in your test with iframes or other tabs, you don't need to add the `Switch context` step.

{% hint style="info" %}
The **default** test execution context is `Tab number` **0** and `context` **Top,** and adding this at the beginning of the test is unnecessary.
{% endhint %}

If you navigate to different tabs or iframes during the test, they will be identified by:

* Tab number \[`number`]
* Context \[`Top`|`Iframe`]
* Frame element (if the context is `Iframe`)

Tabs are numerated from 0, so each frame you open during the recording session will have incremented numbers.

<figure><img src="/files/Kyi2GlwAUwzwOFekh3fD" alt=""><figcaption><p>Tab numbers starting from 0</p></figcaption></figure>

If the interaction **is not** in an `Iframe`, the context should be set to your default tab context: `Top`.

<figure><img src="/files/BOhsPNnFLS1biDz3ixMi" alt=""><figcaption><p>Default tab context - Top</p></figcaption></figure>

If the interaction **is inside** an `iframe`, the context should be set to `Iframe` and the correct iframe selector is needed:

&#x20;

<figure><img src="/files/owNMjLkvGlilM3koS4p5" alt=""><figcaption><p>Switch to the iframe identified by XPath //IFRAME[id="frame1"] in the first browser tab (tab 0)</p></figcaption></figure>

BugBug also supports nested iframes during a regular recording session. You can read more about [nested selectors](/preventing-failed-tests/selectors#nested-selectors) here.

<figure><img src="/files/n7CxhEVxfUZUH3m9naLy" alt=""><figcaption><p>Switch test execution context to nested iframe</p></figcaption></figure>

A test scenario when you operate in your first tab, then in an iframe, in the nested iframe, and then again in the first tab looks like the below:

<figure><img src="/files/OJtGglGqJVKrMcQEIaeU" alt=""><figcaption><p>Mixed test contexts</p></figcaption></figure>

If you have mixed contexts in your tests, it's important to remember which context you're in to make sure the test works correctly.


# Conditional Logic (if/else)

### Why use conditional logic?

Tests should be independent, repeatable, and consistent. That's the theory. Practice sometimes is a bit trickier.

#### **Example scenario**

Let's say your app limits user sessions to one per e-mail address. If something breaks and you do not log out properly from the app via the Logout action, the next login will show you that another session exists, and you have to click "*Force*" to log in and ignore the existing one.

This is an exact example we had with one of our customers, and the solution is simple: if the modal with the "*Force*" action exists, just click that button and continue the test.

To handle this and similar situations, BugBug lets you add a condition step.

<figure><img src="/files/KSxh4SAPXluLWUuoZsL0" alt=""><figcaption></figcaption></figure>

When you click it, you see a list of options to validate and, based on the result, perform (or not) an action.

**Available options**:

* Element
  * Element is visible
  * Element is not visible
  * Element has text
  * Element is disabled
  * Element is not disabled
* Forms
  * Form input has value
  * Form input is checked
  * Form input is not checked
* Page
  * Page shows specific text
  * Page does not show specific text
  * Page has title
  * URL address
  * Download started
* Advanced
  * Custom Javascript
  * DOM element exists
  * DOM element does not exist
  * Number of elements in the DOM
  * Variable value
  * Clipboard value

<figure><img src="/files/1alNDPYyVF1Duzew2L3t" alt=""><figcaption></figcaption></figure>

For example, if you would like to check that the text "Force" exists on the page and then click the button with that text, an example would look like:

<figure><img src="/files/VNzisfuSAQea6lBI7fRP" alt=""><figcaption></figcaption></figure>

You can edit the if condition as a normal step with additional configuration (e.g., setting a timeout, waiting for conditions, and so on).

You can treat the condition as a block where you can put **multiple** steps

#### Execution of the condition

During execution *if* could be resolved as **true** or **false.** Depends on the result, the steps inside the if block will be executed and marked as *passed* or omitted and marked as *skipped*.

<figure><img src="/files/rSXGQbQ6xqgvWzgLwO0H" alt=""><figcaption></figcaption></figure>

#### Where is else and else if?

By design, BugBug doesn't support *else* and *else if* block&#x73;*.* We believe the current implementation covers the most popular scenarios, and at the same time, we still think tests should be linear, without complex logic.

It's still possible to do this complex logic inside BugBug using different checks, like:

* If "Element is visible" do this
* if "Element is not vislble" do that

or by setting a [variable](/editing-tests/local-variables) and checking the result of it:

<figure><img src="/files/jtBBhp54xTqJFxOMj9RK" alt=""><figcaption></figcaption></figure>

Please [let us](https://bugbug.io/contact/) know if there's a scenario you can't cover with the current implementation.

#### Recording if condition

During recording, there is currently no option to add an *if condition* using our BugBug overlay. We plan to add this feature, but this is not a priority. You can easily add it manually when you pause the test. [Edit & Rewind](/workflow-tips/edit-and-rewind) functionality would be helpful here.


# Variables

## Intro to Variables

### Why use variables?&#x20;

Variables enable you to **run and maintain tests efficiently** in any of the following situations:

* You work with multiple development environments
* You have multiple tests that use the same value in multiple form fields or assertions
* You want to test forms that require users to enter random and unique data, e.g. registration with an email address
* You want to run the same tests with different form inputs, e.g. testing product searching against various search queries or testing different zip codes

### What are variables?

Variables are **dynamic pieces of text that you can use in your tests**. [Use variables in tests](#use-variables-in-tests) by entering their name in curly brackets to place a variable in any text field in the test steps ex. `{{myCustomVariable}}`

Variables are good for storing:

* Fragments of URL addresses like domains, subdomains, hostnames, etc.&#x20;
* Email addresses
* Input values like product names, brands, phone numbers, ZIP codes, etc.

<figure><img src="/files/J095nHoVlcYVhosf3odI" alt=""><figcaption><p>Example: variable "hostname" used in an URL</p></figcaption></figure>

<figure><img src="/files/35alJYsBd0N9Wa0NOLN3" alt=""><figcaption><p>Example: definition of variable "hostname" in the variables tab</p></figcaption></figure>

Variables do not have to be simple text assignments. Some [built-in variables](#use-built-in-variables-for-dynamic-or-random-values) are different each time you run the test for example `{{timestamp}}` or generate random values like `{{testRunId}}`.&#x20;

You can also write your own [javascript variables](#javascript-variables) - functions that return a value that is calculated every time you use the variable.

## Using text variables

### Create custom text variables&#x20;

This is the most basic type of variable. Go to the "Variables" tab and click on the "New variable" button.&#x20;

<figure><img src="/files/KLtDEl1LygBKZoby3lvB" alt=""><figcaption></figcaption></figure>

Add a name and value for your variable.

<figure><img src="/files/V7SHqD5SdyygrkEiTZ3p" alt=""><figcaption></figcaption></figure>

Then click on the "Create variable" button to save it.

<figure><img src="/files/gA5i59CVymbaYZD5LqVj" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
**Important!** You can't use spaces in a variable name. We recommend that you use [camelCase](https://en.wikipedia.org/wiki/Camel_case).&#x20;
{% endhint %}

### Create custom JavaScript variables

Previously, a custom variable containing a text value was added. Now you can go further and use it with a JS variable that can generate a unique value. As a support, you are going to use the built-in variables in BugBug as well.

For starters, once again click on the "Create variable" button to create a new one, yet this time on the modal select the "Custom JavaScript" in the "Type" field.

Also, paste the JS code into the "JavaScript code" field. As an example, a simple function was used here:

```
return variables.testVariable + ' ' + variables.testRunId;
```

<figure><img src="/files/nUmlVRfqhL6r7EnMpVGV" alt=""><figcaption><p>Variable settings</p></figcaption></figure>

Next, click on the "Create variable" button, and we're all set.

<figure><img src="/files/HQIzG7F0dHB1HWtQLpyc" alt=""><figcaption><p>List of added custom variables</p></figcaption></figure>

Now you're ready to use the names of our created variables when editing a test. To do this, simply use the names of the existing variables, i.e. place them in the target field(s) on a page that's being tested.

```javascript
{{testVariable}} or {{taskName}}
```

In general, the applied variables in your test might look like this:

<figure><img src="/files/pnXmdTMQMzedEfqaKdON" alt=""><figcaption><p>Variables used in a test</p></figcaption></figure>

###

### Use variables in tests&#x20;

Use a variable name in curly brackets to place a variable **in any text field in the test steps**. You can combine variables with normal text, for example `{{hostname}}/v1/index.html`

<figure><img src="/files/J095nHoVlcYVhosf3odI" alt=""><figcaption><p>Example: a variable used in "Go to url" action</p></figcaption></figure>

You can use variables in other types of actions, such as typing text in a form, assertions, and **even CSS selectors.**

<figure><img src="/files/Lct5x72S7ykQqUEkZil6" alt=""><figcaption><p><strong>Use variables in selectors, assertions, etc.</strong></p></figcaption></figure>

**Combining variables with curly brackets**

You can also combine variables with `{{ }}` signs if you need to. To escape curly brackets, use `{% raw %}` and `{% endraw %}` blocks.

Here is an example:

Input:

* *variable: projectName* = `Foo`&#x20;
* *format*: `{{ projectName }}{% raw %} {Put this text in brackets}{% endraw %}`

Output:

* `Foo {Put this text in brackets}`

### Use built-in variables for dynamic or random values

Use BugBug's pre-defined set of variables to handle your complex testing scenarios. Here are some examples of what you can do with built-in variables

<table><thead><tr><th width="218.62315752406113">Built-in variable name</th><th width="92">Type</th><th width="188.744109669127">Description</th><th>Usage example</th></tr></thead><tbody><tr><td><h4>testRunId</h4></td><td>Text</td><td>The current id of the running test (UUID format).</td><td>You want to have a new random unique value for one specific test run, for example you want to <a href="#test-user-registration-and-login-using-variables">test user sign-up and then log in.</a> </td></tr><tr><td><h4>testId</h4><p></p></td><td>Text</td><td>The current id of the test (UUID format).</td><td>You want to test add/edit/remove operations in one test, for example, add a product and then remove the same product with a name <code>Test Product {{testId}}</code></td></tr><tr><td><h4>suiteRunId</h4></td><td>Text</td><td>The current id of the suite (if the test is running from a suite, UUID format).</td><td>You want to have a new, random unique value that is the same across all the test runs in one suite.</td></tr><tr><td><h4>runMode</h4></td><td>Text</td><td>The current run mode for the test ("local" or "server").</td><td>You want to have different input or assertion value when the test is run on server. </td></tr><tr><td><strong>randomNameFixed</strong></td><td>Text</td><td>Random name that remains unchanged during the test run (8 letters).</td><td>You want to have a new, random uniqe name that is the same across all the  test and used multiple time </td></tr><tr><td><h4>scheduleId</h4></td><td>Text</td><td>The current id of the schedule (if the test has been started via a schedule, UUID format).</td><td>You want to have a new, random unique value that is the same across all schedule run.</td></tr><tr><td><h4>timestamp</h4></td><td>Text</td><td>The current Unix Time in milliseconds (int format, e.g.: 1645710937798).</td><td>You want to know when your test runs or use it similar to <strong>randomNumber</strong></td></tr><tr><td><h4>randomNumberFixed</h4></td><td>Text</td><td>Random number that remains unchanged during the test run (10 digits).</td><td>If you want to edit an element, find it later in test steps and use it or remove it.</td></tr><tr><td><h4>profileName</h4></td><td>Text</td><td>The current profile name for the test. Default: "Default".</td><td>If you want to enter a production/test URL depending on the profile, test runs</td></tr><tr><td><h4>suiteName</h4></td><td>Text</td><td>The current suite name for the test (if the test is running from a suite).</td><td>If you want to create an email that inform you about suit name that was run </td></tr><tr><td><h4>testName</h4></td><td>Text</td><td>The current test name.</td><td>You can mix it with timestamp to create a new subscription notification test.</td></tr></tbody></table>

Built-in variables also give you access to generators of random numbers and names that you can use right away in your tests.

<figure><img src="/files/TIkU5ccWAGzGuzsS0Snn" alt=""><figcaption></figcaption></figure>

### Recording and working with variables

Currently, you can use variables during recording.

<figure><img src="/files/2Fs9x6PDtZ3RGoE9hH45" alt="" width="279"><figcaption></figcaption></figure>

* You can **insert** pre-prepared or built-in **variables** when **recording tests.**
* You can also dynamically **create variables** during recording based on the source being tested.
* You can also record the steps and then edit them manually.&#x20;

<figure><img src="/files/h47yq3Eonzr5KaswhRIM" alt=""><figcaption><p>Two option for variables action in overlay</p></figcaption></figure>

{% hint style="info" %}
&#x20;For more details, go to the "[Variables During Recording](/editing-tests/local-variables)" document.&#x20;
{% endhint %}

## User registration and login using the BugBug Testing Inbox

The [BugBug Testing Inbox](https://bugbug-inbox.com/) solves several problems of testing user registration and login.

> **Test case:** As a user, I go to the home page and click the "Login" button. I enter my email and password. I receive a verification email. I click on the link. I use my previous email and password to log in.

&#x20;You can use inbox to solve several problems, such as:

* How to get a unique random email address
* How to receive the email with the verification link
* How to use previously generated unique email and password in the login form&#x20;

#### **Create your test using BugBug**&#x20;

First, start the test recording with a page that requires registration. Add steps that lead to the registration process. You don't need to set it up any particular way at this point. Record it as normal users perform their actions.

### Use the BugBug Testing Inbox to generate a unique email address&#x20;

When you're ready to enter the email address, look at the BugBug extension overlay menu. There is an option called **"Inbox"**. Click it, but do not stop the recording.

<figure><img src="/files/eMvy0J96FPxTMEVJ0bWP" alt=""><figcaption></figcaption></figure>

When you open it, you will see two options. Focus on the **"Auto-generated random email unique for this test"** option.

<figure><img src="/files/sjoLnkxGRpA8W19SiJcQ" alt=""><figcaption></figcaption></figure>

This option creates a random email address using the variable **{{testRunId}}** and the domain **@bugbug-inbox.com**. \
The {{testRunId}} variable is unique per test run, so the generated email address will be constant during a single test run. If you rerun the test, a new email address will be generated using this variable. On the BugBug web application, in steps, you will see it as **{{testRunId}}@bugbug-inbox.com**.

You can copy it directly from the extension using the copy **icon.**

<figure><img src="/files/doGEiwO0aVSOjy86BroV" alt=""><figcaption></figcaption></figure>

And use it directly to register. If the registration process does not require a verification email, you can now go back to the extension menu and continue. If you need to confirm a verification email, go to the verification flow.&#x20;

<figure><img src="/files/FXkfomCuJdXmID24Px22" alt=""><figcaption></figcaption></figure>

You can find the email address based on a variable in the test step. Now your test is free of duplicate registration email problems every time you run it.

<figure><img src="/files/RwWlyJIpMVyt6tk3OsZh" alt=""><figcaption></figcaption></figure>

### Using the BugBug Testing Inbox to activate the registration email

Most of the registration processes require opening the verification email and confirming the address. With the BugBug Testing Inbox, you can open an email, automatically confirm it as a test step, and complete the process without using third-party providers. \
\
When you reach the moment of providing an email in the test steps, just **copy the email address** by an icon. Submit the form and **open our inbox in a different tab** by clicking the "open inbox" button. Do not stop the recording. \
\
Opening a new tab will be recorded and required.

<figure><img src="/files/eiH1tOeMmvTRUpWb04Ob" alt=""><figcaption></figcaption></figure>

In a new tab, you will see an inbox created specifically for an email address you used in the previous steps. Wait for a confirmation email.&#x20;

\
The inbox refreshes automatically, so there is no need to do it manually.

{% hint style="warning" %}
The BugBug inbox only saves emails for **10 minutes**. After that time, all emails will be removed.
{% endhint %}

Open the registration email by clicking on "subject".

<figure><img src="/files/x45Tb6mpCkf1V7OyK0OY" alt=""><figcaption><p>The BugBug confirmation email is used only as an example of the process.</p></figcaption></figure>

{% hint style="info" %}
**Important! Make sure you click the subject line of the email!** \
BugBug needs to always open the most recent email, so your [selector](/preventing-failed-tests/selectors) here needs to click the first email with a specific subject line, for example `//SPAN[normalize-space(text())="`Confirm your e-mail address`"]`
{% endhint %}

Now just click the button with the authorization link and continue recording.&#x20;

<figure><img src="/files/Gz9BvW7IUoJNbU8AN68t" alt=""><figcaption><p>The BugBug confirmation email is used only as an example of the process.</p></figcaption></figure>

<details>

<summary>If your email doesn't have a button but just a verification link </summary>

If your verification link is shown directly as a string, this string will be different every time. BugBug will record a selector that matches exactly this string, for example //A\[normalize-space(text())="`https://`acmecorp`.com/#/activate`?key=60f0ae29-542a-4418-8529-41a01bf22fcc"]

In such case, you may need to manually update your selector after the recording so that it only checks if the text contains the beginning of the verification URL, for example `//*[contains(text(), "https://`acmecorp`.com/#/activate")`

</details>

When your email is confirmed you can return to the test page tab and continue.&#x20;

### Using specific email and virtual inbox features  &#x20;

If you need to use an email address with a specific alias during a test you can also use the BugBug Testing Inbox. The menu provides an option for a custom alias.&#x20;

Just select the **"Specific test email"** option.

<figure><img src="/files/0H8lSu6W9XXGo2cTvPOH" alt=""><figcaption></figcaption></figure>

If this option is selected, you can create your email alias by typing.

{% hint style="info" %}
You create only an Alias for **@bugbug-inbox.com**.&#x20;

Do not put other domains.
{% endhint %}

<figure><img src="/files/1m8x76pMVjrnKb6eNs2y" alt=""><figcaption></figcaption></figure>

This option also allows you to **open Inbox** with a specific email you set.

{% hint style="warning" %}
If you decide to create an alias, make sure it's unique. We do not limit inboxes per project or test. Make sure that other users will not be able to interrupt your tests with the same email address.
{% endhint %}

<figure><img src="/files/6i6swNCiSfoaLayKyrnM" alt=""><figcaption></figcaption></figure>

### Using variables with BugBug Testing Inbox

By default, inbox uses only the **testRunId** variable, but you can boost it by freely changing it in your recorded steps.&#x20;

You can mix or change variables simply by changing the alias of the email and adding eg. a **timestamp** variable.

<figure><img src="/files/68bELZatxM4aWHexl3CG" alt=""><figcaption><p>Add any variable as alias </p></figcaption></figure>

{% hint style="info" %}
You can open a virtual inbox by combining **<https://bugbug-inbox.com/>** and any **variable**.&#x20;
{% endhint %}

<figure><img src="/files/KZR6R01fFRxc1fEGzuKr" alt=""><figcaption><p>Combined URL </p></figcaption></figure>

## Profiles

### What are profiles?

Profiles are your own **presets for different variable values**. You can run tests or suites with profiles to override your default variables to a specific value. This is especially useful when [working with multiple development environments. ](#work-with-different-development-environments)

{% hint style="info" %}
**Important** To see the profile section in the test, you need to have at least 2 profiles. &#x20;
{% endhint %}

![You can quickly swap the profile in the menu near the "Run" button. This menu will not appear if you only have one default profile.](/files/fUXYNymUKTR0RlkymRvk)

<figure><img src="/files/9b9YawIlOxJFBCCiSMDj" alt=""><figcaption><p>To add, remove and edit profiles go to the "Variables" tab</p></figcaption></figure>

<figure><img src="/files/yCjoqzRPqf1eqmIeYROx" alt=""><figcaption><p>Override variables in the profile settings. Leave an empty field to keep the default value.</p></figcaption></figure>

### Run a test with a profile to override variables

First, make sure that you have read about [what profiles](#what-are-profiles)[ are](#what-are-profiles), and then:

1. Create a profile in the "Variables" tab
2. Go to test editing
3. Swap profiles before running the test in the menu near the "Run" button

You can also run tests with a [profile from the command line](#override-variables-and-profiles-from-command-line-cli) in your pipeline

{% hint style="info" %}
**Important!** Profiles selection is not saved in the test. \
If you run the test from the tests list, we will ask you to select a profile.&#x20;
{% endhint %}

{% hint style="info" %}
**Tip!** Your tests should pass on all profiles. Don't create tests that only work in one profile.&#x20;
{% endhint %}

### Run a suite with a profile

You can have multiple suites and each suite can run your tests with a specific profile. For example, you create suites for "Production smoke tests" and "Staging all tests". Each suite will have different sets of tests that will run on different profiles with different variables.

1. Go to "Suites" and select a suite to edit
2. Choose with which profile this suite will run

{% hint style="info" %}
**Important!** This suite will always run with this profile. The profile selection is saved in the suite settings.&#x20;
{% endhint %}

<figure><img src="/files/Uc7ieIpraYKDysQVGXa4" alt=""><figcaption></figcaption></figure>

### Work with different development environments

Let's say you have 3 environments: *production, staging, and local*. They are all exactly the same, but they have different URL addresses. You want to run the test sometimes on production and sometimes on staging.

| Environment | URL              |
| ----------- | ---------------- |
| Production  | `acme.com`       |
| Staging     | `stage.acme.com` |
| Local       | `localhost:3000` |

**Prepare the variables and profiles**

1. Create a variable named `hostname` with default value `https://acme.com`
2. Create 2 profiles named `Staging` and `Local`
3. Override the hostname variable in the profile Staging for `https://stage.acme.com`
4. Override the hostname variable in the profile `Local` for `https://localhost:3000`

#### Update the URLs with your variable

1. In the tests, find your steps with `Go to url` action
2. Replace the `acme.com` with `{{hostname}}`.&#x20;

**Tip:** You can also combine the curly brackets with the rest of the URL for example `{{hostname}}/registration` or `app.{{hostname}}`

Now you can [run the tests with different profiles](#run-a-test-with-a-profile-to-override-variables) and quickly swap between your dev environments.

![](/files/YweLBu82o24nrOmldz1v)

### Override variables and profiles from the command line (CLI)

Use [BugBug CLI ](/integrations/api)to integrate with your build pipelines and run tests with variables that you can adjust to multiple environments.&#x20;

If you run tests or suites from the command line, you can override each variable or profile with parameters, for example,  `--variable val1=value` and `--profile=profileName`. Read more in the [CLI documentation](https://www.npmjs.com/package/@testrevolution/bugbug-cli).

## JavaScript variables

Javascript variables allow you to compute dynamic values every time the variable is used in a test.&#x20;

#### Use JavaScript variables for:

* Getting data from API, for example, SMS codes, authorization magic links
* Mathematical calculations such as adding, subtracting, multiplying, etc.
* Generating unique strings that need to meet specific validation criteria such as social security numbers,  postal codes
* Values that are different depending on conditions, for example, if your app shows a different text during night and daytime

#### **To create a JavaScript variable**&#x20;

1. Go to the "Variables" tab and click "New variable"
2. Change the variable type to "Custom JavaScript"
3. Enter a JavaScript function that will be executed every time this variable is used in the test

{% hint style="info" %}
**Important!** Remember that your function needs to have a `return` statement - it needs to return a specific value.
{% endhint %}

![](/files/PhFQ823p7GSNvS1QeXqv)

### Example JavaScript variable functions

Return a simple string value:

```
async function(variables) {
    let firstName = "John";
    let lastName = "Smith";
    return firstName + lastName;
}
```

Return a different value when the day of the week is Sunday:

```
async function(variables) {
    const d = new Date();
    let day = d.getDay();
    if (day === '7') {
        return "Delivery in 48 hours"
    } else {
       return "Delivery in 24 hours"
    }
}
```

### Use the "variables" argument in your JavaScript function

Your custom JS variable can also read your other variables. The `variables` argument stores all the built-in variables, your custom variables, and local variables recorded during the test run. <br>

If you run a custom javascript step with a function `console.log(variables)` you will get such an output in the console:&#x20;

```
{
    hostname: "https://marmelab.com/react-admin-demo/"
    profileName: "Default"
    runMode: "local"
    scheduleId: null //only for scheduled runs
    scheduleName: null //only for scheduled runs
    startDemoURL: "https://marmelab.com/react-admin-demo/"
    suiteId: "54bd4384-ad9c-4e83-946f-111392ed0a82"
    suiteName: "All tests"
    suiteRunId: "18e1e3c3-ec2a-45c9-b817-8f48a56a0807"
    testId: "37e64599-31a9-4707-9fed-a64cdec24294"
    testName: "Test"
    testRunId: "6498c9bd-81a5-412f-a275-2c7f1cfc4d45"
    timestamp: 1665667075470
    username: "demo"
}
```

You can use this to operate on the variables, combine them, calculate, etc.&#x20;

```
async function(variables) {
    return variables.firstName + variables.lastName
}
```

```
async function(variables) {
    return variables.userEmail + variables.testRunId
}
```

```
async function(variables) {
    return variables.userHeightInCentimeters + 20;
}
```

{% hint style="info" %}
**Important!** Variables are calculated immediately before a step is executed. If you want to calculate variable only once per test, use `localStorage` to cache the result and then access it with [custom javascript steps](/editing-tests/custom-javascript-actions).
{% endhint %}

{% hint style="warning" %}
**Important!** Other Custom JavaScript variables are not available in the `variables` object. This is impossible because you can't specify the order in which the JS variables are calculated or control the dependencies. See the `localStorage` workaround below.
{% endhint %}

{% hint style="info" %}
**Important!** Do not use the local variable and its combination in steps before BugBug captures the wanted value. Otherwise, BugBug will return an <mark style="color:red;">`undefined`</mark> string instead of the desired [local value](/editing-tests/local-variables).
{% endhint %}

### Use localStorage to pass on data between variables

If you want to access a variable that was already calculated in a previous step, use `localStorage`.&#x20;

1. At the end of the function in the first variable, store the result in `localStorage`.&#x20;

```
async function(variables) {
    let name = variables.firstName + variables.lastName;
    localStorage.setItem('bugbugUserName', name);
    return name;
}
```

2\. At the beginning of the next variable get the value from `localStorage`.

```
async function(variables) {
    let name = localStorage.getItem('bugbugUserName', name);
    if (name === 'Carl') {
        ...
    }
}
```


# Local variables

BugBug has the option to set up and insert a variable from the tested source during test recording. Now you can store any text value from the web page you are testing in a variable and use it in feature steps. For example, to find out newly registered unique users in your CRM. Also, you can use built-in variables or custom variables added to the project.&#x20;

A new option for **variables** in the test recording process can be found in the **BugBug Extension overlay**.

<figure><img src="/files/3eibOMLjQw4ZicWDzFkO" alt="" width="284"><figcaption><p>Variables button in recorder</p></figcaption></figure>

When you click on the "**Variables**" button there will be two options:

* Save variable for later
* Insert variable

<figure><img src="/files/s0qE3XfIcEw2XJcM0PRr" alt=""><figcaption></figcaption></figure>

### Save variable for later&#x20;

This option is used to save the new text value as a variable during the test recording. You can find an element and copy the value directly from the browser. Now there is no need to hardcode values and change them later in a BugBug web app steps edition. You can move forward. <br>

Click on the "**Save variable for later**" button. Saving a variable mode is now active.

<figure><img src="/files/tXruc6WejsFZGyNHQsLR" alt=""><figcaption><p>Click on a "Save variable for later" button</p></figcaption></figure>

At this time you can click on an element with text value on a tested web app and save it into a variable. For example, you can save the search phrase - *"Bugbug automation tool"*.

<figure><img src="/files/rjMUlZ5W1ZYVQg13DJzz" alt=""><figcaption><p>Click the item with the desired text value</p></figcaption></figure>

When an element is selected and a value is recorded, you will see an input in the BugBug extension menu where you can save the name for the new variable. Later this name will be visible in a list of variables in the BugBug extension menu.

<figure><img src="/files/n3fKdS6BCzxmDGEcraWt" alt=""><figcaption><p>No spaces or other special characters allowed</p></figcaption></figure>

When you save a variable, you will be taken to the main menu of the BugBug extension and can continue recording steps.

{% hint style="info" %}
The saved variable is a cross-domain feature. Now you can use the saved value on different web apps in one test. eg. You can open a new tab and use the stored value there.&#x20;
{% endhint %}

{% hint style="warning" %}
The variable can be overwritten several times during the test recording by using the same name. If you want to avoid this situation, use some unique names each time.
{% endhint %}

{% hint style="warning" %}
Using the same name of the variable as the built-in or custom variable name will override the data. This can cause a problem if your test is based on them and overriding these variables is not intended.
{% endhint %}

### Insert a variable during step recording

Now you can insert a variable during step recording in BugBug. You can use saved variables from previous steps, use custom variables from the project, or use global variables that are predefined by default.

<figure><img src="/files/1dMBsJTC4gGnA8EojfSh" alt=""><figcaption></figcaption></figure>

Click the "**Insert Variable**" button. A variable menu will open. As you can see, we suggest the last saved variable by default. Every variable has a name and length-limited value presented below the name. You can open the drop-down menu to select another variable from the list. [Available variables](#available-variables.) will be discussed in another chapter. Now we will focus on how to insert our saved variable into the designated input.

<figure><img src="/files/whaFfjMQR9DeRwGhG3Uy" alt=""><figcaption></figcaption></figure>

When you open the "**Insert variable**" menu the insert variable mode is now active for the selected variable. Now let's move on to the web application we're testing.

<figure><img src="/files/VQpJrJ7ongTbM8eisZNj" alt=""><figcaption><p>Find an input you want to fill with the variable</p></figcaption></figure>

If you have an input that you want to automatically fill and you have opened the Insert Variable menu with the selected variable, you can simply click on an input to fill it with a value.

<figure><img src="/files/fDxCc0jn8Z2aVUjt2aep" alt=""><figcaption></figcaption></figure>

The "**Insert variable**" menu closes. The entry is saved with the value, and you can continue recording steps such as clicking Enter to open search results.

### Available variables &#x20;

During recording, you can also insert a variable added by default from BugBug such as: <br>

* Built-in variables&#x20;
* Custom variables&#x20;

All these variables are described in the [Variables](/editing-tests/variables) section of BugBug documentation. <br>

<figure><img src="/files/6BRcAQr1sr2tx8gXQZYU" alt=""><figcaption><p>Variables added by default to insert list. </p></figcaption></figure>

Using built-in or custom variables is now easy and you do not need to edit steps in the BugBug web application UI. You can find them in the list.

<figure><img src="/files/C7uPNfO5eZOJpCuYqrOc" alt=""><figcaption></figcaption></figure>

### Unavailable variables during step recording &#x20;

#### Built-in variables based on a suit or scheduled run &#x20;

We cannot provide data such as {{suiteRunId}} because when recording, there is no suiteRunId. It's only accessible when the suite is running. You can insert this variable in normal test-edit mode on the BugBug web app UI for a case.&#x20;

{% hint style="info" %}
Some of the built-in variables are now disabled with notification. BugBug cannot import data from these variables. You can use it in step edit on the BugBug web app UI.&#x20;
{% endhint %}

<figure><img src="/files/C7uPNfO5eZOJpCuYqrOc" alt=""><figcaption></figcaption></figure>

#### Custom JS variables&#x20;

Currently, there is no way to use a custom js variable during test recording. We are working on providing such a feature, but for now, we can only use variables with values that are accessible before the test starts recording.\
You can use custom JS variables in step edit on BugBug web app as we [suggest](/editing-tests/custom-javascript-actions) in our documentation.&#x20;

### Search variables on the list&#x20;

You can search for variables on the BugBug extension list by the variable name.&#x20;

<figure><img src="/files/PgkM22fGxtkwiL0EG8W3" alt=""><figcaption></figcaption></figure>

### Local variables in web app UI&#x20;

There is a new step form for local variables recorded from the tested source. You can edit this variable freely. The recorded variable can be found in the step list as a "set variable".

<figure><img src="/files/TngXfafNsZl8wGlUjIem" alt=""><figcaption><p>Recorded step for local variable</p></figcaption></figure>

You can edit values such as the variable name or the correct item selector in the BugBug web application UI after you have finished recording.

<figure><img src="/files/KpcRYLIYIRDY3hgo1E0u" alt=""><figcaption></figcaption></figure>

**Use a local variable**

You can use local variables by selecting the "Insert variable" option during recording in the BugBug overlay. At the end of the recording session, the step using the local variable will be saved as "Type text" with the variable name used in the "value" field.

<figure><img src="/files/7GfDC5L9eNzj7143sAze" alt=""><figcaption></figcaption></figure>

You can also add a local variable from the BugBug web app UI by selecting "add a new step" on the list and filling it all manually.&#x20;

<figure><img src="/files/s4GPJKKU7UWca844wLkT" alt=""><figcaption></figcaption></figure>

Select "Set variable" from the modal.

<figure><img src="/files/j2Yr39Ji6uN3YtwgzTRE" alt=""><figcaption></figcaption></figure>

And fill in the requested inputs&#x20;

<figure><img src="/files/6BjrV7olTQkzPjihaApF" alt=""><figcaption></figcaption></figure>

Any recorded local variable can be used in the following steps by mentioning the local variable name in double curly brackets e.g. {{savedVariable}} in any text field like an assertion or custom selector. For more info check out [what are variables](<https://docs.bugbug.io/editing-tests/variables#what-are-variables >).

### Combine local and other variables in one JS custom variable&#x20;

You can create a new variable using two different values in the JS form, which allows you to combine stored variables from the recording process and those that we provide as default global variables.<br>

When you set variable from recording&#x20;

<figure><img src="/files/Ksi3RdhIZuDV2GGniON1" alt=""><figcaption></figcaption></figure>

You can use its name when creating a [new custom JS variable](/editing-tests/variables#javascript-variables). All stored variables are accessible in JS form by using the argument <mark style="color:red;">`variables`</mark> combined with the variable name.&#x20;

<figure><img src="/files/oK7Gdd495XGyqHVSqFWp" alt=""><figcaption></figcaption></figure>

When you use a new custom JS variable in step, BugBug will automatically combine the stored value with another variable that you want. These options allow you to combine values from all saved variables. You can call them as many times as you like.

To use a newly created variable, just put a variable name in double braces. After the first test run, you can find the calculated value of your variable from the previous test run in Step Details.\ <br>

<figure><img src="/files/7SLLjHIiudkzlA4TSN85" alt=""><figcaption></figcaption></figure>

{% hint style="warning" %}
Do not use the local variable and its combination in steps before BugBug captures the wanted value. Otherwise, BugBug will return an <mark style="color:red;">`undefined`</mark> string instead of the desired local value.
{% endhint %}


# Custom JavaScript actions

## JavaScript Steps

If you know how to code in JavaScript, you can overcome any limitations of BugBug features. With the power and flexibility of custom code actions, you can run any function during your tests.

<figure><img src="/files/er3HHvPuUwCpRuKwWHs2" alt=""><figcaption></figcaption></figure>

![](/files/hu5lprtpZiwagYXj1QII)

{% hint style="info" %}
**Hint!** You can call native JS functions, ex. you can request data via `XMLHttpRequest`, or store values in `localStorage`, etc.&#x20;
{% endhint %}

{% hint style="info" %}
**Remember!** You can also use [variables](/editing-tests/variables#use-the-variables-argument-in-your-javascript-function) in your custom code
{% endhint %}

### Advanced JavaScript assertions

Use JS code to add complex assertions. Run any function and if it returns `true` the assertions will pass.

<figure><img src="/files/wXoLhliA4foZLGoYXixg" alt=""><figcaption></figcaption></figure>

**Example: assert if an input element has a specific placeholder text.**

1. Record a regular assertion to the input.&#x20;
2. Change its type to "Custom Javascript assertion"&#x20;
3. Enter custom JS code that checks the placeholder of the element, for example \
   `if (element.placeholder === 'Username') { return true } else {return false}`

{% embed url="<https://youtu.be/g7CsE-WHrwQ>" %}

### Make an API request from a custom Javascript code

Using the custom JS you can really do anything. For example, you can request some data from your API and use this data in a [custom javascript variable](/editing-tests/variables#javascript-variables) or in an assertion.&#x20;

Here's an example of how to make a server-side request from Javascript.&#x20;

```
const response = await fetch('https://reqres.in/api/users', { 
    mode: 'no-cors'
});
const json = await response.json();
return json.data[0].email; //return the first user email
```

{% hint style="info" %}
**Note!** This is coding, so it adds complexity and more problems to solve. If you encounter cookie complications or  "Access-Control-Allow-Origin” ask a developer for help or contact BugBug support. We recommend keeping things simple and finding another solution to achieve a similar goal.&#x20;
{% endhint %}

{% hint style="info" %}
**Learn more** in the full [Fetch Web API documentation](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch)&#x20;
{% endhint %}

We listed several ideas on what you can achieve with API requests via code:

| Use API request to                                                                 | Example use case                                                                      |
| ---------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- |
| Compare the data displayed in your app with the data returned from the server      | Check if your currency exchange is up-to-date                                         |
| Get a list of test users and their parameters from a centralized testing data file | Get a login and password for your random test user, skipping the registration process |
| Get the latest item from a server and its ID                                       | Check if the most recently added product is shown on the list of search results       |


# Running the tests

Discover how to efficiently run tests with BugBug. Learn the best practices and techniques to optimize your testing process. Improve your software quality today

## Different ways of running the tests

### How to initiate test runs?

* simply [by clicking "Run"](#how-to-run-a-test-manually)
* automatically with Schedules
* via API using [BugBug CLI](/integrations/api)

### Running locally or in the cloud

* [locally](/running-tests/test-in-your-browser) - the test will run on your computer in Chrome browser in incognito mode
* [cloud](/running-tests/in-cloud-on-server) - the test will run on BugBug servers on a virtual machine

![](/files/69e4hPHufZU1pZAAIAt3)

## The simplest way to run a test

1. Go to a project and click the test that you want to run
2. Click `Run` button
3. See the incognito Chrome browser opening and the test running

{% hint style="info" %}
**Make sure you don't have any unsaved work in other incognito windows.** If you have other incognito windows open, BugBug will need to close them before running the tests. When you click "Close all windows", then all the incognito Chrome windows will be closed.&#x20;
{% endhint %}

After you run the test, check the result - [learn more about test statuses](/running-tests/statuses).


# Statuses

Learn about BugBug's test status functionalities and improve your testing process. Explore different test statuses for effective test management.

When you run a test, you will see one of the following statuses:

### Test passed

![](/files/71rOg6dgbWcjGUB3w27S)&#x20;

Everything worked as it should

![](/files/-MMDFTD5fAs-HhT7DMJW)

### Test failed

![](/files/6JNK9bBOzVEmvyoTkvbK)

The test has not finished because an assertion failed or it was not possible to continue running the test steps and the test finished because of the [timeout](/preventing-failed-tests/timeout).

You will get additional error information when this happens and tips on what to do to fix it.

Learn more on how to [debug and modify a step](/debugging-tests/runs-history).

![](/files/ylbS6yUrfVGfgXNAyDwm)

### Test passed but some waiting conditions were skipped

![](/files/mr2ovSQf5iRXDHl7WxZK)&#x20;

This status is indicated by a green circle that's empty inside.

This is a unique BugBug feature for preventing failed tests. This indicates that the user is able to finish your test, but you can take a look at the reason for skipped [waiting conditions](/preventing-failed-tests/waiting-conditions) just to make sure that your tests are in a good condition.

![](/files/7JqR70pcF4hkwYUBkbhG)

### Test error / crashed

![](/files/wxVWZ64N94p9CH0vKNG6)

The test encountered an error, which is not a result of the test steps, ex. internal server error, BugBug extension error, etc. This is most likely caused by a bug - please contact us if you see this status often.

### Test paused for debugging

![](/files/QSZoM0OPlIEwN3EHlFsZ)

You used a [breakpoint](/debugging-tests/breakpoint-run-step-by-step) or paused the test in the middle of execution using "Pause" button

### Test stopped

![](/files/HbO1rdPbpUshRp8WXeQr)

You stopped the test before it finished running, before it reached a conclusion.

### Test running

![](/files/pjx47UbSEkq2oWKO7c8n)

Test is running, execution in progress


# Run (locally)

Discover how to run tests in your browser with BugBug's comprehensive guide. Streamline your testing process for efficient software development. Learn more now!

This is the simplest way to run your tests (see [other ways](/running-tests/running-tests)).&#x20;

To run a test with your own browser:

1. Go to test view
2. Click the `Run` button
3. Then BugBug will open a new Chrome incognito window for your test run

![](/files/uBQGgie9NPJLFL6IQEw8)


# Run and pause here

If you want to run a test to a certain point, you can easily do this with the `Run and pause here` option.&#x20;

To use this function, you have to:

1. Hover on a step you want to run to.
2. Click `+` icon.
3. Click `Run and pause here` option.
4. The test execution window will open, and the test will run until the given step.
5. The paused mode will activate, and you can continue running step-by-step or resume a test execution.

<figure><img src="/files/M73ovMIrKO1mmle1PKYM" alt=""><figcaption><p>Run and pause here in the webapp UI</p></figcaption></figure>

<figure><img src="/files/KxZCqPFWHXVuLmbfuEio" alt=""><figcaption><p>Test execution window with option to resume running or run step-by-step</p></figcaption></figure>

When the test is paused, you can record new steps, change the playback position, resume execution, or modify steps from the UI. BugBug gives you a lot of control. Read more about it on the page [Edit & Rewind](/workflow-tips/edit-and-rewind).&#x20;


# Run in cloud

Discover how to run tests in the cloud or on your server with BugBug's comprehensive guide. Improve your testing efficiency and scalability today.

### Why run in the cloud?

Thanks to running in the cloud, you don't need to use your computer to monitor your website for bugs.

Running in the cloud is required for

* [scheduling tests](/running-tests/schedules)
* integrating with build pipelines ([running via CLI](/running-tests/running-via-api))
* making use of [parallel runs](/running-tests/parallel-mode)

### How to run in the cloud?

1. Go to test view and choose `Run in cloud`option on the right.&#x20;
2. Then you will use BugBug cloud for your test run:
3. You will not see any window for cloud runs, just observe the status of the test steps

Now that your tests pass in the cloud, you can [set up a schedule to automatically run them every hour](/running-tests/schedules).

![](/files/O0WadfgRZkIONzBCkq4W)

{% hint style="info" %}
**Important!** You can't run tests in the cloud on a FREE plan. Start a free trial or upgrade your plan to "PRO" - see [pricing](https://bugbug.io/pricing/).&#x20;
{% endhint %}


# Schedules

Discover BugBug's comprehensive guide on how to use test schedules. Learn efficient techniques to optimize your testing process and enhance software quality.

## Run automated tests in the cloud regularly

### Why use schedules?

When you've already prepared automated tests, you should run them on a regular basis to monitor if your web app works properly.&#x20;

Fortunately, you don't need to log in to BugBug and click "Run" every week :smile:. BugBug can [run the tests in the cloud](/running-tests/in-cloud-on-server) automatically and notify you about failed tests with [email notifications](#get-email-notifications-with-reports-for-scheduled-results).&#x20;

{% hint style="info" %}
To use schedule and cloud runs you need to have a paid subscription - [see pricing](https://bugbug.io/pricing/)
{% endhint %}

<figure><img src="/files/5pMrX4EYWRZF8AU3bXbw" alt=""><figcaption><p>Empty screen for Schedules</p></figcaption></figure>

## Run all tests every hour

{% hint style="info" %}
Creating an hourly schedule is not the only option you can choose. You can also select and create from other available schedules, such as: **Every 5 minutes / Hourly / Daily / Weekly / Monthly**.
{% endhint %}

Scheduling cloud monitoring with automated tests doesn't require any engineering knowledge or additional infrastructure. Here's how to do it:

1. Make sure your selected test suite passes when you [run them in the cloud](/running-tests/in-cloud-on-server)
2. Go to "Schedules"
3. Click on the "New schedule" button
4. Select "Hourly" and fill out all of the required fields
5. Select "All suites" **or** any other specific suite
6. Make sure "Schedule enabled" is turned on
7. Click on the "Create schedule" button

That's it! Based on this example, BugBug will now run your tests every hour. You will receive email notifications when all tests have been completed.

<figure><img src="/files/Kbd2NtJVYtX3kNBba8qU" alt=""><figcaption><p>Add new schedule modal</p></figcaption></figure>

<figure><img src="/files/hRL2SG8CLqgQNRa4TfWK" alt=""><figcaption><p>Filled form for with a new schedule</p></figcaption></figure>

<figure><img src="/files/hXbPHeWse9yPJdJlP2gp" alt=""><figcaption><p>Enabled schedule with all tests running every hour</p></figcaption></figure>

## Get email notifications with reports for scheduled results

You will receive notifications with scheduled test results directly in your inbox. You can [configure who gets notifications in project settings](/collaboration/alerts).

Emails notifying about failed schedules are marked with a :x: symbol.

{% hint style="warning" %}
**Important!** By default all suites use the [auto-retry failed tests](/organizing-tests/suites#auto-retry-failed-cloud-tests-to-prevent-flaky-tests-notifications) setting to avoid sending you false-alarm notifications from unstable, flaky tests.&#x20;
{% endhint %}

{% hint style="info" %}
**Tip!** Add a filter in your email to avoid inbox clutter. Or [disable notifications for passed runs](/collaboration/alerts#choose-when-people-get-email-notifications).
{% endhint %}

![Email notifications with various statuses](/files/LURpgHsJ5MrdVLI9JbM7)

The email contains details about the results and direct links to the tests that failed. After clicking the link you will see a read-only report of this run from the [run history](/debugging-tests/runs-history).

<figure><img src="/files/VwOicyCDx3sMX8RWU05D" alt=""><figcaption><p>Email notification for a failed schedule</p></figcaption></figure>

{% hint style="info" %}
**Did you know?** You can also [integrate BugBug notifications with your Slack](/integrations/slack)
{% endhint %}

## Customize schedule

If you work on a large project, you may want to have more than one schedule. For example, you can run production tests every hour but monitor your [test environment](https://docs.bugbug.io/editing-tests/variables#work-with-different-development-environments) just once a day at night.&#x20;

Create more schedules to have control over which suites are run and when.

{% hint style="info" %}
**Important!** Only suites can be scheduled - you can't schedule running individual tests.
{% endhint %}

1. Create separate test suites
2. Go to "Schedules"
3. Click the "New schedule" button
4. Fill out the name field
5. In the "Time" section, select the type of run from ***E*****very 5 minutes/Hourly/Daily/Weekly/Monthly** (for this example, we'll select Daily).
6. Select the suites you want to run and set the scheduled time range
7. Make sure "Enabled" is turned on
8. Click on the "Create schedule" button

<figure><img src="/files/p7PPLcq2VzJs0Fjy9zVj" alt=""><figcaption><p>Test suites selected for the daily schedule</p></figcaption></figure>

<figure><img src="/files/F0Y4QUleWxRa6SBCFYXa" alt=""><figcaption><p>List of all created schedules</p></figcaption></figure>


# Parallel runs

Discover the power of parallel mode in test execution with BugBug. Boost productivity and efficiency with simultaneous test runs. Get started for free now!

## Why run tests in parallel?

You can run your tests [in the cloud](/running-tests/in-cloud-on-server) *in parallel*, which means that more than one test will be executed at the same time. Multiple tests will run simultaneously, resulting in **up to 32x shorter testing time.**

You can have up to 32 parallel runs, depending on your subscription plan.

## Parallel testing pricing

You can purchase parallel runs on the **CORE**, **PRO** and **BUSINESS** plans, either directly in the BugBug app or when selecting your plan.

Each additional parallel run costs **$80/month** for users on a monthly subscription.\
If you're on an annual plan, you’ll receive a **15% discount** on this price.

**PRO** plan pricing with extra parallels

<table><thead><tr><th width="212">Number of parallel test runs</th><th width="70">-</th><th width="73">2</th><th width="78">4</th><th width="87">8</th><th width="94">16</th><th>32</th></tr></thead><tbody><tr><td>Billed monthly</td><td>$219</td><td>$299</td><td>$459</td><td>$779</td><td>$1,419</td><td>$2,699</td></tr><tr><td>Billed yearly</td><td>$189</td><td>$257</td><td>$393 </td><td>$665</td><td>$1,209</td><td>$2,297</td></tr></tbody></table>

**BUSINESS** plan pricing with extra parallels

<table><thead><tr><th width="212">Number of parallel test runs</th><th width="70">-</th><th width="73">2</th><th width="78">4</th><th width="87">8</th><th width="94">16</th><th>32</th></tr></thead><tbody><tr><td>Billed monthly</td><td>$659</td><td>$739</td><td>$899</td><td>$1,219</td><td>$1,859</td><td>$3,139</td></tr><tr><td>Billed yearly</td><td>$559</td><td>$627</td><td>$763 </td><td>$1,035</td><td>$1,579</td><td>$2,667</td></tr></tbody></table>

## Enable parallel runs

1. Go to **Suites** view
2. Edit or create a suite
3. Change the option for Parallel cloud runs

![](/files/VhTlrcu28ANelxkkK1ZV)

When you trigger suite to run, your tests in that suite will run in parallel.&#x20;

{% hint style="info" %}
**Parallel testing is only possible when tests are** [**run in the cloud**](/running-tests/in-cloud-on-server)

Suites run in your local browser will always run sequentially because your browser cookies and storage are shared among all incognito windows, so only one test can be run at a time.&#x20;

All cloud runs can be performed in parallel, regardless of whether they are manually triggered or [initiated via API](/running-tests/running-via-api).
{% endhint %}

## Parallel runs within your organization

**Parallel runs let you run more than 1 test at the same time.**&#x20;

The number of tests you can simultaneously run within your [organization](/collaboration/organization-settings#what-are-organizations) depends on your subscription plan.

If you are using BugBug with one of the paid subscriptions, you can run tests in the cloud, but only 1 test can be in progress at the same time.&#x20;

If you have multiple projects and run tests at the same time, they will be queued, they won't run in parallel - they will be executed one by one.&#x20;

**To run more tests in parallel you need to upgrade to one of the paid plans and purchase parallel runs either directly in the BugBug app or when selecting your plan.**

We support up to 32 parallel tests.


# Running via API

Discover how to run tests via API with BugBug's comprehensive documentation. Connect BugBug to your CI/CD pipeline. Streamline your automation testing process.

## Running via API

BugBug can be connected to CI/CD pipelines, deployment tools, and custom systems through Public API, CLI, or incoming webhooks.

Use this page to choose the right option.

### Public API

Use the [Public API ](#public-api)when you are building a custom integration and need programmatic control.

The Public API can list and manage tests and suites, start runs, check statuses, retrieve results, stop runs, download reports, export/import data, update settings, and manage visual regression reference screenshots.

BugBug provides API documentation in three formats:

* [GitBook](/public-api-reference/config)
* [Swagger](https://app.bugbug.io/docs/swagger/?version=v2)
* [Redoc](https://app.bugbug.io/docs/redoc/?version=v2)

Read more about public integration [here](/integrations/public-api).

### Command Line Interface

Use CLI when you need to run BugBug tests from CI/CD without writing a custom integration.

[Learn how to seamlessly integrate BugBug into your existing workflow](/integrations/api)

### Incoming webhooks

Use incoming webhooks when another tool only needs to trigger a test or suite with a single `POST` request.

[Learn more how to use incoming webhooks](/integrations/webhooks)


# Test your local build or protected web page using ngrok

Learn how to test your local build or protected web page using ngrok. BugBug provides step-by-step instructions and tips for seamless testing. Start testing for free!

You can use BugBug to test your local build or private site with restricted access. For this action, you have to use a third-party tool like ngrok.&#x20;

{% hint style="info" %}
ngrok is **not** part of BugBug. It's a 3rd party tool that exposes your website to a public URL address. Before you decide to use this tool, you may want to contact your network administrator.
{% endhint %}

ngrok opens a dedicated, secure tunnel that publicizes your local port for Internet access. When your local build or protected page is accessible through the public URL address created by ngrok, BugBug can open that site through a dedicated URL and start running tests or help you record steps.

### Set up ngrok&#x20;

First, visit a ngrok website and download the application to set up a tool, then unzip it to a designated location.

When you launch ngrok, you will need to provide an auth token. You need to register and open your account on the ngrok website.

<figure><img src="/files/zsRr9K4JSkYmhNHrWyG8" alt=""><figcaption></figcaption></figure>

Then open a ngrok command-line shell and copy-paste the command&#x20;

<pre><code><strong>$ ./ngrok config add-authtoken {{yourAuthToken}}
</strong></code></pre>

### Fire up the ngrok&#x20;

Once you have opened and configured the auth token for ngrok, you can publish your local build or private page to the public.

#### Set up your local build and verify the localhost port.

<figure><img src="/files/Yw1gBqyzdn8VaUmmCC1h" alt=""><figcaption></figcaption></figure>

Then enter in your terminal **ngrok** command with the port related to your application, e.g., for **3000**:

```
$ ./ngrok http 3000
```

<figure><img src="/files/0YruFx9h2iRR00RLUxju" alt=""><figcaption></figcaption></figure>

Then ngrok opens a secure tunnel where your local build gets a public URL that can be used in BugBug tests (screenshot below).<br>

<figure><img src="/files/vheK3640wtaBReSGZ7Sn" alt=""><figcaption><p>You can check out it in the browser. </p></figcaption></figure>

#### If your page is on a private server&#x20;

**If the website is running on a private server** then you are likely using a URL like `http://private.mycompany.com` to access it. In this case, you’ll create a tunnel to that URL using this command (with the private server URL swapped in):

```
$ ./ngrok http -host-header=rewrite private.mycompany.com:80
```

ngrok will print the same connection status to the console as above, with the public URL that is accessible to BugBug.&#x20;

### Record a test &#x20;

Once you successfully create a public URL with your local build or protected page, you can start recording tests with BugBug. Just use a URL provided by ngrok at the beginning of the process.<br>

<figure><img src="/files/paC9hUytjtpiGgzvcWZV" alt=""><figcaption></figcaption></figure>

{% hint style="warning" %}
On the free plan, ngrok changes the URL each time it is restarted. So you need to update the test URL when ngrok provides a new one.
{% endhint %}

If you want to avoid this problem, you can use paid plans and set up a dedicated domain for your account. See the [ngrok doc](https://ngrok.com/docs/guides/how-to-set-up-a-custom-domain/) for more information.

To easily update the URL address follow these steps.

1. Open a test and go to the first step.&#x20;
2. Then change the URL address <br>

<figure><img src="/files/a9m06SNx9xVzWttOsFh3" alt=""><figcaption></figcaption></figure>

To make it easier to maintain a large number of tests, use a local variable that helps you to change the URL only in one place for all tests that use it.

<div><figure><img src="/files/WNfrg2heUY4Dw5RAITiZ" alt=""><figcaption><p>Create a variable </p></figcaption></figure> <figure><img src="/files/lON4Kz4zZkoolZAyGv9t" alt=""><figcaption><p>Use it in test </p></figcaption></figure></div>

For more info about variables, please visit [Variables](/editing-tests/variables) in our documentation.

### Alternatives

Like many solutions, ngrok has alternatives, and you can choose something else.

* [Serveo](http://serveo.net/)
* [Localhost](http://localhost.run/)
* [Cloudfared](https://github.com/cloudflare/cloudflared)
* [LocalTunnel](https://github.com/localtunnel/localtunnel)


# How it works?

Visual regression compares the current appearance of a page or element with a stored reference screenshot.

In BugBug, this happens as part of a visual regression step during test execution.

<figure><img src="/files/jV9NpFWUP45hQwqNebe5" alt=""><figcaption></figcaption></figure>

### What Happens During a Run

When the test reaches a visual regression step, BugBug:

1. captures a screenshot of the selected element or the current page
2. identifies the current environment
3. looks for a matching reference screenshot
4. compares the new screenshot with the reference
5. marks the step as passed or failed

If the step fails, you can review the difference and decide what to do next.

### How BugBug Defines the Environment

Reference screenshots are stored **per environment**.

An environment is defined by the combination of:

* browser
* operating system
* screen size
* profile
* run mode

This matters because the same page can render differently across environments. For example, a test running in Chrome on Linux in cloud mode may need a different reference than the same test running locally on another operating system.

### What Happens on the First Run

If BugBug cannot find a reference screenshot for the current environment, it does not compare anything yet.

Instead, it:

1. saves the current screenshot as the initial reference
2. links that reference to the current environment
3. treats the step as passed

This is how **the baseline** is created automatically during the first run.

The same behavior also applies when a test later runs in a different environment that does not yet have its own matching reference.

### How the Comparison Works

When a matching reference exists, BugBug compares the new screenshot with the stored reference screenshot.

The comparison checks:

* how many pixels are different
* how sensitive the comparison should be to color changes
* whether anti-aliased pixels should be included in the diff

The result is an observed visual difference, expressed as a percentage.

<figure><img src="/files/bOodkgtIrmPT7mIgUon8" alt=""><figcaption></figcaption></figure>

### What Decides Whether the Step Passes

Each visual regression step uses a **max difference** value.

<div align="left"><figure><img src="/files/IpmLmlHQXFX7bImPGcWi" alt=""><figcaption></figcaption></figure></div>

BugBug compares:

* the **observed difference** from the current run
* the **allowed max difference** for the step

The step passes when the observed difference stays within the allowed threshold. If the observed difference is higher than the allowed max difference, the step fails.

In short:

* small allowed changes can still pass
* larger differences fail the step

### What Artifacts BugBug Creates

For visual regression steps, BugBug can store:

* the reference screenshot
* the screenshot captured during the run
* a diff screenshot that highlights the changed areas

These screenshots are used in the run details and in the review flow so you can see what changed instead of guessing.

### What You Can Do After a Failure

When a step fails, open **Review & fix** and compare:

* the expected reference screenshot
* the observed screenshot from the run
* the visual diff

<div align="left"><figure><img src="/files/T3sqlRNo46vpNvPsDmoX" alt=""><figcaption></figcaption></figure></div>

From there, you can choose one of the following actions:

* **Do nothing** if the change is not acceptable
* **Increase max difference** if the change is acceptable and the step needs more tolerance
* **Set observed screenshot as reference** if the new UI should become the baseline

<figure><img src="/files/hLJtD4rX3DsQozGVgz9K" alt=""><figcaption></figcaption></figure>

### Why Environment-Specific References Matter

Environment-specific references make visual regression more reliable.

Without them, BugBug would compare screenshots that were captured under different rendering conditions. That would produce false failures for reasons that have nothing to do with an actual regression.

By storing references per environment, BugBug compares like with like:

* desktop with desktop
* one browser with the same browser
* one run context with the same run context

That keeps failures more meaningful and review decisions easier.

### Summary

Visual regression in BugBug follows a simple flow:

1. capture the screenshot
2. find the matching environment reference
3. create the reference automatically if none exists
4. compare the screenshots when a reference is available
5. pass or fail the step based on the allowed difference
6. let you review and update the result when needed

That is the whole mechanism. The useful part is not that it compares screenshots. The useful part is that it compares the right screenshot against the right baseline.


# Best practices

Visual regression helps you catch UI changes that functional checks may miss. It works best when the screen is predictable and the reference screenshot reflects a stable, intentional state.

Use the practices below to keep visual regression useful instead of noisy.

### Prefer Element-Level Checks When Possible

Use **element visual regression** when you want to verify a specific component, section, or control.

This is usually the most stable option because:

* it compares a smaller area
* it is less affected by unrelated page changes
* it makes failures easier to review

Use **full-screen visual regression** only when page layout is the thing you actually want to validate.

### Keep the Screen State Stable

Visual regression compares screenshots, so even small visual changes can affect the result.

Before adding a visual regression step, make sure the page is in a repeatable state:

* wait until content has finished loading
* close popups, cookie banners, and tooltips unless they are part of the expected result
* avoid transient UI states such as animations, loading spinners, hover states, and auto-rotating banners
* make sure test data is predictable

If the page changes every time the test runs, the screenshot will too.

### Use the Same Environment for Stable Results

BugBug stores **reference screenshots per environment**. In practice, that means a reference is matched against the combination of:

* browser
* operating system
* screen size
* profile
* run mode (cloud/local)

If you run the same test in a different environment, BugBug may need a different reference screenshot for that environment.

To keep results consistent:

* review and approve references in the same environments you use for regular runs
* avoid comparing local and cloud runs as if they were interchangeable
* keep screen size and profile selection consistent across runs

### Understand the First Run

When BugBug runs a visual regression step and **no reference screenshot exists for the current environment**, it automatically saves the current screenshot as the initial reference.

That means the first run is used to establish the baseline. Because of that:

* make sure the page looks correct before you accept that first run as your baseline
* if the environment changes later, BugBug can create a separate reference for that environment

### Choose Max Difference Carefully

`Max difference` defines how much visual change is allowed before the step fails.

Keep it as low as you reasonably can:

* use a low value for stable UI such as buttons, forms, labels, and layout containers
* increase it only when small visual variation is expected and acceptable
* avoid using a high value as a shortcut for unstable tests

If the threshold is too low, you will get noisy failures. If it is too high, you can miss real regressions. The feature is not magic; it still depends on decent judgment.

### Use Project Settings for Consistent Behavior

Visual regression comparison is influenced by project-level settings such as:

* default max difference
* pixel sensitivity threshold
* anti-aliasing handling

Use project defaults when you want consistent behavior across tests. Override the step-level max difference only when a specific step genuinely needs different tolerance.

### Review Failures Before Updating References

When a visual regression step fails, review the screenshots before changing anything.

Use **Review & fix** to decide whether the change is expected:

* if the new look is correct, set the observed screenshot as the new reference
* if the UI is allowed to vary slightly, increase the max difference
* if the change is unexpected, keep the existing reference and investigate the regression

Do not blindly replace references after every failure. That is just a more expensive version of ignoring the test.

### Avoid Common Sources of Flakiness

Visual regression is most fragile when the UI includes content that changes outside your control.

Common examples:

* timestamps and relative dates
* rotating banners or carousels
* ads or third-party widgets
* personalized content
* lazy-loaded or virtualized sections
* font rendering differences across environments
* page-level screenshots with dynamic content above or below the fold

If this kind of content matters, isolate it. If it does not matter, do not include it in the screenshot area.

### Re-Record References Intentionally

Update a reference screenshot only when the new UI is the expected result.

A good time to re-record is when:

* the design changed on purpose
* a component was restyled intentionally
* the environment-specific reference needs to be refreshed

Avoid re-recording references during unstable deployments or while the page is still changing frequently.

### Summary

The most reliable visual regression tests have three things in common:

* they target stable UI
* they run in consistent environments
* they use reference updates deliberately

If you do that, visual regression becomes a useful safety net instead of another pile of flaky noise.


# Review & fix

The **Review & fix** flow helps you decide what to do after a visual regression step fails.

Instead of guessing from a single screenshot, you can compare the expected result, the observed result, and the visual diff in one place.

Use this flow when a failed visual regression step needs a decision:

* keep the existing reference because the change is a real regression
* accept the new look as the new reference
* increase the allowed difference for this step

### When Review & Fix Is Available

The **Review & fix** option appears for failed visual regression steps in a test run.

It is meant for steps where BugBug was able to compare:

* a stored reference screenshot
* the screenshot captured during the run
* the resulting diff

If no reference exists yet for the current environment, BugBug creates the initial reference automatically during the run instead of opening this flow.

### What You See in Review & Fix

The modal is split into two main areas:

* the screenshot comparison view
* the resolution panel

#### Screenshot Comparison View

The comparison view shows:

* the **reference screenshot**
* the **observed screenshot**
* the **difference percentage**

You can also enable **Show diff** to overlay the pixel difference visualization on top of the reference screenshot. This helps you see exactly where BugBug detected changes.

Use the opacity slider to make the diff overlay more or less visible.

#### Resolution Panel

The resolution panel lets you choose what to do with the failure.

You can pick one of three actions:

* **Do nothing**
* **Increase max allowed difference**
* **Set observed screenshot as reference**

If the test run contains multiple failed visual regression steps, you can review them one by one and navigate through them from the same modal.

### How to Open Review & Fix

Open the failed test run, find the failed visual regression step, and click **Review & fix**.

If the run contains multiple failed visual regression steps, BugBug can open a sequential review flow so you can process them one after another.

### How to Read the Comparison

Before choosing an action, check three things:

1. **What changed** Compare the reference and observed screenshots.
2. **Where it changed** Turn on **Show diff** to inspect the changed area.
3. **How large the change is** Review the reported difference percentage.

This part matters because the same failure can mean very different things:

* a real UI regression
* a small acceptable visual shift
* an intentional design update
* an unstable or flaky page state

Do not jump straight to updating the reference. That is how bad baselines are born.

### Resolution Options

#### Do Nothing

Choose **Do nothing** when the observed UI is not correct and the existing reference should stay unchanged.

Use this when:

* the difference reveals a real regression
* the screen captured the wrong state
* the page is unstable and the result should not be accepted yet

This keeps the current reference screenshot as the expected baseline.

#### Increase Max Allowed Difference

Choose **Increase max allowed difference** when the change is acceptable, but you do not want to replace the reference screenshot.

This option updates the step's max difference threshold so that small, acceptable variation can pass in future runs.

Use this when:

* the UI is visually the same in practice, but there are minor rendering differences
* small spacing, shading, or anti-aliasing changes are acceptable
* the component has slight but expected variation

Be careful with this option. Raising the threshold too much makes the check less useful.

#### Set Observed Screenshot as Reference

Choose **Set observed screenshot as reference** when the new appearance is the correct expected result and should become the new baseline.

Use this when:

* a design change was intentional
* the component was restyled on purpose
* the correct UI has changed and future runs should compare against the new look

This replaces the existing reference for the matching environment with the observed screenshot from the failed run.

### What Happens When You Save

What BugBug saves depends on the option you selected.

If you choose **Do nothing**:

* no reference is changed
* no threshold is updated

If you choose **Increase max allowed difference**:

* BugBug updates the step's max difference value
* future runs for that step use the new threshold

If you choose **Set observed screenshot as reference**:

* BugBug saves the observed screenshot as the new reference
* future runs in the same environment compare against that new reference

### Apply to All Failed Screenshots

If the test run contains multiple failed visual regression steps, the modal can show **Also apply this to all other failed screenshots**.

Use this carefully.

It applies the selected resolution to all failed visual regression steps in the current test run.

This can be useful when:

* a known visual change affects many steps
* a design refresh changed multiple validated areas
* a temporary tolerance adjustment is needed across several failed visual regression steps

It is a bad idea when failures have different causes. One bulk action can easily accept changes that should have been reviewed separately.

### Keyboard Shortcuts

Review & fix supports keyboard shortcuts to speed up the workflow.

#### Resolution Shortcuts

* `1` selects **Do nothing**
* `2` selects **Increase max allowed difference**
* `3` selects **Set observed screenshot as reference**

#### Save Shortcuts

* `Enter` saves the current selection
* `Shift + Enter` saves for all failed visual regression steps in the current run

#### View Shortcuts

* `D` toggles the diff overlay
* `=` zooms in
* `-` zooms out
* `0` fits the image to the available space

### How to Decide Which Option to Use

Use this rule of thumb:

* if the UI is wrong, choose **Do nothing**
* if the UI is correct but small variation is acceptable, choose **Increase max allowed difference**
* if the UI is correct and should become the new expected result, choose **Set observed screenshot as reference**

If you are unsure whether the page is stable, do not accept the result yet. Re-run after stabilizing the page state first.

### Common Mistakes to Avoid

#### Accepting a Broken UI as the New Reference

Do not update the reference just because the test failed. A failing test is a signal, not a command.

#### Raising the Threshold Too Aggressively

If you keep increasing max difference to silence failures, the visual check gradually stops protecting anything useful.

#### Using Apply to All Without Reviewing the Failures

Bulk actions save time only when the failures come from the same intentional change. Otherwise, they just spread the mistake faster.

#### Ignoring Environment Differences

Review decisions apply to the matching environment. If the same step runs in another environment, it may still need its own review or its own reference screenshot.

### Summary

**Review & fix** is where you decide whether a failed visual regression step means:

* there is a real bug
* the baseline should be updated
* the step needs a slightly higher tolerance

Used correctly, this flow helps you keep reference screenshots accurate and visual checks trustworthy.


# Waiting conditions

Learn effective waiting conditions to prevent failed tests. Improve your test automation process with BugBug's expert guidance. Start your test automation today.

## Smart waiting before running a step

Before running each test step, BugBug will do a series of checks if your page is ready for this action.&#x20;

For example, before BugBug tries to click a button, it will check if the page finished loading, if the button exists and if it's visible. If those conditions are met, BugBug will attempt to click the button. Such conditions are called **"*****Waiting conditions*****"**.

Benefits:

* **more stable tests**
* you don't need to hardcode manual delays
* more intelligent tests running, behaving more like a human and not a machine

## Available waiting conditions&#x20;

### Document readyState is complete

BugBug waits until your page is ready to interact with and if all the basic assets are loaded. In technical terms this is waiting for `onload` window event.

### Page network requests are finished

BugBug waits until your page has finished loading additional data via other network requests.&#x20;

Even after the page is loaded, your web app needs to request additional data from a server. BugBug will wait until your server requests are more or less finished - by default BugBug will stop waiting when there are not more than 2 unfinished requests for more than 1 second. You can change this in Project Settings.

### Element is visible

BugBug will not interact with the element until it is visible. For example, if you have a "Done" button than only appears after several seconds, BugBug will wait until it appears. That's why you should avoid adding manual delays/sleep.

### Element is not covered by the other one

Same as in "Element is visible" above. BugBug will try not to click something that is covered by another element.

### Element is not animating

This ensures that the animation of the element stopped before BugBug interacts with it.&#x20;

For example, if you have a collapsed section that expands with an animation, BugBug **will wait until it is fully expanded before interacting with its contents**.

This waiting condition is enabled if during the recording you clicked an element that was not animating. If the element has a looping animation, BugBug will disable this waiting condition by default.

### Element must be active

This applies to form elements, that can have a `disabled` attribute. BugBug will hold the step execution until the form element is active. This waiting condition is automatically disabled if during the recording you actually clicked on a disabled element.

### Element has focus

This applies to text input elements. BugBug will wait before typing the letters until it verifies that a text `input` or `textarea` has focus, (meaning that the blinking typing cursor is present the right field)

### Element has an attribute

BugBug will check if element has a attribute with expected value, before interacting with it.

You can add this waiting condition manually, by clicking on "Add condition" in step's "Waiting condition" section.

It requires the expected value to be specified using a specific pattern: `key="value"`, where `key` is the attribute name and `value` is the expected attribute value, e.g. `class="bugbug"`.

### Page will navigate after step execution

This is a special waiting condition that is added automatically by BugBug while recording. If BugBug notices that after a click there's a change in the URL, BugBug will not continue running the next step immediately - it will wait until the URL changes. This also applies to URL history state changes for Single Page Applications.

## Enable or disable waiting conditions

Global waiting conditions can be set up in the project settings.

![](/files/E89Z0s0a7qERYGZf9lif)

You can override waiting conditions per each step. Sometimes you need to disable one of them to prevent unnecessary failed tests.

![](/files/MYX30cnn64UC7V087iKm)

## Skipped waiting conditions

If some waiting conditions are not met, BugBug will anyway try to perform the action. For example, if the page networking has not finished, BugBug will anyway click the button after 30 seconds.&#x20;

You will be notified about skipped waiting conditions by a different green indicator![](/files/EplfpWyrJwk1PrVT4VkH)

[More about test statues](/running-tests/statuses)


# Smart click

Discover BugBug's smart click feature to prevent failed tests efficiently. Improve your testing process and enhance software quality with ease.

Smart Click is one of three **AI-powered capabilities** in BugBug's [AI Test Recorder](https://bugbug.io/ai-test-recorder/). It activates automatically during recording — no configuration needed.

It mimics real user behavior when interacting with dynamic UIs: it handles elements that appear only on hover, inside modals, or after scroll-triggered animations.

## Simulating real cursor clicks

BugBug  simulates real clicks as if the user was moving a mouse. So if the element is not visible or covered by something else, it is not possible to click it.&#x20;

BugBug will not fake-click the elements with JavaScript events.&#x20;

## Smart preventing incorrect clicks

BugBug prevents randomly failed tests by being smart about clicking elements.

**1) BugBug will retry the click if the right element was suddenly covered**

After clicking an element, BugBug will check if the right item was clicked. This prevents a situation when the click event was received by a different element, for example, you wanted to click a button but it was covered by a cookie popup overlay or scrolled outside of the viewport.&#x20;

**2) BugBug will click the element even if it's partially covered**

Your test will not fail if the button is partially covered. BugBug will click the remaining visible button area.

![](/files/J4u6XF1evaA6ToetJMed)

## Smart position detection&#x20;

BugBug will first try to click the element in the center, but if this will not work, BugBug will automatically find different coordinates for clicking an element, that is not covered by anything else and is visible on the screen.&#x20;

![](/files/Ww7JZip7gteGbgXCdn2A)


# Smart scroll

Discover how to prevent failed tests with smart scroll. Improve your test efficiency and reliability using BugBug's smart scroll feature. Learn more now!

Smart Scroll is one of three **AI-powered capabilities** in BugBug's [AI Test Recorder](https://bugbug.io/ai-test-recorder/). It activates automatically during recording — no configuration needed.

It handles pages where content loads as you scroll, ensuring BugBug reaches the target element the same way a real user would.

### Simulating real user scroll actions

BugBug will try to behave like a human: we will automatically attempt to scroll the page to see the element and interact with it.

**So you don't need to maintain the scroll actions!** :tada:

Your tests <mark style="color:green;">**will not fail**</mark> if:

* some content on the page changed and pushed the clickable element down outside of the browser viewport
* some fixed popup or an ad covered the element completely, but it is still reachable if you scroll more

{% hint style="info" %}
You can still [manually add scroll steps](/editing-tests/manually-creating-the-test), for handling more complex scrolling and items with their own overflow scroll.&#x20;
{% endhint %}


# Selectors

Learn how to prevent failed tests with efficient selectors. BugBug's comprehensive guide provides valuable insights and best practices. Start optimizing your testing process today!

What is a selector?

Human users just see the page and use their intelligent brains to **find the right element to interact with**.

Computers on the contrary need more specific instructions to know what to click. **"Selector" is a way of describing a specific element on your page that can be clearly identified.**&#x20;

For example, a *selector* can describe an instruction to `Find an element with a text "Add to cart"` or `Find the first element with id "primary-button-submit"`

## Automatic vs. manual selectors&#x20;

**Automatic selectors** --> BugBug creates them automatically when your [record a test](/recording-tests-steps/bugbug-ai-test-recorder)

**Manual selectors** --> You create them on your own using your own human intelligence. Sometimes manual selectors is the only way of creating a reliable automation testing

{% hint style="info" %}
**See** [**our simple tool for building XPath selectors without code -->**](https://bugbug.io/xpath-selector-builder/?ref=docs)

![](/files/jn1SM8YB3OtrhWkZQauX)
{% endhint %}

## Adaptive locators

If you are recording the tests, you don't need to be worried about selectors too much. During recording, BugBug's Adaptive Locators automatically generate multiple selectors for each element and **use AI to pick the most stable one** — prioritizing data-testid attributes, semantic roles, and text content over fragile dynamic IDs or positional CSS.

<figure><img src="/files/hcY2wp7rEGVdpev5aQ1V" alt=""><figcaption><p>Adaptive Locator generated automatically by BugBug's AI during recording</p></figcaption></figure>

{% hint style="info" %}
Adaptive Locators are part of BugBug's AI-Assisted Test Recorder and are available on all plans, including Free. They activate automatically — no configuration needed.
{% endhint %}

## Manual selectors

You can also enter your own custom XPath or CSS selector. In the details of selected test step click on existing selector and select "Customize" option (last position).

<figure><img src="/files/aGxCME1rt6fVd4gkIVRP" alt=""><figcaption><p>Selector customization</p></figcaption></figure>

BugBug can understand selectors in the following formats:

* CSS selectors, for example `[id="submit"]`
* XPath selectors, for example `//*[@id="submit"]`

Manual selectors sometimes is the best way of creating stable automated tests in complex apps.

For example you if you have a long table with buttons inside each row, you may need to create a selector that first points to the right row and then to the right action button.&#x20;

{% hint style="info" %}
**Learn the basics of HTML**

To write reliable selectors you need a basic knowledge of HTML and understand what are *tags*, *attributes*, *parents* and *children*. You can learn it in our **extensive tutorial in the** [**no-code XPath selector tool**](https://bugbug.io/xpath-selector-builder/?ref=docs).
{% endhint %}

### Nested selectors

BugBug allows you to create nested selectors. This is especially helpful when dealing with dynamic table data or nested iframes. Each selector narrows down the context, which gives the superpower to make the right selector for an element.

In the below example, BugBug will first narrow down the context of the document with&#x20;

`//*[@data-testid="todo-list"]`

and then will find a **child** of this element using the next selector `//li`

<figure><img src="/files/rdAKB2YXMgNeWkPAAbre" alt=""><figcaption><p>Nested selectors with BugBug.</p></figcaption></figure>

<figure><img src="/files/ARvsnGbIvZ5dz9wCJKmt" alt=""><figcaption><p>The right box is the parent selector, the pink box is the child selector.</p></figcaption></figure>

In nested selectors, you can refer to **parent**, **child,** or **sibling**.

<figure><img src="/files/L65VTS7bvqgvMHOM4EhT" alt=""><figcaption><p>Nested selectors options.</p></figcaption></figure>

If you want to read more about XPath and selectors in general you can check out our [BugBug Selector Builder](https://bugbug.io/xpath-selector-builder/).

## Set priority of automatic selectors

You can decide about the priorities of automatic selectors and configure your custom attributes in [project settings](/preventing-failed-tests/project-settings). This is an advanced setting and usually there's no need to change it.&#x20;

![](/files/3JWe16xAYxtDkk6jvwc7)

## Use custom attributes for selectors

To create robust tests, your app should be coded with additional special attributes that are dedicated to testing automation. The usual convention is to use `data-test` or `data-testid` attributes.

BugBug will automatically prioritize such robust selectors when it recognizes them. So if you're working on a complex app, **we highly recommend** that you talk to your front-end developers and ask them to add such attributes. This will also make their life easier because they will see from the code that an element is a subject of testing automation.

![](/files/ZkN1NpxHpmgulLZjArOy)

## The "element not found" error

When your test fails with an error "element not found" or "element not visible", this might be caused by an incorrect [selector](/preventing-failed-tests/selectors).

Common problems with selectors are:

* It is too specific, contains some kind of unique ID that is changing every time you run the test
* It is depending on the order of elements, but the order of elements changes, like a list of products in e-commerce might change every day (you can avoid this problem by [building a selector manually](#automatic-vs.-manual-selectors))
* It is pointing to more than one element and some of them are not visible (for example your page has some hidden buttons with `display: none`)
* the text in your app changed and you were using a [text-based selector](#fix-text-based-selectors)&#x20;

![](/files/ntZCNZYzVzmJtBnxhAuX)

## Tips on fixing selectors

### Use Chrome debugging

Chrome is very powerful in debugging and it's worth learning [how to use Chrome developer features](/debugging-tests/debug-in-chrome).&#x20;

### Copy selector to clipboard

* Click the button near the selector field&#x20;
* Open Chrome dev tools
* Click cmd+f
* Paste the selector in the search field
* Chrome will highlight the element that is matching your selector
* If no element is matched, you may try to manually update the selector or just [re-record the step](/recording-tests-steps/re-recording-steps)

![](/files/4TERUa62lyECxwqIMYO6)

![](/files/Fl9UTFfB6IJKUle1ABiC)

### Prevent incorrect selectors

Prevent failed tests by using [custom attributes for selectors](/preventing-failed-tests/selectors#use-custom-attributes-for-selectors)

### Fix text-based selectors

Some selectors are just finding any element that contains a specific text. Here's an example of such a selector:

`//DIV[normalize-space(text())="Create account in Example Project"]`

{% hint style="info" %}
**Tip:** you can [use variables in selectors](/editing-tests/variables#using-text-variables)
{% endhint %}

If this text changes in your app, you will get an "element not found" error. The element is in fact still there, but the selector does not work anymore. You can [manually update](/editing-tests/manually-creating-the-test) the selector or [re-record this step](/recording-tests-steps/re-recording-steps).


# Timeout

Discover effective strategies to prevent failed tests due to timeouts. Learn how to optimize your test environments and code execution for smooth test runs.

BugBug will not immediately fail the test if it can't click an element right away (or do any other interaction or assertion).

By default, it will wait for 30 seconds and reattempt to run the test step and hold until [waiting conditions](/preventing-failed-tests/waiting-conditions) are met. If it was not possible to continue the test after such time, the test will be marked as failed.

## Configure global timeout

You configure the timeout waiting time in Project settings.

Increase the timeout if your page is slow or fails in the cloud.

Decrease the default timeout if you don't want to wait 30 seconds for failed tests results.

Increase the timeout for cloud runs if your [local runs are passed but cloud runs fail](/troubleshooting/cloud-tests-sometimes-failing).

<figure><img src="/files/evxFUnvr3IXIoMvJNMlE" alt=""><figcaption></figcaption></figure>

## Change timeout for individual steps

You can override the timeout for each step separately

![](/files/vlQL5RbgPL4MQ0SZ8jeX)


# Delay / Sleep

Learn how to prevent failed tests and improve test reliability with delay and sleep techniques. Explore BugBug's comprehensive guide for efficient test execution.

Using manual delay is not recommended because BugBug has other ways of [smart waiting](/preventing-failed-tests/waiting-conditions).&#x20;

But sometimes you may want to hardcode a delay for a step, as this might be a faster way to fix the test instead of debugging.

![](/files/ziEgHf4JaMF6BVcbob7h)


# Project settings

Learn about BugBug's project settings. BugBug's comprehensive guide provides effective strategies and solutions. Start testing for free now!

Project settings contain various global parameters and configurations for all your tests and suites.

**What can you do in the project settings?**

**General tab:**

* Change [project](/organizing-tests/projects) name&#x20;
* Change timezone
* Set the default [timeout](/preventing-failed-tests/timeout) for local and cloud runs - this can help you to solve a situation when [cloud tests are sometimes failing](/troubleshooting/cloud-tests-sometimes-failing)
* Decide if you want to close the window after a successful test run automatically

**Browser tab:**&#x20;

* Enable/disable incognito mode for testing sessions, cookies, or local storage &#x20;
* Set a custom user-agent or custom HTTP request headers (for example, you can use it to let BugBug access an environment behind a [VPN or a firewall](/troubleshooting/vpn-or-a-firewall))
* Set browser language&#x20;

#### Screen size tab:&#x20;

* Set window width and height for desktop or mobile screen size - this enables you to [test mobile resolutions](/workflow-tips/mobile-version-testing)

**Selectors tab:**&#x20;

* Set and define the priorities for the automatic smart [selectors](/preventing-failed-tests/selectors), and define your own custom attributes, input names, text content, id, href, class name, etc.&#x20;

**Waiting conditions tab:**&#x20;

* Set default behavior of [waiting conditions](/preventing-failed-tests/waiting-conditions)<br>

**Note:** If you're looking for an [API token](/running-tests/running-via-api) see the [integrations](/integrations/api) tab

<figure><img src="/files/KguXrqRrU5ROB6ZRkcz6" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/koQvBfDDDi6f2iQzyksu" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/Hb9yWltyxsDpBDJz1Fy5" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/Oo3h5IGMlsl4iZH1R7EN" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/fY6do5EoR31a2StC5YC3" alt=""><figcaption></figcaption></figure>


# Runs history

Explore BugBug's Runs History for efficient test debugging. Access logs, track progress, and review your past tests and suites runs. Try it now!

## Why use runs history?

In the "Runs history" tab you can review your past tests and suites runs. Access the reports, errors, and logs of your runs to debug them.

* review past runs (both local and cloud)
* clear history
* stop all running tests
* navigate to a specific test that fails
* download a suite run report

<figure><img src="/files/AWEddVdoUaHzoHvQKJZC" alt=""><figcaption></figcaption></figure>

In the runs history view, you are able to filter test runs and suite runs by:

* status (Passed, Failed, Error, Running, Stopped, Queued, Skipped)
* profile
* method (Cloud, Local browser)
* screen (Desktop, Mobile)
* auto-retry
* error code ([list here](/debugging-tests/error-codes))
* run by
* run date

{% hint style="info" %}
**Important!** The "Tests" tab also shows tests initiated via a suite. This tab simply shows all your past test runs.
{% endhint %}

## Read-only test details

When you click a test in the "Runs history" it will open its details in a read-only mode. This is because your current version of the test might be different that the one you're reviewing.

To quickly jump to the most up-to-date version of this test, click the "Go to test" button.

![](/files/HeNtxXWzKBxwCzXThuJG)

## Download a suite run report

When you enter a specific test suite details page apart from the general information, execution statuses, and so on, you can also download a report with a summary.

Simply just click on the "**Download PDF report**" button to generate and download one.

<figure><img src="/files/yL5puteqD5xsPv09ERzM" alt=""><figcaption></figcaption></figure>

As a next step, you can add additional information eg. a reason why some tests are skipped.

<figure><img src="/files/RnIHdSmLJwPs5VluyGzI" alt=""><figcaption></figcaption></figure>

When you confirm the action, and save the file as PDF you can locally preview it or share it with other related parties.


# Screenshots

Discover BugBug's powerful debugging tests screenshots feature. Streamline bug identification and resolution with clear visual evidence. Try it now!

You can use screenshots to debug your tests and understand what was the reason for the failure.&#x20;

When a test step is executed, **BugBug automatically takes screenshots**:

* of the whole window
* of the individual element

![](/files/InabE04hMXvEHb5vOtdl)

Click the screenshots to see the full preview.

BugBug also keeps the screenshots history, so that you can also compare screenshots from previous runs. Just go to the ["Runs history" tab](/debugging-tests/runs-history).&#x20;

{% hint style="info" %}
**How long screenshots are kept?** It depends on your subscription plan, learn more in [pricing](https://bugbug.io/pricing/).
{% endhint %}

&#x20;


# DOM Snapshot

When a test fails, BugBug automatically captures the full DOM structure of the page at the exact moment of failure. You can then inspect it using browser DevTools — just like inspecting a live page.

***

#### Enabling DOM snapshots

DOM snapshots are **enabled by default**. To change this setting, go to **Project Settings** and find the **Capture DOM on failure** section.

<figure><img src="/files/DlqrXU16NVHfgYKqAOM5" alt=""><figcaption></figcaption></figure>

***

#### How to access a DOM snapshot

DOM snapshots are available for test runs with a **Failed** or **Error** status.

1. Go to the **Runs history**
2. Click on the failed test run to open its details
3. Click the **Show DOM snapshot** button

![](/files/xeJnPe650F3aGMwANeRU)

The snapshot opens in a new browser tab, showing the page structure as it was when the test failed.

***

#### Inspecting the DOM snapshot

Once the snapshot is open, you can use **Chrome DevTools** to inspect the page just like you would on a live site.

1. Right-click anywhere on the page → **Inspect**, or press `F12`
2. Use the **Elements** panel to browse the HTML structure
3. Check element attributes, classes, and computed styles to understand why a selector may have failed to match

<figure><img src="/files/YLnGbN6ZQ9MFy9Qhhbgl" alt=""><figcaption></figcaption></figure>

***

#### Common debugging scenarios

**Selector not found**

Inspect the element BugBug was trying to interact with. Check if its attributes or structure have changed since the test was recorded.

**Assertion failed**

Find the element your assertion targeted and verify its actual content, value, or visibility state at the time of failure.

**Page loaded incorrectly**

Browse the DOM to see if key elements are missing, hidden, or rendered differently than expected.


# Console logs

BugBug can capture browser console logs during test execution, both in local and cloud runs. This helps you diagnose JavaScript errors, warnings, and custom log messages without leaving the test results view.

***

#### Enabling console logs

Console logs are **disabled by default**. To turn them on, go to **Project Settings** and find the **Console logs** section.

<figure><img src="/files/MtfStFNMxogXfPWBOvxN" alt=""><figcaption></figcaption></figure>

Three modes are available:

* **Disabled** - No logs are collected. This is the default setting.
* **Console logs** - Collects browser console logs for each test run. Logs are then available in Runs history.
* **Full BugBug debugging -** Collects extended internal BugBug logs. Use this only if you encountered a BugBug problem and want to help the support team debug it — not intended for everyday use.

{% hint style="warning" %}
Enabling console logs can slow down (or even break) your tests if your application generates a large volume of logs.
{% endhint %}

***

#### How to access console logs

Console logs are available for any completed test run (local or cloud) when collection is enabled.

**Option 1 — from the test run view**

1. Go to the **Runs history**
2. Click on the test run to open its details
3. Click the **Logs** button at the top of the page (next to "Go to test")

<figure><img src="/files/zCjfREovl1QGG4M0mlM4" alt=""><figcaption></figcaption></figure>

**Option 2 — from Artifacts**

1. Go to the **Runs history**
2. Click on the test run to open its details
3. Click **Details** on the test run
4. In the **Artifacts** section, click **Download test run logs**

<figure><img src="/files/9N6LgaRNDp3d5dqFUi9n" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
Sometimes you have to wait a few seconds after test execution to catch and present logs in the UI
{% endhint %}


# Network logs

### Network Logs (HAR)

BugBug automatically captures network activity during every test run — both local and cloud. This lets you inspect HTTP requests, responses, status codes, and timing to diagnose failures caused by API errors, slow endpoints, or unexpected redirects.

***

#### How to access network logs

Network logs are available for every test run when they are enabled (by default) in Project Settings.

1. Go to the **Runs history**
2. Go to the failed test run and click **Details**
3. Click **Download network logs (HAR)** to download the file

> 💡 The download link is also available directly in the failed step when the test failed.
>
> ![](/files/7rb2iO6XboKoPi3NdDsk)

<figure><img src="/files/vKUrEHudcU8NwOYL4cJ5" alt=""><figcaption></figcaption></figure>

***

#### What is a HAR file?

HAR (HTTP Archive) is a JSON-based standard that records all network requests made by the browser during a test. The file is compressed as a `.zip` archive containing a `.har` file inside.

Each entry in a HAR file includes:

* **URL** – the full request URL
* **Method** – GET, POST, PUT, etc.
* **Status code** – e.g. 200, 404, 500
* **Request & response headers**
* **Request body** (for POST/PUT requests)
* **Response body**
* **Timing** – how long each request took

***

#### How to open a HAR file

After downloading and unzipping the archive, you can open the `.har` file in several ways:

**Chrome DevTools**

1. Open Chrome DevTools → **Network** tab
2. Drag and drop the `.har` file into the Network panel

**Online viewers**

* [HAR Analyzer by Google](https://toolbox.googleapps.com/apps/har_analyzer/) — good for quick inspection
* [HAR Viewer](http://www.softwareishard.com/har/viewer/) — detailed timeline view

**Other tools**

* Firefox DevTools (Network tab → Import)
* Charles Proxy, Fiddler, Insomnia — for deeper analysis

***

#### Common debugging scenarios

**API returning an error**

Look for requests with status codes `4xx` or `5xx`. Check the response body for error messages from your backend.

**Test failing on page load**

Look for failed requests to JS bundles or critical API calls that happen right after navigation.

**Assertion failing unexpectedly**

Check if the data your test asserts against is fetched correctly — the response body will show what the server actually returned.

**Slow or timing-out steps**

Review the timing column to find requests that take unusually long and may be causing timeout failures.


# Debug in Chrome

Discover effective debugging techniques in Chrome with BugBug. Streamline your test debugging process and solve issues efficiently. Try it for free now!

When your test failed, the browser window will not close automatically. You can debug the test using all the native Chrome features, DOM navigator, network tab, etc. This is very useful when you need to [fix selectors because an "element was not found"](/preventing-failed-tests/selectors#tips-on-fixing-selectors).

To open Chrome Dev tools **just right click on your page and click "Inspect".**

![](/files/8tp1RspBZwPrirGW5vG5)

&#x20;


# Breakpoint (run step-by-step)

Master the art of debugging tests with BugBug's comprehensive guide on using breakpoints. Enhance your troubleshooting skills and boost software quality.

You can run a test until a certain point and then pause, so that you can investigate what you need using in-browser [Chrome debugging tools](/debugging-tests/debug-in-chrome).

## Run step-by-step

BugBug supports step-by-step execution of the tests. To do this, click `Run and stop here` between steps. This will activate the **paused mode**. In this mode, you can run a test step-by-step and completely control an execution process.

<figure><img src="/files/42TRDUGhdCw9d0jIUHdY" alt=""><figcaption><p>To enable step-by-step execution, click on the "Run and stop here" action.</p></figcaption></figure>

<figure><img src="/files/Uej7w1xOROtLu9gjdC1T" alt=""><figcaption><p>Paused mode. To execute next step click on the "Run next step and pause" icon</p></figcaption></figure>

When a test is paused, a browser window with a test will display BugBug's overlay with options to control the execution process.

<figure><img src="/files/YxzBq0kaibnfqJ11PHM2" alt=""><figcaption><p>Paused mode in a window with a test. BugBug's overlay has options to control the execution process</p></figcaption></figure>

BugBug allows you also to rewind or fast-forward the execution process. You can read more about it here [Edit & Rewind](/workflow-tips/edit-and-rewind)


# Error codes

### Element & Selector Errors

#### ELEMENT\_DOES\_NOT\_EXIST

It was not possible to find the element using the selector

**When occurs?**:

* Element doesn't exist
* Element removed from DOM during execution
* Page is not ready yet, so element is not available

**What to do?**:

* Ensure selected selector is stable (e.g., it does not contain any dynamic content)
* Re-record this step
* Add waiting conditions

#### ELEMENT\_REMOVED

Element was found but unexpectedly removed during the step execution and BugBug was not able to find it again.

**When occurs?**:

* Parent element removed
* JavaScript removes element
* Dynamic reload
* SPA navigation
* Iframe removed

#### SELECTOR\_REQUIRED

Related step has an empty selector.

**What to do?**:

* Provide a valid custom selector
* Re-record this step again

#### INVALID\_ELEMENT\_SELECTOR

Provided element selector is invalid.

**When occurs?**:

* Malformed XPath eg. `//div[[@id`
* Invalid CSS eg. `invalid:selector`
* Unclosed brackets eg. `div[@id="test"`
* Invalid pseudo-selector eg. `div:fst-child`

**What to do?**:

* Re-record this step
* Fix selector manually (e.g., use selector editor)
  * Fix syntax errors
  * Validate in DevTools
* Use [XPath Selector Builder](https://bugbug.io/xpath-selector-builder/), if needed

#### INTERACTION\_POSITION\_OUT\_OF\_VIEWPORT

It was not possible to reach interaction coordinates in the current viewport size.

**When occurs?**:

* Click at (2000,1500) in 1920x1080 viewport
* Selector points to container
* Element off-screen

**What to do?**:

* Check the selector, perhaps it incorrectly points to a large container instead of its child element
* Check the scroll coordinates in previous steps and make sure that the element is fully scrolled to view
* Check the interaction position settings

### Frame & Context Errors

#### FRAME\_DOES\_NOT\_EXIST

Related step was supposed to be executed in an iframe but the iframe was not found.

**When occurs?**:

* Iframe removed during step execution
* Conditional iframe
* Wrong iframe selector

**What to do?**:

* Take a look at the previous steps and find a "Switch context" step
* Make sure it uses a correct selector to a correct iframe
* You can also re-record some steps again
  * remove the "switch context" step and the following iframe steps
  * use "record from here"

#### FRAME\_LOADS\_TOO\_LONG

BugBug waited for a requested frame until it is ready, but loading took too much time.

**When occurs?**:

* Iframe stuck loading
* Third-party issues
* 404/server error
* CORS/CSP blocking

**What to do?**:

* Take a look at the previous steps and find a "Switch context" step.
* Make sure it uses a correct selector to a correct iframe.
* Re-record some steps again
  * remove the "switch context" step and the following iframe steps
  * use "record from here"
* Increase timeout
* Check console for CORS/CSP errors
* Check console for network errors

#### WINDOW\_OR\_TAB\_DOES\_NOT\_EXIST

Window or tab with specified number does not exist

**When occurs?**:

* Switch to tab #3 with only 2 tabs
* Tab closed during execution
* Different tab count than while recording

**What to do?**:

* Take a look at the previous steps and find a "Switch context" step
* Record this step again by using "record from here" or manually update the tab number
* Verify tab number (default tab number is 0)
* Ensure tabs are opened
* Check for accidental tab closures

#### TAB\_CLOSED

User closed tab during running test

**When occurs?**:

* Manual tab closure
* Clicking X button
* Keyboard shortcut Cmd/Ctrl+W

**What to do?**:

* Don't interact with browser during test
* Rerun without interference

#### WINDOW\_CLOSED

Window closed while the test was running

**When occurs?**:

* Too many "Close tab" steps
* Manual window closure
* Closing last tab
* Unexpected window\.close() calls

**What to do?**:

* Make sure you don't have too many steps that close tabs
* Don't close window during test
* Ensure at least one tab remains open
* Check for unexpected window\.close() calls

#### WINDOW\_MINIMIZED

The window with the running test has been minimized

**When occurs?**:

* User minimizes window
* Keyboard shortcut
* Forced by another app

**What to do?**:

* Don't minimize the window when a test is running
* Browser cannot execute steps when window is minimized
* Keep window visible during test execution
* Rerun without minimizing

#### UNEXPECTED\_WINDOW\_STATE\_CHANGE

The window with the running test has been minimized or lost focus by other user actions

**When occurs?**:

* MacOS Space switching
* Clicking other app
* System dialog
* Screen saver activation

**What to do?**:

* Avoid minimizing the window while a test is running
* If you are using MacOS, avoid switching from space with pending test run to another
* Disable notifications/screen saver
* Don't interact with other apps during test

### Form & Input Errors

#### UNCHANGABLE\_ELEMENT

Wrong type of element - expected a form input, textarea, select, checkbox or radio.

**When occurs?**:

* "Change"/"Type" step on `div`, `span`, `p`, `button` or other non-input element
* "Select option" step on non-select element
* "Clear" step on non-input element or element which value cannot be cleared

**What to do?**:

* Check if selector points to correct element
* Update selector to form input (input/textarea/select/checkbox/radio)
* Re-record step
* Use different step type

#### TYPED\_TEXT\_DIFFERENT\_THAN\_EXPECTED

The typing step was completed, but the end result was not as expected

**When occurs?**:

* User interference
* JavaScript modifies value in background
* Auto-complete changes value

**What to do?**:

* Rerun the test and remember not to interact with the page during execution
* Check for JavaScript modifications in your code
* Switch "Type" step to "Change" step
* Contact support if problem persists

#### INVALID\_FIELD\_VALUE

Could not verify that the value in the form was changed properly

**When occurs?**:

* New field value doesn't match expected value due to invalid execution
* User interference
* JavaScript modifies value in background
* Auto-complete changes value

**What to do?**:

* Verify value is valid
* Check for validation/event handlers that might modify the value
* Switch "Type" step to "Change" step
* Add wait after change to allow value to settle

#### INVALID\_OPTION\_INDEX

Provided option index is not a number

**When occurs?**:

* Index "abc" instead of "2"
* Variable resolves to non-numeric

**What to do?**:

* Use numeric index (0,1,2)
* Check variable value, if variable is used
* Use "Select by text/value" instead

#### MISSING\_OPTION\_VALUE

Option with provided value does not exist on available options list

**When occurs?**:

* Value "premium" doesn't exist
* Options changed since recording
* Dynamic options differ
* Typo in value

**What to do?**:

* Verify option exists
* Re-record step
* Check for typos
* Use select by text/index instead
* Ensure dynamic options loaded

#### MISSING\_OPTION\_TEXT

Option with provided text does not exist on available options list

**When occurs?**:

* Text "Szczecin" doesn't exist
* Text changed
* Language/locale changed
* Whitespace mismatch

**What to do?**:

* Verify exact text match (including whitespace)
* Re-record step
* Use "Select by value/index" instead
* Check locale changes

#### MISSING\_OPTION\_INDEX

Option with provided index does not exist on available options list

**When occurs?**:

* Index 5 with only 3 options
* List shortened
* Conditional options missing
* Zero-based indexing confusion

**What to do?**:

* Verify index exists (first option always has index 0)
* Use "Select by text/value" instead
* Check if app uses dynamic options
* Re-record step

#### SELECT\_OPTION\_FAILED

BugBug was not able to select expected option

**When occurs?**:

* Selected value differs from expected
* Options changed since recording
* Browser bug
* Multi-select fails

**What to do?**:

* Verify if options are correct
* Check for event handlers that might revert the selection
* Re-record step
* Contact support if problem persists

#### MULTIPLE\_OPTIONS\_WITH\_VALUE

Could not verify which option should be selected - multiple select options reference the same value

**When occurs?**:

* Duplicated options
* Application bug

**What to do?**:

* Use "Select by text/index" instead
* Contact support if problem persists

### Navigation & Page Loading Errors

#### MISSING\_GOTO\_STEP

Test doesn't start with goto step

**When occurs?**:

* First step is Click
* Deleted goto step
* Manual test without goto
* Copied steps without goto

**What to do?**:

* Every test should begin with a navigation to a URL, so you need to add a "Go to URL" step at the very beginning of the test
* Re-record test from the beginning

#### INVALID\_URL

Provided URL is not valid

**When occurs?**:

* "htp\://example.com" (typo)
* Missing protocol "example.com"
* Spaces in URL
* Variable resolves to invalid URL

**What to do?**:

* Check if URL starts with: "http\://" or "https\://"
* Verify variable resolves correctly
* Fix other typos
* Test URL in browser

#### PAGE\_LOADING\_ERROR

BugBug handles browser's error pages. Full list of those errors can be found [here](https://support.google.com/chrome/answer/95669?hl=en#zippy=%2Cpage-loading-errors):

**When occurs?**:

* Connection timeout (e.g. "ERR\_CONNECTION\_TIMED\_OUT")
* Internet disconnected (e.g. "ERR\_INTERNET\_DISCONNECTED")
* Server down (e.g. "ERR\_CONNECTION\_REFUSED")
* DNS failure (e.g. "ERR\_NAME\_NOT\_RESOLVED")
* SSL protocol error (e.g. "ERR\_SSL\_PROTOCOL\_ERROR")
* Invalid certificate (e.g. "ERR\_CERT\_INVALID")

**What to do?**:

* Verify URL accessible
* Check internet connection
* Verify server running
* Check SSL certificate
* Try URL in browser
* Contact server admin

### Visual Regression Errors

#### ELEMENT\_VISUAL\_REGRESSION\_FAILED

The observed element screenshot differs from the reference by a given percentage.

**When occurs?:**

* When the visual diff between the captured element screenshot and the reference exceeds the configured max allowed difference.

**What to do?**

* Review the comparison  — either accept the new screenshot as the new reference or increase the max difference threshold.

#### PAGE\_VISUAL\_REGRESSION\_FAILED

The observed full-page screenshot differs from the reference by a given percentage.

**When occurs?:**

* When the visual diff between the captured full-page screenshot and the reference exceeds the configured max allowed difference.

**What to do?**

* Review the comparison  — either accept the new screenshot as the new reference or increase the max difference threshold.

#### SCREENSHOT\_CAPTURE\_ERROR

An error occurred while capturing the screenshot.

**When occurs?:**

* When the target element is not visible, has zero dimensions, or the browser tab is in an unexpected state.

**What to do?**

* Re-run the test. If it persists, check that the element is visible and has non-zero dimensions on the page.

#### REFERENCE\_SCREENSHOT\_NOT\_FOUND

No reference screenshot was found for this step.

**When occurs?:**

* On the first run of a visual regression step, or after the reference has been deleted.

**What to do?**

* Remove the screenshot and run the test to capture an initial reference screenshot.

#### SCREENSHOT\_COMPARISON\_ERROR

An unexpected error occurred while comparing the screenshots.

**When occurs?:**

* When the comparison service encounters an internal/temporary failure (e.g. image decoding issue, mismatched dimensions).

**What to do?**

* Re-run the test. This is usually a transient issue.

### JavaScript & Code Execution Errors

#### CODE\_EXECUTION\_ERROR

JavaScript code has runtime error

**When occurs?**:

* Typo "consle.log"
* Syntax error missing brace
* Runtime error element doesn't exist
* ReferenceError undefined variable

**What to do?**:

* Fix syntax errors
* Test in browser console
* Add error handling
* Verify elements/variables exist
* Check console for details

#### INVALID\_EXECUTION\_RESULT

Function didn't return boolean, which is required for assertion

**When occurs?**:

* Returns string "true" not boolean
* Returns undefined/null
* Returns number 1
* Async doesn't resolve to boolean

**What to do?**:

* Ensure returns boolean (true/false)
* Convert with !!value or Boolean(value)
* Test in console

### Variable Errors

#### VARIABLE\_DOES\_NOT\_EXIST

Variable used in step definition doesn't exist

**When occurs?**:

* Using {{userEmail}}, which was never created
* Typo {{userName}} vs {{username}}
* Variable in different test
* Case-sensitive mismatch

**What to do?**:

* Make sure that you use a proper variable name
* Create variable before using (Set variable step)
* Check spelling and case
* Verify in same test/suite
* Use correct syntax {{variableName}}

#### VARIABLE\_NESTING\_LIMIT\_EXCEEDED

Nesting variables is limited to 3 levels and the variable you used contains too many nesting levels.

**When occurs?**:

* {{var1}} contains {{var2}} contains {{var3}} contains {{var4}}
* Complex chains
* Circular references

**What to do?**:

* Simplify to max 3 levels
* Break into separate steps
* Avoid circular references
* Use Execute step for complex values

### Event & Interaction Errors

#### EVENT\_DISPATCHED\_ON\_INVALID\_ELEMENT

BugBug found the element, but could not click it - some other element interrupted the click

**When occurs?**:

* Modal overlay covers button
* Cookie banner covers element
* Loading spinner appears
* Fixed header covers element

**What to do?**:

* Check the screenshots and analyze where the cursor is located
* Investigate why the target element could not be clicked
* Close covering elements first
* Add wait for covering elements to disappear
* Add additional test steps using "record from here" to make sure the clickable element is accessible

#### EVENT\_DISPATCH\_FAILED

BugBug found the element, dispatched the requested event, but could not resolve the event correctly

**When occurs?**:

* Need double-click not click
* Event listener prevents default
* Element disabled or pointer-events:none
* Framework blocks event
* Incorrect event type used

**What to do?**:

* This usually occurs when an incorrect event type is used (e.g., using "click" instead of "double-click")
* Try different step type
* Check if element enabled/interactive
* Verify no CSS preventing interaction
* Re-record step

### Other Step-Specific Errors

#### FAILED\_WAITING\_CONDITIONS

Waiting conditions timeout

**When occurs?**:

* Element never visible
* Network never idle
* Element can't get focus
* Element stays covered

**What to do?**:

* Increase step timeout
* Review and adjust conditions
* Check if achievable
* Remove/modify problematic conditions
* Add explicit waits

#### PROMPT\_DOES\_NOT\_EXIST

Prompt not found

**When occurs?**:

* Answer prompt step with no dialog
* Previous step didn't trigger alert
* Dialog auto-closed
* Page uses custom modal not browser prompt

**What to do?**:

* Ensure the prompt has been opened in a previous step
* Don't close the prompt manually when a test is running
* Remove Answer prompt step if none appears
* Check for custom modals

#### UNHANDLED\_PROMPT

Execution of this step was blocked by unhandled prompt

**When occurs?**:

* Alert without Answer prompt step
* Unexpected window\.confirm()
* JavaScript prompt() without handler
* "Leave site?" dialog

**What to do?**:

* Ensure the prompt has been closed in a previous step
* Record or add manually "Answer prompt" step to close the prompt
* Identify triggering step and add handler
* Check for unexpected prompts
* Disable beforeunload events if possible

#### NEXT\_STEP\_ELEMENT\_REQUIRED

Element from the next step was not found

**When occurs?**:

* Scroll until next step visible but next step has wrong selector
* Next step element doesn't exist
* Selector empty/invalid
* Next step deleted

**What to do?**:

* Related step is set to "Scroll until element from next step is visible" so the next step needs to have a correct selector
* Verify next step selector correct
* Ensure next step element exists
* Fix/add selector to next step

#### NEXT\_ACTIVE\_STEP\_WITH\_ELEMENT\_REQUIRED

Related step is set to "Scroll until element from next step is visible" so the next step needs to have a related element

**When occurs?**:

* Scroll until next step visible but next step is Execute JavaScript (no element)
* Next step is Wait/Set variable
* Next step disabled
* Next step is Goto

**What to do?**:

* Check what is the type of the next step
* Make sure that it is set to a type that has an element
* Change next step to one with element (Click, Change, etc.)
* Remove scroll until next step condition
* Add intermediate step with element

#### ASSERT\_FAILED

Assertion condition not met

**When occurs?**:

* Text equals "Success" but shows "Error"
* Element visible but hidden
* URL contains "/dashboard" but is "/login"
* Variable value mismatch

**What to do?**:

* Verify expected value correct
* Check page state
* Add wait before assertion
* Review test flow
* Update assertion to match behavior

#### SCROLL\_FAILED

Scroll operation failed

**When occurs?**:

* Scroll position doesn't match expected
* Page prevents scrolling with overflow:hidden
* JavaScript interferes
* Scroll target beyond boundaries

**What to do?**:

* Check page allows scrolling
* Verify scroll target reachable
* Check for JavaScript interference
* Adjust scroll coordinates

### Timeout & Performance Errors

#### TIMEOUT

Step couldn't complete within time limit.

**When occurs?**:

* Slow API response
* Page loads too long
* Complex JavaScript exceeds timeout

**What to do?**:

* Increase step timeout in settings
* Optimize page performance
* Add explicit wait steps
* Break into multiple steps
* Check network/server performance

#### SINGLE\_TEST\_TIME\_EXCEEDED

Test exceeded maximum test duration for current plan.

**When occurs?**:

* 65 minutes with 60 minute limit
* Free plan 10 min limit exceeded
* Waits/delays accumulate

**What to do?**:

* Optimize test to run faster
* Upgrade plan for higher limits
* Split into multiple shorter tests
* Reduce/remove explicit waits

### Browser & Extension Errors

#### UNSUPPORTED\_BROWSER

You are using an outdated and unsupported browser

**When occurs?**:

* Chrome 80 when minimum is 90
* Old version missing APIs
* Beta/canary with incompatible changes
* Chromium missing features

**What to do?**:

* We suggest updating it to the most recent version
* Update browser to latest stable version
* Use supported version (check docs)
* Switch to Chrome if using alternative

#### DEBUGGER\_DETACHED

Chrome debugger detached

**When occurs?**:

* User clicks "Cancel" on debugging notification
* Manually detaching from DevTools
* Debugger lost due to crash

**What to do?**:

* Don't click "Cancel" in the Chrome toolbar saying "BugBug is debugging your browser"
* Don't manually detach debugger
* Try to run the test again
* Restart browser if crashed

#### BLOCKED\_BY\_BROWSER\_POLICY

BugBug could not run on this page due to extension settings policy

**When occurs?**:

* Chrome Enterprise blocks extensions on domains
* Sandboxed iframe (reCAPTCHA) blocks execution
* Opera without "Allow access to search page results"
* Corporate IT policy restricts permissions
* Site access settings block domain

**What to do?**:

* If using Opera browser, turn on "Allow access to search page results" option in BugBug extension settings
* Verify if your app is using any sandboxed iframe which blocks BugBug from running (e.reCAPTCHA)
* If your organization is using Chrome Enterprise, contact your IT administrator
* Check extension site access settings

### Configuration & Settings Errors

#### INVALID\_CUSTOM\_HEADERS

Custom headers provided in project's browser settings are invalid

**When occurs?**:

* Header with spaces "invalid header:value"
* Missing colon "Authorization Bearer token"
* Invalid characters "X-Custom-Header!: value"
* Malformed list

**What to do?**:

* Verify they follow the correct format (e.g., key:value, x-second-key:value)
* Ensure colon separator between key and value
* Ensure headers' names do not contain any spaces or other forbidden characters
* Check line breaks in header list

#### INVALID\_DATA\_FORMAT

Provided data has not valid format

**When occurs?**:

* Invalid date "2024-13-45"
* Malformed JSON
* Invalid email format
* Wrong data type (string instead of number)

**What to do?**:

* You need to update a value in the field or re-record this step
* Fix date format
* Validate JSON syntax
* Correct email format
* Use correct data type

### System Errors

#### RUNTIME\_ERROR

Unexpected runtime error

**When occurs?**:

* "Failed to resume runner"
* Tab context not found
* Unexpected extension state
* Memory/resource exhaustion

**What to do?**:

* Rerun test
* Reload extension
* Restart browser
* Contact support with error details

#### INTERNAL\_ERROR

Critical internal error

**When occurs?**:

* Severe internal failures
* Unhandled exception in core logic
* Data corruption
* Critical bug

**What to do?**:

* Rerun test
* Reload extension
* Clear browser cache and extension data
* Contact support with detailed information

#### INITIALIZATION\_ERROR

Error during test run initialization

**When occurs?**:

* Failed browser session setup
* Can't connect debugger
* Error opening window
* Failed script injection

**What to do?**:

* Rerun test
* Restart browser
* Check browser permissions
* Ensure no other debugging tools attached
* Contact support

#### AUTHENTICATION\_ERROR

User authentication failed.

**When occurs?:**

* When credentials provided for a password-protected page are invalid or expired.

**What to do?**

* Check your credentials and try again.

#### STEP\_RUN\_INITIALIZATION\_ERROR

Error during step run initialization

**When occurs?**:

* Failed step environment preparation
* Can't access step data
* Error setting up resources
* Previous state not cleaned

**What to do?**:

* Rerun test
* Check step configuration
* Verify test data valid
* Contact support

#### UNRECOGNIZED\_STEP\_TYPE

Step type not supported

**When occurs?**:

* Corrupted step data
* Test from newer version
* Database corruption
* Custom step type not recognized

**What to do?**:

* Update extension to latest version
* Re-create step with correct type
* Check for data corruption
* Contact support

#### FRAME\_IS\_NOT\_INITIALIZED

Frame exists but not initialized

**When occurs?**:

* Scripts not injected
* Iframe loads too quickly
* Security policy prevents injection

**What to do?**:

* Add wait step
* Increase timeout
* Check console for security errors
* Contact support

#### INVALID\_MOUSE\_INPUT\_PARAMS

Mouse parameters invalid

**When occurs?**:

* Invalid button type
* Negative coordinates
* Invalid modifier keys
* Corrupted event data

**What to do?**:

* Re-record step
* Check configuration for invalid values
* Contact support

#### FILE\_DOES\_NOT\_EXIST

Upload file doesn't exist

**When occurs?**:

* Non-existent file path
* File deleted/moved
* Wrong path

#### FILE\_UPLOAD\_ERROR

Generic file upload error

**When occurs?**:

* Insufficient permissions
* File locked by another process
* File size exceeds limits
* File type not accepted

**What to do?**:

* Check file permissions
* Ensure file not open elsewhere
* Verify file size within limits
* Check file type accepted
* Try different file

#### VALUE\_COMPUTING\_ERROR

There was an error while parsing variables

**When occurs?**:

* Single braces {variable}
* Malformed {{variable}
* Invalid characters {{user-name}}
* Nested braces

**What to do?**:

* If you are going to use variables, make sure you use double braces like this: {{variable}}
* Ensure complete syntax
* Use alphanumeric and underscores only
* Check for typos

#### WEBSOCKET\_ERROR

WebSocket connection error

**When occurs?**:

* Connection fails during cloud run
* Firewall blocks WebSocket
* WebSocket server down/unreachable
* Connection drops during test

**What to do?**:

* Check network/firewall settings
* Verify WebSocket server availability
* Check for network stability
* Contact support for cloud runs

#### WEBSOCKET\_SETUP\_ERROR

Failed to set up WebSocket

**When occurs?**:

* Can't establish initial connection for cloud runs
* Invalid WebSocket URL/credentials
* Proxy/firewall blocks handshake
* SSL/TLS certificate issues

**What to do?**:

* Verify WebSocket URL and credentials
* Check proxy/firewall settings
* Verify SSL/TLS certificates
* Contact support

#### REQUEST\_ERROR

API request failed

**When occurs?**:

* BugBug API is noit responsive
* Network timeout during request

**What to do?**:

* Verify network connection
* Contact support

#### LOGS\_UPLOAD\_TIMEOUT

Log upload exceeded timeout

**When occurs?**:

* Network issues prevent upload
* Very large log file
* Connection interrupted

**What to do?**:

* Optimize test or app to reduce log size
* Switch logs settings from to "Console logs"
* Disable logs

#### EXTENSION\_DOES\_NOT\_RESPONSE

Extension doesn't respond within timeout

**When occurs?**:

* Extension unresponsive
* Heavy page load causes hang
* Browser throttles extension
* Communication timeout

**What to do?**:

* Increase step timeout
* Reload extension and retry
* Check browser performance and close tabs
* Update browser
* Contact support

#### EXTENSION\_DISCONNECTED

Your BugBug extension has been disconnected

**When occurs?**:

* Network issues interrupt communication
* Extension reloaded during test
* Browser update forces restart
* Extension crashes

**What to do?**:

* Check your internet connection
* Don't reload extension during test
* Avoid browser updates during test
* Try again

#### EXTENSION\_DISCONNECTED\_ERROR

Your BugBug extension has been disconnected

**When occurs?**:

* Extension crashes due to memory
* Extension disabled by user
* Browser kills extension for resource usage
* Extension update interrupts test

**What to do?**:

* Check your internet connection
* Check extension status
* Close unnecessary tabs to free resources

#### TAKING\_SCREENSHOT\_TIMEOUT

Screenshot capture exceeded timeout

**When occurs?**:

* Screenshot takes >10 seconds
* Page with very large images/canvas
* Browser under heavy load
* Graphics driver issues

**What to do?**:

* Optimize page images/canvas size
* Close unnecessary tabs to reduce load
* Update graphics drivers

#### MISSING\_STEP\_SCREENSHOT

Step screenshot missing

**When occurs?**:

* Screenshot capture failed
* Browser API returned null
* Insufficient memory
* Tab closed before screenshot

**What to do?**:

* Ensure sufficient memory available
* Don't close tabs during test
* Rerun test
* Contact suppoer if issue persists

#### MISSING\_ELEMENT\_SCREENSHOT

Element screenshot missing

**When occurs?**:

* Element screenshot failed
* Element moved/disappeared
* Element outside viewport
* Browser API error

**What to do?**:

* Scroll element into view
* Rerun test
* Contact suppoer if issue persists


# Naming your tests

Learn how you can structure your tests to make it clean and useful! Learn effective test organization techniques to streamline your testing process with BugBug's comprehensive guide.

Think of a smart convention for naming your tests so that you can handle hundreds of test cases in the future.

You can use special characters in the names of the tests so that you can quickly filter them using the search box, for example, use slashes, emojis, etc.&#x20;

The [searching](/organizing-tests/searching-tests) is case insensitive - that means that it doesn't matter if you use capital or small letters in the names of your tests.

You can edit the test name in two ways

#### Renaming tests on the tests list

![](/files/tre7HeFCPI90uIqkINqM)

#### Renaming when editing the test, by clicking its title

![](/files/qQlQQmrEBTsrYLHMRWHW)


# Searching tests

Learn how to efficiently search and organize your tests using BugBug's comprehensive documentation. Boost your testing productivity today!

### Use the search in table

The search box is located at the top of the table with your tests. Just type in the keyword and see the results. The search is case insensitive - that means that it doesn't matter if you use capital or small letters in the names of your tests.

Tip: if you have hundreds of test cases, think [how to name your tests.](/organizing-tests/organising-your-tests)&#x20;

![](/files/0X4YHG8t7CQSwXaPzEsQ)

### Sorting the tests list

If you want to see only failed tests, you can sort the table by status. Just click the table header once or twice to find the right sorting order.

![](/files/P846WgKr7RppsAAbCoB1)


# Suites

Explore BugBug's comprehensive guide on organizing test suites efficiently. Learn how to gorup test cases to run them in parallel. Start testing for free!

### Why use suites?

Suites are great for grouping test cases to run them in parallel. They are simply groups of multiple tests. Organise your tests into Suites to quickly **run several tests at once**.

By default BugBug has one suite called "All tests", where you will find all tests you created in a project. All newly created tests will be automatically added to this suite.&#x20;

Suites can be [scheduled](/running-tests/schedules) to run in the cloud and are useful for [working with different environments](/editing-tests/variables#work-with-different-development-environments).&#x20;

### What suites should I have?&#x20;

Here are some examples of suites that usually help with test automation workflow.

* you can have a suite that monitors only core features on your production, [scheduled](/running-tests/schedules) every hour
* you can have a full regression suite that you run manually before the release
* you can have a "feature branch" suite that has work in progress tests that are not yet ready to be run on production, but after the release you will add them to the production suite&#x20;
* you can have suites that run the same tests with different [profiles](/editing-tests/variables#profiles), for example checking your app on multiple languages

![](/files/3d0Y8LSuW0UOQxjiTpHO)

### Create new custom suite

You can create custom suites in the Suites tab:

1. Click `Create new suite` button
2. Add `Suite name`
3. Choose tests that you want to include in a suite
4. Choose options for a suite
5. Save

![](/files/ICkA5ieeMxMibgAAIV30)

### Auto-retry failed cloud tests to prevent flaky tests notifications

If your suite sometimes randomly fails, but there is no certain reason for that, you may be annoyed by the "failed" false positive [notifications](/collaboration/alerts). The industry term for tests that fail randomly for no reason is *flaky tests*.&#x20;

*Flakiness* can be caused by many different factors:&#x20;

* a slowdown in the internet connection
* busy server side
* temporary machine CPU overload

You probably don't want to get notifications for such randomly failed tests - your app works as it should, it was just a temporary problem that doesn't require attention. BugBug allows you to prevent such unnecessary alerts.   &#x20;

<figure><img src="/files/CxstA3r0yLdApgT5F2UU" alt=""><figcaption></figcaption></figure>

**When auto-retry is enabled:**

* If one of the tests in a suite fails, it will be automatically run again
* if another attempt passes, we will mark the suite as "passed", but you can still see the failed test attempt in the [test runs history](/debugging-tests/runs-history), marked as "auto-retried"
* If the test  fails for the second time, it will be again restarted
* If the test fails the specified number of times, we will mark the suite as "failed"

<figure><img src="/files/2j86YVJB9NKmXO6lvHIA" alt=""><figcaption><p>Example suite run history with auto-retry enabled. There were 3 attempts to run the same test.</p></figcaption></figure>

**When auto-retry is disabled:**

* If any of the tests fail, the suite will continue running and after all the tests are finished it will be marked as "failed"

<figure><img src="/files/cArR8nmUbrtpR3XhC36D" alt=""><figcaption><p>Example suite run history with auto-retry disabled. There was just one attempt to run the test.</p></figcaption></figure>

{% hint style="info" %}
**Important!** Auto-retry only works in suites run in the BugBug cloud. [Pro subscription](https://bugbug.io/pricing) is required.&#x20;
{% endhint %}


# Projects

Discover BugBug's guide on organizing tests within projects. Learn effective strategies for seamless test automation management and maximize your testing efficiency. Start now!

## What is a project?

Projects are a higher level "folder" for your tests, suites and schedules. Learn about it in [your first project section](/quick-start/your-first-test) of our quick start guide.

## Switching projects

To change the project you are currently working on, click the BugBug logo in the top left. This will navigate to the list of projects.

![](/files/xvAzEv3sypYkafFymTXJ)

## Duplicating a project

If you want to make a copy of a project, click the "three dots" icon and select "Duplicate project".&#x20;

{% hint style="info" %}
**Important!** Project duplication can take several minutes. You will get an email notification when it's done.
{% endhint %}

![](/files/haH72tUK5JQgdFJtYU3A)

## Transfer a project to a different organization

You can move projects to another organization. This is helpful when you need to transfer tests to a different account managed by your client or a different department.&#x20;

Just ask our [support](https://bugbug.io/contact) and we will do it for you. Send us a link to the project you want to transfer and the link to the target organization. Please note that our support would need to authorize you before the transfer by sending an email with a confirmation request.&#x20;


# Reporting


# Standard reports

BugBug provides standard reports for both **test runs** and **suite runs**. You can access all reports in the [Runs History](/running-tests/test-in-your-browser) module.

{% hint style="success" %}
Standard reports are available only in [paid plans](https://bugbug.io/pricing/).
{% endhint %}

### Available report types

* **PDF summary** - visual summary of test results. Test run report includes general information and step statuses. Suite run report provides general information and test run statuses.&#x20;

> You can view an example [here](https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MKixgeBPbLvnD0l1eiV%2Fuploads%2FaSpE2N3Rn1rJNpcqJp9A%2FStaging_-_E2E_Regression_tests_2025-10-31_90490.pdf?alt=media\&token=1d8c9f31-a37d-427c-bfaa-0c5c313dec93).

* **JUnit XML** – A structured summary of test results in the output format used by software testing frameworks.

> You can view an example [here](https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MKixgeBPbLvnD0l1eiV%2Fuploads%2FNYRS6j4VtZq8FbRM2cV4%2FStaging_-_E2E_Regression_tests_2025-10-31_90490.xml?alt=media\&token=ffd6e1dc-fb2f-4451-b8a6-1d8a8b7b6f16).

{% hint style="info" %}
If you need more detailed reports — including screenshots for each step or raw data in CSV or JSON format — see the [Advanced Reports](/organizing-tests/reporting/advanced-reports) section.
{% endhint %}

### How to download a standard report

1. Go to the desired **test run** or **suite run**.
2. Open the dropdown menu and click `Download report` .<br>

<figure><img src="/files/4dMvhFJZkRVJZkSMD2wu" alt=""><figcaption></figcaption></figure>

3. Select the report type that you need and click `Continue`.

<figure><img src="/files/HwFyhASXoPvGLEfJun4n" alt=""><figcaption></figcaption></figure>

4. Add a custom note if you need to include some additional context in the report, and click `Download`.&#x20;

<figure><img src="/files/ka8TMUtTyQIFKln8hacc" alt=""><figcaption></figcaption></figure>

### Examples of standard reports

Below, you can see examples of a PDF and a JUnit XML report for a single suite run containing multiple tests.

{% file src="/files/EAxyYWdZDghE98aaacN1" %}

{% file src="/files/G6aib1q8swnPHv0IvifT" %}


# Advanced reports

BugBug provides **compliance-ready test reports** that include detailed **PDFs with step-by-step screenshots**. You can easily export your test run and suite run data in multiple formats, including JSON, CSV, and more.

{% hint style="success" %}
Advance reports are available only in the [BUSINESS](https://bugbug.io/pricing/#:~:text=discount%20for%20startups-,BUSINESS,-For%20scaling%20companies) plan.
{% endhint %}

### Available report types

* **Detailed PDF report with screenshots** - Comprehensive, compliance-friendly report including each step and screenshot. Perfect for audits and documentation.
* **CSV** - Spreadsheet format containing all tests, steps, and selectors. Ideal for data analysis or importing into BI tools.
* **JSON** - Structured data format designed for sending results to other apps or integrating with external systems.
* **ZIP with screenshots** - A packaged folder containing separate CSV and JSON files for each test, along with all related screenshots.

{% @arcade/embed flowId="L6kL6B3udaDyLJBCe1it" url="<https://app.arcade.software/share/L6kL6B3udaDyLJBCe1it>" %}

###

### How to download an Advanced report for a suite run

1. Go to the specific suite run in Runs history.
2. Click `Download report` in the top-right corner.<br>

<figure><img src="/files/dsLpIm72Wtq2WnXLNwZh" alt=""><figcaption></figcaption></figure>

3. Select your preferred format and click `Continue`.

<figure><img src="/files/aoftUS3aoEqW8hJilVV7" alt=""><figcaption></figcaption></figure>

5. If you want to include additional context, you can add a custom note to the report before downloading. Once ready, click  `Download` to start the report generation process.

<figure><img src="/files/r8bodFLNdDR9O02quT7L" alt=""><figcaption></figcaption></figure>

6. Report generation will begin, and you’ll receive a download link via email once it’s ready.\
   The process runs asynchronously, as generating detailed reports with screenshots may take a few minutes.

<figure><img src="/files/MBt3UNyppIP9uT5uyu7j" alt=""><figcaption></figcaption></figure>

7. Click the `Download PDF report`  button in your email. You’ll be redirected to the BugBug app, where the report download will start automatically.

{% hint style="warning" %}
All advanced reports are available for **24 hours** after generation.\
After that, the download links will expire, and you’ll need to generate a new report if needed.
{% endhint %}

<figure><img src="/files/tqR896v5y2VDL2YrBaTv" alt=""><figcaption></figcaption></figure>

> Advanced reports that include screenshots — such as **detailed PDF** or **ZIP with screenshots** — can be quite large, sometimes exceeding **hundreds of megabytes**, since each test step includes its own screenshot. Keep this in mind when downloading or sharing reports.

###

### Examples of advanced reports

Below, you can find an example of how advanced reports look like for a single suite run with multiple tests inside.&#x20;

{% file src="/files/p06v52LXgZ80NjvsH2Fg" %}

{% file src="/files/HSZbjvsJRY8YaZh3ITBq" %}

{% file src="/files/XgiTqjoEAHYLcDx294mu" %}

{% file src="/files/pPfEZ2iRUBO9YVMsjuGt" %}


# Edit & Rewind

BugBug supports unique functionality that allows you to easily record and execute steps in a very flexible way. Let's dive into the typical maintenance problem in end-to-end tests.

### A long test breaks down, and you have to fix it

This is a very common scenario when dealing with end-to-end testing.&#x20;

Imagine that you have a test that executes in 5 minutes. Of course, the recommendation for e2e tests is to have as short tests as possible, but the reality is very often different.<br>

This scenario is typically resolved as follows:

* Run a test and wait 5 minutes.
* The test fails.
* Fix broken steps or record new steps.
* Re-run the test from the beginning and wait another 5 minutes to reach the problematic part.
* If it passes, it's excellent. If not, you need to fix it again, run it, wait another 5 minutes, and loop it until it succeeds. This takes time - **a lot** of time.

Keeping this in mind, we've implemented a feature that allows you to run a test, pause it, record a new step, rewind the playback position, and continue test execution from the given position. You can run and record a test in any combination.

How to fix a test using BugBug’s Edit & Rewind freature:

* Run a test and wait until the end of execution.
* The test failed.
* Fix broken steps or record new steps.
* Rewind the playback position. **You don't have to start execution from the beggining!**
* Continue test execution from the given position.
* If it passes, excellent. If not, you have to fix it again and rewind the playback position bypassing the need to wait for earlier steps to complete. Simply verify only fixed steps.
* Profit.

#### **What does that mean for you?**

With Edit & Rewind, you can <mark style="background-color:green;">tremendously reduce the time spent on the maintenance</mark> of the tests.

Sounds awesome? Let's see it in action!

{% embed url="<https://vimeo.com/1017561827>" %}
Edit & Rewind in action
{% endembed %}

#### When else will Edit & Rewind be helpful

There are many more scenarios in which you can use this functionality.

1. **If you want to record new steps in multiple places in the test**

Pause and enable the recording multiple times, changing the recording position in the web UI where needed.

2. **If you want to record new steps somewhere in a test but don't want to wait for the whole execution process to reach this position**

Run the test and pause it. Change the playback position. In the window with a test set the right app state and start recording.

3. **If you want to debug the test step-by-step**

Pause the test execution and use the `Run next step` button. You can rewind and replay as many times as you like.

Do you feel it? Life is better now. You can rest.

<figure><img src="/files/nKPNfrLxEC7zlseBZyfH" alt=""><figcaption><p>You after using Edit &#x26; Rewind functionality. Source <a href="https://www.reddit.com/r/wholesomememes/comments/evgnfp/resting_is_important_to_your_wellbeing/">https://www.reddit.com/r/wholesomememes/comments/evgnfp/resting_is_important_to_your_wellbeing/</a></p></figcaption></figure>


# Changing the test screen size

Discover BugBug tips on changing the test screen size in your testing workflow. Optimize your automation testing process for better results. Read now!

### What is a Screen Size option?&#x20;

The Screen Size option is used to set the screen size for a browser running your tests. Different sizes can render your website differently and you may want to test this or test different views for mobile devices. Where can you set it?

### Creating a new test&#x20;

When you create a new test, we offer two different screen resolution options.

<figure><img src="/files/GhIRhfUKx852Qd9pGcpe" alt=""><figcaption><p>You can select screen size optiom from dropdown menu </p></figcaption></figure>

* **Desktop**&#x20;

  As the default window size for your primary web application testing
* **Mobile** \
  Optional for small screen testing

You can change the test screen size to mobile or desktop using test settings from the menu. &#x20;

<figure><img src="/files/qdjVhthD5adQO7bc2zag" alt=""><figcaption><p>open meatball menu and choose Test settings</p></figcaption></figure>

<figure><img src="/files/60ZSnyOiPrraQcnsRolh" alt=""><figcaption><p>choose an option from Screen size dropdown menu</p></figcaption></figure>

### Changing screen size for desktop and mobile

If you want to change the default screen size, you need to set it in the Project Settings. Each project has its own default screen size. If you want to test other sizes, simply duplicate the project and change the settings from the default.\
\
**Note: Due the Chrome limitations the minimal value for Screen size is 500**

<figure><img src="/files/x5cH8umdvkdsUcXXxfLc" alt=""><figcaption><p>Go to the side menu and select Project Settings. Then select the Screen Sizes tab.</p></figcaption></figure>

Also, you can use a quick link from the project menu&#x20;

<figure><img src="/files/x4mYD3cCMAqxktQaQVB0" alt=""><figcaption><p>Open meatball menu, choose test setting and use link from Sreen size dropdown menu</p></figcaption></figure>

### Easy way to check your screen size for tests

We have added a new column for easy identification of the screen size set for a test.

* In the list of tests, you will see an icon informing you that the test is set for desktop or mobile.

<figure><img src="/files/V6MTPAN50UmyrGnrkrs4" alt=""><figcaption><p>Icon will only be added if you set two different screen sizes for each test.</p></figcaption></figure>

* On Runs history there is also info about the screen size

<figure><img src="/files/44vcGgfb2RTxcx1EAG6f" alt=""><figcaption></figcaption></figure>

###


# Integrating with build systems

Learn about integrating BugBug with your build systems for seamless test management. Integrate with your CI/CD pipelines, GitHub, GitLab, Bitbucket, Bamboo, Jenkis and many more.

BugBug can be easily integrated into your continuous integration, CI/CD pipelines, Github actions, Gitlab, Bitbucket pipelines, Bamboo, Jenkins, etc.

You can do this with our simple yet powerful CLI - [BugBug command-line interface that you can install with NPM.](/integrations/api)

![](/files/jfvrTg3B8Rrcuoa8UqZH)


# Mobile version testing

Enhance your mobile version testing workflow with BugBug's tips. Optimize your website's performance and user experience on mobile devices.

### What is a mobile version / RWD?

Your website may behave differently when opened on smaller screens, such as a smartphone or a tablet. This behavior is called Responsive Web Design (RWD) or simply a mobile version of your website - your website is designed in a way that adapts to different screen widths.

### When to test more than one screen width?

If your app is very similar on mobile and desktop, there's no need to create separate mobile tests - it will just double your work without much value added. We recommend that you focus on one screen resolution - the one that has the most users. You can still create 5 - 10 additional tests for different resolutions, but focus on the major differences between the mobile and desktop versions - just check if these specific core differences work correctly. &#x20;

If your app has many differences between mobile and desktop, for example very different navigation and user journeys, it makes sense to develop tests for mobile and desktop in parallel, as completely independent projects.

### How to create tests for different screen resolutions?

The easiest way to test the mobile version (responsive web design / RWD) is to have 2 different projects: one for desktop tests and one for mobile tests. Set a different window width per project in its [project settings](/preventing-failed-tests/project-settings).&#x20;

We recommend doing this in the following way:

1. Create all the important desktop tests
2. Duplicate the project
3. Rename the new project and add `- Mobile` suffix to the project name
4. Change the screen size to "Mobile" in the project settings
5. Adapt the tests to the mobile version via [re-recording test steps](/recording-tests-steps/re-recording-steps).

<figure><img src="/files/p147PaqHfv0psHf57F6r" alt=""><figcaption><p>Duplicate the project and change its name</p></figcaption></figure>

<figure><img src="/files/HVEwGmyamZsqo1Fh9aNJ" alt=""><figcaption><p>You can choose a mobile option when creating a new test </p></figcaption></figure>

<figure><img src="/files/yeTsAVkhWD1uAzy2xHhy" alt=""><figcaption><p>or change to mobile screen size in test settings. </p></figcaption></figure>

<figure><img src="/files/w1mAL5eBNRKqEaxPBP0S" alt=""><figcaption><p>When You copy an existing test </p></figcaption></figure>

<figure><img src="/files/7hSojB8O3tDjnYDCitjQ" alt=""><figcaption><p>Run tests with smaller mobilewindow width</p></figcaption></figure>

{% hint style="info" %}
**Tip!** You can [ask support to move the tests between projects or accounts](/organizing-tests/projects#transfer-a-project-to-a-different-organization).&#x20;
{% endhint %}


# Organizations

Discover BugBug's collaboration and organization settings. You can modify, add or delete information regarding your organization. Optimize teamwork and enhance your productivity.

## What are organizations?

Invite people to your organization to collaborate on the tests.&#x20;

"Organization" is your team's workspace, that shares the following:

* projects
* subscription
* organization settings
* [scheduled tests](/running-tests/schedules) notifications

You can have unlimited projects in one organization. Everyone in the organization can access all the projects.

{% hint style="info" %}
**Important!** Only the organization admin can edit credit card information.
{% endhint %}

## Organization settings

To access Organization settings click the top-right user icon and select "Organization settings"

![](/files/FLoQN6wngIMn2bRgUjRD)

In the organization settings you are able to:

* change your organization's name (rename an organization)
* invite other people to your organization and give them different roles like `admin` or `editor`
* enter your billing data
* choose or change the subscription plan
* modify your credit card details (only organization Admin can do this)
* check your invoices

## Creating a new organization

You can create a new organization any time using the top dropdown. Here you can also switch between organizations if you have more than one.&#x20;

![](/files/MFq1TfJgsZXK0BWrSMZW)

![](/files/NV9XSdRgoiQvPa7iOHLC)

## Related

[Parallel runs within your organization](/running-tests/parallel-mode#parallel-runs-within-your-organization)


# Inviting team members

Learn how to invite team members and enhance your team collaboration with BugBug. You can work together on test cases, share links to test results, empower developers and many more.

## Why invite collaborators?

Working in a team on test automation is easier if all of your team members have access to BugBug.

* Work together on test cases
* Share direct links to test results
* Empower developers to [run tests locally ](/running-tests/test-in-your-browser)
* Let developers see test results by clicking a link in[ build pipelines](/integrations/api)
* Get all-team [notifications](/collaboration/alerts) for scheduled cloud runs

{% hint style="info" %}
**Hint!** If you're a software agency, you don't need to invite your clients to send them email notifications. You can add them as "additional email addresses" in [project notification settings](/collaboration/alerts).
{% endhint %}

## How many users can I invite?

You can invite an unlimited number of users, <mark style="color:green;">**free of charge**</mark>. No paid subscription is required.

## How to invite collaborators?

Go to "Organization settings" and switch to the "User" tab. Here you can see who has access and their role.&#x20;

![](/files/eF7wimdlY56ofUbHaYNS)

![](/files/zAP1BS32EP2UfRWmqJZ2)

## User roles

| Role   | Can                                                                                                           |
| ------ | ------------------------------------------------------------------------------------------------------------- |
| Editor | Access & Edit assigned projects                                                                               |
| Admin  | <p>Access & Edit all projects<br>Manage Billing<br>Update credit card information<br>Change subscriptions</p> |


# Project access management

The BugBug [BUSINESS](https://bugbug.io/pricing/#:~:text=Optional%20parallel%20runs-,BUSINESS,-For%20scaling%20companies) plan allows you to assign users to specific projects. By default, every user is assigned to every project. To modify this, navigate to ***Organization settings > Users*** and make the necessary changes.

<figure><img src="/files/LpLtqpxppleohFVNWEhU" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/1StisOBmuB5FrYnrGV0m" alt=""><figcaption></figcaption></figure>

Please note that the ***Admin*** role has access to all projects, which cannot be modified. To assign a specific user to a project, you must first change their role to ***Editor.***

{% hint style="info" %}
You can read more about the differences between **Admin** and **Editor** roles [here](/collaboration/inviting-team-members#user-roles).
{% endhint %}


# Alerts

Stay connected and informed with BugBug's collaboration notifications feature. Streamline teamwork and never miss your test results. Try it now for free!

By default, BugBug is sending email notifications about [scheduled runs](/running-tests/schedules) to all members of your [organization](/collaboration/organization-settings). This makes sure that as soon as your app is not working as it should you will get an email alert.

You can change this rule on the Alerts page:

* when people get notifications
* who will receive them

You can also send additional notifications to email addresses who are not members of your organization, for example, clients or colleagues.&#x20;

{% hint style="info" %}
Alerts are configured **per project**, each project has independent settings.
{% endhint %}

<figure><img src="/files/JAsdu1yoyrkI8riMjYZu" alt=""><figcaption><p>Blank screen without alerts</p></figcaption></figure>

## Adding a new alert to your project&#x20;

By clicking on the "**New alert**" button you can set up alerts related to a specific project.

<figure><img src="/files/SJqw6lBHlJFstH6G0N0r" alt=""><figcaption><p>Blank screen without alerts</p></figcaption></figure>

<figure><img src="/files/tfeGOmySEjprjwyHsnTJ" alt=""><figcaption><p>Alerts setup modal</p></figcaption></figure>

### Choose when the alerts should be sent

You can easily select when the alerts should be triggered by clicking and expanding the drop-down list in the "*When*" section.&#x20;

Available options:

* Test started
* Test finished
* Suite started
* Suite finished
* Schedule started
* Schedule finished

<figure><img src="/files/6q8h7gX119v6oEKmpqNo" alt=""><figcaption><p>List of available conditions</p></figcaption></figure>

#### Along with other conditions, such as:

* **Which suites/tests/schedules** - allows you to select various suites, tests, or schedules.
* **Results -** "*Passed*" and "*Failed*" are selected by default, but you can also choose a third option - "*BugBug internal erro*r" that will send an alert when, for example, some technical issues occur on BugBug's side that could impact the test run results.&#x20;
* **Methods&#x20;*****-*** contains "*Local browser*" and "*Cloud*" options to be selected, but this is dependent on your subscription plan settings.
* **Profile** *- a* profile that was used in selected runs.
* **Run by** *-* define what causes the run. Select between: "*Manually by a use*r", "*API*", or "*Automatically by scheduler*".
* **Frequency** *-* define when you want to get an alert. Select between:
  * "*Every time*" - get an alert always when the trigger with the given parameters occurs.
  * "*Only once when the result changes*" - reduce the noise. Don't get alerts if the result is the same as the previous one. For example, if the result is failed 5 times in a row, you will only get an alert the first time.

{% hint style="info" %}
Remember that these fields will change based on what type of event you will select in the "When" section from the listed options.
{% endhint %}

### Set what type of action should be executed\*

<figure><img src="/files/gmkGZomrV2see34n2CY6" alt=""><figcaption></figcaption></figure>

Currently you can choose one of those options:

* [Send email notification](/collaboration/alerts/sending-email-notification)
* [Send webhook](/collaboration/alerts/sending-webhook)
* [Send Slack message](/collaboration/alerts/sending-slack-message)

{% hint style="info" %}
**\*Note:** More will come soon, such as: creating a Jira ticket and sending a notification to other team communicators like Discord, etc.
{% endhint %}

***

## Alerts list and management

Having all the data filled you can add your alert by clicking on the "**Create alert**" button to see it on the list.

<figure><img src="/files/oLWXSlAVCJSDzIKGCz5p" alt=""><figcaption></figcaption></figure>

### Manage your existing alerts

From this level, you can easily manage your listed alerts. From enabling or disabling to duplication them with a few clicks. Editing is also possible - just simply click on a listed alert's box.

<figure><img src="/files/PvN0zPxdl7Z6FMCrnueN" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
Click on the toggle button to enable/disable each alert.
{% endhint %}

Click on the "**...**" to display the drop-down menu and select between available options:

* Edit
* Duplicate
* Delete

<figure><img src="/files/cHLThGS6lbByx9zvOOam" alt=""><figcaption></figcaption></figure>

If some alerts aren't needed anymore and you want to tidy your list, just simply delete the selected item.


# Sending email notification

### Select who should be notified

In the "Send to" drop-down section you can select who should be notified when alerts are triggered. You can select between:

* All people (in the selected project)
* Selected user(s)

### Additional email addresses for notifications

You can also send notifications to other people, who are not members of your organization. For example:

* notify your clients about their app status without granting them access to the whole project
* notify other teams who don't want to sign up for BugBug but still want to be notified when something is not working as it should

You can enter several additional email addresses, separated by a comma.

<figure><img src="/files/7NzrOsXdOprabkc9uceo" alt=""><figcaption><p>Send to setup options for email notifications</p></figcaption></figure>


# Sending webhook

Outgoing webhooks are a powerful feature for advanced users that can be used to integrate BugBug into your current workflow, such as sending custom notifications to your team's communicator, like Slack.

Before proceeding to the next step, set up a webhook in your external service. You will need the webhook configuration to populate the form fields.

{% hint style="info" %}
**Note**: You can use built-in variables in any field, e.g., **{{testRunId}}**.
{% endhint %}

### Set basic request data

In the first two fields, define the request **method** and the **webhook URL**. Currently, we support the most popular webhook request methods like POST and GET.

<figure><img src="/files/9pkqqh1yMGA6Wet1a7el" alt=""><figcaption><p>Method and Webohook URL fields on the setup screen</p></figcaption></figure>

### Define POST request body message

The **Body** field is optional and consumes JSON data. Its value depends on your needs and your external service provider's requirements.

If you need to send additional data through the webhook request, it's the best place to do so.

### Testing a webhook alert

Before creating a new webhook alert, you can test it by clicking the **"Trigger Alert"** button.

It's a good practice to do this. It helps you avoid unexpected errors in the future, such as invalid credentials or an incorrect request body format.

<figure><img src="/files/bViHr6UaHyGyv9NQchqi" alt=""><figcaption><p>Verify alert configuration</p></figcaption></figure>

### Define the POST request body message

When setting up the *Body* of your webhook, you can use variables available in the specific event context. Knowing this, for instance, you can set an alert that sends the test name via the POST method, with the body containing a variable that reflects the finished test's name.\\

<figure><img src="/files/khUDDGoKOGzJA4uhL8aV" alt=""><figcaption><p>Request body with a bult-in variable</p></figcaption></figure>

Reference for all available variables in webhook notification templates.

#### Common Variables (all context types)

| Variable               | Type   | Description                                                |
| ---------------------- | ------ | ---------------------------------------------------------- |
| `{{eventId}}`          | UUID   | Unique event ID for deduplication                          |
| `{{eventName}}`        | string | Notification event (e.g., `testFinished`, `suiteFinished`) |
| `{{status}}`           | string | Run status (`passed`, `failed`, `error`, etc.)             |
| `{{profileName}}`      | string | Run profile name                                           |
| `{{runMode}}`          | string | Run mode (`cloud`, `local`, `recording`)                   |
| `{{started}}`          | string | ISO 8601 start timestamp                                   |
| `{{finished}}`         | string | ISO 8601 end timestamp                                     |
| `{{durationMs}}`       | int    | Duration in milliseconds (e.g., `330500`)                  |
| `{{triggeredBy}}`      | string | Who triggered the run (`user`, `scheduler`, `api`)         |
| `{{organizationId}}`   | UUID   | Organization ID                                            |
| `{{organizationName}}` | string | Organization name                                          |
| `{{projectId}}`        | UUID   | Project ID                                                 |
| `{{projectName}}`      | string | Project name                                               |
| `{{projectUrl}}`       | URL    | Link to project in webapp                                  |
| `{{timestampMs}}`      | int    | Current epoch timestamp in milliseconds                    |
| `{{timestamp}}`        | int    | Alias for `timestampMs` (backward compatibility)           |
| `{{schemaVersion}}`    | string | Webhook payload schema version (e.g., `v1`)                |
| `{{objectsLimit}}`     | int    | Maximum number of items per list (e.g., `10`)              |

#### Test Run Variables

Available when the webhook is triggered by a test run event.

| Variable                  | Type   | Description                                                                      |
| ------------------------- | ------ | -------------------------------------------------------------------------------- |
| `{{testName}}`            | string | Test name                                                                        |
| `{{testId}}`              | UUID   | Test ID                                                                          |
| `{{testRunId}}`           | UUID   | Test run ID                                                                      |
| `{{testRunUrl}}`          | URL    | Link to test run details in webapp                                               |
| `{{testUrl}}`             | URL    | Link to test definition in webapp                                                |
| `{{browser}}`             | string | Combined browser string (e.g., `"Chrome 120.0"`)                                 |
| `{{browserName}}`         | string | Browser name                                                                     |
| `{{browserVersion}}`      | string | Browser version                                                                  |
| `{{os}}`                  | string | Operating system name                                                            |
| `{{screenSizeType}}`      | string | Screen size type (`desktop`, `mobile`, etc.)                                     |
| `{{extensionVersion}}`    | string | BugBug extension version                                                         |
| `{{failedStepUrl}}`       | URL    | Deep-link to first failed step (only for failed/errored runs)                    |
| `{{failedStepId}}`        | UUID   | Step Id of failed step                                                           |
| `{{failedStepErrorCode}}` | string | [Error code](/debugging-tests/error-codes) that represents problem with the step |
| `{{suiteId}}`             | UUID   | Parent suite ID (if run within a suite)                                          |
| `{{suiteRunId}}`          | UUID   | Parent suite run ID                                                              |
| `{{suiteName}}`           | string | Parent suite name                                                                |
| `{{suiteRunUrl}}`         | URL    | Link to parent suite run details                                                 |
| `{{scheduleId}}`          | UUID   | Parent schedule ID (if run within a schedule)                                    |
| `{{schedulerRunId}}`      | UUID   | Parent scheduler run ID                                                          |
| `{{scheduleName}}`        | string | Parent schedule name                                                             |

#### Suite Run Variables

Available when the webhook is triggered by a suite run event.

| Variable                    | Type   | Description                                      |
| --------------------------- | ------ | ------------------------------------------------ |
| `{{suiteId}}`               | UUID   | Suite ID                                         |
| `{{suiteRunId}}`            | UUID   | Suite run ID                                     |
| `{{suiteName}}`             | string | Suite name                                       |
| `{{suiteRunUrl}}`           | URL    | Link to suite run details                        |
| `{{suiteUrl}}`              | URL    | Link to suite configuration                      |
| `{{failedTestsCount}}`      | int    | Number of failed tests                           |
| `{{passedTestsCount}}`      | int    | Number of passed tests                           |
| `{{erroredTestsCount}}`     | int    | Number of errored tests                          |
| `{{totalTestsCount}}`       | int    | Total number of tests (including skipped)        |
| `{{failedTests}}`           | JSON   | Failed tests details (see structure below)       |
| `{{passedTests}}`           | JSON   | Passed tests details (see structure below)       |
| `{{erroredTests}}`          | JSON   | Errored tests details (see structure below)      |
| `{{failedTestsTruncated}}`  | bool   | `true` if failed tests list was truncated to 10  |
| `{{passedTestsTruncated}}`  | bool   | `true` if passed tests list was truncated to 10  |
| `{{erroredTestsTruncated}}` | bool   | `true` if errored tests list was truncated to 10 |
| `{{scheduleId}}`            | UUID   | Parent schedule ID (if run within a schedule)    |
| `{{schedulerRunId}}`        | UUID   | Parent scheduler run ID                          |
| `{{scheduleName}}`          | string | Parent schedule name                             |

#### Schedule Run Variables

Available when the webhook is triggered by a schedule run event.

| Variable                     | Type   | Description                                       |
| ---------------------------- | ------ | ------------------------------------------------- |
| `{{scheduleId}}`             | UUID   | Schedule ID                                       |
| `{{schedulerRunId}}`         | UUID   | Scheduler run ID                                  |
| `{{scheduleName}}`           | string | Schedule name                                     |
| `{{scheduleUrl}}`            | URL    | Link to schedule configuration                    |
| `{{failedSuites}}`           | JSON   | Failed suite runs (see structure below)           |
| `{{passedSuites}}`           | JSON   | Passed suite runs (see structure below)           |
| `{{erroredSuites}}`          | JSON   | Errored suite runs (see structure below)          |
| `{{failedSuitesTruncated}}`  | bool   | `true` if failed suites list was truncated to 10  |
| `{{passedSuitesTruncated}}`  | bool   | `true` if passed suites list was truncated to 10  |
| `{{erroredSuitesTruncated}}` | bool   | `true` if errored suites list was truncated to 10 |
| `{{failedTestsCount}}`       | int    | Number of failed tests across all suites          |
| `{{passedTestsCount}}`       | int    | Number of passed tests                            |
| `{{erroredTestsCount}}`      | int    | Number of errored tests                           |
| `{{totalTestsCount}}`        | int    | Total number of tests (including skipped)         |
| `{{failedTests}}`            | JSON   | Failed tests details                              |
| `{{passedTests}}`            | JSON   | Passed tests details                              |
| `{{erroredTests}}`           | JSON   | Errored tests details                             |
| `{{failedTestsTruncated}}`   | bool   | `true` if failed tests list was truncated to 10   |
| `{{passedTestsTruncated}}`   | bool   | `true` if passed tests list was truncated to 10   |
| `{{erroredTestsTruncated}}`  | bool   | `true` if errored tests list was truncated to 10  |

#### JSON Structures

#### `failedTests` / `passedTests` / `erroredTests`

All three lists share the same structure:

```
[
  {
    "testId": "<uuid>",
    "testRunId": "<uuid>",
    "testName": "Login Test",
    "status": "failed",
    "testRunUrl": "https://app.bugbug.io/.../runs-history/tests/<test_run_id>/",
    "started": "2026-03-24T10:00:00+00:00",
    "finished": "2026-03-24T10:05:30+00:00",
    "durationMs": 330500,
    "browser": "Chrome 120.0",
    "browserName": "Chrome",
    "browserVersion": "120.0",
    "os": "Linux",
    "screenSizeType": "desktop",
    "extensionVersion": "1.2.3"
  }
]
```

**Note:** Test lists are limited to 10 entries to prevent oversized payloads.

#### `failedSuites` / `passedSuites` / `erroredSuites`

Available only in schedule run events:

```
[
  {
    "suiteRunId": "<uuid>",
    "suiteRunUrl": "https://app.bugbug.io/.../runs-history/suites/<suite_run_id>/",
    "suiteId": "<uuid>",
    "suiteName": "'MAIN' Suite",
    "status": "failed",
    "started": "2026-03-24T10:00:00+00:00",
    "finished": "2026-03-24T10:05:30+00:00",
    "durationMs": 330500
  }
]
```

{% hint style="warning" %}
**Important:** Use list variables (`failedTests`, `passedTests`, `erroredTests`) **without quotes** in the template to get native JSON arrays in the payload. The template itself won't be valid JSON, but the rendered output will be.
{% endhint %}

{% hint style="warning" %}
**Important:** For numeric and boolean variables (counts, `*Truncated`, etc.) use them **without quotes** to preserve types.
{% endhint %}

#### Example Payloads

These example payloads are also available via the "Fill with example" button in the webapp webhook editor

**Test Run**

```
{
  "id": "{{eventId}}",
  "schemaVersion": "{{schemaVersion}}",
  "eventType": "{{eventName}}",
  "timestampMs": {{timestampMs}},
  "organization": {
    "id": "{{organizationId}}",
    "name": "{{organizationName}}"
  },
  "project": {
    "id": "{{projectId}}",
    "name": "{{projectName}}"
  },
  "test": {
    "id": "{{testId}}",
    "name": "{{testName}}"
  },
  "execution": {
    "id": "{{testRunId}}",
    "status": "{{status}}",
    "started": "{{started}}",
    "finished": "{{finished}}",
    "durationMs": {{durationMs}},
    "triggeredBy": "{{triggeredBy}}",
    "profileName": "{{profileName}}",
    "runMode": "{{runMode}}",
    "browser": "{{browser}}",
    "browserName": "{{browserName}}",
    "browserVersion": "{{browserVersion}}",
    "os": "{{os}}",
    "screenSizeType": "{{screenSizeType}}",
    "extensionVersion": "{{extensionVersion}}"
  },
  "parent": {
    "suiteId": "{{suiteId}}",
    "suiteName": "{{suiteName}}",
    "suiteRunId": "{{suiteRunId}}",
    "scheduleId": "{{scheduleId}}",
    "scheduleName": "{{scheduleName}}",
    "schedulerRunId": "{{schedulerRunId}}"
  },
  "links": {
    "project": "{{projectUrl}}",
    "testRun": "{{testRunUrl}}",
    "test": "{{testUrl}}",
    "suiteRun": "{{suiteRunUrl}}",
    "failedStep": "{{failedStepUrl}}"
  },
  "failedStep": {
    "stepId": "{{failedStepId}}",
    "errorCode": "{{failedStepErrorCode}}"
  }
}
```

**Suite Run**

```
{
  "id": "{{eventId}}",
  "schemaVersion": "{{schemaVersion}}",
  "eventType": "{{eventName}}",
  "timestampMs": {{timestampMs}},
  "organization": {
    "id": "{{organizationId}}",
    "name": "{{organizationName}}"
  },
  "project": {
    "id": "{{projectId}}",
    "name": "{{projectName}}"
  },
  "suite": {
    "id": "{{suiteId}}",
    "name": "{{suiteName}}"
  },
  "execution": {
    "id": "{{suiteRunId}}",
    "status": "{{status}}",
    "started": "{{started}}",
    "finished": "{{finished}}",
    "durationMs": {{durationMs}},
    "triggeredBy": "{{triggeredBy}}",
    "profileName": "{{profileName}}",
    "runMode": "{{runMode}}"
  },
  "parent": {
    "scheduleId": "{{scheduleId}}",
    "scheduleName": "{{scheduleName}}",
    "schedulerRunId": "{{schedulerRunId}}"
  },
  "links": {
    "project": "{{projectUrl}}",
    "suiteRun": "{{suiteRunUrl}}",
    "suite": "{{suiteUrl}}"
  },
  "results": {
    "total": {{totalTestsCount}},
    "counts": {
      "passed": {{passedTestsCount}},
      "failed": {{failedTestsCount}},
      "errored": {{erroredTestsCount}}
    }
  },
  "failedTests": {
    "truncated": {{failedTestsTruncated}},
    "limit": {{objectsLimit}},
    "items": {{failedTests}}
  },
  "passedTests": {
    "truncated": {{passedTestsTruncated}},
    "limit": {{objectsLimit}},
    "items": {{passedTests}}
  },
  "erroredTests": {
    "truncated": {{erroredTestsTruncated}},
    "limit": {{objectsLimit}},
    "items": {{erroredTests}}
  }
}
```

**Schedule Run**

```
{
  "id": "{{eventId}}",
  "schemaVersion": "{{schemaVersion}}",
  "eventType": "{{eventName}}",
  "timestampMs": {{timestampMs}},
  "organization": {
    "id": "{{organizationId}}",
    "name": "{{organizationName}}"
  },
  "project": {
    "id": "{{projectId}}",
    "name": "{{projectName}}"
  },
  "schedule": {
    "id": "{{scheduleId}}",
    "name": "{{scheduleName}}"
  },
  "execution": {
    "id": "{{schedulerRunId}}",
    "status": "{{status}}",
    "started": "{{started}}",
    "finished": "{{finished}}",
    "durationMs": {{durationMs}},
    "profileName": "{{profileName}}",
    "runMode": "{{runMode}}"
  },
  "links": {
    "project": "{{projectUrl}}",
    "schedule": "{{scheduleUrl}}"
  },
  "failedSuites": {
    "truncated": {{failedSuitesTruncated}},
    "limit": {{objectsLimit}},
    "items": {{failedSuites}}
  },
  "passedSuites": {
    "truncated": {{passedSuitesTruncated}},
    "limit": {{objectsLimit}},
    "items": {{passedSuites}}
  },
  "erroredSuites": {
    "truncated": {{erroredSuitesTruncated}},
    "limit": {{objectsLimit}},
    "items": {{erroredSuites}}
  },
  "results": {
    "total": {{totalTestsCount}},
    "counts": {
      "passed": {{passedTestsCount}},
      "failed": {{failedTestsCount}},
      "errored": {{erroredTestsCount}}
    }
  },
  "failedTests": {
    "truncated": {{failedTestsTruncated}},
    "limit": {{objectsLimit}},
    "items": {{failedTests}}
  },
  "passedTests": {
    "truncated": {{passedTestsTruncated}},
    "limit": {{objectsLimit}},
    "items": {{passedTests}}
  },
  "erroredTests": {
    "truncated": {{erroredTestsTruncated}},
    "limit": {{objectsLimit}},
    "items": {{erroredTests}}
  }
}
```


# Sending Slack message

Sending Slack messages to your project channel or directly to people is the best way to keep your team updated on the status of test/suite/schedule runs.

{% hint style="warning" %}
Keep in mind that the "Alerts" feature is only available on paid plans.\
So any related features, such as Slack alerts, will not be available on the free plan.

More information about pricing can be found here: <https://bugbug.io/pricing/>
{% endhint %}

Before proceeding to the first step, remember to [integrate your Slack workspace with BugBug](/integrations/slack#connect-your-slack-workspace-with-bugbug).\
If you haven't done so yet, don't worry - BugBug will prompt you for permissions when you start creating an alert.

<figure><img src="/files/KfuhiwPKUKXfENj4ND3y" alt=""><figcaption></figcaption></figure>

Already connected? Great! Follow the steps below.

### Set Slack message type&#x20;

In the first field, you need to specify the messaging method. We currently support two different ways to send a Slack message:

* Channel message *(most common)*&#x20;
* Direct message

<figure><img src="/files/U0cDJ75dU4co13wwaR9R" alt=""><figcaption></figcaption></figure>

### Choose a recipient/channel

In the next box, you need to select a channel or person to receive the messages.\
BugBug will provide you with a list of all available Slack members.

<figure><img src="/files/fiIAhWWmCb2xloPmYcF4" alt=""><figcaption></figcaption></figure>

### Testing a Slack alert

Before creating a new Slack alert, it's possible to check how it works by clicking on the **"Trigger Alert"** button.

{% hint style="info" %}
The Slack message template is predefined for all users.\
If you need to customize the message, [create a webhook alert instead](/collaboration/alerts/sending-webhook).
{% endhint %}


# CLI

Integrate BugBug with any continuous integration (CI) or continuous deployment (CD) pipelines or build system hooks.

## Integrate with CI/CD using BugBug Command Line Interface

You can operate BugBug via the Command Line Interface (CLI). This empowers you to integrate with any continuous integration (CI) or continuous deployment (CD) pipelines or build system hooks.

{% embed url="<https://www.npmjs.com/package/@testrevolution/bugbug-cli>" %}

## Install via NPM

Open your terminal. First of all, you need  [Node.js](https://nodejs.org/en/download/) installed on your machine and [npm](https://www.npmjs.com/get-npm) installed.&#x20;

{% hint style="info" %}
You need Node.js **version 20** **or newer**
{% endhint %}

After you have **NodeJS** and **npm** installed simply run:

```
npm install -g @testrevolution/bugbug-cli
```

Remember that you need to have admin user permissions on NodeJS execution.

## Get your API token

You need to take **the API token** of the project you want to run with CLI. You will find that in the BugBug web app in the Integrations tab from the side menu:

<figure><img src="/files/JKLXJZdu99m8ehBeh4Sv" alt=""><figcaption><p>The API token for the project</p></figcaption></figure>

Then configure CLI with the project's API token:

```
bugbug config set-token <api-token-from-project-settings>
```

## Run tests from terminal

On BugBug npm's page, you find the available commands. You can also just strike `bugbug help` to see what you can do and how.

Example: list suites within the connected project:

![](/files/-MOTX5rk6pQWIegiDMU3)

To run a particular test via CLI you need to find the ID of the test. It's easy, just go to your test, expand `3 dots`, and select `Run via CLI`. Just simply copy the command for running, open the terminal, and paste and run. The command looks as below:

```
bugbug remote run test <test-id>
```

## Find your suite ID

You can run the whole suite as well by going to `Suites` the tab, expanding the details, and selecting `Run via CLI`. The command is the same but SUITE\_ID is different. That's how we recognize you want to run the whole suite!

<figure><img src="/files/mrMlZtKZ8GUCLreLD0gE" alt=""><figcaption><p>Run in CLI option in the more drop-down menu</p></figcaption></figure>

<figure><img src="/files/aQde5tSgqZeOF0kWeD7b" alt=""><figcaption><p>Run this suite via CLI modal</p></figcaption></figure>

## Run tests from your build pipeline

Update your CI/CD build scripts to see test results directly in your build management tool *(for example in Bitbucket)*

Here's an example of what you can add to your build script:&#x20;

![](/files/vJ82yv94c7HU7CheediK)

You can also override individual [variables](/editing-tests/variables#intro-to-variables) from the command line with `--variable variableName="customVariableValue"`. This allows you to run different combinations of test data in different environments, for example, you can insert a different user password on prod and a different one on staging.&#x20;

{% hint style="info" %}
**If you're ambitious**&#x20;

Command line variables override allows you to test various combinations of test data. You could create a `for each` type of script and execute a suite with all the combinations.&#x20;
{% endhint %}

When you run your pipeline, BugBug tests would be triggered and your build will only be successful if all tests passed.

![](/files/SQY2W0YgjqOx7ehlj3FX)

Also read: [our advanced guide to automation testing for startups](https://bugbug.io/blog/software-testing/automation-testing-guide-for-startups-level-3/)

## Available commands list

Here is a list of the commands that may be in use with different options and/or flags:

### **`bugbug help <option>`**

| Options                                                                                        | Flags | Description                            |
| ---------------------------------------------------------------------------------------------- | ----- | -------------------------------------- |
| <ul><li><code>config</code></li><li><code>remote</code></li><li><code>version</code></li></ul> | N/A   | Show help menu for a specific command. |

### **`bugbug config <option>`**

| Options             | Flags | Description                                                                                                   |
| ------------------- | ----- | ------------------------------------------------------------------------------------------------------------- |
| `set-token <token>` | N/A   | <p></p><p>You can use this option for the command to set a valid token from your web app project settings</p> |

### **`bugbug remote <option>`**

| Options                       | Flags                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           | Description                                       |
| ----------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------- |
| `list test`                   | <ul><li><code>--no-wait</code> <br><em>Exit immediately without waiting for the result</em></li><li><code>--no-progress</code><br><em>Don't show progress spinner</em></li><li><code>--debug</code> <br><em>Show more data</em> <em>(like raw API response)</em></li></ul>                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      | Returns a list of all existing tests              |
| `list suite`                  | <ul><li><code>--no-wait</code> <br><em>Exit immediately without waiting for the result</em></li><li><code>--no-progress</code><br><em>Don't show progress spinner</em></li><li><code>--debug</code> <br><em>Show more data</em> <em>(like raw API response)</em></li></ul>                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      | Returns a list of all existing test suites        |
| `list profile`                | <ul><li><code>--no-wait</code> <br><em>Exit immediately without waiting for the result</em></li><li><code>--no-progress</code><br><em>Don't show progress spinner</em></li><li><code>--debug</code> <br><em>Show more data</em> <em>(like raw API response)</em></li></ul>                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      | Returns a list of all existing test profiles      |
| `run test <test-id>`          | <ul><li><code>--no-wait</code><br><em>Exit immediately without waiting for the result</em></li><li><code>--no-progress</code><br><em>Exit immediately without waiting for the result</em></li><li><code>--debug</code> <br><em>Show more data</em> <em>(like raw API response)</em></li><li><code>--with-details</code><br> <em>Show result with details</em></li><li><code>--profile</code> <br><code>"\<profile-name>"</code><br> <em>Run with a specific, existing profile</em><br></li><li><code>--variable</code> <br><code>"\<variable-name>"</code><br> <em>Override default variable during a single run</em><br></li><li><code>--reporter</code><br> <em>The name of the reporter to use (default: "inline"). Instead of "inline" you can also set "junit" for the report to be exported to an XML file</em><br></li><li><code>--output-path</code><br> <em>The path to save the test report. Relative to the current working directory</em></li></ul> | Runs a specific test based on its ID              |
| `stop test <test-run-id>`     | <ul><li><code>--no-progress</code><br><em>Exit immediately without waiting for the result</em></li><li><code>--debug</code><br><em>Show more data</em> <em>(like raw API response)</em></li><li><code>--result-timeout \<int></code><br><em>Modify the default result waiting time (minutes, default: 60)</em></li></ul>                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        | Stop the test run based on its ID                 |
| `run suite <suite-id>`        | <ul><li><code>--no-wait</code><br><em>Exit immediately without waiting for the result</em></li><li><code>--no-progress</code><br><em>Exit immediately without waiting for the result</em></li><li><code>--debug</code> <br><em>Show more data</em> <em>(like raw API response)</em></li><li><code>--with-details</code><br><em>Show result with details</em></li><li><code>--profile</code> <br><code>"\<profile-name>"</code><br><em>Run with a specific, existing profile</em></li><li><code>--variable</code> <br><code>"\<variable-name>"</code><br><em>Override default variable during a single run</em></li><li><code>--reporter</code><br><em>The name of the reporter to use (default: "inline"). Instead of "inline" you can also set "<strong>junit</strong>" for the report to be exported to an XML file</em></li><li><code>--output-path</code><br><em>The path to save the test report. Relative to the current working directory</em></li></ul> | Runs a specific test suite based on its ID        |
| `stop suite <suite-run-id>`   | <p></p><ul><li><code>--no-progress</code><br><em>Exit immediately without waiting for the result</em></li><li><code>--debug</code><br><em>Show more data</em> <em>(like raw API response)</em></li><li><code>--result-timeout \<int></code><br><em>Modify the default result waiting time (minutes, default: 60)</em></li></ul>                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 | Stop the test suite run based on its ID           |
| `status test <test-id>`       | <ul><li><code>--no-progress</code><br><em>Exit immediately without waiting for the result</em></li><li><code>--debug</code> <br><em>Show more data</em> <em>(like raw API response)</em></li></ul>                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              | Display the test's status based on a run ID       |
| `status suite <suite-run-id>` | <ul><li><code>--no-progress</code><br><em>Exit immediately without waiting for the result</em></li><li><code>--debug</code> <br><em>Show more data</em> <em>(like raw API response)</em></li></ul>                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              | Display the test suite's status based on a run ID |
| `result test <test-run-id>`   | <ul><li><code>--no-progress</code><br><em>Exit immediately without waiting for the result</em></li><li><code>--debug</code> <br><em>Show more data</em> <em>(like raw API response)</em></li><li><code>--with-details</code><br><em>Show results with details</em></li></ul>                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    | Display the test result based on a run ID         |
| `result suite <test-run-id>`  | <ul><li><code>--no-progress</code><br><em>Exit immediately without waiting for the result</em></li><li><code>--debug</code> <br><em>Show more data</em> <em>(like raw API response)</em></li><li><code>--with-details</code><br><em>Show results with details</em></li></ul>                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    | Display the test suite's result based on a run ID |

## Examples of usage

### Check the status of a test run by its ID:

```
bugbug remote status test <test-run-id>
```

**Output:**

```
ℹ Test name: [REG] Popup handling #2 (testRunId: 10a696b2-3ce6-4b45-8b9f-0a0a0abc00000)
✔ Status: passed
```

### Generate a report of a test run by its ID:

{% hint style="info" %}
By default "reporter" option is set to "inline".
{% endhint %}

```
bugbug remote status test <test-run-id> --reporter
```

**Output:**

```
ℹ Test name: Test number 71 (testRunId: ba5e19d8-609d-4529-95f6-0c6179e59614)
✔ Status: passed
```

### Generate a report of a test run by its ID that's exported to a junit format (XML file):

<pre><code><strong>bugbug remote status test &#x3C;test-run-id> --reporter junit
</strong></code></pre>

**Output:**

```
bugbug remote status test <test-run-id> --reporter junit
⠹ Waiting for result...
```

The XML file is automatically exported to your project's main directory:

<figure><img src="/files/dv5stZLGyM2EkSocv1xG" alt=""><figcaption><p>Preview of a test report exported to an XML file</p></figcaption></figure>

### Execute a test suite by its ID:

<pre><code><strong>bugbug remote run suite &#x3C;test-suite-id>
</strong></code></pre>

**Output:**

```
bugbug remote status suite bceb9701-23d3-4b67-bfb7-a000a000a00
✔ Status: passed
```

### Check test suite run's status:

<pre><code><strong>bugbug remote status suite &#x3C;suite-run-id>
</strong></code></pre>

**Output:**

```
bugbug remote status suite 8de73c22-c8a3-4141-c111-0a0a0a0a0a
✔ Status: passed
```


# Zapier

Discover seamless integration between BugBug and Zapier for efficient test automation. Streamline processes and boost QA productivity effortlessly.

## Connect BugBug to hundreds of other apps with Zapier

[Zapier](https://zapier.com/apps/BugBug/integrations) lets you connect BugBug to 2,000+ other web services. Automated connections called Zaps, set up in minutes with no coding, can automate your day-to-day tasks and build workflows between apps that otherwise wouldn't be possible.

Each Zap has one app as the **Trigger**, where your information comes from and which causes one or more **Actions** in other apps, where your data gets sent automatically.

### Flexible integrations

Explore multiple [**ways of integrating BugBug with other apps like Slack or Jira**](https://zapier.com/apps/bugbug/integrations)

![https://zapier.com/apps/bugbug/integrations](/files/fe7yR4ByRQbi2EJ28HTA)

![https://zapier.com/apps/bugbug/integrations](/files/vvMncqmcMfciY1yBnKq8)

###

### Start with BugBug integrations for free

Zapier allows you to execute up to 100 automated tasks per month for free.

### How do I connect BugBug to Zapier?

Log in to your [Zapier account](https://zapier.com/app/login) or create a [new account](https://zapier.com/sign-up). Next, click on the "***Explore apps***" buton from the top menu bar or "***App Connections***" in the sidebar. Search for "BugBug" and add a new connection.&#x20;

Use your credentials (API Key) to connect your BugBug account to Zapier. Once that's done you can start creating an automation!&#x20;

Use a pre-made Zap or create your own with the Zap Editor. Creating a Zap requires no coding knowledge and you'll be walked step-by-step through the setup.&#x20;

Need inspiration? See everything that's possible with [BugBug and Zapier](https://zapier.com/apps/BugBug/integrations).

If you have any additional questions, you can reach out to <contact@zapier.com>.&#x20;


# Slack

Discover seamless integration between BugBug and Slack for efficient bug tracking and collaboration. Streamline your workflow with ease. Learn more!

<div align="center"><figure><img src="/files/ww8vzTcGDPpWUnwOXYlO" alt="Slack logo" width="300"><figcaption></figcaption></figure></div>

## How to integrate test automation with Slack?

BugBug’s integration for Slack is designed to elevate your testing and issue management to a whole new level.

Stay informed about:

* failed test runs
* schedule suites results
* unexpected errors
* ...and many more.

Currently, it is possible to do that in two ways:

1. [Creating a Slack message alert](#creating-a-slack-message-alert) *(recommended)*
2. [Using Zapier integration](#using-zapier-integration)

## Creating a Slack message alert

If you use Slack on a daily basis, need real-time updates, and want to set it up as seamlessly as possible, this is the easiest way to go.

{% hint style="warning" %}
Keep in mind that Slack integration is only available on paid plans. So any related features, such as Slack alerts, will not be available on the free plan.

More information about pricing can be found here: <https://bugbug.io/pricing/>
{% endhint %}

### Connect your Slack workspace with BugBug

Before you can create a new Slack Alert, you need to provide access to your Slack workspace.\
To do this:

1. Go to the "Integrations" page
2. Find Slack on the integrations list
3. Click on the "Manage" button
4. Continue by clicking on the "Connect" button
5. "Allow" BugBug to access your workspace data

{% hint style="info" %}
BugBug only needs information about available channels/users and permission to send messages to them.

More information about our privacy policy can be found here: <https://bugbug.io/privacy-policy/>
{% endhint %}

After the last step, you will be automatically redirected to the "Integration Details" page.

<figure><img src="/files/tpkj0MIwCEx28Owsw597" alt=""><figcaption></figcaption></figure>

### Create a Slack message alert

On this page, you can click the "Send a Slack message alert" link. This takes you to the "New Alert" view, where you can configure your first Slack message alert, eg. the message type or recipient.

<figure><img src="/files/CVDHvhMTB2lbWPwSCGV9" alt=""><figcaption></figcaption></figure>

If you don't know how to set up [Alerts](/collaboration/alerts), you can read more about how to do it [here](/collaboration/alerts#adding-a-new-alert-to-your-project).

***

## Using Zapier integration

[Use Zapier for connecting BugBug to Slack to get notifications -->](/integrations/zapier)

### Explore other ways of integrating BugBug with Slack

Check out other templates for [integrating BugBug with Slack](https://zapier.com/apps/bugbug/integrations)

![https://zapier.com/apps/bugbug/integrations](/files/SGfaV5yddPiLzNlctvPT)


# GitHub

Streamline your GitHub workflow with BugBug's seamless integration. Collaborate efficiently and track issues effortlessly. Try it now for free!

![](/files/mtsUhQR5Hu7ZDWxyfxmn)

Integrate with GitHub to streamline testing into your CI/CD pipeline, providing real-time feedback within your repository. Run tests and suites on BugBug Cloud to ensure that only high-quality, thoroughly tested code is deployed to production environments, reducing the risk of introducing regressions or bugs.

Currently, it is possible to integrate in two ways:

1. Using [official GitHub Action](#official-github-action) **(recommended)**
2. Via [BugBug Command Line Interface (CLI)](/integrations/api)

## Official GitHub Action

GitHub Actions allows developers to create automated workflows directly within their GitHub repositories. Integrating with [BugBug Cloud Runner](https://github.com/marketplace/actions/bugbug-cloud-runner) lets them seamlessly incorporate testing into your CI/CD pipeline to receive instant feedback on test results and quickly identify issues.

{% hint style="warning" %}
Keep in mind that BugBug Cloud Runner is only available on paid plans. \
More information about pricing can be found here: <https://bugbug.io/pricing/>
{% endhint %}

To add BugBug action to your workflow:

1. Go to the "Integrations" page
2. Find GitHub on the integrations list
3. Click on the "Manage" button
4. Continue by clicking on the "Open Github Action" button
5. Follow the instructions on [GitHub Marketplace](https://github.com/marketplace/actions/bugbug-cloud-runner) to add BugBug Cloud Runner to your .yml files

{% hint style="info" %}
Find your API token by following the instructions provided [here](/integrations/api#get-your-api-token).

Discover where to find your suite ID by referring to the information available on this [page](/integrations/api#find-your-suite-id).
{% endhint %}

### Use CLI in GitHub Actions

You can also use the BugBug CLI in a workflow.

```yaml
name: BugBug tests

on:
  push:
    branches:
      - main

jobs:
  e2e:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: 22
      - run: npm install -g @testrevolution/bugbug-cli
      - run: bugbug config set-token "$BUGBUG_API_TOKEN"
        env:
          BUGBUG_API_TOKEN: ${{ secrets.BUGBUG_API_TOKEN }}
      - run: bugbug remote run suite <suite-id>
```

Store the API token as a GitHub Actions secret. Do not commit it to the repository.

### Use Public API or incoming webhooks

Use the Public API if your workflow needs to list tests, start runs, stop runs, check statuses, or download reports programmatically.

Use incoming webhooks if GitHub only needs to trigger a test or suite with a single `POST` request.


# Bitbucket

Discover seamless integration between BugBug and Bitbucket for efficient bug tracking. Streamline your test automation process today!

BugBug can run tests from Bitbucket Pipelines using BugBug Command Line Interface.

Use this integration when you want Bitbucket to run BugBug tests before deployment or as part of your pull request workflow.

Keep in mind that cloud runs from CI/CD integrations are available on paid plans. More information about pricing can be found here: <https://bugbug.io/pricing/>

### Get your API token and suite ID

1. Go to the **Integrations** page.
2. Open the **CLI** tab.
3. Copy your API token or CLI setup command.
4. Find the suite or test you want to run.
5. Open its menu and select **Run via CLI or webhook**.
6. Copy the test ID or suite ID.

Store the API token as a Bitbucket repository variable. Do not commit it to the repository.

### Example Bitbucket pipeline

Add a step like this to `bitbucket-pipelines.yml`:

```yaml
image: node:20

pipelines:
  default:
    - step:
        name: BugBug tests
        script:
          - npm install -g @testrevolution/bugbug-cli
          - bugbug config set-token "$BUGBUG_API_TOKEN"
          - bugbug remote run suite <suite-id>
```

Set `BUGBUG_API_TOKEN` in **Repository settings > Repository variables** in Bitbucket.

### Use Public API or incoming webhooks

Use the Public API if your Bitbucket pipeline needs advanced control, such as checking run status, stopping runs, or downloading reports.

Use incoming webhooks if Bitbucket only needs to trigger a run with one `POST` request.

BugBug does not require a native Bitbucket OAuth connection for this flow.


# Gitlab

Discover seamless GitLab integration with BugBug. Run your test automation from GitLab CI/CD pipelines using our CLI.

### How to integrate test automation with GitLab?

BugBug can run tests from GitLab CI/CD pipelines using BugBug Command Line Interface.

Use this integration when you want GitLab to run BugBug tests before deployment or as part of merge request checks.

Keep in mind that cloud runs from CI/CD integrations are available on paid plans. More information about pricing can be found here: <https://bugbug.io/pricing/>

### Get your API token and suite ID

1. Go to the **Integrations** page.
2. Open the **CLI** tab.
3. Copy your API token or CLI setup command.
4. Find the suite or test you want to run.
5. Open its menu and select **Run via CLI or webhook**.
6. Copy the test ID or suite ID.

Store the API token as a GitLab CI/CD variable. Do not commit it to the repository.

### Example GitLab pipeline

Add a job like this to `.gitlab-ci.yml`:

```yaml
bugbug_tests:
  image: node:22
  stage: test
  script:
    - npm install -g @testrevolution/bugbug-cli
    - bugbug config set-token "$BUGBUG_API_TOKEN"
    - bugbug remote run suite <suite-id>
  only:
    - main
```

Set `BUGBUG_API_TOKEN` in **Settings > CI/CD > Variables** in GitLab.

### Use Public API or incoming webhooks

Use the Public API if your GitLab pipeline needs advanced control, such as checking run status, stopping runs, or downloading reports.

Use incoming webhooks if GitLab only needs to trigger a run with one `POST` request.

BugBug does not require a native GitLab OAuth connection for this flow.


# Trello

Seamlessly integrate Trello with BugBug to enhance collaboration and create Trello tasks when the scheduled tests failed. Explore our integration guide!

You can automatically create Trello tasks when the scheduled tests failed. Use [Zapier integration to connect BugBug to Trello](/integrations/zapier).

![](/files/dzqYeZX2mcY2dL4wVcHa)


# Jira

Discover seamless integration between BugBug and Jira for efficient bug tracking and project management. Jira integration allows you to integrate BugBug runs with your development process.

## Jira

### How to integrate test automation with Jira?

BugBug's Jira integration lets you create Jira issues from failed test runs.

Use this integration when a failed BugBug test needs follow-up work in Jira and you want the issue to include useful run context instead of a vague "test failed" note. Because yes, those are useless.

Keep in mind that Jira integration is available on the Business plan. More information about pricing can be found here: <https://bugbug.io/pricing/>

### Connect Jira with BugBug

1. Go to the **Integrations** page.
2. Find **Jira** on the integrations list.
3. Click **Manage**.
4. Click **Connect**.
5. Authorize BugBug in Atlassian.
6. Select the Jira site you want to connect.
7. After authorization, you will return to BugBug.

BugBug uses the connection to read available Jira projects and create issues in the selected project.

### Create a Jira issue from a failed test

1. Open the failed test run.
2. Find the failed test or step that should become a Jira issue.
3. Choose **Create Jira issue**.
4. Select the Jira project.
5. Edit the issue title if needed.
6. Confirm issue creation.

BugBug creates the Jira issue and stores the linked issue in the test run context, so your team can get back to the Jira issue from BugBug later.

BugBug does not automatically create Jira issues for every failed scheduled run. Create the issue when the failed run needs work in Jira.

### View or remove linked Jira issues

Linked Jira issues are shown in BugBug next to the related failed run, test, or step.

If an issue was created by mistake or no longer belongs to the run, you can remove the link from BugBug. Removing the link in BugBug does not delete the issue in Jira.


# Webhooks

Incoming webhooks let you start test and suite runs by sending a simple POST request.

This is the easiest way to trigger runs from external tools such as CI pipelines, deployment scripts, workflow builders, or internal services when you do not need the extra control offered by the [CLI](/integrations/api) or [API](/running-tests/running-via-api).

{% hint style="info" %}
This page covers only incoming webhooks. If you want to configure outgoing webhooks, see [Sending webhook alerts](/collaboration/alerts/sending-webhook).
{% endhint %}

### Where to find your webhook URLs

#### Integrations page

Open your project and go to `Integrations` -> `Webhooks`.

This tab shows webhook URL templates with your project webhook token and a placeholder for the test or suite ID.

<figure><img src="/files/ueDSxgIvddNMEhIhjI5B" alt="Integrations page"><figcaption></figcaption></figure>

#### Test and suite actions

To get a webhook URL with specific `test_id` or `suite_id` without building it manually:

1. Open the `...` menu for a test or suite.
2. Click `Run via CLI or webhook`.
3. Open the `Webhook` tab.
4. Copy the generated URL.

<figure><img src="/files/eTfmT6FnpZV5IjG9WlyV" alt="Tests list page"><figcaption></figcaption></figure>

<figure><img src="/files/YUrGzkivU0LFrugpdFhq" alt="Run via modal" width="456"><figcaption></figcaption></figure>

### How to trigger a run

Send a `POST` request to the webhook URL.

No authentication header is required because the webhook token is embedded in the URL.

#### Example: run a test with CURL

```bash
curl -X POST "https://app.bugbug.io/webhooks/<webhook_token>/tests/run/<test_id>"
```

#### Example: run a suite with CURL

```bash
curl -X POST "https://app.bugbug.io/webhooks/<webhook_token>/suites/run/<suite_id>"
```

### Webhook response

If the request is valid, BugBug starts the run and returns `200 OK`.

The response contains the following fields:

| Field        | Type     | Description                                   |
| ------------ | -------- | --------------------------------------------- |
| `id`         | UUID     | ID of the created test or suite run           |
| `modified`   | datetime | Last update time of the run                   |
| `status`     | string   | Current run status, for example `queued`      |
| `webapp_url` | URL      | Direct link to the run details in the web app |


# Discord

### How to integrate test automation with Discord?

BugBug can send test notifications to a Discord channel using Discord's native webhook system.

Use this integration when your team monitors test results in Discord and wants instant updates about test, suite, or schedule runs.

Keep in mind that Discord integration is available on paid plans. More information about pricing can be found here: <https://bugbug.io/pricing/>

### Create a Discord webhook

Before you create a Discord alert in BugBug, create a webhook URL in Discord.

1. Open Discord and go to the server where you want to receive BugBug notifications.
2. Open **Server Settings**.
3. Go to **Integrations**.
4. Open **Webhooks**.
5. Create a new webhook.
6. Choose the channel where BugBug should post messages.
7. Copy the webhook URL.

Treat the webhook URL as a secret. Anyone with this URL can send messages to your Discord channel.

### Create a Discord message alert

After you have the Discord webhook URL, create an alert in BugBug.

1. Go to the **Alerts** page.
2. Click **New alert**.
3. Choose when the alert should be sent, for example when a test, suite, or schedule finishes.
4. Select **Send Discord message** as the alert action.
5. Paste the Discord webhook URL.
6. Save the alert.

Before saving, use **Trigger Alert** to check that Discord receives the message.

### What this integration supports

BugBug sends messages to Discord channels through Discord webhooks. It does not install a Discord bot and does not send direct messages to Discord users.

If you need a custom payload for another service, use an outgoing webhook alert instead.


# Linear

### How to integrate test automation with Linear?

BugBug's Linear integration helps you turn failed tests into Linear issues without copying test details by hand.

Use this integration when your QA and development workflow is managed in Linear and you want failed BugBug runs to become actionable issues with links back to the test run.

Keep in mind that Linear integration is available on paid plans. More information about pricing can be found here: <https://bugbug.io/pricing/>

### Connect Linear with BugBug

1. Go to the **Integrations** page.
2. Find **Linear** on the integrations list.
3. Click **Manage**.
4. Click **Connect**.
5. Authorize BugBug in Linear.
6. After authorization, you will return to BugBug.

BugBug uses the connection to read available Linear teams and create issues in the team you choose.

### Create a Linear issue from a failed test

You can create Linear issues from failed test results in BugBug.

1. Open the failed test run.
2. Find the failed test or step that should become an issue.
3. Choose **Create Linear issue**.
4. Select the Linear team.
5. Edit the issue title if needed.
6. Confirm issue creation.

BugBug creates the Linear issue and stores the linked issue in the test run context, so your team can get back to the Linear issue from BugBug later.

BugBug does not automatically create Linear issues for every failed scheduled run. Create the issue when the failed run needs work in Linear.

### View or remove linked Linear issues

Linked Linear issues are shown in BugBug next to the related failed run, test, or step.

If an issue was created by mistake or no longer belongs to the run, you can remove the link from BugBug. Removing the link in BugBug does not delete the issue in Linear.


# Public API

### How to create custom integrations with BugBug Public API?

BugBug Public API lets you run and manage tests from your own tools, scripts, CI/CD pipelines, and internal dashboards.

Use the Public API when you need more control than a simple webhook URL or CLI command can provide.

Keep in mind that Public API access is available on paid plans. More information about pricing can be found here: <https://bugbug.io/pricing/>

### Get your API token

1. Go to the **Integrations** page.
2. Open the **API** tab.
3. Copy the project API token.

The API token belongs to a project. Treat it as a secret.

### Authenticate API requests

Send the API token in the `Authorization` header with the `Token` prefix:

```http
Authorization: Token <api-token>
```

Example:

```bash
curl \
  -H "Authorization: Token <api-token>" \
  "https://api.bugbug.io/v2/tests/"
```

### API documentation

BugBug provides generated API documentation in three formats:

* [GitBook](/public-api-reference/config)
* [Swagger](https://app.bugbug.io/docs/swagger/?version=v2)
* [Redoc](https://app.bugbug.io/docs/redoc/?version=v2)

### What you can build with the Public API

The Public API can be used to create custom integrations for CI/CD systems, internal tools, dashboards, release workflows, and reporting automation.

Common API capabilities include:

* listing, creating, updating, and deleting tests
* listing, creating, updating, and deleting suites
* running tests and suites in the cloud
* checking test run and suite run status
* retrieving run results
* stopping running tests and suites
* downloading JUnit reports
* managing test groups, steps, and reusable components in API v2
* exporting and importing tests or projects as YAML or ZIP files
* reading and updating project settings
* managing visual regression reference screenshots

### Public API, CLI, and webhooks

Use the **Public API** when you are building a custom integration and need programmatic control.

Use the **Command Line Interface** when you want a ready-made command for CI/CD scripts.

Use **incoming webhooks** when another tool only needs to start a test or suite with one `POST` request.

Use **outgoing webhooks** when BugBug should send run events to another system.


# Config

Config

## IP addresses list

> Returns List of Bugbug infrastructure IP addresses.

```json
{"openapi":"3.1.0","info":{"title":"BugBug.io Public API","version":"v2"},"tags":[{"name":"Config","description":"Config"}],"security":[{"Bearer":[]},{}],"components":{"securitySchemes":{},"schemas":{"IPAddressList":{"type":"object","properties":{"ips":{"type":"array","items":{"type":"string"}}},"required":["ips"]}}},"paths":{"/api/v2/config/ips/":{"get":{"operationId":"v2_config_ips_retrieve","description":"Returns List of Bugbug infrastructure IP addresses.","summary":"IP addresses list","tags":["Config"],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IPAddressList"}}},"description":""},"401":{"description":"Authentication credentials were missing or invalid."}}}}}}
```


# Projects

Retrieving projects

## Retrieving projects list

> Returns projects available within the public API token scope.

```json
{"openapi":"3.1.0","info":{"title":"BugBug.io Public API","version":"v2"},"tags":[{"name":"Projects","description":"Retrieving projects"}],"security":[{"tokenAuth":[]},{"Bearer":[]}],"components":{"securitySchemes":{"tokenAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"Token-based authentication with required prefix \"Token\""}},"schemas":{"PaginatedV2ProjectList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer"},"next":{"type":"string","nullable":true,"format":"uri"},"previous":{"type":"string","nullable":true,"format":"uri"},"results":{"type":"array","items":{"$ref":"#/components/schemas/V2Project"}}}},"V2Project":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"name":{"type":["string","null"],"readOnly":true},"organizationId":{"type":["string","null"],"format":"uuid","readOnly":true},"organizationName":{"type":"string"}},"required":["id","name","organizationId","organizationName"]}}},"paths":{"/api/v2/projects/":{"get":{"operationId":"v2_projects_list","description":"Returns projects available within the public API token scope.","summary":"Retrieving projects list","parameters":[{"in":"query","name":"ordering","schema":{"type":"string","enum":["-created","-name","created","name"]}},{"name":"page","required":false,"in":"query","description":"A page number within the paginated result set.","schema":{"type":"integer"}},{"name":"page_size","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"query","schema":{"type":"string"},"description":"Search in names with the following query"}],"tags":["Projects"],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedV2ProjectList"}}},"description":""},"401":{"description":"Authentication credentials were missing or invalid."}}}}}}
```


# Tests

Retrieving tests

## Retrieving tests list

> Returns many tests.

```json
{"openapi":"3.1.0","info":{"title":"BugBug.io Public API","version":"v2"},"tags":[{"name":"Tests","description":"Retrieving tests"}],"security":[{"tokenAuth":[]},{"Bearer":[]}],"components":{"securitySchemes":{"tokenAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"Token-based authentication with required prefix \"Token\""}},"schemas":{"PaginatedV2TestList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer"},"next":{"type":"string","nullable":true,"format":"uri"},"previous":{"type":"string","nullable":true,"format":"uri"},"results":{"type":"array","items":{"$ref":"#/components/schemas/V2Test"}}}},"V2Test":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"name":{"type":"string","maxLength":255}},"required":["id"]}}},"paths":{"/api/v2/tests/":{"get":{"operationId":"v2_tests_list","description":"Returns many tests.","summary":"Retrieving tests list","parameters":[{"in":"query","name":"ordering","schema":{"type":"string","enum":["-created","-name","created","name"]}},{"name":"page","required":false,"in":"query","description":"A page number within the paginated result set.","schema":{"type":"integer"}},{"name":"page_size","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"query","schema":{"type":"string"},"description":"Search in names with the following query"}],"tags":["Tests"],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedV2TestList"}}},"description":""},"401":{"description":"Authentication credentials were missing or invalid."}}}}}}
```

## Create a new test

> Create test.

```json
{"openapi":"3.1.0","info":{"title":"BugBug.io Public API","version":"v2"},"tags":[{"name":"Tests","description":"Retrieving tests"}],"security":[{"tokenAuth":[]},{"Bearer":[]}],"components":{"securitySchemes":{"tokenAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"Token-based authentication with required prefix \"Token\""}},"schemas":{"V2TestCreate":{"type":"object","properties":{"name":{"type":["string","null"],"maxLength":255},"screenSizeType":{"enum":["desktop","mobile","custom"],"type":"string","description":"* `desktop` - Desktop\n* `mobile` - Mobile\n* `custom` - Custom"},"notes":{"type":["string","null"],"title":"Test notes"}}},"V2TestDetails":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"name":{"type":"string","maxLength":255},"groups":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"readOnly":true,"title":"Test notes"},"screenSizeType":{"enum":["desktop","mobile","custom"],"type":"string","description":"* `desktop` - Desktop\n* `mobile` - Mobile\n* `custom` - Custom","readOnly":true}},"required":["groups","id","notes","screenSizeType"]}}},"paths":{"/api/v2/tests/":{"post":{"operationId":"v2_tests_create","description":"Create test.","summary":"Create a new test","parameters":[],"tags":["Tests"],"requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/V2TestCreate"}},"application/json":{"schema":{"$ref":"#/components/schemas/V2TestCreate"}}}},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V2TestDetails"}}},"description":""},"400":{"description":"Request body failed validation."},"401":{"description":"Authentication credentials were missing or invalid."}}}}}}
```

## Retrieving test by ID

> Returns a single test.

```json
{"openapi":"3.1.0","info":{"title":"BugBug.io Public API","version":"v2"},"tags":[{"name":"Tests","description":"Retrieving tests"}],"security":[{"tokenAuth":[]},{"Bearer":[]}],"components":{"securitySchemes":{"tokenAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"Token-based authentication with required prefix \"Token\""}},"schemas":{"V2TestDetails":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"name":{"type":"string","maxLength":255},"groups":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"readOnly":true,"title":"Test notes"},"screenSizeType":{"enum":["desktop","mobile","custom"],"type":"string","description":"* `desktop` - Desktop\n* `mobile` - Mobile\n* `custom` - Custom","readOnly":true}},"required":["groups","id","notes","screenSizeType"]}}},"paths":{"/api/v2/tests/{id}/":{"get":{"operationId":"v2_tests_retrieve","description":"Returns a single test.","summary":"Retrieving test by ID","parameters":[{"in":"path","name":"id","schema":{"type":"string","format":"uuid"},"description":"A UUID string identifying this test.","required":true}],"tags":["Tests"],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V2TestDetails"}}},"description":""},"401":{"description":"Authentication credentials were missing or invalid."},"404":{"description":"Resource not found."}}}}}}
```

## Retrieve a test by its ID and remove it

> Remove a test.

```json
{"openapi":"3.1.0","info":{"title":"BugBug.io Public API","version":"v2"},"tags":[{"name":"Tests","description":"Retrieving tests"}],"security":[{"tokenAuth":[]},{"Bearer":[]}],"components":{"securitySchemes":{"tokenAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"Token-based authentication with required prefix \"Token\""}}},"paths":{"/api/v2/tests/{id}/":{"delete":{"operationId":"v2_tests_destroy","description":"Remove a test.","summary":"Retrieve a test by its ID and remove it","parameters":[{"in":"path","name":"id","schema":{"type":"string","format":"uuid"},"description":"A UUID string identifying this test.","required":true}],"tags":["Tests"],"responses":{"204":{"description":"No response body"},"401":{"description":"Authentication credentials were missing or invalid."},"404":{"description":"Resource not found."}}}}}}
```

## Retrieve a test by its ID and update details

> Updates test details.

```json
{"openapi":"3.1.0","info":{"title":"BugBug.io Public API","version":"v2"},"tags":[{"name":"Tests","description":"Retrieving tests"}],"security":[{"tokenAuth":[]},{"Bearer":[]}],"components":{"securitySchemes":{"tokenAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"Token-based authentication with required prefix \"Token\""}},"schemas":{"PatchedV2TestCreate":{"type":"object","properties":{"name":{"type":["string","null"],"maxLength":255},"screenSizeType":{"enum":["desktop","mobile","custom"],"type":"string","description":"* `desktop` - Desktop\n* `mobile` - Mobile\n* `custom` - Custom"},"notes":{"type":["string","null"],"title":"Test notes"}}},"V2TestDetails":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"name":{"type":"string","maxLength":255},"groups":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"readOnly":true,"title":"Test notes"},"screenSizeType":{"enum":["desktop","mobile","custom"],"type":"string","description":"* `desktop` - Desktop\n* `mobile` - Mobile\n* `custom` - Custom","readOnly":true}},"required":["groups","id","notes","screenSizeType"]}}},"paths":{"/api/v2/tests/{id}/":{"patch":{"operationId":"v2_tests_partial_update","description":"Updates test details.","summary":"Retrieve a test by its ID and update details","parameters":[{"in":"path","name":"id","schema":{"type":"string","format":"uuid"},"description":"A UUID string identifying this test.","required":true}],"tags":["Tests"],"requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedV2TestCreate"}},"application/json":{"schema":{"$ref":"#/components/schemas/PatchedV2TestCreate"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V2TestDetails"}}},"description":""},"400":{"description":"Request body failed validation."},"401":{"description":"Authentication credentials were missing or invalid."},"404":{"description":"Resource not found."}}}}}}
```

## Insert a component into a test by test ID

> Insert a component into a test. Prefer componentId. The legacy groupId field is still accepted and must contain the component relation ID returned by the components endpoint.

```json
{"openapi":"3.1.0","info":{"title":"BugBug.io Public API","version":"v2"},"tags":[{"name":"Tests","description":"Retrieving tests"}],"security":[{"tokenAuth":[]},{"Bearer":[]}],"components":{"securitySchemes":{"tokenAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"Token-based authentication with required prefix \"Token\""}},"schemas":{"V2InsertComponent":{"type":"object","properties":{"groupId":{"type":"string","format":"uuid"},"componentId":{"type":"string","format":"uuid","writeOnly":true},"atIndex":{"type":["integer","null"]}}},"V2TestDetails":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"name":{"type":"string","maxLength":255},"groups":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"readOnly":true,"title":"Test notes"},"screenSizeType":{"enum":["desktop","mobile","custom"],"type":"string","description":"* `desktop` - Desktop\n* `mobile` - Mobile\n* `custom` - Custom","readOnly":true}},"required":["groups","id","notes","screenSizeType"]}}},"paths":{"/api/v2/tests/{id}/insert-component/":{"post":{"operationId":"v2_tests_insert_component_create","description":"Insert a component into a test. Prefer componentId. The legacy groupId field is still accepted and must contain the component relation ID returned by the components endpoint.","summary":"Insert a component into a test by test ID","parameters":[{"in":"path","name":"id","schema":{"type":"string","format":"uuid"},"description":"A UUID string identifying this test.","required":true}],"tags":["Tests"],"requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/V2InsertComponent"}},"application/json":{"schema":{"$ref":"#/components/schemas/V2InsertComponent"}}}},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V2TestDetails"}}},"description":""},"400":{"description":"Request body failed validation."},"401":{"description":"Authentication credentials were missing or invalid."},"404":{"description":"Resource not found."}}}}}}
```

## Unlink a component from a test by test ID

> Unlink a component from a test.

```json
{"openapi":"3.1.0","info":{"title":"BugBug.io Public API","version":"v2"},"tags":[{"name":"Tests","description":"Retrieving tests"}],"security":[{"tokenAuth":[]},{"Bearer":[]}],"components":{"securitySchemes":{"tokenAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"Token-based authentication with required prefix \"Token\""}},"schemas":{"UnlinkComponent":{"type":"object","properties":{"groupId":{"type":"string","format":"uuid"}},"required":["groupId"]},"V2TestDetails":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"name":{"type":"string","maxLength":255},"groups":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"readOnly":true,"title":"Test notes"},"screenSizeType":{"enum":["desktop","mobile","custom"],"type":"string","description":"* `desktop` - Desktop\n* `mobile` - Mobile\n* `custom` - Custom","readOnly":true}},"required":["groups","id","notes","screenSizeType"]}}},"paths":{"/api/v2/tests/{id}/unlink-component/":{"post":{"operationId":"v2_tests_unlink_component_create","description":"Unlink a component from a test.","summary":"Unlink a component from a test by test ID","parameters":[{"in":"path","name":"id","schema":{"type":"string","format":"uuid"},"description":"A UUID string identifying this test.","required":true}],"tags":["Tests"],"requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/UnlinkComponent"}},"application/json":{"schema":{"$ref":"#/components/schemas/UnlinkComponent"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V2TestDetails"}}},"description":""},"400":{"description":"Request body failed validation."},"401":{"description":"Authentication credentials were missing or invalid."},"404":{"description":"Resource not found."}}}}}}
```

## Move a step to a different position or group

> Update the position of a step within a test.

```json
{"openapi":"3.1.0","info":{"title":"BugBug.io Public API","version":"v2"},"tags":[{"name":"Tests","description":"Retrieving tests"}],"security":[{"tokenAuth":[]},{"Bearer":[]}],"components":{"securitySchemes":{"tokenAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"Token-based authentication with required prefix \"Token\""}},"schemas":{"V2UpdateStepPosition":{"type":"object","properties":{"stepId":{"type":"string","format":"uuid"},"groupId":{"type":"string","format":"uuid"},"atIndex":{"type":"integer"},"blockId":{"type":["string","null"],"format":"uuid"}},"required":["stepId"]}}},"paths":{"/api/v2/tests/{id}/update-step-position/":{"post":{"operationId":"v2_tests_update_step_position_create","description":"Update the position of a step within a test.","summary":"Move a step to a different position or group","parameters":[{"in":"path","name":"id","schema":{"type":"string","format":"uuid"},"description":"A UUID string identifying this test.","required":true}],"tags":["Tests"],"requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/V2UpdateStepPosition"}},"application/json":{"schema":{"$ref":"#/components/schemas/V2UpdateStepPosition"}}},"required":true},"responses":{"200":{"description":"No response body"},"400":{"description":"Request body failed validation."},"401":{"description":"Authentication credentials were missing or invalid."},"404":{"description":"Resource not found."}}}}}}
```


# Suites

Retrieving suites

## Retrieving suites list

> Returns many suites.

```json
{"openapi":"3.1.0","info":{"title":"BugBug.io Public API","version":"v2"},"tags":[{"name":"Suites","description":"Retrieving suites"}],"security":[{"tokenAuth":[]},{"Bearer":[]}],"components":{"securitySchemes":{"tokenAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"Token-based authentication with required prefix \"Token\""}},"schemas":{"PaginatedV2SuiteList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer"},"next":{"type":"string","nullable":true,"format":"uri"},"previous":{"type":"string","nullable":true,"format":"uri"},"results":{"type":"array","items":{"$ref":"#/components/schemas/V2Suite"}}}},"V2Suite":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"name":{"type":["string","null"],"readOnly":true},"testsCount":{"type":"integer","readOnly":true},"tests":{"type":"array","items":{"type":"object","additionalProperties":{}},"readOnly":true},"autoAddNewTests":{"type":"boolean","readOnly":true},"autoRetry":{"type":"integer","readOnly":true},"notes":{"type":["string","null"],"readOnly":true,"title":"Suite notes"},"runInParallel":{"type":"boolean","readOnly":true},"runProfileId":{"type":["string","null"],"format":"uuid","readOnly":true}},"required":["autoAddNewTests","autoRetry","id","name","notes","runInParallel","runProfileId","tests","testsCount"]}}},"paths":{"/api/v2/suites/":{"get":{"operationId":"v2_suites_list","description":"Returns many suites.","summary":"Retrieving suites list","parameters":[{"in":"query","name":"ordering","schema":{"type":"string","enum":["-created","-name","created","name"]}},{"name":"page","required":false,"in":"query","description":"A page number within the paginated result set.","schema":{"type":"integer"}},{"name":"page_size","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"query","schema":{"type":"string"},"description":"Search in names with the following query"}],"tags":["Suites"],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedV2SuiteList"}}},"description":""},"401":{"description":"Authentication credentials were missing or invalid."}}}}}}
```

## Create new suite

> Creates a suite.

```json
{"openapi":"3.1.0","info":{"title":"BugBug.io Public API","version":"v2"},"tags":[{"name":"Suites","description":"Retrieving suites"}],"security":[{"tokenAuth":[]},{"Bearer":[]}],"components":{"securitySchemes":{"tokenAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"Token-based authentication with required prefix \"Token\""}},"schemas":{"V2SuiteCreate":{"type":"object","properties":{"autoAddNewTests":{"type":"boolean"},"autoRetry":{"type":"integer","maximum":5,"minimum":0},"notes":{"type":["string","null"],"title":"Suite notes"},"name":{"type":["string","null"],"maxLength":100},"runInParallel":{"type":"boolean"},"runProfileId":{"type":"string","format":"uuid"},"tests":{"type":"array","items":{"type":"string","format":"uuid"}}},"required":["runProfileId"]},"V2Suite":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"name":{"type":["string","null"],"readOnly":true},"testsCount":{"type":"integer","readOnly":true},"tests":{"type":"array","items":{"type":"object","additionalProperties":{}},"readOnly":true},"autoAddNewTests":{"type":"boolean","readOnly":true},"autoRetry":{"type":"integer","readOnly":true},"notes":{"type":["string","null"],"readOnly":true,"title":"Suite notes"},"runInParallel":{"type":"boolean","readOnly":true},"runProfileId":{"type":["string","null"],"format":"uuid","readOnly":true}},"required":["autoAddNewTests","autoRetry","id","name","notes","runInParallel","runProfileId","tests","testsCount"]}}},"paths":{"/api/v2/suites/":{"post":{"operationId":"v2_suites_create","description":"Creates a suite.","summary":"Create new suite","parameters":[],"tags":["Suites"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V2SuiteCreate"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V2Suite"}}},"description":""},"400":{"description":"Request body failed validation."},"401":{"description":"Authentication credentials were missing or invalid."}}}}}}
```

## Retrieving suite by ID

> Returns a single suite.

```json
{"openapi":"3.1.0","info":{"title":"BugBug.io Public API","version":"v2"},"tags":[{"name":"Suites","description":"Retrieving suites"}],"security":[{"tokenAuth":[]},{"Bearer":[]}],"components":{"securitySchemes":{"tokenAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"Token-based authentication with required prefix \"Token\""}},"schemas":{"V2Suite":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"name":{"type":["string","null"],"readOnly":true},"testsCount":{"type":"integer","readOnly":true},"tests":{"type":"array","items":{"type":"object","additionalProperties":{}},"readOnly":true},"autoAddNewTests":{"type":"boolean","readOnly":true},"autoRetry":{"type":"integer","readOnly":true},"notes":{"type":["string","null"],"readOnly":true,"title":"Suite notes"},"runInParallel":{"type":"boolean","readOnly":true},"runProfileId":{"type":["string","null"],"format":"uuid","readOnly":true}},"required":["autoAddNewTests","autoRetry","id","name","notes","runInParallel","runProfileId","tests","testsCount"]}}},"paths":{"/api/v2/suites/{id}/":{"get":{"operationId":"v2_suites_retrieve","description":"Returns a single suite.","summary":"Retrieving suite by ID","parameters":[{"in":"path","name":"id","schema":{"type":"string","format":"uuid"},"description":"A UUID string identifying this suite.","required":true}],"tags":["Suites"],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V2Suite"}}},"description":""},"401":{"description":"Authentication credentials were missing or invalid."},"404":{"description":"Resource not found."}}}}}}
```

## Update suite by ID

> Updates a suite.

```json
{"openapi":"3.1.0","info":{"title":"BugBug.io Public API","version":"v2"},"tags":[{"name":"Suites","description":"Retrieving suites"}],"security":[{"tokenAuth":[]},{"Bearer":[]}],"components":{"securitySchemes":{"tokenAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"Token-based authentication with required prefix \"Token\""}},"schemas":{"V2SuiteCreate":{"type":"object","properties":{"autoAddNewTests":{"type":"boolean"},"autoRetry":{"type":"integer","maximum":5,"minimum":0},"notes":{"type":["string","null"],"title":"Suite notes"},"name":{"type":["string","null"],"maxLength":100},"runInParallel":{"type":"boolean"},"runProfileId":{"type":"string","format":"uuid"},"tests":{"type":"array","items":{"type":"string","format":"uuid"}}},"required":["runProfileId"]},"V2Suite":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"name":{"type":["string","null"],"readOnly":true},"testsCount":{"type":"integer","readOnly":true},"tests":{"type":"array","items":{"type":"object","additionalProperties":{}},"readOnly":true},"autoAddNewTests":{"type":"boolean","readOnly":true},"autoRetry":{"type":"integer","readOnly":true},"notes":{"type":["string","null"],"readOnly":true,"title":"Suite notes"},"runInParallel":{"type":"boolean","readOnly":true},"runProfileId":{"type":["string","null"],"format":"uuid","readOnly":true}},"required":["autoAddNewTests","autoRetry","id","name","notes","runInParallel","runProfileId","tests","testsCount"]}}},"paths":{"/api/v2/suites/{id}/":{"put":{"operationId":"v2_suites_update","description":"Updates a suite.","summary":"Update suite by ID","parameters":[{"in":"path","name":"id","schema":{"type":"string","format":"uuid"},"description":"A UUID string identifying this suite.","required":true}],"tags":["Suites"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V2SuiteCreate"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V2Suite"}}},"description":""},"400":{"description":"Request body failed validation."},"401":{"description":"Authentication credentials were missing or invalid."},"404":{"description":"Resource not found."}}}}}}
```

## Removing a suite

> Remove a suite.

```json
{"openapi":"3.1.0","info":{"title":"BugBug.io Public API","version":"v2"},"tags":[{"name":"Suites","description":"Retrieving suites"}],"security":[{"tokenAuth":[]},{"Bearer":[]}],"components":{"securitySchemes":{"tokenAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"Token-based authentication with required prefix \"Token\""}}},"paths":{"/api/v2/suites/{id}/":{"delete":{"operationId":"v2_suites_destroy","description":"Remove a suite.","summary":"Removing a suite","parameters":[{"in":"path","name":"id","schema":{"type":"string","format":"uuid"},"description":"A UUID string identifying this suite.","required":true}],"tags":["Suites"],"responses":{"204":{"description":"No response body"},"401":{"description":"Authentication credentials were missing or invalid."},"404":{"description":"Resource not found."}}}}}}
```

## Partially update suite by ID

> Partially updates a suite.

```json
{"openapi":"3.1.0","info":{"title":"BugBug.io Public API","version":"v2"},"tags":[{"name":"Suites","description":"Retrieving suites"}],"security":[{"tokenAuth":[]},{"Bearer":[]}],"components":{"securitySchemes":{"tokenAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"Token-based authentication with required prefix \"Token\""}},"schemas":{"PatchedV2SuiteCreate":{"type":"object","properties":{"autoAddNewTests":{"type":"boolean"},"autoRetry":{"type":"integer","maximum":5,"minimum":0},"notes":{"type":["string","null"],"title":"Suite notes"},"name":{"type":["string","null"],"maxLength":100},"runInParallel":{"type":"boolean"},"runProfileId":{"type":"string","format":"uuid"},"tests":{"type":"array","items":{"type":"string","format":"uuid"}}}},"V2Suite":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"name":{"type":["string","null"],"readOnly":true},"testsCount":{"type":"integer","readOnly":true},"tests":{"type":"array","items":{"type":"object","additionalProperties":{}},"readOnly":true},"autoAddNewTests":{"type":"boolean","readOnly":true},"autoRetry":{"type":"integer","readOnly":true},"notes":{"type":["string","null"],"readOnly":true,"title":"Suite notes"},"runInParallel":{"type":"boolean","readOnly":true},"runProfileId":{"type":["string","null"],"format":"uuid","readOnly":true}},"required":["autoAddNewTests","autoRetry","id","name","notes","runInParallel","runProfileId","tests","testsCount"]}}},"paths":{"/api/v2/suites/{id}/":{"patch":{"operationId":"v2_suites_partial_update","description":"Partially updates a suite.","summary":"Partially update suite by ID","parameters":[{"in":"path","name":"id","schema":{"type":"string","format":"uuid"},"description":"A UUID string identifying this suite.","required":true}],"tags":["Suites"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedV2SuiteCreate"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V2Suite"}}},"description":""},"400":{"description":"Request body failed validation."},"401":{"description":"Authentication credentials were missing or invalid."},"404":{"description":"Resource not found."}}}}}}
```


# Test Runs

Executing tests and getting result

## Returns list of historical TestRuns

> Returns list of historical TestRuns

```json
{"openapi":"3.1.0","info":{"title":"BugBug.io Public API","version":"v2"},"tags":[{"name":"Test runs","description":"Executing tests and getting result"}],"security":[{"tokenAuth":[]},{"Bearer":[]}],"components":{"securitySchemes":{"tokenAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"Token-based authentication with required prefix \"Token\""}},"schemas":{"PaginatedV2TestRunList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer"},"next":{"type":"string","nullable":true,"format":"uri"},"previous":{"type":"string","nullable":true,"format":"uri"},"results":{"type":"array","items":{"$ref":"#/components/schemas/V2TestRun"}}}},"V2TestRun":{"type":"object","properties":{"browserName":{"type":["string","null"],"readOnly":true},"browserVersion":{"type":["string","null"],"readOnly":true},"browserHeight":{"type":["integer","null"],"readOnly":true},"browserWidth":{"type":["integer","null"],"readOnly":true},"stepsRuns":{"type":"string","readOnly":true},"userId":{"type":["string","null"],"format":"uuid","readOnly":true},"duration":{"type":["string","null"],"readOnly":true},"ended":{"type":["string","null"],"format":"date-time","readOnly":true},"errorCode":{"type":["string","null"],"readOnly":true},"extensionVersion":{"type":["string","null"],"readOnly":true},"id":{"type":"string","format":"uuid","readOnly":true},"name":{"type":"string","readOnly":true},"osName":{"type":["string","null"],"readOnly":true},"queued":{"type":["string","null"],"format":"date-time","readOnly":true},"runMode":{"enum":["server","local","recording"],"type":"string","description":"* `server` - cloud\n* `local` - local\n* `recording` - recording","readOnly":true},"runProfileId":{"type":["string","null"],"format":"uuid","readOnly":true},"screenSizeType":{"enum":["desktop","mobile","custom"],"type":"string","description":"* `desktop` - Desktop\n* `mobile` - Mobile\n* `custom` - Custom","readOnly":true},"sequence":{"type":["integer","null"],"readOnly":true},"started":{"type":["string","null"],"format":"date-time","readOnly":true},"status":{"enum":["error","passed","failed","running","auto_retrying","stopped","queued","paused","skipped","recording","initialized"],"type":"string","description":"* `error` - Error\n* `passed` - Passed\n* `failed` - Failed\n* `running` - Running\n* `auto_retrying` - Auto Retrying\n* `stopped` - Stopped\n* `queued` - Queued\n* `paused` - Paused\n* `skipped` - Skipped\n* `recording` - Recording\n* `initialized` - Initialized","readOnly":true},"suiteRunId":{"type":["string","null"],"format":"uuid","readOnly":true},"testId":{"type":["string","null"],"format":"uuid","readOnly":true},"triggeredBy":{"enum":["user","api","webhook","scheduler","github","cli","agent"],"type":"string","description":"* `user` - User\n* `api` - Api\n* `webhook` - Webhook\n* `scheduler` - Scheduler\n* `github` - Github\n* `cli` - Cli\n* `agent` - Agent","readOnly":true},"webappUrl":{"type":"string","readOnly":true}},"required":["browserHeight","browserName","browserVersion","browserWidth","duration","ended","errorCode","extensionVersion","id","name","osName","queued","runMode","runProfileId","screenSizeType","sequence","started","status","stepsRuns","suiteRunId","testId","triggeredBy","userId","webappUrl"]}}},"paths":{"/api/v2/testruns/":{"get":{"operationId":"v2_testruns_list","description":"Returns list of historical TestRuns","summary":"Returns list of historical TestRuns","parameters":[{"in":"query","name":"ordering","schema":{"type":"string","enum":["-started","started"]},"description":"Sort list by param"},{"name":"page","required":false,"in":"query","description":"A page number within the paginated result set.","schema":{"type":"integer"}},{"name":"page_size","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"started_after","schema":{"type":"string","format":"date-time"}},{"in":"query","name":"started_before","schema":{"type":"string","format":"date-time"}},{"in":"query","name":"status","schema":{"type":"string","enum":["auto_retrying","error","failed","initialized","passed","paused","queued","recording","running","skipped","stopped"]},"description":"* `error` - Error\n* `passed` - Passed\n* `failed` - Failed\n* `running` - Running\n* `auto_retrying` - Auto Retrying\n* `stopped` - Stopped\n* `queued` - Queued\n* `paused` - Paused\n* `skipped` - Skipped\n* `recording` - Recording\n* `initialized` - Initialized"},{"in":"query","name":"testId","schema":{"type":"string","format":"uuid"}},{"in":"query","name":"test_id","schema":{"type":"string","format":"uuid"}}],"tags":["Test runs"],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedV2TestRunList"}}},"description":""},"401":{"description":"Authentication credentials were missing or invalid."}}}}}}
```

## Execute desired test

> Execute desired test.

```json
{"openapi":"3.1.0","info":{"title":"BugBug.io Public API","version":"v2"},"tags":[{"name":"Test runs","description":"Executing tests and getting result"}],"security":[{"tokenAuth":[]},{"Bearer":[]}],"components":{"securitySchemes":{"tokenAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"Token-based authentication with required prefix \"Token\""}},"schemas":{"V2RunTest":{"type":"object","properties":{"testId":{"type":"string","format":"uuid"},"runProfileId":{"type":["string","null"],"format":"uuid"},"variables":{"type":["array","null"],"items":{"$ref":"#/components/schemas/V2OverrideVariable"},"default":[]}},"required":["testId"]},"V2OverrideVariable":{"type":"object","properties":{"key":{"type":"string","maxLength":128},"value":{"type":["string","null"]}},"required":["key"]},"V2TestRunStatus":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"finishedSteps":{"type":"integer","readOnly":true},"modified":{"type":"string","format":"date-time","readOnly":true},"status":{"enum":["error","passed","failed","running","auto_retrying","stopped","queued","paused","skipped","recording","initialized"],"type":"string","description":"* `error` - Error\n* `passed` - Passed\n* `failed` - Failed\n* `running` - Running\n* `auto_retrying` - Auto Retrying\n* `stopped` - Stopped\n* `queued` - Queued\n* `paused` - Paused\n* `skipped` - Skipped\n* `recording` - Recording\n* `initialized` - Initialized","readOnly":true},"totalSteps":{"type":"integer","readOnly":true},"webappUrl":{"type":"string","readOnly":true}},"required":["finishedSteps","id","modified","status","totalSteps","webappUrl"]}}},"paths":{"/api/v2/testruns/":{"post":{"operationId":"v2_testruns_create","description":"Execute desired test.","summary":"Execute desired test","tags":["Test runs"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V2RunTest"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V2TestRunStatus"}}},"description":""},"400":{"description":"Request body failed validation."},"401":{"description":"Authentication credentials were missing or invalid."}}}}}}
```

## Retrieve test run result

> Returns single object.

```json
{"openapi":"3.1.0","info":{"title":"BugBug.io Public API","version":"v2"},"tags":[{"name":"Test runs","description":"Executing tests and getting result"}],"security":[{"tokenAuth":[]},{"Bearer":[]}],"components":{"securitySchemes":{"tokenAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"Token-based authentication with required prefix \"Token\""}},"schemas":{"V2TestRun":{"type":"object","properties":{"browserName":{"type":["string","null"],"readOnly":true},"browserVersion":{"type":["string","null"],"readOnly":true},"browserHeight":{"type":["integer","null"],"readOnly":true},"browserWidth":{"type":["integer","null"],"readOnly":true},"stepsRuns":{"type":"string","readOnly":true},"userId":{"type":["string","null"],"format":"uuid","readOnly":true},"duration":{"type":["string","null"],"readOnly":true},"ended":{"type":["string","null"],"format":"date-time","readOnly":true},"errorCode":{"type":["string","null"],"readOnly":true},"extensionVersion":{"type":["string","null"],"readOnly":true},"id":{"type":"string","format":"uuid","readOnly":true},"name":{"type":"string","readOnly":true},"osName":{"type":["string","null"],"readOnly":true},"queued":{"type":["string","null"],"format":"date-time","readOnly":true},"runMode":{"enum":["server","local","recording"],"type":"string","description":"* `server` - cloud\n* `local` - local\n* `recording` - recording","readOnly":true},"runProfileId":{"type":["string","null"],"format":"uuid","readOnly":true},"screenSizeType":{"enum":["desktop","mobile","custom"],"type":"string","description":"* `desktop` - Desktop\n* `mobile` - Mobile\n* `custom` - Custom","readOnly":true},"sequence":{"type":["integer","null"],"readOnly":true},"started":{"type":["string","null"],"format":"date-time","readOnly":true},"status":{"enum":["error","passed","failed","running","auto_retrying","stopped","queued","paused","skipped","recording","initialized"],"type":"string","description":"* `error` - Error\n* `passed` - Passed\n* `failed` - Failed\n* `running` - Running\n* `auto_retrying` - Auto Retrying\n* `stopped` - Stopped\n* `queued` - Queued\n* `paused` - Paused\n* `skipped` - Skipped\n* `recording` - Recording\n* `initialized` - Initialized","readOnly":true},"suiteRunId":{"type":["string","null"],"format":"uuid","readOnly":true},"testId":{"type":["string","null"],"format":"uuid","readOnly":true},"triggeredBy":{"enum":["user","api","webhook","scheduler","github","cli","agent"],"type":"string","description":"* `user` - User\n* `api` - Api\n* `webhook` - Webhook\n* `scheduler` - Scheduler\n* `github` - Github\n* `cli` - Cli\n* `agent` - Agent","readOnly":true},"webappUrl":{"type":"string","readOnly":true}},"required":["browserHeight","browserName","browserVersion","browserWidth","duration","ended","errorCode","extensionVersion","id","name","osName","queued","runMode","runProfileId","screenSizeType","sequence","started","status","stepsRuns","suiteRunId","testId","triggeredBy","userId","webappUrl"]}}},"paths":{"/api/v2/testruns/{id}/":{"get":{"operationId":"v2_testruns_retrieve","description":"Returns single object.","summary":"Retrieve test run result","parameters":[{"in":"path","name":"id","schema":{"type":"string","format":"uuid"},"description":"A UUID string identifying this test run.","required":true}],"tags":["Test runs"],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V2TestRun"}}},"description":""},"401":{"description":"Authentication credentials were missing or invalid."},"404":{"description":"Resource not found."}}}}}}
```

## List test run debug artifacts

> Returns list of debug artifacts attached to the test run.

```json
{"openapi":"3.1.0","info":{"title":"BugBug.io Public API","version":"v2"},"tags":[{"name":"Test runs","description":"Executing tests and getting result"}],"security":[{"tokenAuth":[]},{"Bearer":[]}],"components":{"securitySchemes":{"tokenAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"Token-based authentication with required prefix \"Token\""}},"schemas":{"DebugArtifact":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"kind":{"enum":["uploaded_file","logs_partial","logs","cloud_logs","container_stats","chrome_debug_logs","extension_network_logs","extension_network_logs_partial","report","dom_snapshot","visual_regression_screenshot"],"type":"string","description":"* `uploaded_file` - Uploaded File\n* `logs_partial` - Logs Partial\n* `logs` - Logs\n* `cloud_logs` - Cloud Logs\n* `container_stats` - Container Stats\n* `chrome_debug_logs` - Chrome Debug Logs\n* `extension_network_logs` - Extension Network Logs\n* `extension_network_logs_partial` - Extension Network Logs Partial\n* `report` - Report\n* `dom_snapshot` - Dom Snapshot\n* `visual_regression_screenshot` - Visual Regression Screenshot","readOnly":true,"title":"Artifact kind"},"file":{"type":"string"},"expirationTime":{"type":["string","null"],"format":"date-time","readOnly":true,"description":"None for eternal"}},"required":["expirationTime","file","id","kind"]}}},"paths":{"/api/v2/testruns/{id}/debug-artifacts/":{"get":{"operationId":"v2_testruns_debug_artifacts_list","description":"Returns list of debug artifacts attached to the test run.","summary":"List test run debug artifacts","parameters":[{"in":"path","name":"id","schema":{"type":"string","format":"uuid"},"description":"A UUID string identifying this test run.","required":true}],"tags":["Test runs"],"responses":{"200":{"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/DebugArtifact"}}}},"description":""},"401":{"description":"Authentication credentials were missing or invalid."},"404":{"description":"Resource not found."}}}}}}
```

## Retrieve test run debug artifact by kind

> Returns a single debug artifact of the given kind attached to the test run.

```json
{"openapi":"3.1.0","info":{"title":"BugBug.io Public API","version":"v2"},"tags":[{"name":"Test runs","description":"Executing tests and getting result"}],"security":[{"tokenAuth":[]},{"Bearer":[]}],"components":{"securitySchemes":{"tokenAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"Token-based authentication with required prefix \"Token\""}},"schemas":{"DebugArtifact":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"kind":{"enum":["uploaded_file","logs_partial","logs","cloud_logs","container_stats","chrome_debug_logs","extension_network_logs","extension_network_logs_partial","report","dom_snapshot","visual_regression_screenshot"],"type":"string","description":"* `uploaded_file` - Uploaded File\n* `logs_partial` - Logs Partial\n* `logs` - Logs\n* `cloud_logs` - Cloud Logs\n* `container_stats` - Container Stats\n* `chrome_debug_logs` - Chrome Debug Logs\n* `extension_network_logs` - Extension Network Logs\n* `extension_network_logs_partial` - Extension Network Logs Partial\n* `report` - Report\n* `dom_snapshot` - Dom Snapshot\n* `visual_regression_screenshot` - Visual Regression Screenshot","readOnly":true,"title":"Artifact kind"},"file":{"type":"string"},"expirationTime":{"type":["string","null"],"format":"date-time","readOnly":true,"description":"None for eternal"}},"required":["expirationTime","file","id","kind"]}}},"paths":{"/api/v2/testruns/{id}/debug-artifacts/{artifact_type}/":{"get":{"operationId":"v2_testruns_debug_artifacts_retrieve","description":"Returns a single debug artifact of the given kind attached to the test run.","summary":"Retrieve test run debug artifact by kind","parameters":[{"in":"path","name":"artifact_type","schema":{"type":"string","enum":["chrome_debug_logs","cloud_logs","container_stats","dom_snapshot","logs","logs_partial"]},"description":"Debug artifact type.","required":true},{"in":"path","name":"id","schema":{"type":"string","format":"uuid"},"description":"A UUID string identifying this test run.","required":true}],"tags":["Test runs"],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DebugArtifact"}}},"description":""},"401":{"description":"Authentication credentials were missing or invalid."},"404":{"description":"Artifact not found"}}}}}}
```

## Download test run logs

> Download the logs for the selected test run.

```json
{"openapi":"3.1.0","info":{"title":"BugBug.io Public API","version":"v2"},"tags":[{"name":"Test runs","description":"Executing tests and getting result"}],"security":[{"tokenAuth":[]},{"Bearer":[]}],"components":{"securitySchemes":{"tokenAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"Token-based authentication with required prefix \"Token\""}}},"paths":{"/api/v2/testruns/{id}/logs/":{"get":{"operationId":"v2_testruns_logs_retrieve","description":"Download the logs for the selected test run.","summary":"Download test run logs","parameters":[{"in":"path","name":"id","schema":{"type":"string","format":"uuid"},"description":"A UUID string identifying this test run.","required":true}],"tags":["Test runs"],"responses":{"302":{"description":"Redirect to logs file"},"401":{"description":"Authentication credentials were missing or invalid."},"404":{"description":"Logs not found or expired"}}}}}}
```

## Download JUnit XML report

> Download the JUnit XML report for the selected test run.

```json
{"openapi":"3.1.0","info":{"title":"BugBug.io Public API","version":"v2"},"tags":[{"name":"Test runs","description":"Executing tests and getting result"}],"security":[{"tokenAuth":[]},{"Bearer":[]}],"components":{"securitySchemes":{"tokenAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"Token-based authentication with required prefix \"Token\""}}},"paths":{"/api/v2/testruns/{id}/report/junit/":{"get":{"operationId":"v2_testruns_report_junit_retrieve","description":"Download the JUnit XML report for the selected test run.","summary":"Download JUnit XML report","parameters":[{"in":"path","name":"id","schema":{"type":"string","format":"uuid"},"description":"A UUID string identifying this test run.","required":true}],"tags":["Test runs"],"responses":{"200":{"content":{"application/json":{"schema":{"type":"string","format":"binary"}}},"description":"JUnit XML report file"},"401":{"description":"Authentication credentials were missing or invalid."},"404":{"description":"Resource not found."}}}}}}
```

## Get test run steps screenshots

> Returns all screenshots.

```json
{"openapi":"3.1.0","info":{"title":"BugBug.io Public API","version":"v2"},"tags":[{"name":"Test runs","description":"Executing tests and getting result"}],"security":[{"tokenAuth":[]},{"Bearer":[]}],"components":{"securitySchemes":{"tokenAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"Token-based authentication with required prefix \"Token\""}},"schemas":{"V2TestRunScreenshots":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"stepsRuns":{"type":"array","items":{"$ref":"#/components/schemas/V2StepRunScreenshot"},"readOnly":true}},"required":["id","stepsRuns"]},"V2StepRunScreenshot":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"stepId":{"type":["string","null"],"format":"uuid","readOnly":true},"screenshotUrl":{"type":"string"}},"required":["id","screenshotUrl","stepId"]}}},"paths":{"/api/v2/testruns/{id}/screenshots/":{"get":{"operationId":"v2_testruns_screenshots_retrieve","description":"Returns all screenshots.","summary":"Get test run steps screenshots","parameters":[{"in":"path","name":"id","schema":{"type":"string","format":"uuid"},"description":"A UUID string identifying this test run.","required":true}],"tags":["Test runs"],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V2TestRunScreenshots"}}},"description":""},"401":{"description":"Authentication credentials were missing or invalid."},"404":{"description":"Resource not found."}}}}}}
```

## Get test run status

> Returns single object.

```json
{"openapi":"3.1.0","info":{"title":"BugBug.io Public API","version":"v2"},"tags":[{"name":"Test runs","description":"Executing tests and getting result"}],"security":[{"tokenAuth":[]},{"Bearer":[]}],"components":{"securitySchemes":{"tokenAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"Token-based authentication with required prefix \"Token\""}},"schemas":{"V2TestRunStatus":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"finishedSteps":{"type":"integer","readOnly":true},"modified":{"type":"string","format":"date-time","readOnly":true},"status":{"enum":["error","passed","failed","running","auto_retrying","stopped","queued","paused","skipped","recording","initialized"],"type":"string","description":"* `error` - Error\n* `passed` - Passed\n* `failed` - Failed\n* `running` - Running\n* `auto_retrying` - Auto Retrying\n* `stopped` - Stopped\n* `queued` - Queued\n* `paused` - Paused\n* `skipped` - Skipped\n* `recording` - Recording\n* `initialized` - Initialized","readOnly":true},"totalSteps":{"type":"integer","readOnly":true},"webappUrl":{"type":"string","readOnly":true}},"required":["finishedSteps","id","modified","status","totalSteps","webappUrl"]}}},"paths":{"/api/v2/testruns/{id}/status/":{"get":{"operationId":"v2_testruns_status_retrieve","description":"Returns single object.","summary":"Get test run status","parameters":[{"in":"path","name":"id","schema":{"type":"string","format":"uuid"},"description":"A UUID string identifying this test run.","required":true}],"tags":["Test runs"],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V2TestRunStatus"}}},"description":""},"401":{"description":"Authentication credentials were missing or invalid."},"404":{"description":"Resource not found."}}}}}}
```

## Stop running test run

> Stop test run

```json
{"openapi":"3.1.0","info":{"title":"BugBug.io Public API","version":"v2"},"tags":[{"name":"Test runs","description":"Executing tests and getting result"}],"security":[{"tokenAuth":[]},{"Bearer":[]}],"components":{"securitySchemes":{"tokenAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"Token-based authentication with required prefix \"Token\""}},"schemas":{"V2TestRunStatus":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"finishedSteps":{"type":"integer","readOnly":true},"modified":{"type":"string","format":"date-time","readOnly":true},"status":{"enum":["error","passed","failed","running","auto_retrying","stopped","queued","paused","skipped","recording","initialized"],"type":"string","description":"* `error` - Error\n* `passed` - Passed\n* `failed` - Failed\n* `running` - Running\n* `auto_retrying` - Auto Retrying\n* `stopped` - Stopped\n* `queued` - Queued\n* `paused` - Paused\n* `skipped` - Skipped\n* `recording` - Recording\n* `initialized` - Initialized","readOnly":true},"totalSteps":{"type":"integer","readOnly":true},"webappUrl":{"type":"string","readOnly":true}},"required":["finishedSteps","id","modified","status","totalSteps","webappUrl"]}}},"paths":{"/api/v2/testruns/{id}/stop/":{"post":{"operationId":"v2_testruns_stop_create","description":"Stop test run","summary":"Stop running test run","parameters":[{"in":"path","name":"id","schema":{"type":"string","format":"uuid"},"description":"A UUID string identifying this test run.","required":true}],"tags":["Test runs"],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V2TestRunStatus"}}},"description":""},"400":{"description":"Request body failed validation."},"401":{"description":"Authentication credentials were missing or invalid."},"404":{"description":"Resource not found."}}}}}}
```


# Suite Runs

Executing and getting result

## Retrieving suite run list

> Returns many suite runs.

```json
{"openapi":"3.1.0","info":{"title":"BugBug.io Public API","version":"v2"},"tags":[{"name":"Suite runs","description":"Executing and getting result"}],"security":[{"tokenAuth":[]},{"Bearer":[]}],"components":{"securitySchemes":{"tokenAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"Token-based authentication with required prefix \"Token\""}},"schemas":{"PaginatedV2SuiteRunList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer"},"next":{"type":"string","nullable":true,"format":"uri"},"previous":{"type":"string","nullable":true,"format":"uri"},"results":{"type":"array","items":{"$ref":"#/components/schemas/V2SuiteRun"}}}},"V2SuiteRun":{"type":"object","properties":{"duration":{"type":["string","null"],"readOnly":true},"ended":{"type":["string","null"],"format":"date-time","readOnly":true},"errorCode":{"type":["string","null"],"readOnly":true},"id":{"type":"string","format":"uuid","readOnly":true},"name":{"type":"string","readOnly":true},"parallelRun":{"type":["boolean","null"],"readOnly":true},"parallelSlots":{"type":["integer","null"],"readOnly":true,"title":"Max possible slots for parallel run"},"profileId":{"type":"string","format":"uuid","readOnly":true},"profileName":{"type":"string","readOnly":true},"queued":{"type":["string","null"],"format":"date-time","readOnly":true},"runMode":{"enum":["server","local","recording"],"type":"string","description":"* `server` - cloud\n* `local` - local\n* `recording` - recording","readOnly":true},"sequence":{"type":["integer","null"],"readOnly":true},"started":{"type":["string","null"],"format":"date-time","readOnly":true},"status":{"enum":["error","passed","failed","running","auto_retrying","stopped","queued","paused","skipped","recording","initialized"],"type":"string","description":"* `error` - Error\n* `passed` - Passed\n* `failed` - Failed\n* `running` - Running\n* `auto_retrying` - Auto Retrying\n* `stopped` - Stopped\n* `queued` - Queued\n* `paused` - Paused\n* `skipped` - Skipped\n* `recording` - Recording\n* `initialized` - Initialized","readOnly":true},"suiteId":{"type":["string","null"],"format":"uuid","readOnly":true},"testRuns":{"type":"array","items":{"$ref":"#/components/schemas/V2TestRun"},"readOnly":true},"triggeredBy":{"type":"string","readOnly":true},"userId":{"type":["string","null"],"readOnly":true},"webappUrl":{"type":"string","readOnly":true}},"required":["duration","ended","errorCode","id","name","parallelRun","parallelSlots","profileId","profileName","queued","runMode","sequence","started","status","suiteId","testRuns","triggeredBy","userId","webappUrl"]},"V2TestRun":{"type":"object","properties":{"browserName":{"type":["string","null"],"readOnly":true},"browserVersion":{"type":["string","null"],"readOnly":true},"browserHeight":{"type":["integer","null"],"readOnly":true},"browserWidth":{"type":["integer","null"],"readOnly":true},"stepsRuns":{"type":"string","readOnly":true},"userId":{"type":["string","null"],"format":"uuid","readOnly":true},"duration":{"type":["string","null"],"readOnly":true},"ended":{"type":["string","null"],"format":"date-time","readOnly":true},"errorCode":{"type":["string","null"],"readOnly":true},"extensionVersion":{"type":["string","null"],"readOnly":true},"id":{"type":"string","format":"uuid","readOnly":true},"name":{"type":"string","readOnly":true},"osName":{"type":["string","null"],"readOnly":true},"queued":{"type":["string","null"],"format":"date-time","readOnly":true},"runMode":{"enum":["server","local","recording"],"type":"string","description":"* `server` - cloud\n* `local` - local\n* `recording` - recording","readOnly":true},"runProfileId":{"type":["string","null"],"format":"uuid","readOnly":true},"screenSizeType":{"enum":["desktop","mobile","custom"],"type":"string","description":"* `desktop` - Desktop\n* `mobile` - Mobile\n* `custom` - Custom","readOnly":true},"sequence":{"type":["integer","null"],"readOnly":true},"started":{"type":["string","null"],"format":"date-time","readOnly":true},"status":{"enum":["error","passed","failed","running","auto_retrying","stopped","queued","paused","skipped","recording","initialized"],"type":"string","description":"* `error` - Error\n* `passed` - Passed\n* `failed` - Failed\n* `running` - Running\n* `auto_retrying` - Auto Retrying\n* `stopped` - Stopped\n* `queued` - Queued\n* `paused` - Paused\n* `skipped` - Skipped\n* `recording` - Recording\n* `initialized` - Initialized","readOnly":true},"suiteRunId":{"type":["string","null"],"format":"uuid","readOnly":true},"testId":{"type":["string","null"],"format":"uuid","readOnly":true},"triggeredBy":{"enum":["user","api","webhook","scheduler","github","cli","agent"],"type":"string","description":"* `user` - User\n* `api` - Api\n* `webhook` - Webhook\n* `scheduler` - Scheduler\n* `github` - Github\n* `cli` - Cli\n* `agent` - Agent","readOnly":true},"webappUrl":{"type":"string","readOnly":true}},"required":["browserHeight","browserName","browserVersion","browserWidth","duration","ended","errorCode","extensionVersion","id","name","osName","queued","runMode","runProfileId","screenSizeType","sequence","started","status","stepsRuns","suiteRunId","testId","triggeredBy","userId","webappUrl"]}}},"paths":{"/api/v2/suiteruns/":{"get":{"operationId":"v2_suiteruns_list","description":"Returns many suite runs.","summary":"Retrieving suite run list","parameters":[{"name":"ordering","required":false,"in":"query","description":"Which field to use when ordering the results.","schema":{"type":"string"}},{"name":"page","required":false,"in":"query","description":"A page number within the paginated result set.","schema":{"type":"integer"}},{"name":"page_size","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"started_after","schema":{"type":"string","format":"date-time"}},{"in":"query","name":"started_before","schema":{"type":"string","format":"date-time"}},{"in":"query","name":"suiteId","schema":{"type":"string"},"description":"Filter list by suite ID."}],"tags":["Suite runs"],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedV2SuiteRunList"}}},"description":""},"401":{"description":"Authentication credentials were missing or invalid."}}}}}}
```

## Execute desired suite

> Execute desired suite.

```json
{"openapi":"3.1.0","info":{"title":"BugBug.io Public API","version":"v2"},"tags":[{"name":"Suite runs","description":"Executing and getting result"}],"security":[{"tokenAuth":[]},{"Bearer":[]}],"components":{"securitySchemes":{"tokenAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"Token-based authentication with required prefix \"Token\""}},"schemas":{"V2RunSuite":{"type":"object","properties":{"suiteId":{"type":"string","format":"uuid"},"runProfileId":{"type":["string","null"],"format":"uuid"},"variables":{"type":["array","null"],"items":{"$ref":"#/components/schemas/V2OverrideVariable"},"default":[]}},"required":["suiteId"]},"V2OverrideVariable":{"type":"object","properties":{"key":{"type":"string","maxLength":128},"value":{"type":["string","null"]}},"required":["key"]},"V2SuiteRunStatus":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"status":{"enum":["error","passed","failed","running","auto_retrying","stopped","queued","paused","skipped","recording","initialized"],"type":"string","description":"* `error` - Error\n* `passed` - Passed\n* `failed` - Failed\n* `running` - Running\n* `auto_retrying` - Auto Retrying\n* `stopped` - Stopped\n* `queued` - Queued\n* `paused` - Paused\n* `skipped` - Skipped\n* `recording` - Recording\n* `initialized` - Initialized","readOnly":true},"finishedTests":{"type":"integer","readOnly":true},"totalTests":{"type":"integer","readOnly":true},"modified":{"type":"string","format":"date-time","readOnly":true},"webappUrl":{"type":"string","readOnly":true}},"required":["finishedTests","id","modified","status","totalTests","webappUrl"]}}},"paths":{"/api/v2/suiteruns/":{"post":{"operationId":"v2_suiteruns_create","description":"Execute desired suite.","summary":"Execute desired suite","tags":["Suite runs"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V2RunSuite"}}},"required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V2SuiteRunStatus"}}},"description":""},"400":{"description":"Request body failed validation."},"401":{"description":"Authentication credentials were missing or invalid."}}}}}}
```

## Retrieve suite run result

> Returns single object.

```json
{"openapi":"3.1.0","info":{"title":"BugBug.io Public API","version":"v2"},"tags":[{"name":"Suite runs","description":"Executing and getting result"}],"security":[{"tokenAuth":[]},{"Bearer":[]}],"components":{"securitySchemes":{"tokenAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"Token-based authentication with required prefix \"Token\""}},"schemas":{"V2SuiteRun":{"type":"object","properties":{"duration":{"type":["string","null"],"readOnly":true},"ended":{"type":["string","null"],"format":"date-time","readOnly":true},"errorCode":{"type":["string","null"],"readOnly":true},"id":{"type":"string","format":"uuid","readOnly":true},"name":{"type":"string","readOnly":true},"parallelRun":{"type":["boolean","null"],"readOnly":true},"parallelSlots":{"type":["integer","null"],"readOnly":true,"title":"Max possible slots for parallel run"},"profileId":{"type":"string","format":"uuid","readOnly":true},"profileName":{"type":"string","readOnly":true},"queued":{"type":["string","null"],"format":"date-time","readOnly":true},"runMode":{"enum":["server","local","recording"],"type":"string","description":"* `server` - cloud\n* `local` - local\n* `recording` - recording","readOnly":true},"sequence":{"type":["integer","null"],"readOnly":true},"started":{"type":["string","null"],"format":"date-time","readOnly":true},"status":{"enum":["error","passed","failed","running","auto_retrying","stopped","queued","paused","skipped","recording","initialized"],"type":"string","description":"* `error` - Error\n* `passed` - Passed\n* `failed` - Failed\n* `running` - Running\n* `auto_retrying` - Auto Retrying\n* `stopped` - Stopped\n* `queued` - Queued\n* `paused` - Paused\n* `skipped` - Skipped\n* `recording` - Recording\n* `initialized` - Initialized","readOnly":true},"suiteId":{"type":["string","null"],"format":"uuid","readOnly":true},"testRuns":{"type":"array","items":{"$ref":"#/components/schemas/V2TestRun"},"readOnly":true},"triggeredBy":{"type":"string","readOnly":true},"userId":{"type":["string","null"],"readOnly":true},"webappUrl":{"type":"string","readOnly":true}},"required":["duration","ended","errorCode","id","name","parallelRun","parallelSlots","profileId","profileName","queued","runMode","sequence","started","status","suiteId","testRuns","triggeredBy","userId","webappUrl"]},"V2TestRun":{"type":"object","properties":{"browserName":{"type":["string","null"],"readOnly":true},"browserVersion":{"type":["string","null"],"readOnly":true},"browserHeight":{"type":["integer","null"],"readOnly":true},"browserWidth":{"type":["integer","null"],"readOnly":true},"stepsRuns":{"type":"string","readOnly":true},"userId":{"type":["string","null"],"format":"uuid","readOnly":true},"duration":{"type":["string","null"],"readOnly":true},"ended":{"type":["string","null"],"format":"date-time","readOnly":true},"errorCode":{"type":["string","null"],"readOnly":true},"extensionVersion":{"type":["string","null"],"readOnly":true},"id":{"type":"string","format":"uuid","readOnly":true},"name":{"type":"string","readOnly":true},"osName":{"type":["string","null"],"readOnly":true},"queued":{"type":["string","null"],"format":"date-time","readOnly":true},"runMode":{"enum":["server","local","recording"],"type":"string","description":"* `server` - cloud\n* `local` - local\n* `recording` - recording","readOnly":true},"runProfileId":{"type":["string","null"],"format":"uuid","readOnly":true},"screenSizeType":{"enum":["desktop","mobile","custom"],"type":"string","description":"* `desktop` - Desktop\n* `mobile` - Mobile\n* `custom` - Custom","readOnly":true},"sequence":{"type":["integer","null"],"readOnly":true},"started":{"type":["string","null"],"format":"date-time","readOnly":true},"status":{"enum":["error","passed","failed","running","auto_retrying","stopped","queued","paused","skipped","recording","initialized"],"type":"string","description":"* `error` - Error\n* `passed` - Passed\n* `failed` - Failed\n* `running` - Running\n* `auto_retrying` - Auto Retrying\n* `stopped` - Stopped\n* `queued` - Queued\n* `paused` - Paused\n* `skipped` - Skipped\n* `recording` - Recording\n* `initialized` - Initialized","readOnly":true},"suiteRunId":{"type":["string","null"],"format":"uuid","readOnly":true},"testId":{"type":["string","null"],"format":"uuid","readOnly":true},"triggeredBy":{"enum":["user","api","webhook","scheduler","github","cli","agent"],"type":"string","description":"* `user` - User\n* `api` - Api\n* `webhook` - Webhook\n* `scheduler` - Scheduler\n* `github` - Github\n* `cli` - Cli\n* `agent` - Agent","readOnly":true},"webappUrl":{"type":"string","readOnly":true}},"required":["browserHeight","browserName","browserVersion","browserWidth","duration","ended","errorCode","extensionVersion","id","name","osName","queued","runMode","runProfileId","screenSizeType","sequence","started","status","stepsRuns","suiteRunId","testId","triggeredBy","userId","webappUrl"]}}},"paths":{"/api/v2/suiteruns/{id}/":{"get":{"operationId":"v2_suiteruns_retrieve","description":"Returns single object.","summary":"Retrieve suite run result","parameters":[{"in":"path","name":"id","schema":{"type":"string","format":"uuid"},"description":"A UUID string identifying this suite run.","required":true}],"tags":["Suite runs"],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V2SuiteRun"}}},"description":""},"401":{"description":"Authentication credentials were missing or invalid."},"404":{"description":"Resource not found."}}}}}}
```

## Download report

> Download the report for the selected suite run in the specified format.

```json
{"openapi":"3.1.0","info":{"title":"BugBug.io Public API","version":"v2"},"tags":[{"name":"Suite runs","description":"Executing and getting result"}],"security":[{"tokenAuth":[]},{"Bearer":[]}],"components":{"securitySchemes":{"tokenAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"Token-based authentication with required prefix \"Token\""}}},"paths":{"/api/v2/suiteruns/{id}/report/junit/":{"get":{"operationId":"v2_suiteruns_report_junit_retrieve","description":"Download the report for the selected suite run in the specified format.","summary":"Download report","parameters":[{"in":"path","name":"id","schema":{"type":"string","format":"uuid"},"description":"A UUID string identifying this suite run.","required":true}],"tags":["Suite runs"],"responses":{"200":{"content":{"application/json":{"schema":{"type":"string","format":"binary"}}},"description":"JUnit XML report file"},"401":{"description":"Authentication credentials were missing or invalid."},"404":{"description":"Resource not found."}}}}}}
```

## Get suite run steps screenshots

> Returns all screenshots.

```json
{"openapi":"3.1.0","info":{"title":"BugBug.io Public API","version":"v2"},"tags":[{"name":"Suite runs","description":"Executing and getting result"}],"security":[{"tokenAuth":[]},{"Bearer":[]}],"components":{"securitySchemes":{"tokenAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"Token-based authentication with required prefix \"Token\""}},"schemas":{"V2SuiteRunScreenshots":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"testsRuns":{"type":"array","items":{"$ref":"#/components/schemas/V2TestRunScreenshots"},"readOnly":true}},"required":["id","testsRuns"]},"V2TestRunScreenshots":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"stepsRuns":{"type":"array","items":{"$ref":"#/components/schemas/V2StepRunScreenshot"},"readOnly":true}},"required":["id","stepsRuns"]},"V2StepRunScreenshot":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"stepId":{"type":["string","null"],"format":"uuid","readOnly":true},"screenshotUrl":{"type":"string"}},"required":["id","screenshotUrl","stepId"]}}},"paths":{"/api/v2/suiteruns/{id}/screenshots/":{"get":{"operationId":"v2_suiteruns_screenshots_retrieve","description":"Returns all screenshots.","summary":"Get suite run steps screenshots","parameters":[{"in":"path","name":"id","schema":{"type":"string","format":"uuid"},"description":"A UUID string identifying this suite run.","required":true}],"tags":["Suite runs"],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V2SuiteRunScreenshots"}}},"description":""},"401":{"description":"Authentication credentials were missing or invalid."},"404":{"description":"Resource not found."}}}}}}
```

## Get suite run status

> Returns single object.

```json
{"openapi":"3.1.0","info":{"title":"BugBug.io Public API","version":"v2"},"tags":[{"name":"Suite runs","description":"Executing and getting result"}],"security":[{"tokenAuth":[]},{"Bearer":[]}],"components":{"securitySchemes":{"tokenAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"Token-based authentication with required prefix \"Token\""}},"schemas":{"V2SuiteRunStatus":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"status":{"enum":["error","passed","failed","running","auto_retrying","stopped","queued","paused","skipped","recording","initialized"],"type":"string","description":"* `error` - Error\n* `passed` - Passed\n* `failed` - Failed\n* `running` - Running\n* `auto_retrying` - Auto Retrying\n* `stopped` - Stopped\n* `queued` - Queued\n* `paused` - Paused\n* `skipped` - Skipped\n* `recording` - Recording\n* `initialized` - Initialized","readOnly":true},"finishedTests":{"type":"integer","readOnly":true},"totalTests":{"type":"integer","readOnly":true},"modified":{"type":"string","format":"date-time","readOnly":true},"webappUrl":{"type":"string","readOnly":true}},"required":["finishedTests","id","modified","status","totalTests","webappUrl"]}}},"paths":{"/api/v2/suiteruns/{id}/status/":{"get":{"operationId":"v2_suiteruns_status_retrieve","description":"Returns single object.","summary":"Get suite run status","parameters":[{"in":"path","name":"id","schema":{"type":"string","format":"uuid"},"description":"A UUID string identifying this suite run.","required":true}],"tags":["Suite runs"],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V2SuiteRunStatus"}}},"description":""},"401":{"description":"Authentication credentials were missing or invalid."},"404":{"description":"Resource not found."}}}}}}
```

## Stop running suite run.

> Stop suite run.

```json
{"openapi":"3.1.0","info":{"title":"BugBug.io Public API","version":"v2"},"tags":[{"name":"Suite runs","description":"Executing and getting result"}],"security":[{"tokenAuth":[]},{"Bearer":[]}],"components":{"securitySchemes":{"tokenAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"Token-based authentication with required prefix \"Token\""}},"schemas":{"V2SuiteRunStatus":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"status":{"enum":["error","passed","failed","running","auto_retrying","stopped","queued","paused","skipped","recording","initialized"],"type":"string","description":"* `error` - Error\n* `passed` - Passed\n* `failed` - Failed\n* `running` - Running\n* `auto_retrying` - Auto Retrying\n* `stopped` - Stopped\n* `queued` - Queued\n* `paused` - Paused\n* `skipped` - Skipped\n* `recording` - Recording\n* `initialized` - Initialized","readOnly":true},"finishedTests":{"type":"integer","readOnly":true},"totalTests":{"type":"integer","readOnly":true},"modified":{"type":"string","format":"date-time","readOnly":true},"webappUrl":{"type":"string","readOnly":true}},"required":["finishedTests","id","modified","status","totalTests","webappUrl"]}}},"paths":{"/api/v2/suiteruns/{id}/stop/":{"post":{"operationId":"v2_suiteruns_stop_create","description":"Stop suite run.","summary":"Stop running suite run.","parameters":[{"in":"path","name":"id","schema":{"type":"string","format":"uuid"},"description":"A UUID string identifying this suite run.","required":true}],"tags":["Suite runs"],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V2SuiteRunStatus"}}},"description":""},"400":{"description":"Request body failed validation."},"401":{"description":"Authentication credentials were missing or invalid."},"404":{"description":"Resource not found."}}}}}}
```


# Profiles

Profiles

## Retrieving profile list

> Returns many profiles.

```json
{"openapi":"3.1.0","info":{"title":"BugBug.io Public API","version":"v2"},"tags":[{"name":"Profiles","description":"Profiles"}],"security":[{"tokenAuth":[]},{"Bearer":[]}],"components":{"securitySchemes":{"tokenAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"Token-based authentication with required prefix \"Token\""}},"schemas":{"PaginatedV1RunProfileList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer"},"next":{"type":"string","nullable":true,"format":"uri"},"previous":{"type":"string","nullable":true,"format":"uri"},"results":{"type":"array","items":{"$ref":"#/components/schemas/V1RunProfile"}}}},"V1RunProfile":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"name":{"type":"string","maxLength":128},"isDefault":{"type":"boolean"}},"required":["id","name"]}}},"paths":{"/api/v2/profiles/":{"get":{"operationId":"v2_profiles_list","description":"Returns many profiles.","summary":"Retrieving profile list","parameters":[{"name":"page","required":false,"in":"query","description":"A page number within the paginated result set.","schema":{"type":"integer"}},{"name":"page_size","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}}],"tags":["Profiles"],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedV1RunProfileList"}}},"description":""},"401":{"description":"Authentication credentials were missing or invalid."}}}}}}
```

## Retrieving profile by ID

> Returns a single profile.

```json
{"openapi":"3.1.0","info":{"title":"BugBug.io Public API","version":"v2"},"tags":[{"name":"Profiles","description":"Profiles"}],"security":[{"tokenAuth":[]},{"Bearer":[]}],"components":{"securitySchemes":{"tokenAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"Token-based authentication with required prefix \"Token\""}},"schemas":{"V1RunProfile":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"name":{"type":"string","maxLength":128},"isDefault":{"type":"boolean"}},"required":["id","name"]}}},"paths":{"/api/v2/profiles/{id}/":{"get":{"operationId":"v2_profiles_retrieve","description":"Returns a single profile.","summary":"Retrieving profile by ID","parameters":[{"in":"path","name":"id","schema":{"type":"string","format":"uuid"},"description":"A UUID string identifying this run profile.","required":true}],"tags":["Profiles"],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V1RunProfile"}}},"description":""},"401":{"description":"Authentication credentials were missing or invalid."},"404":{"description":"Resource not found."}}}}}}
```


# Groups

Managing test groups

## Retrieving groups list

> Returns many groups.

```json
{"openapi":"3.1.0","info":{"title":"BugBug.io Public API","version":"v2"},"tags":[{"name":"Groups","description":"Managing test groups"}],"security":[{"tokenAuth":[]},{"Bearer":[]}],"components":{"securitySchemes":{"tokenAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"Token-based authentication with required prefix \"Token\""}},"schemas":{"PaginatedV2GroupList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer"},"next":{"type":"string","nullable":true,"format":"uri"},"previous":{"type":"string","nullable":true,"format":"uri"},"results":{"type":"array","items":{"$ref":"#/components/schemas/V2Group"}}}},"V2Group":{"type":"object","properties":{"id":{"type":"string","readOnly":true},"originGroupId":{"type":"string","format":"uuid","readOnly":true},"name":{"type":["string","null"],"readOnly":true},"isComponent":{"type":"boolean","readOnly":true},"steps":{"type":"array","items":{"$ref":"#/components/schemas/V2GroupStepResponse"},"readOnly":true}},"required":["id","isComponent","name","originGroupId","steps"]},"V2GroupStepResponse":{"oneOf":[{"$ref":"#/components/schemas/V2AnswerPromptStep"},{"$ref":"#/components/schemas/AssertStep"},{"$ref":"#/components/schemas/PastFromClipboardStep"},{"$ref":"#/components/schemas/ChangeStep"},{"$ref":"#/components/schemas/ClearStep"},{"$ref":"#/components/schemas/ClickStep"},{"$ref":"#/components/schemas/CloseTabStep"},{"$ref":"#/components/schemas/V2DragAndDropStep"},{"$ref":"#/components/schemas/ElementVisualRegressionStep"},{"$ref":"#/components/schemas/ExecuteStep"},{"$ref":"#/components/schemas/GotoStep"},{"$ref":"#/components/schemas/GoBackStep"},{"$ref":"#/components/schemas/GoForwardStep"},{"$ref":"#/components/schemas/HoverStep"},{"$ref":"#/components/schemas/IfConditionStep"},{"$ref":"#/components/schemas/MouseDownStep"},{"$ref":"#/components/schemas/MouseUpStep"},{"$ref":"#/components/schemas/NewTabStep"},{"$ref":"#/components/schemas/PageVisualRegressionStep"},{"$ref":"#/components/schemas/ReloadPageStep"},{"$ref":"#/components/schemas/ScrollStep"},{"$ref":"#/components/schemas/SelectStep"},{"$ref":"#/components/schemas/SetLocalVariableStep"},{"$ref":"#/components/schemas/SwitchContext"},{"$ref":"#/components/schemas/TypeStep"},{"$ref":"#/components/schemas/UploadStep"}],"discriminator":{"propertyName":"type","mapping":{"answerPrompt":"#/components/schemas/V2AnswerPromptStep","assert":"#/components/schemas/AssertStep","pasteFromClipboard":"#/components/schemas/PastFromClipboardStep","change":"#/components/schemas/ChangeStep","clear":"#/components/schemas/ClearStep","click":"#/components/schemas/ClickStep","closeTab":"#/components/schemas/CloseTabStep","dblClick":"#/components/schemas/ClickStep","dragAndDrop":"#/components/schemas/V2DragAndDropStep","elementVisualRegression":"#/components/schemas/ElementVisualRegressionStep","execute":"#/components/schemas/ExecuteStep","goto":"#/components/schemas/GotoStep","goBack":"#/components/schemas/GoBackStep","goForward":"#/components/schemas/GoForwardStep","hover":"#/components/schemas/HoverStep","ifCondition":"#/components/schemas/IfConditionStep","mouseDown":"#/components/schemas/MouseDownStep","mouseUp":"#/components/schemas/MouseUpStep","newTab":"#/components/schemas/NewTabStep","pageVisualRegression":"#/components/schemas/PageVisualRegressionStep","reloadPage":"#/components/schemas/ReloadPageStep","rightClick":"#/components/schemas/ClickStep","scroll":"#/components/schemas/ScrollStep","select":"#/components/schemas/SelectStep","setLocalVariable":"#/components/schemas/SetLocalVariableStep","switchContext":"#/components/schemas/SwitchContext","type":"#/components/schemas/TypeStep","uploadFile":"#/components/schemas/UploadStep"}}},"V2AnswerPromptStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"value":{"type":"string"}},"required":["id","originGroupId","type","value"]},"UpdateStepWaitingCondition":{"type":"object","properties":{"type":{"enum":["documentComplete","elementIsVisible","elementIsNotCovered","elementIsNotAnimating","elementIsNotDisabled","elementHasFocus","networkIdle","pageNavigationAfterExecution","elementHasAttribute"],"type":"string","description":"* `documentComplete` - documentComplete\n* `elementIsVisible` - elementIsVisible\n* `elementIsNotCovered` - elementIsNotCovered\n* `elementIsNotAnimating` - elementIsNotAnimating\n* `elementIsNotDisabled` - elementIsNotDisabled\n* `elementHasFocus` - elementHasFocus\n* `networkIdle` - networkIdle\n* `pageNavigationAfterExecution` - pageNavigationAfterExecution\n* `elementHasAttribute` - elementHasAttribute"},"expected":{"type":["string","null"]},"isActive":{"type":"boolean"},"isOverridden":{"type":"boolean","writeOnly":true,"description":"Required for each item when sending waitingConditions."},"timeout":{"type":["integer","null"]}},"required":["isActive","isOverridden","type"]},"AssertStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}},"continueOnFailure":{"type":"boolean","default":false},"assertionProperty":{"enum":["checked","count","customJavaScript","exist","notChecked","notExist","notVisible","textContent","value","visible","pageTitle","pageShowsText","pageDoesNotShowText","pageUrlIs","downloadStarted","variableValue","clipboardValue","disabled","notDisabled"],"type":"string","description":"* `checked` - Checked\n* `count` - Count\n* `customJavaScript` - Custom Javascript\n* `exist` - Exist\n* `notChecked` - Not Checked\n* `notExist` - Not Exist\n* `notVisible` - Not Visible\n* `textContent` - Text Content\n* `value` - Value\n* `visible` - Visible\n* `pageTitle` - Page Has Title\n* `pageShowsText` - Page Shows Text\n* `pageDoesNotShowText` - Page Does Not Show Text\n* `pageUrlIs` - Page Url Is\n* `downloadStarted` - Download Started\n* `variableValue` - Variable Value\n* `clipboardValue` - Clipboard Value\n* `disabled` - Disabled\n* `notDisabled` - Not Disabled"},"assertionType":{"enum":["contain","equal","greaterThan","lessThan","match","notContain","notEqual","any"],"type":"string","description":"* `contain` - Contain\n* `equal` - Equal\n* `greaterThan` - Greater Than\n* `lessThan` - Less Than\n* `match` - Match\n* `notContain` - Not Contain\n* `notEqual` - Not Equal\n* `any` - Any"},"assertionExpectedValue":{"type":["string","null"],"maxLength":10000},"assertionJavaScript":{"type":["string","null"],"description":"Required for assert and ifCondition steps. Send an empty string when unused."},"assertionVariableName":{"type":["string","null"],"description":"Required for assert and ifCondition steps. Send an empty string when unused."}},"required":["assertionExpectedValue","assertionJavaScript","assertionProperty","assertionType","assertionVariableName","id","originGroupId","type"]},"UpdateSelectorsPresetGroup":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"isActive":{"type":"boolean","default":false},"isCustom":{"type":"boolean","default":false},"selectorsGroups":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsGroup"}}},"required":["selectorsGroups"]},"UpdateSelectorsGroup":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"selectors":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelector"}},"relation":{"enum":["descendant","ancestor","sibling"],"type":"string","description":"* `descendant` - Descendant\n* `ancestor` - Ancestor\n* `sibling` - Sibling"}},"required":["relation","selectors"]},"UpdateSelector":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"type":{"enum":["XPath","customCSS","customXPath","",null],"type":["string","null"],"description":"* `XPath` - Xpath\n* `customCSS` - Custom Css\n* `customXPath` - Custom Xpath"},"selector":{"type":["string","null"]},"isActive":{"type":"boolean"},"score":{"type":["string","null"]}},"required":["isActive","selector","type"]},"PastFromClipboardStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","originGroupId","type"]},"ChangeStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"value":{"type":"string"},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","originGroupId","type","value"]},"ClearStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","originGroupId","type"]},"ClickStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"interactionPosition":{"enum":["smart","custom","topLeft","topCenter","topRight","middleLeft","middleCenter","middleRight","bottomLeft","bottomCenter","bottomRight"],"type":"string","description":"Required interaction target position. auto is not supported.\n\n* `smart` - Smart\n* `custom` - Custom\n* `topLeft` - Top Left\n* `topCenter` - Top Center\n* `topRight` - Top Right\n* `middleLeft` - Middle Left\n* `middleCenter` - Middle Center\n* `middleRight` - Middle Right\n* `bottomLeft` - Bottom Left\n* `bottomCenter` - Bottom Center\n* `bottomRight` - Bottom Right"},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","interactionPosition","originGroupId","type"]},"CloseTabStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}}},"required":["id","originGroupId","type"]},"V2DragAndDropStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}},"dndDropSelectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}},"dndDragOn":{"enum":["coords","element"],"type":"string","description":"* `coords` - coords\n* `element` - element"},"interactionPosition":{"enum":["smart","custom","topLeft","topCenter","topRight","middleLeft","middleCenter","middleRight","bottomLeft","bottomCenter","bottomRight"],"type":"string","description":"Required interaction target position. auto is not supported.\n\n* `smart` - Smart\n* `custom` - Custom\n* `topLeft` - Top Left\n* `topCenter` - Top Center\n* `topRight` - Top Right\n* `middleLeft` - Middle Left\n* `middleCenter` - Middle Center\n* `middleRight` - Middle Right\n* `bottomLeft` - Bottom Left\n* `bottomCenter` - Bottom Center\n* `bottomRight` - Bottom Right"},"dndDragX":{"type":["number","null"],"format":"double"},"dndDragY":{"type":["number","null"],"format":"double"},"dndDropOn":{"enum":["coords","element"],"type":"string","description":"* `coords` - coords\n* `element` - element"},"dndDropInteractionPosition":{"enum":["smart","custom","topLeft","topCenter","topRight","middleLeft","middleCenter","middleRight","bottomLeft","bottomCenter","bottomRight"],"type":"string","description":"Required interaction target position. auto is not supported.\n\n* `smart` - Smart\n* `custom` - Custom\n* `topLeft` - Top Left\n* `topCenter` - Top Center\n* `topRight` - Top Right\n* `middleLeft` - Middle Left\n* `middleCenter` - Middle Center\n* `middleRight` - Middle Right\n* `bottomLeft` - Bottom Left\n* `bottomCenter` - Bottom Center\n* `bottomRight` - Bottom Right"},"dndDropX":{"type":["number","null"],"format":"double"},"dndDropY":{"type":["number","null"],"format":"double"}},"required":["dndDragOn","dndDropInteractionPosition","dndDropOn","id","interactionPosition","originGroupId","type"]},"ElementVisualRegressionStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"visualRegressionMaxDiff":{"type":["number","null"],"format":"double","maximum":100,"minimum":0},"visualRegressionRefScreenshots":{"type":"array","items":{"type":"object","additionalProperties":{}},"readOnly":true},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","originGroupId","selectorsPresets","type","visualRegressionRefScreenshots"]},"ExecuteStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"code":{"type":"string"}},"required":["code","id","originGroupId","type"]},"GotoStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"url":{"type":"string"},"username":{"type":["string","null"]},"password":{"type":["string","null"]},"frameLocation":{"type":"string"}},"required":["id","originGroupId","type","url"]},"GoBackStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}}},"required":["id","originGroupId","type"]},"GoForwardStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}}},"required":["id","originGroupId","type"]},"HoverStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"interactionPosition":{"enum":["smart","custom","topLeft","topCenter","topRight","middleLeft","middleCenter","middleRight","bottomLeft","bottomCenter","bottomRight"],"type":"string","description":"Required interaction target position. auto is not supported.\n\n* `smart` - Smart\n* `custom` - Custom\n* `topLeft` - Top Left\n* `topCenter` - Top Center\n* `topRight` - Top Right\n* `middleLeft` - Middle Left\n* `middleCenter` - Middle Center\n* `middleRight` - Middle Right\n* `bottomLeft` - Bottom Left\n* `bottomCenter` - Bottom Center\n* `bottomRight` - Bottom Right"},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","interactionPosition","originGroupId","type"]},"IfConditionStep":{"type":"object","description":"If condition steps reuse assertion_* fields as the branch condition.","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}},"assertionProperty":{"enum":["checked","count","customJavaScript","exist","notChecked","notExist","notVisible","textContent","value","visible","pageTitle","pageShowsText","pageDoesNotShowText","pageUrlIs","downloadStarted","variableValue","clipboardValue","disabled","notDisabled"],"type":"string","description":"* `checked` - Checked\n* `count` - Count\n* `customJavaScript` - Custom Javascript\n* `exist` - Exist\n* `notChecked` - Not Checked\n* `notExist` - Not Exist\n* `notVisible` - Not Visible\n* `textContent` - Text Content\n* `value` - Value\n* `visible` - Visible\n* `pageTitle` - Page Has Title\n* `pageShowsText` - Page Shows Text\n* `pageDoesNotShowText` - Page Does Not Show Text\n* `pageUrlIs` - Page Url Is\n* `downloadStarted` - Download Started\n* `variableValue` - Variable Value\n* `clipboardValue` - Clipboard Value\n* `disabled` - Disabled\n* `notDisabled` - Not Disabled"},"assertionType":{"enum":["contain","equal","greaterThan","lessThan","match","notContain","notEqual","any"],"type":"string","description":"* `contain` - Contain\n* `equal` - Equal\n* `greaterThan` - Greater Than\n* `lessThan` - Less Than\n* `match` - Match\n* `notContain` - Not Contain\n* `notEqual` - Not Equal\n* `any` - Any"},"assertionExpectedValue":{"type":["string","null"],"maxLength":10000},"assertionJavaScript":{"type":["string","null"],"description":"Required for assert and ifCondition steps. Send an empty string when unused."},"assertionVariableName":{"type":["string","null"],"description":"Required for assert and ifCondition steps. Send an empty string when unused."}},"required":["assertionExpectedValue","assertionJavaScript","assertionProperty","assertionType","assertionVariableName","id","originGroupId","type"]},"MouseDownStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"interactionPosition":{"enum":["smart","custom","topLeft","topCenter","topRight","middleLeft","middleCenter","middleRight","bottomLeft","bottomCenter","bottomRight"],"type":"string","description":"Required interaction target position. auto is not supported.\n\n* `smart` - Smart\n* `custom` - Custom\n* `topLeft` - Top Left\n* `topCenter` - Top Center\n* `topRight` - Top Right\n* `middleLeft` - Middle Left\n* `middleCenter` - Middle Center\n* `middleRight` - Middle Right\n* `bottomLeft` - Bottom Left\n* `bottomCenter` - Bottom Center\n* `bottomRight` - Bottom Right"},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","interactionPosition","originGroupId","type"]},"MouseUpStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"interactionPosition":{"enum":["smart","custom","topLeft","topCenter","topRight","middleLeft","middleCenter","middleRight","bottomLeft","bottomCenter","bottomRight"],"type":"string","description":"Required interaction target position. auto is not supported.\n\n* `smart` - Smart\n* `custom` - Custom\n* `topLeft` - Top Left\n* `topCenter` - Top Center\n* `topRight` - Top Right\n* `middleLeft` - Middle Left\n* `middleCenter` - Middle Center\n* `middleRight` - Middle Right\n* `bottomLeft` - Bottom Left\n* `bottomCenter` - Bottom Center\n* `bottomRight` - Bottom Right"},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","interactionPosition","originGroupId","type"]},"NewTabStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"url":{"type":["string","null"]},"username":{"type":["string","null"]},"password":{"type":["string","null"]}},"required":["id","originGroupId","type"]},"PageVisualRegressionStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"visualRegressionMaxDiff":{"type":["number","null"],"format":"double","maximum":100,"minimum":0},"visualRegressionRefScreenshots":{"type":"array","items":{"type":"object","additionalProperties":{}},"readOnly":true}},"required":["id","originGroupId","type","visualRegressionRefScreenshots"]},"ReloadPageStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}}},"required":["id","originGroupId","type"]},"ScrollStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}},"scrollX":{"type":["number","null"],"format":"double"},"scrollY":{"type":["number","null"],"format":"double"},"scrollEdge":{"enum":["topLeft","topCenter","topRight","middleLeft","middleCenter","middleRight","bottomLeft","bottomCenter","bottomRight",null],"type":["string","null"],"description":"* `topLeft` - Top Left\n* `topCenter` - Top Center\n* `topRight` - Top Right\n* `middleLeft` - Middle Left\n* `middleCenter` - Middle Center\n* `middleRight` - Middle Right\n* `bottomLeft` - Bottom Left\n* `bottomCenter` - Bottom Center\n* `bottomRight` - Bottom Right"},"scrollDirection":{"enum":["down","up","right","left",null],"type":["string","null"],"description":"* `down` - Down\n* `up` - Up\n* `right` - Right\n* `left` - Left"},"scrollTo":{"enum":["coords","edge","untilNextStepElementIsVisible","elementIntoView"],"type":"string","description":"* `coords` - Coords\n* `edge` - Edge\n* `untilNextStepElementIsVisible` - Until Next Step Element Is Visible\n* `elementIntoView` - Element Into View"},"scrollInside":{"enum":["window","element"],"type":"string","description":"* `window` - window\n* `element` - element"}},"required":["id","originGroupId","scrollInside","scrollTo","type"]},"SelectStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}},"value":{"type":"string"},"selectType":{"enum":["text","index","value"],"type":"string","description":"* `text` - text\n* `index` - index\n* `value` - value"},"selectIsMultiple":{"type":"boolean","default":false}},"required":["id","originGroupId","selectType","type","value"]},"SetLocalVariableStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}},"value":{"type":"string"},"code":{"type":["string","null"]},"localVariableName":{"type":"string"},"localVariableSource":{"enum":["element","value","evaluate"],"type":"string","description":"* `element` - element\n* `value` - value\n* `evaluate` - evaluate"}},"required":["id","localVariableName","localVariableSource","originGroupId","type"]},"SwitchContext":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}},"tabNo":{"type":"integer"},"value":{"enum":["topFrame","iframe"],"type":"string","description":"* `topFrame` - Top Frame\n* `iframe` - Iframe"}},"required":["id","originGroupId","tabNo","type","value"]},"TypeStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"value":{"type":"string"},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","originGroupId","type","value"]},"UploadStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"projectArtifactId":{"type":"string","format":"uuid"},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","originGroupId","projectArtifactId","type"]}}},"paths":{"/api/v2/groups/":{"get":{"operationId":"v2_groups_list","description":"Returns many groups.","summary":"Retrieving groups list","parameters":[{"in":"query","name":"ordering","schema":{"type":"string","enum":["-created","-name","created","name"]}},{"name":"page","required":false,"in":"query","description":"A page number within the paginated result set.","schema":{"type":"integer"}},{"name":"page_size","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"query","schema":{"type":"string"},"description":"Search in names with the following query"}],"tags":["Groups"],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedV2GroupList"}}},"description":""},"401":{"description":"Authentication credentials were missing or invalid."}}}}}}
```

## Creating a group

> Create a new group.

```json
{"openapi":"3.1.0","info":{"title":"BugBug.io Public API","version":"v2"},"tags":[{"name":"Groups","description":"Managing test groups"}],"security":[{"tokenAuth":[]},{"Bearer":[]}],"components":{"securitySchemes":{"tokenAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"Token-based authentication with required prefix \"Token\""}},"schemas":{"V2GroupCreate":{"type":"object","properties":{"name":{"type":["string","null"],"maxLength":255},"isActive":{"type":"boolean"},"isComponent":{"type":"boolean"},"testId":{"type":"string"},"atIndex":{"type":"integer"}},"required":["testId"]},"V2Group":{"type":"object","properties":{"id":{"type":"string","readOnly":true},"originGroupId":{"type":"string","format":"uuid","readOnly":true},"name":{"type":["string","null"],"readOnly":true},"isComponent":{"type":"boolean","readOnly":true},"steps":{"type":"array","items":{"$ref":"#/components/schemas/V2GroupStepResponse"},"readOnly":true}},"required":["id","isComponent","name","originGroupId","steps"]},"V2GroupStepResponse":{"oneOf":[{"$ref":"#/components/schemas/V2AnswerPromptStep"},{"$ref":"#/components/schemas/AssertStep"},{"$ref":"#/components/schemas/PastFromClipboardStep"},{"$ref":"#/components/schemas/ChangeStep"},{"$ref":"#/components/schemas/ClearStep"},{"$ref":"#/components/schemas/ClickStep"},{"$ref":"#/components/schemas/CloseTabStep"},{"$ref":"#/components/schemas/V2DragAndDropStep"},{"$ref":"#/components/schemas/ElementVisualRegressionStep"},{"$ref":"#/components/schemas/ExecuteStep"},{"$ref":"#/components/schemas/GotoStep"},{"$ref":"#/components/schemas/GoBackStep"},{"$ref":"#/components/schemas/GoForwardStep"},{"$ref":"#/components/schemas/HoverStep"},{"$ref":"#/components/schemas/IfConditionStep"},{"$ref":"#/components/schemas/MouseDownStep"},{"$ref":"#/components/schemas/MouseUpStep"},{"$ref":"#/components/schemas/NewTabStep"},{"$ref":"#/components/schemas/PageVisualRegressionStep"},{"$ref":"#/components/schemas/ReloadPageStep"},{"$ref":"#/components/schemas/ScrollStep"},{"$ref":"#/components/schemas/SelectStep"},{"$ref":"#/components/schemas/SetLocalVariableStep"},{"$ref":"#/components/schemas/SwitchContext"},{"$ref":"#/components/schemas/TypeStep"},{"$ref":"#/components/schemas/UploadStep"}],"discriminator":{"propertyName":"type","mapping":{"answerPrompt":"#/components/schemas/V2AnswerPromptStep","assert":"#/components/schemas/AssertStep","pasteFromClipboard":"#/components/schemas/PastFromClipboardStep","change":"#/components/schemas/ChangeStep","clear":"#/components/schemas/ClearStep","click":"#/components/schemas/ClickStep","closeTab":"#/components/schemas/CloseTabStep","dblClick":"#/components/schemas/ClickStep","dragAndDrop":"#/components/schemas/V2DragAndDropStep","elementVisualRegression":"#/components/schemas/ElementVisualRegressionStep","execute":"#/components/schemas/ExecuteStep","goto":"#/components/schemas/GotoStep","goBack":"#/components/schemas/GoBackStep","goForward":"#/components/schemas/GoForwardStep","hover":"#/components/schemas/HoverStep","ifCondition":"#/components/schemas/IfConditionStep","mouseDown":"#/components/schemas/MouseDownStep","mouseUp":"#/components/schemas/MouseUpStep","newTab":"#/components/schemas/NewTabStep","pageVisualRegression":"#/components/schemas/PageVisualRegressionStep","reloadPage":"#/components/schemas/ReloadPageStep","rightClick":"#/components/schemas/ClickStep","scroll":"#/components/schemas/ScrollStep","select":"#/components/schemas/SelectStep","setLocalVariable":"#/components/schemas/SetLocalVariableStep","switchContext":"#/components/schemas/SwitchContext","type":"#/components/schemas/TypeStep","uploadFile":"#/components/schemas/UploadStep"}}},"V2AnswerPromptStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"value":{"type":"string"}},"required":["id","originGroupId","type","value"]},"UpdateStepWaitingCondition":{"type":"object","properties":{"type":{"enum":["documentComplete","elementIsVisible","elementIsNotCovered","elementIsNotAnimating","elementIsNotDisabled","elementHasFocus","networkIdle","pageNavigationAfterExecution","elementHasAttribute"],"type":"string","description":"* `documentComplete` - documentComplete\n* `elementIsVisible` - elementIsVisible\n* `elementIsNotCovered` - elementIsNotCovered\n* `elementIsNotAnimating` - elementIsNotAnimating\n* `elementIsNotDisabled` - elementIsNotDisabled\n* `elementHasFocus` - elementHasFocus\n* `networkIdle` - networkIdle\n* `pageNavigationAfterExecution` - pageNavigationAfterExecution\n* `elementHasAttribute` - elementHasAttribute"},"expected":{"type":["string","null"]},"isActive":{"type":"boolean"},"isOverridden":{"type":"boolean","writeOnly":true,"description":"Required for each item when sending waitingConditions."},"timeout":{"type":["integer","null"]}},"required":["isActive","isOverridden","type"]},"AssertStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}},"continueOnFailure":{"type":"boolean","default":false},"assertionProperty":{"enum":["checked","count","customJavaScript","exist","notChecked","notExist","notVisible","textContent","value","visible","pageTitle","pageShowsText","pageDoesNotShowText","pageUrlIs","downloadStarted","variableValue","clipboardValue","disabled","notDisabled"],"type":"string","description":"* `checked` - Checked\n* `count` - Count\n* `customJavaScript` - Custom Javascript\n* `exist` - Exist\n* `notChecked` - Not Checked\n* `notExist` - Not Exist\n* `notVisible` - Not Visible\n* `textContent` - Text Content\n* `value` - Value\n* `visible` - Visible\n* `pageTitle` - Page Has Title\n* `pageShowsText` - Page Shows Text\n* `pageDoesNotShowText` - Page Does Not Show Text\n* `pageUrlIs` - Page Url Is\n* `downloadStarted` - Download Started\n* `variableValue` - Variable Value\n* `clipboardValue` - Clipboard Value\n* `disabled` - Disabled\n* `notDisabled` - Not Disabled"},"assertionType":{"enum":["contain","equal","greaterThan","lessThan","match","notContain","notEqual","any"],"type":"string","description":"* `contain` - Contain\n* `equal` - Equal\n* `greaterThan` - Greater Than\n* `lessThan` - Less Than\n* `match` - Match\n* `notContain` - Not Contain\n* `notEqual` - Not Equal\n* `any` - Any"},"assertionExpectedValue":{"type":["string","null"],"maxLength":10000},"assertionJavaScript":{"type":["string","null"],"description":"Required for assert and ifCondition steps. Send an empty string when unused."},"assertionVariableName":{"type":["string","null"],"description":"Required for assert and ifCondition steps. Send an empty string when unused."}},"required":["assertionExpectedValue","assertionJavaScript","assertionProperty","assertionType","assertionVariableName","id","originGroupId","type"]},"UpdateSelectorsPresetGroup":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"isActive":{"type":"boolean","default":false},"isCustom":{"type":"boolean","default":false},"selectorsGroups":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsGroup"}}},"required":["selectorsGroups"]},"UpdateSelectorsGroup":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"selectors":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelector"}},"relation":{"enum":["descendant","ancestor","sibling"],"type":"string","description":"* `descendant` - Descendant\n* `ancestor` - Ancestor\n* `sibling` - Sibling"}},"required":["relation","selectors"]},"UpdateSelector":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"type":{"enum":["XPath","customCSS","customXPath","",null],"type":["string","null"],"description":"* `XPath` - Xpath\n* `customCSS` - Custom Css\n* `customXPath` - Custom Xpath"},"selector":{"type":["string","null"]},"isActive":{"type":"boolean"},"score":{"type":["string","null"]}},"required":["isActive","selector","type"]},"PastFromClipboardStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","originGroupId","type"]},"ChangeStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"value":{"type":"string"},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","originGroupId","type","value"]},"ClearStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","originGroupId","type"]},"ClickStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"interactionPosition":{"enum":["smart","custom","topLeft","topCenter","topRight","middleLeft","middleCenter","middleRight","bottomLeft","bottomCenter","bottomRight"],"type":"string","description":"Required interaction target position. auto is not supported.\n\n* `smart` - Smart\n* `custom` - Custom\n* `topLeft` - Top Left\n* `topCenter` - Top Center\n* `topRight` - Top Right\n* `middleLeft` - Middle Left\n* `middleCenter` - Middle Center\n* `middleRight` - Middle Right\n* `bottomLeft` - Bottom Left\n* `bottomCenter` - Bottom Center\n* `bottomRight` - Bottom Right"},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","interactionPosition","originGroupId","type"]},"CloseTabStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}}},"required":["id","originGroupId","type"]},"V2DragAndDropStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}},"dndDropSelectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}},"dndDragOn":{"enum":["coords","element"],"type":"string","description":"* `coords` - coords\n* `element` - element"},"interactionPosition":{"enum":["smart","custom","topLeft","topCenter","topRight","middleLeft","middleCenter","middleRight","bottomLeft","bottomCenter","bottomRight"],"type":"string","description":"Required interaction target position. auto is not supported.\n\n* `smart` - Smart\n* `custom` - Custom\n* `topLeft` - Top Left\n* `topCenter` - Top Center\n* `topRight` - Top Right\n* `middleLeft` - Middle Left\n* `middleCenter` - Middle Center\n* `middleRight` - Middle Right\n* `bottomLeft` - Bottom Left\n* `bottomCenter` - Bottom Center\n* `bottomRight` - Bottom Right"},"dndDragX":{"type":["number","null"],"format":"double"},"dndDragY":{"type":["number","null"],"format":"double"},"dndDropOn":{"enum":["coords","element"],"type":"string","description":"* `coords` - coords\n* `element` - element"},"dndDropInteractionPosition":{"enum":["smart","custom","topLeft","topCenter","topRight","middleLeft","middleCenter","middleRight","bottomLeft","bottomCenter","bottomRight"],"type":"string","description":"Required interaction target position. auto is not supported.\n\n* `smart` - Smart\n* `custom` - Custom\n* `topLeft` - Top Left\n* `topCenter` - Top Center\n* `topRight` - Top Right\n* `middleLeft` - Middle Left\n* `middleCenter` - Middle Center\n* `middleRight` - Middle Right\n* `bottomLeft` - Bottom Left\n* `bottomCenter` - Bottom Center\n* `bottomRight` - Bottom Right"},"dndDropX":{"type":["number","null"],"format":"double"},"dndDropY":{"type":["number","null"],"format":"double"}},"required":["dndDragOn","dndDropInteractionPosition","dndDropOn","id","interactionPosition","originGroupId","type"]},"ElementVisualRegressionStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"visualRegressionMaxDiff":{"type":["number","null"],"format":"double","maximum":100,"minimum":0},"visualRegressionRefScreenshots":{"type":"array","items":{"type":"object","additionalProperties":{}},"readOnly":true},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","originGroupId","selectorsPresets","type","visualRegressionRefScreenshots"]},"ExecuteStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"code":{"type":"string"}},"required":["code","id","originGroupId","type"]},"GotoStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"url":{"type":"string"},"username":{"type":["string","null"]},"password":{"type":["string","null"]},"frameLocation":{"type":"string"}},"required":["id","originGroupId","type","url"]},"GoBackStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}}},"required":["id","originGroupId","type"]},"GoForwardStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}}},"required":["id","originGroupId","type"]},"HoverStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"interactionPosition":{"enum":["smart","custom","topLeft","topCenter","topRight","middleLeft","middleCenter","middleRight","bottomLeft","bottomCenter","bottomRight"],"type":"string","description":"Required interaction target position. auto is not supported.\n\n* `smart` - Smart\n* `custom` - Custom\n* `topLeft` - Top Left\n* `topCenter` - Top Center\n* `topRight` - Top Right\n* `middleLeft` - Middle Left\n* `middleCenter` - Middle Center\n* `middleRight` - Middle Right\n* `bottomLeft` - Bottom Left\n* `bottomCenter` - Bottom Center\n* `bottomRight` - Bottom Right"},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","interactionPosition","originGroupId","type"]},"IfConditionStep":{"type":"object","description":"If condition steps reuse assertion_* fields as the branch condition.","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}},"assertionProperty":{"enum":["checked","count","customJavaScript","exist","notChecked","notExist","notVisible","textContent","value","visible","pageTitle","pageShowsText","pageDoesNotShowText","pageUrlIs","downloadStarted","variableValue","clipboardValue","disabled","notDisabled"],"type":"string","description":"* `checked` - Checked\n* `count` - Count\n* `customJavaScript` - Custom Javascript\n* `exist` - Exist\n* `notChecked` - Not Checked\n* `notExist` - Not Exist\n* `notVisible` - Not Visible\n* `textContent` - Text Content\n* `value` - Value\n* `visible` - Visible\n* `pageTitle` - Page Has Title\n* `pageShowsText` - Page Shows Text\n* `pageDoesNotShowText` - Page Does Not Show Text\n* `pageUrlIs` - Page Url Is\n* `downloadStarted` - Download Started\n* `variableValue` - Variable Value\n* `clipboardValue` - Clipboard Value\n* `disabled` - Disabled\n* `notDisabled` - Not Disabled"},"assertionType":{"enum":["contain","equal","greaterThan","lessThan","match","notContain","notEqual","any"],"type":"string","description":"* `contain` - Contain\n* `equal` - Equal\n* `greaterThan` - Greater Than\n* `lessThan` - Less Than\n* `match` - Match\n* `notContain` - Not Contain\n* `notEqual` - Not Equal\n* `any` - Any"},"assertionExpectedValue":{"type":["string","null"],"maxLength":10000},"assertionJavaScript":{"type":["string","null"],"description":"Required for assert and ifCondition steps. Send an empty string when unused."},"assertionVariableName":{"type":["string","null"],"description":"Required for assert and ifCondition steps. Send an empty string when unused."}},"required":["assertionExpectedValue","assertionJavaScript","assertionProperty","assertionType","assertionVariableName","id","originGroupId","type"]},"MouseDownStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"interactionPosition":{"enum":["smart","custom","topLeft","topCenter","topRight","middleLeft","middleCenter","middleRight","bottomLeft","bottomCenter","bottomRight"],"type":"string","description":"Required interaction target position. auto is not supported.\n\n* `smart` - Smart\n* `custom` - Custom\n* `topLeft` - Top Left\n* `topCenter` - Top Center\n* `topRight` - Top Right\n* `middleLeft` - Middle Left\n* `middleCenter` - Middle Center\n* `middleRight` - Middle Right\n* `bottomLeft` - Bottom Left\n* `bottomCenter` - Bottom Center\n* `bottomRight` - Bottom Right"},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","interactionPosition","originGroupId","type"]},"MouseUpStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"interactionPosition":{"enum":["smart","custom","topLeft","topCenter","topRight","middleLeft","middleCenter","middleRight","bottomLeft","bottomCenter","bottomRight"],"type":"string","description":"Required interaction target position. auto is not supported.\n\n* `smart` - Smart\n* `custom` - Custom\n* `topLeft` - Top Left\n* `topCenter` - Top Center\n* `topRight` - Top Right\n* `middleLeft` - Middle Left\n* `middleCenter` - Middle Center\n* `middleRight` - Middle Right\n* `bottomLeft` - Bottom Left\n* `bottomCenter` - Bottom Center\n* `bottomRight` - Bottom Right"},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","interactionPosition","originGroupId","type"]},"NewTabStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"url":{"type":["string","null"]},"username":{"type":["string","null"]},"password":{"type":["string","null"]}},"required":["id","originGroupId","type"]},"PageVisualRegressionStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"visualRegressionMaxDiff":{"type":["number","null"],"format":"double","maximum":100,"minimum":0},"visualRegressionRefScreenshots":{"type":"array","items":{"type":"object","additionalProperties":{}},"readOnly":true}},"required":["id","originGroupId","type","visualRegressionRefScreenshots"]},"ReloadPageStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}}},"required":["id","originGroupId","type"]},"ScrollStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}},"scrollX":{"type":["number","null"],"format":"double"},"scrollY":{"type":["number","null"],"format":"double"},"scrollEdge":{"enum":["topLeft","topCenter","topRight","middleLeft","middleCenter","middleRight","bottomLeft","bottomCenter","bottomRight",null],"type":["string","null"],"description":"* `topLeft` - Top Left\n* `topCenter` - Top Center\n* `topRight` - Top Right\n* `middleLeft` - Middle Left\n* `middleCenter` - Middle Center\n* `middleRight` - Middle Right\n* `bottomLeft` - Bottom Left\n* `bottomCenter` - Bottom Center\n* `bottomRight` - Bottom Right"},"scrollDirection":{"enum":["down","up","right","left",null],"type":["string","null"],"description":"* `down` - Down\n* `up` - Up\n* `right` - Right\n* `left` - Left"},"scrollTo":{"enum":["coords","edge","untilNextStepElementIsVisible","elementIntoView"],"type":"string","description":"* `coords` - Coords\n* `edge` - Edge\n* `untilNextStepElementIsVisible` - Until Next Step Element Is Visible\n* `elementIntoView` - Element Into View"},"scrollInside":{"enum":["window","element"],"type":"string","description":"* `window` - window\n* `element` - element"}},"required":["id","originGroupId","scrollInside","scrollTo","type"]},"SelectStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}},"value":{"type":"string"},"selectType":{"enum":["text","index","value"],"type":"string","description":"* `text` - text\n* `index` - index\n* `value` - value"},"selectIsMultiple":{"type":"boolean","default":false}},"required":["id","originGroupId","selectType","type","value"]},"SetLocalVariableStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}},"value":{"type":"string"},"code":{"type":["string","null"]},"localVariableName":{"type":"string"},"localVariableSource":{"enum":["element","value","evaluate"],"type":"string","description":"* `element` - element\n* `value` - value\n* `evaluate` - evaluate"}},"required":["id","localVariableName","localVariableSource","originGroupId","type"]},"SwitchContext":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}},"tabNo":{"type":"integer"},"value":{"enum":["topFrame","iframe"],"type":"string","description":"* `topFrame` - Top Frame\n* `iframe` - Iframe"}},"required":["id","originGroupId","tabNo","type","value"]},"TypeStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"value":{"type":"string"},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","originGroupId","type","value"]},"UploadStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"projectArtifactId":{"type":"string","format":"uuid"},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","originGroupId","projectArtifactId","type"]}}},"paths":{"/api/v2/groups/":{"post":{"operationId":"v2_groups_create","description":"Create a new group.","summary":"Creating a group","parameters":[],"tags":["Groups"],"requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/V2GroupCreate"}},"application/json":{"schema":{"$ref":"#/components/schemas/V2GroupCreate"}}},"required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V2Group"}}},"description":""},"400":{"description":"Request body failed validation."},"401":{"description":"Authentication credentials were missing or invalid."}}}}}}
```

## Retrieving group by ID

> Returns a single group.

```json
{"openapi":"3.1.0","info":{"title":"BugBug.io Public API","version":"v2"},"tags":[{"name":"Groups","description":"Managing test groups"}],"security":[{"tokenAuth":[]},{"Bearer":[]}],"components":{"securitySchemes":{"tokenAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"Token-based authentication with required prefix \"Token\""}},"schemas":{"V2Group":{"type":"object","properties":{"id":{"type":"string","readOnly":true},"originGroupId":{"type":"string","format":"uuid","readOnly":true},"name":{"type":["string","null"],"readOnly":true},"isComponent":{"type":"boolean","readOnly":true},"steps":{"type":"array","items":{"$ref":"#/components/schemas/V2GroupStepResponse"},"readOnly":true}},"required":["id","isComponent","name","originGroupId","steps"]},"V2GroupStepResponse":{"oneOf":[{"$ref":"#/components/schemas/V2AnswerPromptStep"},{"$ref":"#/components/schemas/AssertStep"},{"$ref":"#/components/schemas/PastFromClipboardStep"},{"$ref":"#/components/schemas/ChangeStep"},{"$ref":"#/components/schemas/ClearStep"},{"$ref":"#/components/schemas/ClickStep"},{"$ref":"#/components/schemas/CloseTabStep"},{"$ref":"#/components/schemas/V2DragAndDropStep"},{"$ref":"#/components/schemas/ElementVisualRegressionStep"},{"$ref":"#/components/schemas/ExecuteStep"},{"$ref":"#/components/schemas/GotoStep"},{"$ref":"#/components/schemas/GoBackStep"},{"$ref":"#/components/schemas/GoForwardStep"},{"$ref":"#/components/schemas/HoverStep"},{"$ref":"#/components/schemas/IfConditionStep"},{"$ref":"#/components/schemas/MouseDownStep"},{"$ref":"#/components/schemas/MouseUpStep"},{"$ref":"#/components/schemas/NewTabStep"},{"$ref":"#/components/schemas/PageVisualRegressionStep"},{"$ref":"#/components/schemas/ReloadPageStep"},{"$ref":"#/components/schemas/ScrollStep"},{"$ref":"#/components/schemas/SelectStep"},{"$ref":"#/components/schemas/SetLocalVariableStep"},{"$ref":"#/components/schemas/SwitchContext"},{"$ref":"#/components/schemas/TypeStep"},{"$ref":"#/components/schemas/UploadStep"}],"discriminator":{"propertyName":"type","mapping":{"answerPrompt":"#/components/schemas/V2AnswerPromptStep","assert":"#/components/schemas/AssertStep","pasteFromClipboard":"#/components/schemas/PastFromClipboardStep","change":"#/components/schemas/ChangeStep","clear":"#/components/schemas/ClearStep","click":"#/components/schemas/ClickStep","closeTab":"#/components/schemas/CloseTabStep","dblClick":"#/components/schemas/ClickStep","dragAndDrop":"#/components/schemas/V2DragAndDropStep","elementVisualRegression":"#/components/schemas/ElementVisualRegressionStep","execute":"#/components/schemas/ExecuteStep","goto":"#/components/schemas/GotoStep","goBack":"#/components/schemas/GoBackStep","goForward":"#/components/schemas/GoForwardStep","hover":"#/components/schemas/HoverStep","ifCondition":"#/components/schemas/IfConditionStep","mouseDown":"#/components/schemas/MouseDownStep","mouseUp":"#/components/schemas/MouseUpStep","newTab":"#/components/schemas/NewTabStep","pageVisualRegression":"#/components/schemas/PageVisualRegressionStep","reloadPage":"#/components/schemas/ReloadPageStep","rightClick":"#/components/schemas/ClickStep","scroll":"#/components/schemas/ScrollStep","select":"#/components/schemas/SelectStep","setLocalVariable":"#/components/schemas/SetLocalVariableStep","switchContext":"#/components/schemas/SwitchContext","type":"#/components/schemas/TypeStep","uploadFile":"#/components/schemas/UploadStep"}}},"V2AnswerPromptStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"value":{"type":"string"}},"required":["id","originGroupId","type","value"]},"UpdateStepWaitingCondition":{"type":"object","properties":{"type":{"enum":["documentComplete","elementIsVisible","elementIsNotCovered","elementIsNotAnimating","elementIsNotDisabled","elementHasFocus","networkIdle","pageNavigationAfterExecution","elementHasAttribute"],"type":"string","description":"* `documentComplete` - documentComplete\n* `elementIsVisible` - elementIsVisible\n* `elementIsNotCovered` - elementIsNotCovered\n* `elementIsNotAnimating` - elementIsNotAnimating\n* `elementIsNotDisabled` - elementIsNotDisabled\n* `elementHasFocus` - elementHasFocus\n* `networkIdle` - networkIdle\n* `pageNavigationAfterExecution` - pageNavigationAfterExecution\n* `elementHasAttribute` - elementHasAttribute"},"expected":{"type":["string","null"]},"isActive":{"type":"boolean"},"isOverridden":{"type":"boolean","writeOnly":true,"description":"Required for each item when sending waitingConditions."},"timeout":{"type":["integer","null"]}},"required":["isActive","isOverridden","type"]},"AssertStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}},"continueOnFailure":{"type":"boolean","default":false},"assertionProperty":{"enum":["checked","count","customJavaScript","exist","notChecked","notExist","notVisible","textContent","value","visible","pageTitle","pageShowsText","pageDoesNotShowText","pageUrlIs","downloadStarted","variableValue","clipboardValue","disabled","notDisabled"],"type":"string","description":"* `checked` - Checked\n* `count` - Count\n* `customJavaScript` - Custom Javascript\n* `exist` - Exist\n* `notChecked` - Not Checked\n* `notExist` - Not Exist\n* `notVisible` - Not Visible\n* `textContent` - Text Content\n* `value` - Value\n* `visible` - Visible\n* `pageTitle` - Page Has Title\n* `pageShowsText` - Page Shows Text\n* `pageDoesNotShowText` - Page Does Not Show Text\n* `pageUrlIs` - Page Url Is\n* `downloadStarted` - Download Started\n* `variableValue` - Variable Value\n* `clipboardValue` - Clipboard Value\n* `disabled` - Disabled\n* `notDisabled` - Not Disabled"},"assertionType":{"enum":["contain","equal","greaterThan","lessThan","match","notContain","notEqual","any"],"type":"string","description":"* `contain` - Contain\n* `equal` - Equal\n* `greaterThan` - Greater Than\n* `lessThan` - Less Than\n* `match` - Match\n* `notContain` - Not Contain\n* `notEqual` - Not Equal\n* `any` - Any"},"assertionExpectedValue":{"type":["string","null"],"maxLength":10000},"assertionJavaScript":{"type":["string","null"],"description":"Required for assert and ifCondition steps. Send an empty string when unused."},"assertionVariableName":{"type":["string","null"],"description":"Required for assert and ifCondition steps. Send an empty string when unused."}},"required":["assertionExpectedValue","assertionJavaScript","assertionProperty","assertionType","assertionVariableName","id","originGroupId","type"]},"UpdateSelectorsPresetGroup":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"isActive":{"type":"boolean","default":false},"isCustom":{"type":"boolean","default":false},"selectorsGroups":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsGroup"}}},"required":["selectorsGroups"]},"UpdateSelectorsGroup":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"selectors":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelector"}},"relation":{"enum":["descendant","ancestor","sibling"],"type":"string","description":"* `descendant` - Descendant\n* `ancestor` - Ancestor\n* `sibling` - Sibling"}},"required":["relation","selectors"]},"UpdateSelector":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"type":{"enum":["XPath","customCSS","customXPath","",null],"type":["string","null"],"description":"* `XPath` - Xpath\n* `customCSS` - Custom Css\n* `customXPath` - Custom Xpath"},"selector":{"type":["string","null"]},"isActive":{"type":"boolean"},"score":{"type":["string","null"]}},"required":["isActive","selector","type"]},"PastFromClipboardStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","originGroupId","type"]},"ChangeStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"value":{"type":"string"},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","originGroupId","type","value"]},"ClearStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","originGroupId","type"]},"ClickStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"interactionPosition":{"enum":["smart","custom","topLeft","topCenter","topRight","middleLeft","middleCenter","middleRight","bottomLeft","bottomCenter","bottomRight"],"type":"string","description":"Required interaction target position. auto is not supported.\n\n* `smart` - Smart\n* `custom` - Custom\n* `topLeft` - Top Left\n* `topCenter` - Top Center\n* `topRight` - Top Right\n* `middleLeft` - Middle Left\n* `middleCenter` - Middle Center\n* `middleRight` - Middle Right\n* `bottomLeft` - Bottom Left\n* `bottomCenter` - Bottom Center\n* `bottomRight` - Bottom Right"},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","interactionPosition","originGroupId","type"]},"CloseTabStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}}},"required":["id","originGroupId","type"]},"V2DragAndDropStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}},"dndDropSelectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}},"dndDragOn":{"enum":["coords","element"],"type":"string","description":"* `coords` - coords\n* `element` - element"},"interactionPosition":{"enum":["smart","custom","topLeft","topCenter","topRight","middleLeft","middleCenter","middleRight","bottomLeft","bottomCenter","bottomRight"],"type":"string","description":"Required interaction target position. auto is not supported.\n\n* `smart` - Smart\n* `custom` - Custom\n* `topLeft` - Top Left\n* `topCenter` - Top Center\n* `topRight` - Top Right\n* `middleLeft` - Middle Left\n* `middleCenter` - Middle Center\n* `middleRight` - Middle Right\n* `bottomLeft` - Bottom Left\n* `bottomCenter` - Bottom Center\n* `bottomRight` - Bottom Right"},"dndDragX":{"type":["number","null"],"format":"double"},"dndDragY":{"type":["number","null"],"format":"double"},"dndDropOn":{"enum":["coords","element"],"type":"string","description":"* `coords` - coords\n* `element` - element"},"dndDropInteractionPosition":{"enum":["smart","custom","topLeft","topCenter","topRight","middleLeft","middleCenter","middleRight","bottomLeft","bottomCenter","bottomRight"],"type":"string","description":"Required interaction target position. auto is not supported.\n\n* `smart` - Smart\n* `custom` - Custom\n* `topLeft` - Top Left\n* `topCenter` - Top Center\n* `topRight` - Top Right\n* `middleLeft` - Middle Left\n* `middleCenter` - Middle Center\n* `middleRight` - Middle Right\n* `bottomLeft` - Bottom Left\n* `bottomCenter` - Bottom Center\n* `bottomRight` - Bottom Right"},"dndDropX":{"type":["number","null"],"format":"double"},"dndDropY":{"type":["number","null"],"format":"double"}},"required":["dndDragOn","dndDropInteractionPosition","dndDropOn","id","interactionPosition","originGroupId","type"]},"ElementVisualRegressionStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"visualRegressionMaxDiff":{"type":["number","null"],"format":"double","maximum":100,"minimum":0},"visualRegressionRefScreenshots":{"type":"array","items":{"type":"object","additionalProperties":{}},"readOnly":true},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","originGroupId","selectorsPresets","type","visualRegressionRefScreenshots"]},"ExecuteStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"code":{"type":"string"}},"required":["code","id","originGroupId","type"]},"GotoStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"url":{"type":"string"},"username":{"type":["string","null"]},"password":{"type":["string","null"]},"frameLocation":{"type":"string"}},"required":["id","originGroupId","type","url"]},"GoBackStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}}},"required":["id","originGroupId","type"]},"GoForwardStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}}},"required":["id","originGroupId","type"]},"HoverStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"interactionPosition":{"enum":["smart","custom","topLeft","topCenter","topRight","middleLeft","middleCenter","middleRight","bottomLeft","bottomCenter","bottomRight"],"type":"string","description":"Required interaction target position. auto is not supported.\n\n* `smart` - Smart\n* `custom` - Custom\n* `topLeft` - Top Left\n* `topCenter` - Top Center\n* `topRight` - Top Right\n* `middleLeft` - Middle Left\n* `middleCenter` - Middle Center\n* `middleRight` - Middle Right\n* `bottomLeft` - Bottom Left\n* `bottomCenter` - Bottom Center\n* `bottomRight` - Bottom Right"},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","interactionPosition","originGroupId","type"]},"IfConditionStep":{"type":"object","description":"If condition steps reuse assertion_* fields as the branch condition.","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}},"assertionProperty":{"enum":["checked","count","customJavaScript","exist","notChecked","notExist","notVisible","textContent","value","visible","pageTitle","pageShowsText","pageDoesNotShowText","pageUrlIs","downloadStarted","variableValue","clipboardValue","disabled","notDisabled"],"type":"string","description":"* `checked` - Checked\n* `count` - Count\n* `customJavaScript` - Custom Javascript\n* `exist` - Exist\n* `notChecked` - Not Checked\n* `notExist` - Not Exist\n* `notVisible` - Not Visible\n* `textContent` - Text Content\n* `value` - Value\n* `visible` - Visible\n* `pageTitle` - Page Has Title\n* `pageShowsText` - Page Shows Text\n* `pageDoesNotShowText` - Page Does Not Show Text\n* `pageUrlIs` - Page Url Is\n* `downloadStarted` - Download Started\n* `variableValue` - Variable Value\n* `clipboardValue` - Clipboard Value\n* `disabled` - Disabled\n* `notDisabled` - Not Disabled"},"assertionType":{"enum":["contain","equal","greaterThan","lessThan","match","notContain","notEqual","any"],"type":"string","description":"* `contain` - Contain\n* `equal` - Equal\n* `greaterThan` - Greater Than\n* `lessThan` - Less Than\n* `match` - Match\n* `notContain` - Not Contain\n* `notEqual` - Not Equal\n* `any` - Any"},"assertionExpectedValue":{"type":["string","null"],"maxLength":10000},"assertionJavaScript":{"type":["string","null"],"description":"Required for assert and ifCondition steps. Send an empty string when unused."},"assertionVariableName":{"type":["string","null"],"description":"Required for assert and ifCondition steps. Send an empty string when unused."}},"required":["assertionExpectedValue","assertionJavaScript","assertionProperty","assertionType","assertionVariableName","id","originGroupId","type"]},"MouseDownStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"interactionPosition":{"enum":["smart","custom","topLeft","topCenter","topRight","middleLeft","middleCenter","middleRight","bottomLeft","bottomCenter","bottomRight"],"type":"string","description":"Required interaction target position. auto is not supported.\n\n* `smart` - Smart\n* `custom` - Custom\n* `topLeft` - Top Left\n* `topCenter` - Top Center\n* `topRight` - Top Right\n* `middleLeft` - Middle Left\n* `middleCenter` - Middle Center\n* `middleRight` - Middle Right\n* `bottomLeft` - Bottom Left\n* `bottomCenter` - Bottom Center\n* `bottomRight` - Bottom Right"},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","interactionPosition","originGroupId","type"]},"MouseUpStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"interactionPosition":{"enum":["smart","custom","topLeft","topCenter","topRight","middleLeft","middleCenter","middleRight","bottomLeft","bottomCenter","bottomRight"],"type":"string","description":"Required interaction target position. auto is not supported.\n\n* `smart` - Smart\n* `custom` - Custom\n* `topLeft` - Top Left\n* `topCenter` - Top Center\n* `topRight` - Top Right\n* `middleLeft` - Middle Left\n* `middleCenter` - Middle Center\n* `middleRight` - Middle Right\n* `bottomLeft` - Bottom Left\n* `bottomCenter` - Bottom Center\n* `bottomRight` - Bottom Right"},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","interactionPosition","originGroupId","type"]},"NewTabStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"url":{"type":["string","null"]},"username":{"type":["string","null"]},"password":{"type":["string","null"]}},"required":["id","originGroupId","type"]},"PageVisualRegressionStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"visualRegressionMaxDiff":{"type":["number","null"],"format":"double","maximum":100,"minimum":0},"visualRegressionRefScreenshots":{"type":"array","items":{"type":"object","additionalProperties":{}},"readOnly":true}},"required":["id","originGroupId","type","visualRegressionRefScreenshots"]},"ReloadPageStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}}},"required":["id","originGroupId","type"]},"ScrollStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}},"scrollX":{"type":["number","null"],"format":"double"},"scrollY":{"type":["number","null"],"format":"double"},"scrollEdge":{"enum":["topLeft","topCenter","topRight","middleLeft","middleCenter","middleRight","bottomLeft","bottomCenter","bottomRight",null],"type":["string","null"],"description":"* `topLeft` - Top Left\n* `topCenter` - Top Center\n* `topRight` - Top Right\n* `middleLeft` - Middle Left\n* `middleCenter` - Middle Center\n* `middleRight` - Middle Right\n* `bottomLeft` - Bottom Left\n* `bottomCenter` - Bottom Center\n* `bottomRight` - Bottom Right"},"scrollDirection":{"enum":["down","up","right","left",null],"type":["string","null"],"description":"* `down` - Down\n* `up` - Up\n* `right` - Right\n* `left` - Left"},"scrollTo":{"enum":["coords","edge","untilNextStepElementIsVisible","elementIntoView"],"type":"string","description":"* `coords` - Coords\n* `edge` - Edge\n* `untilNextStepElementIsVisible` - Until Next Step Element Is Visible\n* `elementIntoView` - Element Into View"},"scrollInside":{"enum":["window","element"],"type":"string","description":"* `window` - window\n* `element` - element"}},"required":["id","originGroupId","scrollInside","scrollTo","type"]},"SelectStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}},"value":{"type":"string"},"selectType":{"enum":["text","index","value"],"type":"string","description":"* `text` - text\n* `index` - index\n* `value` - value"},"selectIsMultiple":{"type":"boolean","default":false}},"required":["id","originGroupId","selectType","type","value"]},"SetLocalVariableStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}},"value":{"type":"string"},"code":{"type":["string","null"]},"localVariableName":{"type":"string"},"localVariableSource":{"enum":["element","value","evaluate"],"type":"string","description":"* `element` - element\n* `value` - value\n* `evaluate` - evaluate"}},"required":["id","localVariableName","localVariableSource","originGroupId","type"]},"SwitchContext":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}},"tabNo":{"type":"integer"},"value":{"enum":["topFrame","iframe"],"type":"string","description":"* `topFrame` - Top Frame\n* `iframe` - Iframe"}},"required":["id","originGroupId","tabNo","type","value"]},"TypeStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"value":{"type":"string"},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","originGroupId","type","value"]},"UploadStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"projectArtifactId":{"type":"string","format":"uuid"},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","originGroupId","projectArtifactId","type"]}}},"paths":{"/api/v2/groups/{id}/":{"get":{"operationId":"v2_groups_retrieve","description":"Returns a single group.","summary":"Retrieving group by ID","parameters":[{"in":"path","name":"id","schema":{"type":"string","format":"uuid"},"description":"A UUID string identifying this group.","required":true}],"tags":["Groups"],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V2Group"}}},"description":""},"401":{"description":"Authentication credentials were missing or invalid."},"404":{"description":"Resource not found."}}}}}}
```

## Updating a group

> Update a group.

```json
{"openapi":"3.1.0","info":{"title":"BugBug.io Public API","version":"v2"},"tags":[{"name":"Groups","description":"Managing test groups"}],"security":[{"tokenAuth":[]},{"Bearer":[]}],"components":{"securitySchemes":{"tokenAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"Token-based authentication with required prefix \"Token\""}},"schemas":{"V2GroupUpdate":{"type":"object","properties":{"name":{"type":["string","null"],"maxLength":255},"isActive":{"type":"boolean"},"isComponent":{"type":"boolean"}}},"V2Group":{"type":"object","properties":{"id":{"type":"string","readOnly":true},"originGroupId":{"type":"string","format":"uuid","readOnly":true},"name":{"type":["string","null"],"readOnly":true},"isComponent":{"type":"boolean","readOnly":true},"steps":{"type":"array","items":{"$ref":"#/components/schemas/V2GroupStepResponse"},"readOnly":true}},"required":["id","isComponent","name","originGroupId","steps"]},"V2GroupStepResponse":{"oneOf":[{"$ref":"#/components/schemas/V2AnswerPromptStep"},{"$ref":"#/components/schemas/AssertStep"},{"$ref":"#/components/schemas/PastFromClipboardStep"},{"$ref":"#/components/schemas/ChangeStep"},{"$ref":"#/components/schemas/ClearStep"},{"$ref":"#/components/schemas/ClickStep"},{"$ref":"#/components/schemas/CloseTabStep"},{"$ref":"#/components/schemas/V2DragAndDropStep"},{"$ref":"#/components/schemas/ElementVisualRegressionStep"},{"$ref":"#/components/schemas/ExecuteStep"},{"$ref":"#/components/schemas/GotoStep"},{"$ref":"#/components/schemas/GoBackStep"},{"$ref":"#/components/schemas/GoForwardStep"},{"$ref":"#/components/schemas/HoverStep"},{"$ref":"#/components/schemas/IfConditionStep"},{"$ref":"#/components/schemas/MouseDownStep"},{"$ref":"#/components/schemas/MouseUpStep"},{"$ref":"#/components/schemas/NewTabStep"},{"$ref":"#/components/schemas/PageVisualRegressionStep"},{"$ref":"#/components/schemas/ReloadPageStep"},{"$ref":"#/components/schemas/ScrollStep"},{"$ref":"#/components/schemas/SelectStep"},{"$ref":"#/components/schemas/SetLocalVariableStep"},{"$ref":"#/components/schemas/SwitchContext"},{"$ref":"#/components/schemas/TypeStep"},{"$ref":"#/components/schemas/UploadStep"}],"discriminator":{"propertyName":"type","mapping":{"answerPrompt":"#/components/schemas/V2AnswerPromptStep","assert":"#/components/schemas/AssertStep","pasteFromClipboard":"#/components/schemas/PastFromClipboardStep","change":"#/components/schemas/ChangeStep","clear":"#/components/schemas/ClearStep","click":"#/components/schemas/ClickStep","closeTab":"#/components/schemas/CloseTabStep","dblClick":"#/components/schemas/ClickStep","dragAndDrop":"#/components/schemas/V2DragAndDropStep","elementVisualRegression":"#/components/schemas/ElementVisualRegressionStep","execute":"#/components/schemas/ExecuteStep","goto":"#/components/schemas/GotoStep","goBack":"#/components/schemas/GoBackStep","goForward":"#/components/schemas/GoForwardStep","hover":"#/components/schemas/HoverStep","ifCondition":"#/components/schemas/IfConditionStep","mouseDown":"#/components/schemas/MouseDownStep","mouseUp":"#/components/schemas/MouseUpStep","newTab":"#/components/schemas/NewTabStep","pageVisualRegression":"#/components/schemas/PageVisualRegressionStep","reloadPage":"#/components/schemas/ReloadPageStep","rightClick":"#/components/schemas/ClickStep","scroll":"#/components/schemas/ScrollStep","select":"#/components/schemas/SelectStep","setLocalVariable":"#/components/schemas/SetLocalVariableStep","switchContext":"#/components/schemas/SwitchContext","type":"#/components/schemas/TypeStep","uploadFile":"#/components/schemas/UploadStep"}}},"V2AnswerPromptStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"value":{"type":"string"}},"required":["id","originGroupId","type","value"]},"UpdateStepWaitingCondition":{"type":"object","properties":{"type":{"enum":["documentComplete","elementIsVisible","elementIsNotCovered","elementIsNotAnimating","elementIsNotDisabled","elementHasFocus","networkIdle","pageNavigationAfterExecution","elementHasAttribute"],"type":"string","description":"* `documentComplete` - documentComplete\n* `elementIsVisible` - elementIsVisible\n* `elementIsNotCovered` - elementIsNotCovered\n* `elementIsNotAnimating` - elementIsNotAnimating\n* `elementIsNotDisabled` - elementIsNotDisabled\n* `elementHasFocus` - elementHasFocus\n* `networkIdle` - networkIdle\n* `pageNavigationAfterExecution` - pageNavigationAfterExecution\n* `elementHasAttribute` - elementHasAttribute"},"expected":{"type":["string","null"]},"isActive":{"type":"boolean"},"isOverridden":{"type":"boolean","writeOnly":true,"description":"Required for each item when sending waitingConditions."},"timeout":{"type":["integer","null"]}},"required":["isActive","isOverridden","type"]},"AssertStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}},"continueOnFailure":{"type":"boolean","default":false},"assertionProperty":{"enum":["checked","count","customJavaScript","exist","notChecked","notExist","notVisible","textContent","value","visible","pageTitle","pageShowsText","pageDoesNotShowText","pageUrlIs","downloadStarted","variableValue","clipboardValue","disabled","notDisabled"],"type":"string","description":"* `checked` - Checked\n* `count` - Count\n* `customJavaScript` - Custom Javascript\n* `exist` - Exist\n* `notChecked` - Not Checked\n* `notExist` - Not Exist\n* `notVisible` - Not Visible\n* `textContent` - Text Content\n* `value` - Value\n* `visible` - Visible\n* `pageTitle` - Page Has Title\n* `pageShowsText` - Page Shows Text\n* `pageDoesNotShowText` - Page Does Not Show Text\n* `pageUrlIs` - Page Url Is\n* `downloadStarted` - Download Started\n* `variableValue` - Variable Value\n* `clipboardValue` - Clipboard Value\n* `disabled` - Disabled\n* `notDisabled` - Not Disabled"},"assertionType":{"enum":["contain","equal","greaterThan","lessThan","match","notContain","notEqual","any"],"type":"string","description":"* `contain` - Contain\n* `equal` - Equal\n* `greaterThan` - Greater Than\n* `lessThan` - Less Than\n* `match` - Match\n* `notContain` - Not Contain\n* `notEqual` - Not Equal\n* `any` - Any"},"assertionExpectedValue":{"type":["string","null"],"maxLength":10000},"assertionJavaScript":{"type":["string","null"],"description":"Required for assert and ifCondition steps. Send an empty string when unused."},"assertionVariableName":{"type":["string","null"],"description":"Required for assert and ifCondition steps. Send an empty string when unused."}},"required":["assertionExpectedValue","assertionJavaScript","assertionProperty","assertionType","assertionVariableName","id","originGroupId","type"]},"UpdateSelectorsPresetGroup":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"isActive":{"type":"boolean","default":false},"isCustom":{"type":"boolean","default":false},"selectorsGroups":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsGroup"}}},"required":["selectorsGroups"]},"UpdateSelectorsGroup":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"selectors":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelector"}},"relation":{"enum":["descendant","ancestor","sibling"],"type":"string","description":"* `descendant` - Descendant\n* `ancestor` - Ancestor\n* `sibling` - Sibling"}},"required":["relation","selectors"]},"UpdateSelector":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"type":{"enum":["XPath","customCSS","customXPath","",null],"type":["string","null"],"description":"* `XPath` - Xpath\n* `customCSS` - Custom Css\n* `customXPath` - Custom Xpath"},"selector":{"type":["string","null"]},"isActive":{"type":"boolean"},"score":{"type":["string","null"]}},"required":["isActive","selector","type"]},"PastFromClipboardStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","originGroupId","type"]},"ChangeStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"value":{"type":"string"},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","originGroupId","type","value"]},"ClearStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","originGroupId","type"]},"ClickStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"interactionPosition":{"enum":["smart","custom","topLeft","topCenter","topRight","middleLeft","middleCenter","middleRight","bottomLeft","bottomCenter","bottomRight"],"type":"string","description":"Required interaction target position. auto is not supported.\n\n* `smart` - Smart\n* `custom` - Custom\n* `topLeft` - Top Left\n* `topCenter` - Top Center\n* `topRight` - Top Right\n* `middleLeft` - Middle Left\n* `middleCenter` - Middle Center\n* `middleRight` - Middle Right\n* `bottomLeft` - Bottom Left\n* `bottomCenter` - Bottom Center\n* `bottomRight` - Bottom Right"},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","interactionPosition","originGroupId","type"]},"CloseTabStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}}},"required":["id","originGroupId","type"]},"V2DragAndDropStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}},"dndDropSelectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}},"dndDragOn":{"enum":["coords","element"],"type":"string","description":"* `coords` - coords\n* `element` - element"},"interactionPosition":{"enum":["smart","custom","topLeft","topCenter","topRight","middleLeft","middleCenter","middleRight","bottomLeft","bottomCenter","bottomRight"],"type":"string","description":"Required interaction target position. auto is not supported.\n\n* `smart` - Smart\n* `custom` - Custom\n* `topLeft` - Top Left\n* `topCenter` - Top Center\n* `topRight` - Top Right\n* `middleLeft` - Middle Left\n* `middleCenter` - Middle Center\n* `middleRight` - Middle Right\n* `bottomLeft` - Bottom Left\n* `bottomCenter` - Bottom Center\n* `bottomRight` - Bottom Right"},"dndDragX":{"type":["number","null"],"format":"double"},"dndDragY":{"type":["number","null"],"format":"double"},"dndDropOn":{"enum":["coords","element"],"type":"string","description":"* `coords` - coords\n* `element` - element"},"dndDropInteractionPosition":{"enum":["smart","custom","topLeft","topCenter","topRight","middleLeft","middleCenter","middleRight","bottomLeft","bottomCenter","bottomRight"],"type":"string","description":"Required interaction target position. auto is not supported.\n\n* `smart` - Smart\n* `custom` - Custom\n* `topLeft` - Top Left\n* `topCenter` - Top Center\n* `topRight` - Top Right\n* `middleLeft` - Middle Left\n* `middleCenter` - Middle Center\n* `middleRight` - Middle Right\n* `bottomLeft` - Bottom Left\n* `bottomCenter` - Bottom Center\n* `bottomRight` - Bottom Right"},"dndDropX":{"type":["number","null"],"format":"double"},"dndDropY":{"type":["number","null"],"format":"double"}},"required":["dndDragOn","dndDropInteractionPosition","dndDropOn","id","interactionPosition","originGroupId","type"]},"ElementVisualRegressionStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"visualRegressionMaxDiff":{"type":["number","null"],"format":"double","maximum":100,"minimum":0},"visualRegressionRefScreenshots":{"type":"array","items":{"type":"object","additionalProperties":{}},"readOnly":true},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","originGroupId","selectorsPresets","type","visualRegressionRefScreenshots"]},"ExecuteStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"code":{"type":"string"}},"required":["code","id","originGroupId","type"]},"GotoStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"url":{"type":"string"},"username":{"type":["string","null"]},"password":{"type":["string","null"]},"frameLocation":{"type":"string"}},"required":["id","originGroupId","type","url"]},"GoBackStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}}},"required":["id","originGroupId","type"]},"GoForwardStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}}},"required":["id","originGroupId","type"]},"HoverStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"interactionPosition":{"enum":["smart","custom","topLeft","topCenter","topRight","middleLeft","middleCenter","middleRight","bottomLeft","bottomCenter","bottomRight"],"type":"string","description":"Required interaction target position. auto is not supported.\n\n* `smart` - Smart\n* `custom` - Custom\n* `topLeft` - Top Left\n* `topCenter` - Top Center\n* `topRight` - Top Right\n* `middleLeft` - Middle Left\n* `middleCenter` - Middle Center\n* `middleRight` - Middle Right\n* `bottomLeft` - Bottom Left\n* `bottomCenter` - Bottom Center\n* `bottomRight` - Bottom Right"},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","interactionPosition","originGroupId","type"]},"IfConditionStep":{"type":"object","description":"If condition steps reuse assertion_* fields as the branch condition.","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}},"assertionProperty":{"enum":["checked","count","customJavaScript","exist","notChecked","notExist","notVisible","textContent","value","visible","pageTitle","pageShowsText","pageDoesNotShowText","pageUrlIs","downloadStarted","variableValue","clipboardValue","disabled","notDisabled"],"type":"string","description":"* `checked` - Checked\n* `count` - Count\n* `customJavaScript` - Custom Javascript\n* `exist` - Exist\n* `notChecked` - Not Checked\n* `notExist` - Not Exist\n* `notVisible` - Not Visible\n* `textContent` - Text Content\n* `value` - Value\n* `visible` - Visible\n* `pageTitle` - Page Has Title\n* `pageShowsText` - Page Shows Text\n* `pageDoesNotShowText` - Page Does Not Show Text\n* `pageUrlIs` - Page Url Is\n* `downloadStarted` - Download Started\n* `variableValue` - Variable Value\n* `clipboardValue` - Clipboard Value\n* `disabled` - Disabled\n* `notDisabled` - Not Disabled"},"assertionType":{"enum":["contain","equal","greaterThan","lessThan","match","notContain","notEqual","any"],"type":"string","description":"* `contain` - Contain\n* `equal` - Equal\n* `greaterThan` - Greater Than\n* `lessThan` - Less Than\n* `match` - Match\n* `notContain` - Not Contain\n* `notEqual` - Not Equal\n* `any` - Any"},"assertionExpectedValue":{"type":["string","null"],"maxLength":10000},"assertionJavaScript":{"type":["string","null"],"description":"Required for assert and ifCondition steps. Send an empty string when unused."},"assertionVariableName":{"type":["string","null"],"description":"Required for assert and ifCondition steps. Send an empty string when unused."}},"required":["assertionExpectedValue","assertionJavaScript","assertionProperty","assertionType","assertionVariableName","id","originGroupId","type"]},"MouseDownStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"interactionPosition":{"enum":["smart","custom","topLeft","topCenter","topRight","middleLeft","middleCenter","middleRight","bottomLeft","bottomCenter","bottomRight"],"type":"string","description":"Required interaction target position. auto is not supported.\n\n* `smart` - Smart\n* `custom` - Custom\n* `topLeft` - Top Left\n* `topCenter` - Top Center\n* `topRight` - Top Right\n* `middleLeft` - Middle Left\n* `middleCenter` - Middle Center\n* `middleRight` - Middle Right\n* `bottomLeft` - Bottom Left\n* `bottomCenter` - Bottom Center\n* `bottomRight` - Bottom Right"},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","interactionPosition","originGroupId","type"]},"MouseUpStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"interactionPosition":{"enum":["smart","custom","topLeft","topCenter","topRight","middleLeft","middleCenter","middleRight","bottomLeft","bottomCenter","bottomRight"],"type":"string","description":"Required interaction target position. auto is not supported.\n\n* `smart` - Smart\n* `custom` - Custom\n* `topLeft` - Top Left\n* `topCenter` - Top Center\n* `topRight` - Top Right\n* `middleLeft` - Middle Left\n* `middleCenter` - Middle Center\n* `middleRight` - Middle Right\n* `bottomLeft` - Bottom Left\n* `bottomCenter` - Bottom Center\n* `bottomRight` - Bottom Right"},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","interactionPosition","originGroupId","type"]},"NewTabStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"url":{"type":["string","null"]},"username":{"type":["string","null"]},"password":{"type":["string","null"]}},"required":["id","originGroupId","type"]},"PageVisualRegressionStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"visualRegressionMaxDiff":{"type":["number","null"],"format":"double","maximum":100,"minimum":0},"visualRegressionRefScreenshots":{"type":"array","items":{"type":"object","additionalProperties":{}},"readOnly":true}},"required":["id","originGroupId","type","visualRegressionRefScreenshots"]},"ReloadPageStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}}},"required":["id","originGroupId","type"]},"ScrollStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}},"scrollX":{"type":["number","null"],"format":"double"},"scrollY":{"type":["number","null"],"format":"double"},"scrollEdge":{"enum":["topLeft","topCenter","topRight","middleLeft","middleCenter","middleRight","bottomLeft","bottomCenter","bottomRight",null],"type":["string","null"],"description":"* `topLeft` - Top Left\n* `topCenter` - Top Center\n* `topRight` - Top Right\n* `middleLeft` - Middle Left\n* `middleCenter` - Middle Center\n* `middleRight` - Middle Right\n* `bottomLeft` - Bottom Left\n* `bottomCenter` - Bottom Center\n* `bottomRight` - Bottom Right"},"scrollDirection":{"enum":["down","up","right","left",null],"type":["string","null"],"description":"* `down` - Down\n* `up` - Up\n* `right` - Right\n* `left` - Left"},"scrollTo":{"enum":["coords","edge","untilNextStepElementIsVisible","elementIntoView"],"type":"string","description":"* `coords` - Coords\n* `edge` - Edge\n* `untilNextStepElementIsVisible` - Until Next Step Element Is Visible\n* `elementIntoView` - Element Into View"},"scrollInside":{"enum":["window","element"],"type":"string","description":"* `window` - window\n* `element` - element"}},"required":["id","originGroupId","scrollInside","scrollTo","type"]},"SelectStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}},"value":{"type":"string"},"selectType":{"enum":["text","index","value"],"type":"string","description":"* `text` - text\n* `index` - index\n* `value` - value"},"selectIsMultiple":{"type":"boolean","default":false}},"required":["id","originGroupId","selectType","type","value"]},"SetLocalVariableStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}},"value":{"type":"string"},"code":{"type":["string","null"]},"localVariableName":{"type":"string"},"localVariableSource":{"enum":["element","value","evaluate"],"type":"string","description":"* `element` - element\n* `value` - value\n* `evaluate` - evaluate"}},"required":["id","localVariableName","localVariableSource","originGroupId","type"]},"SwitchContext":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}},"tabNo":{"type":"integer"},"value":{"enum":["topFrame","iframe"],"type":"string","description":"* `topFrame` - Top Frame\n* `iframe` - Iframe"}},"required":["id","originGroupId","tabNo","type","value"]},"TypeStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"value":{"type":"string"},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","originGroupId","type","value"]},"UploadStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"projectArtifactId":{"type":"string","format":"uuid"},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","originGroupId","projectArtifactId","type"]}}},"paths":{"/api/v2/groups/{id}/":{"put":{"operationId":"v2_groups_update","description":"Update a group.","summary":"Updating a group","parameters":[{"in":"path","name":"id","schema":{"type":"string","format":"uuid"},"description":"A UUID string identifying this group.","required":true}],"tags":["Groups"],"requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/V2GroupUpdate"}},"application/json":{"schema":{"$ref":"#/components/schemas/V2GroupUpdate"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V2Group"}}},"description":""},"400":{"description":"Request body failed validation."},"401":{"description":"Authentication credentials were missing or invalid."},"404":{"description":"Resource not found."}}}}}}
```

## Removing a group

> Remove a group.

```json
{"openapi":"3.1.0","info":{"title":"BugBug.io Public API","version":"v2"},"tags":[{"name":"Groups","description":"Managing test groups"}],"security":[{"tokenAuth":[]},{"Bearer":[]}],"components":{"securitySchemes":{"tokenAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"Token-based authentication with required prefix \"Token\""}}},"paths":{"/api/v2/groups/{id}/":{"delete":{"operationId":"v2_groups_destroy","description":"Remove a group.","summary":"Removing a group","parameters":[{"in":"path","name":"id","schema":{"type":"string","format":"uuid"},"description":"A UUID string identifying this group.","required":true}],"tags":["Groups"],"responses":{"204":{"description":"No response body"},"401":{"description":"Authentication credentials were missing or invalid."},"404":{"description":"Resource not found."}}}}}}
```

## Partially updating a group

> Partially update a group.

```json
{"openapi":"3.1.0","info":{"title":"BugBug.io Public API","version":"v2"},"tags":[{"name":"Groups","description":"Managing test groups"}],"security":[{"tokenAuth":[]},{"Bearer":[]}],"components":{"securitySchemes":{"tokenAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"Token-based authentication with required prefix \"Token\""}},"schemas":{"PatchedV2GroupUpdate":{"type":"object","properties":{"name":{"type":["string","null"],"maxLength":255},"isActive":{"type":"boolean"},"isComponent":{"type":"boolean"}}},"V2Group":{"type":"object","properties":{"id":{"type":"string","readOnly":true},"originGroupId":{"type":"string","format":"uuid","readOnly":true},"name":{"type":["string","null"],"readOnly":true},"isComponent":{"type":"boolean","readOnly":true},"steps":{"type":"array","items":{"$ref":"#/components/schemas/V2GroupStepResponse"},"readOnly":true}},"required":["id","isComponent","name","originGroupId","steps"]},"V2GroupStepResponse":{"oneOf":[{"$ref":"#/components/schemas/V2AnswerPromptStep"},{"$ref":"#/components/schemas/AssertStep"},{"$ref":"#/components/schemas/PastFromClipboardStep"},{"$ref":"#/components/schemas/ChangeStep"},{"$ref":"#/components/schemas/ClearStep"},{"$ref":"#/components/schemas/ClickStep"},{"$ref":"#/components/schemas/CloseTabStep"},{"$ref":"#/components/schemas/V2DragAndDropStep"},{"$ref":"#/components/schemas/ElementVisualRegressionStep"},{"$ref":"#/components/schemas/ExecuteStep"},{"$ref":"#/components/schemas/GotoStep"},{"$ref":"#/components/schemas/GoBackStep"},{"$ref":"#/components/schemas/GoForwardStep"},{"$ref":"#/components/schemas/HoverStep"},{"$ref":"#/components/schemas/IfConditionStep"},{"$ref":"#/components/schemas/MouseDownStep"},{"$ref":"#/components/schemas/MouseUpStep"},{"$ref":"#/components/schemas/NewTabStep"},{"$ref":"#/components/schemas/PageVisualRegressionStep"},{"$ref":"#/components/schemas/ReloadPageStep"},{"$ref":"#/components/schemas/ScrollStep"},{"$ref":"#/components/schemas/SelectStep"},{"$ref":"#/components/schemas/SetLocalVariableStep"},{"$ref":"#/components/schemas/SwitchContext"},{"$ref":"#/components/schemas/TypeStep"},{"$ref":"#/components/schemas/UploadStep"}],"discriminator":{"propertyName":"type","mapping":{"answerPrompt":"#/components/schemas/V2AnswerPromptStep","assert":"#/components/schemas/AssertStep","pasteFromClipboard":"#/components/schemas/PastFromClipboardStep","change":"#/components/schemas/ChangeStep","clear":"#/components/schemas/ClearStep","click":"#/components/schemas/ClickStep","closeTab":"#/components/schemas/CloseTabStep","dblClick":"#/components/schemas/ClickStep","dragAndDrop":"#/components/schemas/V2DragAndDropStep","elementVisualRegression":"#/components/schemas/ElementVisualRegressionStep","execute":"#/components/schemas/ExecuteStep","goto":"#/components/schemas/GotoStep","goBack":"#/components/schemas/GoBackStep","goForward":"#/components/schemas/GoForwardStep","hover":"#/components/schemas/HoverStep","ifCondition":"#/components/schemas/IfConditionStep","mouseDown":"#/components/schemas/MouseDownStep","mouseUp":"#/components/schemas/MouseUpStep","newTab":"#/components/schemas/NewTabStep","pageVisualRegression":"#/components/schemas/PageVisualRegressionStep","reloadPage":"#/components/schemas/ReloadPageStep","rightClick":"#/components/schemas/ClickStep","scroll":"#/components/schemas/ScrollStep","select":"#/components/schemas/SelectStep","setLocalVariable":"#/components/schemas/SetLocalVariableStep","switchContext":"#/components/schemas/SwitchContext","type":"#/components/schemas/TypeStep","uploadFile":"#/components/schemas/UploadStep"}}},"V2AnswerPromptStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"value":{"type":"string"}},"required":["id","originGroupId","type","value"]},"UpdateStepWaitingCondition":{"type":"object","properties":{"type":{"enum":["documentComplete","elementIsVisible","elementIsNotCovered","elementIsNotAnimating","elementIsNotDisabled","elementHasFocus","networkIdle","pageNavigationAfterExecution","elementHasAttribute"],"type":"string","description":"* `documentComplete` - documentComplete\n* `elementIsVisible` - elementIsVisible\n* `elementIsNotCovered` - elementIsNotCovered\n* `elementIsNotAnimating` - elementIsNotAnimating\n* `elementIsNotDisabled` - elementIsNotDisabled\n* `elementHasFocus` - elementHasFocus\n* `networkIdle` - networkIdle\n* `pageNavigationAfterExecution` - pageNavigationAfterExecution\n* `elementHasAttribute` - elementHasAttribute"},"expected":{"type":["string","null"]},"isActive":{"type":"boolean"},"isOverridden":{"type":"boolean","writeOnly":true,"description":"Required for each item when sending waitingConditions."},"timeout":{"type":["integer","null"]}},"required":["isActive","isOverridden","type"]},"AssertStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}},"continueOnFailure":{"type":"boolean","default":false},"assertionProperty":{"enum":["checked","count","customJavaScript","exist","notChecked","notExist","notVisible","textContent","value","visible","pageTitle","pageShowsText","pageDoesNotShowText","pageUrlIs","downloadStarted","variableValue","clipboardValue","disabled","notDisabled"],"type":"string","description":"* `checked` - Checked\n* `count` - Count\n* `customJavaScript` - Custom Javascript\n* `exist` - Exist\n* `notChecked` - Not Checked\n* `notExist` - Not Exist\n* `notVisible` - Not Visible\n* `textContent` - Text Content\n* `value` - Value\n* `visible` - Visible\n* `pageTitle` - Page Has Title\n* `pageShowsText` - Page Shows Text\n* `pageDoesNotShowText` - Page Does Not Show Text\n* `pageUrlIs` - Page Url Is\n* `downloadStarted` - Download Started\n* `variableValue` - Variable Value\n* `clipboardValue` - Clipboard Value\n* `disabled` - Disabled\n* `notDisabled` - Not Disabled"},"assertionType":{"enum":["contain","equal","greaterThan","lessThan","match","notContain","notEqual","any"],"type":"string","description":"* `contain` - Contain\n* `equal` - Equal\n* `greaterThan` - Greater Than\n* `lessThan` - Less Than\n* `match` - Match\n* `notContain` - Not Contain\n* `notEqual` - Not Equal\n* `any` - Any"},"assertionExpectedValue":{"type":["string","null"],"maxLength":10000},"assertionJavaScript":{"type":["string","null"],"description":"Required for assert and ifCondition steps. Send an empty string when unused."},"assertionVariableName":{"type":["string","null"],"description":"Required for assert and ifCondition steps. Send an empty string when unused."}},"required":["assertionExpectedValue","assertionJavaScript","assertionProperty","assertionType","assertionVariableName","id","originGroupId","type"]},"UpdateSelectorsPresetGroup":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"isActive":{"type":"boolean","default":false},"isCustom":{"type":"boolean","default":false},"selectorsGroups":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsGroup"}}},"required":["selectorsGroups"]},"UpdateSelectorsGroup":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"selectors":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelector"}},"relation":{"enum":["descendant","ancestor","sibling"],"type":"string","description":"* `descendant` - Descendant\n* `ancestor` - Ancestor\n* `sibling` - Sibling"}},"required":["relation","selectors"]},"UpdateSelector":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"type":{"enum":["XPath","customCSS","customXPath","",null],"type":["string","null"],"description":"* `XPath` - Xpath\n* `customCSS` - Custom Css\n* `customXPath` - Custom Xpath"},"selector":{"type":["string","null"]},"isActive":{"type":"boolean"},"score":{"type":["string","null"]}},"required":["isActive","selector","type"]},"PastFromClipboardStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","originGroupId","type"]},"ChangeStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"value":{"type":"string"},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","originGroupId","type","value"]},"ClearStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","originGroupId","type"]},"ClickStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"interactionPosition":{"enum":["smart","custom","topLeft","topCenter","topRight","middleLeft","middleCenter","middleRight","bottomLeft","bottomCenter","bottomRight"],"type":"string","description":"Required interaction target position. auto is not supported.\n\n* `smart` - Smart\n* `custom` - Custom\n* `topLeft` - Top Left\n* `topCenter` - Top Center\n* `topRight` - Top Right\n* `middleLeft` - Middle Left\n* `middleCenter` - Middle Center\n* `middleRight` - Middle Right\n* `bottomLeft` - Bottom Left\n* `bottomCenter` - Bottom Center\n* `bottomRight` - Bottom Right"},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","interactionPosition","originGroupId","type"]},"CloseTabStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}}},"required":["id","originGroupId","type"]},"V2DragAndDropStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}},"dndDropSelectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}},"dndDragOn":{"enum":["coords","element"],"type":"string","description":"* `coords` - coords\n* `element` - element"},"interactionPosition":{"enum":["smart","custom","topLeft","topCenter","topRight","middleLeft","middleCenter","middleRight","bottomLeft","bottomCenter","bottomRight"],"type":"string","description":"Required interaction target position. auto is not supported.\n\n* `smart` - Smart\n* `custom` - Custom\n* `topLeft` - Top Left\n* `topCenter` - Top Center\n* `topRight` - Top Right\n* `middleLeft` - Middle Left\n* `middleCenter` - Middle Center\n* `middleRight` - Middle Right\n* `bottomLeft` - Bottom Left\n* `bottomCenter` - Bottom Center\n* `bottomRight` - Bottom Right"},"dndDragX":{"type":["number","null"],"format":"double"},"dndDragY":{"type":["number","null"],"format":"double"},"dndDropOn":{"enum":["coords","element"],"type":"string","description":"* `coords` - coords\n* `element` - element"},"dndDropInteractionPosition":{"enum":["smart","custom","topLeft","topCenter","topRight","middleLeft","middleCenter","middleRight","bottomLeft","bottomCenter","bottomRight"],"type":"string","description":"Required interaction target position. auto is not supported.\n\n* `smart` - Smart\n* `custom` - Custom\n* `topLeft` - Top Left\n* `topCenter` - Top Center\n* `topRight` - Top Right\n* `middleLeft` - Middle Left\n* `middleCenter` - Middle Center\n* `middleRight` - Middle Right\n* `bottomLeft` - Bottom Left\n* `bottomCenter` - Bottom Center\n* `bottomRight` - Bottom Right"},"dndDropX":{"type":["number","null"],"format":"double"},"dndDropY":{"type":["number","null"],"format":"double"}},"required":["dndDragOn","dndDropInteractionPosition","dndDropOn","id","interactionPosition","originGroupId","type"]},"ElementVisualRegressionStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"visualRegressionMaxDiff":{"type":["number","null"],"format":"double","maximum":100,"minimum":0},"visualRegressionRefScreenshots":{"type":"array","items":{"type":"object","additionalProperties":{}},"readOnly":true},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","originGroupId","selectorsPresets","type","visualRegressionRefScreenshots"]},"ExecuteStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"code":{"type":"string"}},"required":["code","id","originGroupId","type"]},"GotoStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"url":{"type":"string"},"username":{"type":["string","null"]},"password":{"type":["string","null"]},"frameLocation":{"type":"string"}},"required":["id","originGroupId","type","url"]},"GoBackStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}}},"required":["id","originGroupId","type"]},"GoForwardStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}}},"required":["id","originGroupId","type"]},"HoverStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"interactionPosition":{"enum":["smart","custom","topLeft","topCenter","topRight","middleLeft","middleCenter","middleRight","bottomLeft","bottomCenter","bottomRight"],"type":"string","description":"Required interaction target position. auto is not supported.\n\n* `smart` - Smart\n* `custom` - Custom\n* `topLeft` - Top Left\n* `topCenter` - Top Center\n* `topRight` - Top Right\n* `middleLeft` - Middle Left\n* `middleCenter` - Middle Center\n* `middleRight` - Middle Right\n* `bottomLeft` - Bottom Left\n* `bottomCenter` - Bottom Center\n* `bottomRight` - Bottom Right"},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","interactionPosition","originGroupId","type"]},"IfConditionStep":{"type":"object","description":"If condition steps reuse assertion_* fields as the branch condition.","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}},"assertionProperty":{"enum":["checked","count","customJavaScript","exist","notChecked","notExist","notVisible","textContent","value","visible","pageTitle","pageShowsText","pageDoesNotShowText","pageUrlIs","downloadStarted","variableValue","clipboardValue","disabled","notDisabled"],"type":"string","description":"* `checked` - Checked\n* `count` - Count\n* `customJavaScript` - Custom Javascript\n* `exist` - Exist\n* `notChecked` - Not Checked\n* `notExist` - Not Exist\n* `notVisible` - Not Visible\n* `textContent` - Text Content\n* `value` - Value\n* `visible` - Visible\n* `pageTitle` - Page Has Title\n* `pageShowsText` - Page Shows Text\n* `pageDoesNotShowText` - Page Does Not Show Text\n* `pageUrlIs` - Page Url Is\n* `downloadStarted` - Download Started\n* `variableValue` - Variable Value\n* `clipboardValue` - Clipboard Value\n* `disabled` - Disabled\n* `notDisabled` - Not Disabled"},"assertionType":{"enum":["contain","equal","greaterThan","lessThan","match","notContain","notEqual","any"],"type":"string","description":"* `contain` - Contain\n* `equal` - Equal\n* `greaterThan` - Greater Than\n* `lessThan` - Less Than\n* `match` - Match\n* `notContain` - Not Contain\n* `notEqual` - Not Equal\n* `any` - Any"},"assertionExpectedValue":{"type":["string","null"],"maxLength":10000},"assertionJavaScript":{"type":["string","null"],"description":"Required for assert and ifCondition steps. Send an empty string when unused."},"assertionVariableName":{"type":["string","null"],"description":"Required for assert and ifCondition steps. Send an empty string when unused."}},"required":["assertionExpectedValue","assertionJavaScript","assertionProperty","assertionType","assertionVariableName","id","originGroupId","type"]},"MouseDownStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"interactionPosition":{"enum":["smart","custom","topLeft","topCenter","topRight","middleLeft","middleCenter","middleRight","bottomLeft","bottomCenter","bottomRight"],"type":"string","description":"Required interaction target position. auto is not supported.\n\n* `smart` - Smart\n* `custom` - Custom\n* `topLeft` - Top Left\n* `topCenter` - Top Center\n* `topRight` - Top Right\n* `middleLeft` - Middle Left\n* `middleCenter` - Middle Center\n* `middleRight` - Middle Right\n* `bottomLeft` - Bottom Left\n* `bottomCenter` - Bottom Center\n* `bottomRight` - Bottom Right"},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","interactionPosition","originGroupId","type"]},"MouseUpStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"interactionPosition":{"enum":["smart","custom","topLeft","topCenter","topRight","middleLeft","middleCenter","middleRight","bottomLeft","bottomCenter","bottomRight"],"type":"string","description":"Required interaction target position. auto is not supported.\n\n* `smart` - Smart\n* `custom` - Custom\n* `topLeft` - Top Left\n* `topCenter` - Top Center\n* `topRight` - Top Right\n* `middleLeft` - Middle Left\n* `middleCenter` - Middle Center\n* `middleRight` - Middle Right\n* `bottomLeft` - Bottom Left\n* `bottomCenter` - Bottom Center\n* `bottomRight` - Bottom Right"},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","interactionPosition","originGroupId","type"]},"NewTabStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"url":{"type":["string","null"]},"username":{"type":["string","null"]},"password":{"type":["string","null"]}},"required":["id","originGroupId","type"]},"PageVisualRegressionStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"visualRegressionMaxDiff":{"type":["number","null"],"format":"double","maximum":100,"minimum":0},"visualRegressionRefScreenshots":{"type":"array","items":{"type":"object","additionalProperties":{}},"readOnly":true}},"required":["id","originGroupId","type","visualRegressionRefScreenshots"]},"ReloadPageStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}}},"required":["id","originGroupId","type"]},"ScrollStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}},"scrollX":{"type":["number","null"],"format":"double"},"scrollY":{"type":["number","null"],"format":"double"},"scrollEdge":{"enum":["topLeft","topCenter","topRight","middleLeft","middleCenter","middleRight","bottomLeft","bottomCenter","bottomRight",null],"type":["string","null"],"description":"* `topLeft` - Top Left\n* `topCenter` - Top Center\n* `topRight` - Top Right\n* `middleLeft` - Middle Left\n* `middleCenter` - Middle Center\n* `middleRight` - Middle Right\n* `bottomLeft` - Bottom Left\n* `bottomCenter` - Bottom Center\n* `bottomRight` - Bottom Right"},"scrollDirection":{"enum":["down","up","right","left",null],"type":["string","null"],"description":"* `down` - Down\n* `up` - Up\n* `right` - Right\n* `left` - Left"},"scrollTo":{"enum":["coords","edge","untilNextStepElementIsVisible","elementIntoView"],"type":"string","description":"* `coords` - Coords\n* `edge` - Edge\n* `untilNextStepElementIsVisible` - Until Next Step Element Is Visible\n* `elementIntoView` - Element Into View"},"scrollInside":{"enum":["window","element"],"type":"string","description":"* `window` - window\n* `element` - element"}},"required":["id","originGroupId","scrollInside","scrollTo","type"]},"SelectStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}},"value":{"type":"string"},"selectType":{"enum":["text","index","value"],"type":"string","description":"* `text` - text\n* `index` - index\n* `value` - value"},"selectIsMultiple":{"type":"boolean","default":false}},"required":["id","originGroupId","selectType","type","value"]},"SetLocalVariableStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}},"value":{"type":"string"},"code":{"type":["string","null"]},"localVariableName":{"type":"string"},"localVariableSource":{"enum":["element","value","evaluate"],"type":"string","description":"* `element` - element\n* `value` - value\n* `evaluate` - evaluate"}},"required":["id","localVariableName","localVariableSource","originGroupId","type"]},"SwitchContext":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}},"tabNo":{"type":"integer"},"value":{"enum":["topFrame","iframe"],"type":"string","description":"* `topFrame` - Top Frame\n* `iframe` - Iframe"}},"required":["id","originGroupId","tabNo","type","value"]},"TypeStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"value":{"type":"string"},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","originGroupId","type","value"]},"UploadStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"projectArtifactId":{"type":"string","format":"uuid"},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","originGroupId","projectArtifactId","type"]}}},"paths":{"/api/v2/groups/{id}/":{"patch":{"operationId":"v2_groups_partial_update","description":"Partially update a group.","summary":"Partially updating a group","parameters":[{"in":"path","name":"id","schema":{"type":"string","format":"uuid"},"description":"A UUID string identifying this group.","required":true}],"tags":["Groups"],"requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/PatchedV2GroupUpdate"}},"application/json":{"schema":{"$ref":"#/components/schemas/PatchedV2GroupUpdate"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V2Group"}}},"description":""},"400":{"description":"Request body failed validation."},"401":{"description":"Authentication credentials were missing or invalid."},"404":{"description":"Resource not found."}}}}}}
```


# Steps

Managing test steps

## Creating a step

> Create a new step.

```json
{"openapi":"3.1.0","info":{"title":"BugBug.io Public API","version":"v2"},"tags":[{"name":"Steps","description":"Managing test steps"}],"security":[{"tokenAuth":[]},{"Bearer":[]}],"components":{"securitySchemes":{"tokenAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"Token-based authentication with required prefix \"Token\""}},"schemas":{"StepResponse":{"oneOf":[{"$ref":"#/components/schemas/V2AnswerPromptStep"},{"$ref":"#/components/schemas/AssertStep"},{"$ref":"#/components/schemas/PastFromClipboardStep"},{"$ref":"#/components/schemas/ChangeStep"},{"$ref":"#/components/schemas/ClearStep"},{"$ref":"#/components/schemas/ClickStep"},{"$ref":"#/components/schemas/CloseTabStep"},{"$ref":"#/components/schemas/V2DragAndDropStep"},{"$ref":"#/components/schemas/ElementVisualRegressionStep"},{"$ref":"#/components/schemas/ExecuteStep"},{"$ref":"#/components/schemas/GotoStep"},{"$ref":"#/components/schemas/GoBackStep"},{"$ref":"#/components/schemas/GoForwardStep"},{"$ref":"#/components/schemas/HoverStep"},{"$ref":"#/components/schemas/IfConditionStep"},{"$ref":"#/components/schemas/MouseDownStep"},{"$ref":"#/components/schemas/MouseUpStep"},{"$ref":"#/components/schemas/NewTabStep"},{"$ref":"#/components/schemas/PageVisualRegressionStep"},{"$ref":"#/components/schemas/ReloadPageStep"},{"$ref":"#/components/schemas/ScrollStep"},{"$ref":"#/components/schemas/SelectStep"},{"$ref":"#/components/schemas/SetLocalVariableStep"},{"$ref":"#/components/schemas/SwitchContext"},{"$ref":"#/components/schemas/TypeStep"},{"$ref":"#/components/schemas/UploadStep"}],"discriminator":{"propertyName":"type","mapping":{"answerPrompt":"#/components/schemas/V2AnswerPromptStep","assert":"#/components/schemas/AssertStep","pasteFromClipboard":"#/components/schemas/PastFromClipboardStep","change":"#/components/schemas/ChangeStep","clear":"#/components/schemas/ClearStep","click":"#/components/schemas/ClickStep","closeTab":"#/components/schemas/CloseTabStep","dblClick":"#/components/schemas/ClickStep","dragAndDrop":"#/components/schemas/V2DragAndDropStep","elementVisualRegression":"#/components/schemas/ElementVisualRegressionStep","execute":"#/components/schemas/ExecuteStep","goto":"#/components/schemas/GotoStep","goBack":"#/components/schemas/GoBackStep","goForward":"#/components/schemas/GoForwardStep","hover":"#/components/schemas/HoverStep","ifCondition":"#/components/schemas/IfConditionStep","mouseDown":"#/components/schemas/MouseDownStep","mouseUp":"#/components/schemas/MouseUpStep","newTab":"#/components/schemas/NewTabStep","pageVisualRegression":"#/components/schemas/PageVisualRegressionStep","reloadPage":"#/components/schemas/ReloadPageStep","rightClick":"#/components/schemas/ClickStep","scroll":"#/components/schemas/ScrollStep","select":"#/components/schemas/SelectStep","setLocalVariable":"#/components/schemas/SetLocalVariableStep","switchContext":"#/components/schemas/SwitchContext","type":"#/components/schemas/TypeStep","uploadFile":"#/components/schemas/UploadStep"}}},"V2AnswerPromptStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"value":{"type":"string"}},"required":["id","originGroupId","type","value"]},"UpdateStepWaitingCondition":{"type":"object","properties":{"type":{"enum":["documentComplete","elementIsVisible","elementIsNotCovered","elementIsNotAnimating","elementIsNotDisabled","elementHasFocus","networkIdle","pageNavigationAfterExecution","elementHasAttribute"],"type":"string","description":"* `documentComplete` - documentComplete\n* `elementIsVisible` - elementIsVisible\n* `elementIsNotCovered` - elementIsNotCovered\n* `elementIsNotAnimating` - elementIsNotAnimating\n* `elementIsNotDisabled` - elementIsNotDisabled\n* `elementHasFocus` - elementHasFocus\n* `networkIdle` - networkIdle\n* `pageNavigationAfterExecution` - pageNavigationAfterExecution\n* `elementHasAttribute` - elementHasAttribute"},"expected":{"type":["string","null"]},"isActive":{"type":"boolean"},"isOverridden":{"type":"boolean","writeOnly":true,"description":"Required for each item when sending waitingConditions."},"timeout":{"type":["integer","null"]}},"required":["isActive","isOverridden","type"]},"AssertStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}},"continueOnFailure":{"type":"boolean","default":false},"assertionProperty":{"enum":["checked","count","customJavaScript","exist","notChecked","notExist","notVisible","textContent","value","visible","pageTitle","pageShowsText","pageDoesNotShowText","pageUrlIs","downloadStarted","variableValue","clipboardValue","disabled","notDisabled"],"type":"string","description":"* `checked` - Checked\n* `count` - Count\n* `customJavaScript` - Custom Javascript\n* `exist` - Exist\n* `notChecked` - Not Checked\n* `notExist` - Not Exist\n* `notVisible` - Not Visible\n* `textContent` - Text Content\n* `value` - Value\n* `visible` - Visible\n* `pageTitle` - Page Has Title\n* `pageShowsText` - Page Shows Text\n* `pageDoesNotShowText` - Page Does Not Show Text\n* `pageUrlIs` - Page Url Is\n* `downloadStarted` - Download Started\n* `variableValue` - Variable Value\n* `clipboardValue` - Clipboard Value\n* `disabled` - Disabled\n* `notDisabled` - Not Disabled"},"assertionType":{"enum":["contain","equal","greaterThan","lessThan","match","notContain","notEqual","any"],"type":"string","description":"* `contain` - Contain\n* `equal` - Equal\n* `greaterThan` - Greater Than\n* `lessThan` - Less Than\n* `match` - Match\n* `notContain` - Not Contain\n* `notEqual` - Not Equal\n* `any` - Any"},"assertionExpectedValue":{"type":["string","null"],"maxLength":10000},"assertionJavaScript":{"type":["string","null"],"description":"Required for assert and ifCondition steps. Send an empty string when unused."},"assertionVariableName":{"type":["string","null"],"description":"Required for assert and ifCondition steps. Send an empty string when unused."}},"required":["assertionExpectedValue","assertionJavaScript","assertionProperty","assertionType","assertionVariableName","id","originGroupId","type"]},"UpdateSelectorsPresetGroup":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"isActive":{"type":"boolean","default":false},"isCustom":{"type":"boolean","default":false},"selectorsGroups":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsGroup"}}},"required":["selectorsGroups"]},"UpdateSelectorsGroup":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"selectors":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelector"}},"relation":{"enum":["descendant","ancestor","sibling"],"type":"string","description":"* `descendant` - Descendant\n* `ancestor` - Ancestor\n* `sibling` - Sibling"}},"required":["relation","selectors"]},"UpdateSelector":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"type":{"enum":["XPath","customCSS","customXPath","",null],"type":["string","null"],"description":"* `XPath` - Xpath\n* `customCSS` - Custom Css\n* `customXPath` - Custom Xpath"},"selector":{"type":["string","null"]},"isActive":{"type":"boolean"},"score":{"type":["string","null"]}},"required":["isActive","selector","type"]},"PastFromClipboardStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","originGroupId","type"]},"ChangeStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"value":{"type":"string"},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","originGroupId","type","value"]},"ClearStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","originGroupId","type"]},"ClickStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"interactionPosition":{"enum":["smart","custom","topLeft","topCenter","topRight","middleLeft","middleCenter","middleRight","bottomLeft","bottomCenter","bottomRight"],"type":"string","description":"Required interaction target position. auto is not supported.\n\n* `smart` - Smart\n* `custom` - Custom\n* `topLeft` - Top Left\n* `topCenter` - Top Center\n* `topRight` - Top Right\n* `middleLeft` - Middle Left\n* `middleCenter` - Middle Center\n* `middleRight` - Middle Right\n* `bottomLeft` - Bottom Left\n* `bottomCenter` - Bottom Center\n* `bottomRight` - Bottom Right"},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","interactionPosition","originGroupId","type"]},"CloseTabStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}}},"required":["id","originGroupId","type"]},"V2DragAndDropStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}},"dndDropSelectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}},"dndDragOn":{"enum":["coords","element"],"type":"string","description":"* `coords` - coords\n* `element` - element"},"interactionPosition":{"enum":["smart","custom","topLeft","topCenter","topRight","middleLeft","middleCenter","middleRight","bottomLeft","bottomCenter","bottomRight"],"type":"string","description":"Required interaction target position. auto is not supported.\n\n* `smart` - Smart\n* `custom` - Custom\n* `topLeft` - Top Left\n* `topCenter` - Top Center\n* `topRight` - Top Right\n* `middleLeft` - Middle Left\n* `middleCenter` - Middle Center\n* `middleRight` - Middle Right\n* `bottomLeft` - Bottom Left\n* `bottomCenter` - Bottom Center\n* `bottomRight` - Bottom Right"},"dndDragX":{"type":["number","null"],"format":"double"},"dndDragY":{"type":["number","null"],"format":"double"},"dndDropOn":{"enum":["coords","element"],"type":"string","description":"* `coords` - coords\n* `element` - element"},"dndDropInteractionPosition":{"enum":["smart","custom","topLeft","topCenter","topRight","middleLeft","middleCenter","middleRight","bottomLeft","bottomCenter","bottomRight"],"type":"string","description":"Required interaction target position. auto is not supported.\n\n* `smart` - Smart\n* `custom` - Custom\n* `topLeft` - Top Left\n* `topCenter` - Top Center\n* `topRight` - Top Right\n* `middleLeft` - Middle Left\n* `middleCenter` - Middle Center\n* `middleRight` - Middle Right\n* `bottomLeft` - Bottom Left\n* `bottomCenter` - Bottom Center\n* `bottomRight` - Bottom Right"},"dndDropX":{"type":["number","null"],"format":"double"},"dndDropY":{"type":["number","null"],"format":"double"}},"required":["dndDragOn","dndDropInteractionPosition","dndDropOn","id","interactionPosition","originGroupId","type"]},"ElementVisualRegressionStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"visualRegressionMaxDiff":{"type":["number","null"],"format":"double","maximum":100,"minimum":0},"visualRegressionRefScreenshots":{"type":"array","items":{"type":"object","additionalProperties":{}},"readOnly":true},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","originGroupId","selectorsPresets","type","visualRegressionRefScreenshots"]},"ExecuteStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"code":{"type":"string"}},"required":["code","id","originGroupId","type"]},"GotoStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"url":{"type":"string"},"username":{"type":["string","null"]},"password":{"type":["string","null"]},"frameLocation":{"type":"string"}},"required":["id","originGroupId","type","url"]},"GoBackStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}}},"required":["id","originGroupId","type"]},"GoForwardStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}}},"required":["id","originGroupId","type"]},"HoverStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"interactionPosition":{"enum":["smart","custom","topLeft","topCenter","topRight","middleLeft","middleCenter","middleRight","bottomLeft","bottomCenter","bottomRight"],"type":"string","description":"Required interaction target position. auto is not supported.\n\n* `smart` - Smart\n* `custom` - Custom\n* `topLeft` - Top Left\n* `topCenter` - Top Center\n* `topRight` - Top Right\n* `middleLeft` - Middle Left\n* `middleCenter` - Middle Center\n* `middleRight` - Middle Right\n* `bottomLeft` - Bottom Left\n* `bottomCenter` - Bottom Center\n* `bottomRight` - Bottom Right"},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","interactionPosition","originGroupId","type"]},"IfConditionStep":{"type":"object","description":"If condition steps reuse assertion_* fields as the branch condition.","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}},"assertionProperty":{"enum":["checked","count","customJavaScript","exist","notChecked","notExist","notVisible","textContent","value","visible","pageTitle","pageShowsText","pageDoesNotShowText","pageUrlIs","downloadStarted","variableValue","clipboardValue","disabled","notDisabled"],"type":"string","description":"* `checked` - Checked\n* `count` - Count\n* `customJavaScript` - Custom Javascript\n* `exist` - Exist\n* `notChecked` - Not Checked\n* `notExist` - Not Exist\n* `notVisible` - Not Visible\n* `textContent` - Text Content\n* `value` - Value\n* `visible` - Visible\n* `pageTitle` - Page Has Title\n* `pageShowsText` - Page Shows Text\n* `pageDoesNotShowText` - Page Does Not Show Text\n* `pageUrlIs` - Page Url Is\n* `downloadStarted` - Download Started\n* `variableValue` - Variable Value\n* `clipboardValue` - Clipboard Value\n* `disabled` - Disabled\n* `notDisabled` - Not Disabled"},"assertionType":{"enum":["contain","equal","greaterThan","lessThan","match","notContain","notEqual","any"],"type":"string","description":"* `contain` - Contain\n* `equal` - Equal\n* `greaterThan` - Greater Than\n* `lessThan` - Less Than\n* `match` - Match\n* `notContain` - Not Contain\n* `notEqual` - Not Equal\n* `any` - Any"},"assertionExpectedValue":{"type":["string","null"],"maxLength":10000},"assertionJavaScript":{"type":["string","null"],"description":"Required for assert and ifCondition steps. Send an empty string when unused."},"assertionVariableName":{"type":["string","null"],"description":"Required for assert and ifCondition steps. Send an empty string when unused."}},"required":["assertionExpectedValue","assertionJavaScript","assertionProperty","assertionType","assertionVariableName","id","originGroupId","type"]},"MouseDownStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"interactionPosition":{"enum":["smart","custom","topLeft","topCenter","topRight","middleLeft","middleCenter","middleRight","bottomLeft","bottomCenter","bottomRight"],"type":"string","description":"Required interaction target position. auto is not supported.\n\n* `smart` - Smart\n* `custom` - Custom\n* `topLeft` - Top Left\n* `topCenter` - Top Center\n* `topRight` - Top Right\n* `middleLeft` - Middle Left\n* `middleCenter` - Middle Center\n* `middleRight` - Middle Right\n* `bottomLeft` - Bottom Left\n* `bottomCenter` - Bottom Center\n* `bottomRight` - Bottom Right"},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","interactionPosition","originGroupId","type"]},"MouseUpStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"interactionPosition":{"enum":["smart","custom","topLeft","topCenter","topRight","middleLeft","middleCenter","middleRight","bottomLeft","bottomCenter","bottomRight"],"type":"string","description":"Required interaction target position. auto is not supported.\n\n* `smart` - Smart\n* `custom` - Custom\n* `topLeft` - Top Left\n* `topCenter` - Top Center\n* `topRight` - Top Right\n* `middleLeft` - Middle Left\n* `middleCenter` - Middle Center\n* `middleRight` - Middle Right\n* `bottomLeft` - Bottom Left\n* `bottomCenter` - Bottom Center\n* `bottomRight` - Bottom Right"},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","interactionPosition","originGroupId","type"]},"NewTabStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"url":{"type":["string","null"]},"username":{"type":["string","null"]},"password":{"type":["string","null"]}},"required":["id","originGroupId","type"]},"PageVisualRegressionStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"visualRegressionMaxDiff":{"type":["number","null"],"format":"double","maximum":100,"minimum":0},"visualRegressionRefScreenshots":{"type":"array","items":{"type":"object","additionalProperties":{}},"readOnly":true}},"required":["id","originGroupId","type","visualRegressionRefScreenshots"]},"ReloadPageStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}}},"required":["id","originGroupId","type"]},"ScrollStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}},"scrollX":{"type":["number","null"],"format":"double"},"scrollY":{"type":["number","null"],"format":"double"},"scrollEdge":{"enum":["topLeft","topCenter","topRight","middleLeft","middleCenter","middleRight","bottomLeft","bottomCenter","bottomRight",null],"type":["string","null"],"description":"* `topLeft` - Top Left\n* `topCenter` - Top Center\n* `topRight` - Top Right\n* `middleLeft` - Middle Left\n* `middleCenter` - Middle Center\n* `middleRight` - Middle Right\n* `bottomLeft` - Bottom Left\n* `bottomCenter` - Bottom Center\n* `bottomRight` - Bottom Right"},"scrollDirection":{"enum":["down","up","right","left",null],"type":["string","null"],"description":"* `down` - Down\n* `up` - Up\n* `right` - Right\n* `left` - Left"},"scrollTo":{"enum":["coords","edge","untilNextStepElementIsVisible","elementIntoView"],"type":"string","description":"* `coords` - Coords\n* `edge` - Edge\n* `untilNextStepElementIsVisible` - Until Next Step Element Is Visible\n* `elementIntoView` - Element Into View"},"scrollInside":{"enum":["window","element"],"type":"string","description":"* `window` - window\n* `element` - element"}},"required":["id","originGroupId","scrollInside","scrollTo","type"]},"SelectStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}},"value":{"type":"string"},"selectType":{"enum":["text","index","value"],"type":"string","description":"* `text` - text\n* `index` - index\n* `value` - value"},"selectIsMultiple":{"type":"boolean","default":false}},"required":["id","originGroupId","selectType","type","value"]},"SetLocalVariableStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}},"value":{"type":"string"},"code":{"type":["string","null"]},"localVariableName":{"type":"string"},"localVariableSource":{"enum":["element","value","evaluate"],"type":"string","description":"* `element` - element\n* `value` - value\n* `evaluate` - evaluate"}},"required":["id","localVariableName","localVariableSource","originGroupId","type"]},"SwitchContext":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}},"tabNo":{"type":"integer"},"value":{"enum":["topFrame","iframe"],"type":"string","description":"* `topFrame` - Top Frame\n* `iframe` - Iframe"}},"required":["id","originGroupId","tabNo","type","value"]},"TypeStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"value":{"type":"string"},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","originGroupId","type","value"]},"UploadStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"projectArtifactId":{"type":"string","format":"uuid"},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","originGroupId","projectArtifactId","type"]}}},"paths":{"/api/v2/steps/":{"post":{"operationId":"v2_steps_create","description":"Create a new step.","summary":"Creating a step","parameters":[],"tags":["Steps"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StepResponse"}}}},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StepResponse"}}},"description":""},"400":{"description":"Request body failed validation."},"401":{"description":"Authentication credentials were missing or invalid."}}}}}}
```

## Retrieving step by ID

> Return a single step.

```json
{"openapi":"3.1.0","info":{"title":"BugBug.io Public API","version":"v2"},"tags":[{"name":"Steps","description":"Managing test steps"}],"security":[{"tokenAuth":[]},{"Bearer":[]}],"components":{"securitySchemes":{"tokenAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"Token-based authentication with required prefix \"Token\""}},"schemas":{"StepResponse":{"oneOf":[{"$ref":"#/components/schemas/V2AnswerPromptStep"},{"$ref":"#/components/schemas/AssertStep"},{"$ref":"#/components/schemas/PastFromClipboardStep"},{"$ref":"#/components/schemas/ChangeStep"},{"$ref":"#/components/schemas/ClearStep"},{"$ref":"#/components/schemas/ClickStep"},{"$ref":"#/components/schemas/CloseTabStep"},{"$ref":"#/components/schemas/V2DragAndDropStep"},{"$ref":"#/components/schemas/ElementVisualRegressionStep"},{"$ref":"#/components/schemas/ExecuteStep"},{"$ref":"#/components/schemas/GotoStep"},{"$ref":"#/components/schemas/GoBackStep"},{"$ref":"#/components/schemas/GoForwardStep"},{"$ref":"#/components/schemas/HoverStep"},{"$ref":"#/components/schemas/IfConditionStep"},{"$ref":"#/components/schemas/MouseDownStep"},{"$ref":"#/components/schemas/MouseUpStep"},{"$ref":"#/components/schemas/NewTabStep"},{"$ref":"#/components/schemas/PageVisualRegressionStep"},{"$ref":"#/components/schemas/ReloadPageStep"},{"$ref":"#/components/schemas/ScrollStep"},{"$ref":"#/components/schemas/SelectStep"},{"$ref":"#/components/schemas/SetLocalVariableStep"},{"$ref":"#/components/schemas/SwitchContext"},{"$ref":"#/components/schemas/TypeStep"},{"$ref":"#/components/schemas/UploadStep"}],"discriminator":{"propertyName":"type","mapping":{"answerPrompt":"#/components/schemas/V2AnswerPromptStep","assert":"#/components/schemas/AssertStep","pasteFromClipboard":"#/components/schemas/PastFromClipboardStep","change":"#/components/schemas/ChangeStep","clear":"#/components/schemas/ClearStep","click":"#/components/schemas/ClickStep","closeTab":"#/components/schemas/CloseTabStep","dblClick":"#/components/schemas/ClickStep","dragAndDrop":"#/components/schemas/V2DragAndDropStep","elementVisualRegression":"#/components/schemas/ElementVisualRegressionStep","execute":"#/components/schemas/ExecuteStep","goto":"#/components/schemas/GotoStep","goBack":"#/components/schemas/GoBackStep","goForward":"#/components/schemas/GoForwardStep","hover":"#/components/schemas/HoverStep","ifCondition":"#/components/schemas/IfConditionStep","mouseDown":"#/components/schemas/MouseDownStep","mouseUp":"#/components/schemas/MouseUpStep","newTab":"#/components/schemas/NewTabStep","pageVisualRegression":"#/components/schemas/PageVisualRegressionStep","reloadPage":"#/components/schemas/ReloadPageStep","rightClick":"#/components/schemas/ClickStep","scroll":"#/components/schemas/ScrollStep","select":"#/components/schemas/SelectStep","setLocalVariable":"#/components/schemas/SetLocalVariableStep","switchContext":"#/components/schemas/SwitchContext","type":"#/components/schemas/TypeStep","uploadFile":"#/components/schemas/UploadStep"}}},"V2AnswerPromptStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"value":{"type":"string"}},"required":["id","originGroupId","type","value"]},"UpdateStepWaitingCondition":{"type":"object","properties":{"type":{"enum":["documentComplete","elementIsVisible","elementIsNotCovered","elementIsNotAnimating","elementIsNotDisabled","elementHasFocus","networkIdle","pageNavigationAfterExecution","elementHasAttribute"],"type":"string","description":"* `documentComplete` - documentComplete\n* `elementIsVisible` - elementIsVisible\n* `elementIsNotCovered` - elementIsNotCovered\n* `elementIsNotAnimating` - elementIsNotAnimating\n* `elementIsNotDisabled` - elementIsNotDisabled\n* `elementHasFocus` - elementHasFocus\n* `networkIdle` - networkIdle\n* `pageNavigationAfterExecution` - pageNavigationAfterExecution\n* `elementHasAttribute` - elementHasAttribute"},"expected":{"type":["string","null"]},"isActive":{"type":"boolean"},"isOverridden":{"type":"boolean","writeOnly":true,"description":"Required for each item when sending waitingConditions."},"timeout":{"type":["integer","null"]}},"required":["isActive","isOverridden","type"]},"AssertStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}},"continueOnFailure":{"type":"boolean","default":false},"assertionProperty":{"enum":["checked","count","customJavaScript","exist","notChecked","notExist","notVisible","textContent","value","visible","pageTitle","pageShowsText","pageDoesNotShowText","pageUrlIs","downloadStarted","variableValue","clipboardValue","disabled","notDisabled"],"type":"string","description":"* `checked` - Checked\n* `count` - Count\n* `customJavaScript` - Custom Javascript\n* `exist` - Exist\n* `notChecked` - Not Checked\n* `notExist` - Not Exist\n* `notVisible` - Not Visible\n* `textContent` - Text Content\n* `value` - Value\n* `visible` - Visible\n* `pageTitle` - Page Has Title\n* `pageShowsText` - Page Shows Text\n* `pageDoesNotShowText` - Page Does Not Show Text\n* `pageUrlIs` - Page Url Is\n* `downloadStarted` - Download Started\n* `variableValue` - Variable Value\n* `clipboardValue` - Clipboard Value\n* `disabled` - Disabled\n* `notDisabled` - Not Disabled"},"assertionType":{"enum":["contain","equal","greaterThan","lessThan","match","notContain","notEqual","any"],"type":"string","description":"* `contain` - Contain\n* `equal` - Equal\n* `greaterThan` - Greater Than\n* `lessThan` - Less Than\n* `match` - Match\n* `notContain` - Not Contain\n* `notEqual` - Not Equal\n* `any` - Any"},"assertionExpectedValue":{"type":["string","null"],"maxLength":10000},"assertionJavaScript":{"type":["string","null"],"description":"Required for assert and ifCondition steps. Send an empty string when unused."},"assertionVariableName":{"type":["string","null"],"description":"Required for assert and ifCondition steps. Send an empty string when unused."}},"required":["assertionExpectedValue","assertionJavaScript","assertionProperty","assertionType","assertionVariableName","id","originGroupId","type"]},"UpdateSelectorsPresetGroup":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"isActive":{"type":"boolean","default":false},"isCustom":{"type":"boolean","default":false},"selectorsGroups":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsGroup"}}},"required":["selectorsGroups"]},"UpdateSelectorsGroup":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"selectors":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelector"}},"relation":{"enum":["descendant","ancestor","sibling"],"type":"string","description":"* `descendant` - Descendant\n* `ancestor` - Ancestor\n* `sibling` - Sibling"}},"required":["relation","selectors"]},"UpdateSelector":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"type":{"enum":["XPath","customCSS","customXPath","",null],"type":["string","null"],"description":"* `XPath` - Xpath\n* `customCSS` - Custom Css\n* `customXPath` - Custom Xpath"},"selector":{"type":["string","null"]},"isActive":{"type":"boolean"},"score":{"type":["string","null"]}},"required":["isActive","selector","type"]},"PastFromClipboardStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","originGroupId","type"]},"ChangeStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"value":{"type":"string"},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","originGroupId","type","value"]},"ClearStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","originGroupId","type"]},"ClickStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"interactionPosition":{"enum":["smart","custom","topLeft","topCenter","topRight","middleLeft","middleCenter","middleRight","bottomLeft","bottomCenter","bottomRight"],"type":"string","description":"Required interaction target position. auto is not supported.\n\n* `smart` - Smart\n* `custom` - Custom\n* `topLeft` - Top Left\n* `topCenter` - Top Center\n* `topRight` - Top Right\n* `middleLeft` - Middle Left\n* `middleCenter` - Middle Center\n* `middleRight` - Middle Right\n* `bottomLeft` - Bottom Left\n* `bottomCenter` - Bottom Center\n* `bottomRight` - Bottom Right"},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","interactionPosition","originGroupId","type"]},"CloseTabStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}}},"required":["id","originGroupId","type"]},"V2DragAndDropStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}},"dndDropSelectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}},"dndDragOn":{"enum":["coords","element"],"type":"string","description":"* `coords` - coords\n* `element` - element"},"interactionPosition":{"enum":["smart","custom","topLeft","topCenter","topRight","middleLeft","middleCenter","middleRight","bottomLeft","bottomCenter","bottomRight"],"type":"string","description":"Required interaction target position. auto is not supported.\n\n* `smart` - Smart\n* `custom` - Custom\n* `topLeft` - Top Left\n* `topCenter` - Top Center\n* `topRight` - Top Right\n* `middleLeft` - Middle Left\n* `middleCenter` - Middle Center\n* `middleRight` - Middle Right\n* `bottomLeft` - Bottom Left\n* `bottomCenter` - Bottom Center\n* `bottomRight` - Bottom Right"},"dndDragX":{"type":["number","null"],"format":"double"},"dndDragY":{"type":["number","null"],"format":"double"},"dndDropOn":{"enum":["coords","element"],"type":"string","description":"* `coords` - coords\n* `element` - element"},"dndDropInteractionPosition":{"enum":["smart","custom","topLeft","topCenter","topRight","middleLeft","middleCenter","middleRight","bottomLeft","bottomCenter","bottomRight"],"type":"string","description":"Required interaction target position. auto is not supported.\n\n* `smart` - Smart\n* `custom` - Custom\n* `topLeft` - Top Left\n* `topCenter` - Top Center\n* `topRight` - Top Right\n* `middleLeft` - Middle Left\n* `middleCenter` - Middle Center\n* `middleRight` - Middle Right\n* `bottomLeft` - Bottom Left\n* `bottomCenter` - Bottom Center\n* `bottomRight` - Bottom Right"},"dndDropX":{"type":["number","null"],"format":"double"},"dndDropY":{"type":["number","null"],"format":"double"}},"required":["dndDragOn","dndDropInteractionPosition","dndDropOn","id","interactionPosition","originGroupId","type"]},"ElementVisualRegressionStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"visualRegressionMaxDiff":{"type":["number","null"],"format":"double","maximum":100,"minimum":0},"visualRegressionRefScreenshots":{"type":"array","items":{"type":"object","additionalProperties":{}},"readOnly":true},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","originGroupId","selectorsPresets","type","visualRegressionRefScreenshots"]},"ExecuteStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"code":{"type":"string"}},"required":["code","id","originGroupId","type"]},"GotoStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"url":{"type":"string"},"username":{"type":["string","null"]},"password":{"type":["string","null"]},"frameLocation":{"type":"string"}},"required":["id","originGroupId","type","url"]},"GoBackStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}}},"required":["id","originGroupId","type"]},"GoForwardStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}}},"required":["id","originGroupId","type"]},"HoverStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"interactionPosition":{"enum":["smart","custom","topLeft","topCenter","topRight","middleLeft","middleCenter","middleRight","bottomLeft","bottomCenter","bottomRight"],"type":"string","description":"Required interaction target position. auto is not supported.\n\n* `smart` - Smart\n* `custom` - Custom\n* `topLeft` - Top Left\n* `topCenter` - Top Center\n* `topRight` - Top Right\n* `middleLeft` - Middle Left\n* `middleCenter` - Middle Center\n* `middleRight` - Middle Right\n* `bottomLeft` - Bottom Left\n* `bottomCenter` - Bottom Center\n* `bottomRight` - Bottom Right"},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","interactionPosition","originGroupId","type"]},"IfConditionStep":{"type":"object","description":"If condition steps reuse assertion_* fields as the branch condition.","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}},"assertionProperty":{"enum":["checked","count","customJavaScript","exist","notChecked","notExist","notVisible","textContent","value","visible","pageTitle","pageShowsText","pageDoesNotShowText","pageUrlIs","downloadStarted","variableValue","clipboardValue","disabled","notDisabled"],"type":"string","description":"* `checked` - Checked\n* `count` - Count\n* `customJavaScript` - Custom Javascript\n* `exist` - Exist\n* `notChecked` - Not Checked\n* `notExist` - Not Exist\n* `notVisible` - Not Visible\n* `textContent` - Text Content\n* `value` - Value\n* `visible` - Visible\n* `pageTitle` - Page Has Title\n* `pageShowsText` - Page Shows Text\n* `pageDoesNotShowText` - Page Does Not Show Text\n* `pageUrlIs` - Page Url Is\n* `downloadStarted` - Download Started\n* `variableValue` - Variable Value\n* `clipboardValue` - Clipboard Value\n* `disabled` - Disabled\n* `notDisabled` - Not Disabled"},"assertionType":{"enum":["contain","equal","greaterThan","lessThan","match","notContain","notEqual","any"],"type":"string","description":"* `contain` - Contain\n* `equal` - Equal\n* `greaterThan` - Greater Than\n* `lessThan` - Less Than\n* `match` - Match\n* `notContain` - Not Contain\n* `notEqual` - Not Equal\n* `any` - Any"},"assertionExpectedValue":{"type":["string","null"],"maxLength":10000},"assertionJavaScript":{"type":["string","null"],"description":"Required for assert and ifCondition steps. Send an empty string when unused."},"assertionVariableName":{"type":["string","null"],"description":"Required for assert and ifCondition steps. Send an empty string when unused."}},"required":["assertionExpectedValue","assertionJavaScript","assertionProperty","assertionType","assertionVariableName","id","originGroupId","type"]},"MouseDownStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"interactionPosition":{"enum":["smart","custom","topLeft","topCenter","topRight","middleLeft","middleCenter","middleRight","bottomLeft","bottomCenter","bottomRight"],"type":"string","description":"Required interaction target position. auto is not supported.\n\n* `smart` - Smart\n* `custom` - Custom\n* `topLeft` - Top Left\n* `topCenter` - Top Center\n* `topRight` - Top Right\n* `middleLeft` - Middle Left\n* `middleCenter` - Middle Center\n* `middleRight` - Middle Right\n* `bottomLeft` - Bottom Left\n* `bottomCenter` - Bottom Center\n* `bottomRight` - Bottom Right"},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","interactionPosition","originGroupId","type"]},"MouseUpStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"interactionPosition":{"enum":["smart","custom","topLeft","topCenter","topRight","middleLeft","middleCenter","middleRight","bottomLeft","bottomCenter","bottomRight"],"type":"string","description":"Required interaction target position. auto is not supported.\n\n* `smart` - Smart\n* `custom` - Custom\n* `topLeft` - Top Left\n* `topCenter` - Top Center\n* `topRight` - Top Right\n* `middleLeft` - Middle Left\n* `middleCenter` - Middle Center\n* `middleRight` - Middle Right\n* `bottomLeft` - Bottom Left\n* `bottomCenter` - Bottom Center\n* `bottomRight` - Bottom Right"},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","interactionPosition","originGroupId","type"]},"NewTabStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"url":{"type":["string","null"]},"username":{"type":["string","null"]},"password":{"type":["string","null"]}},"required":["id","originGroupId","type"]},"PageVisualRegressionStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"visualRegressionMaxDiff":{"type":["number","null"],"format":"double","maximum":100,"minimum":0},"visualRegressionRefScreenshots":{"type":"array","items":{"type":"object","additionalProperties":{}},"readOnly":true}},"required":["id","originGroupId","type","visualRegressionRefScreenshots"]},"ReloadPageStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}}},"required":["id","originGroupId","type"]},"ScrollStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}},"scrollX":{"type":["number","null"],"format":"double"},"scrollY":{"type":["number","null"],"format":"double"},"scrollEdge":{"enum":["topLeft","topCenter","topRight","middleLeft","middleCenter","middleRight","bottomLeft","bottomCenter","bottomRight",null],"type":["string","null"],"description":"* `topLeft` - Top Left\n* `topCenter` - Top Center\n* `topRight` - Top Right\n* `middleLeft` - Middle Left\n* `middleCenter` - Middle Center\n* `middleRight` - Middle Right\n* `bottomLeft` - Bottom Left\n* `bottomCenter` - Bottom Center\n* `bottomRight` - Bottom Right"},"scrollDirection":{"enum":["down","up","right","left",null],"type":["string","null"],"description":"* `down` - Down\n* `up` - Up\n* `right` - Right\n* `left` - Left"},"scrollTo":{"enum":["coords","edge","untilNextStepElementIsVisible","elementIntoView"],"type":"string","description":"* `coords` - Coords\n* `edge` - Edge\n* `untilNextStepElementIsVisible` - Until Next Step Element Is Visible\n* `elementIntoView` - Element Into View"},"scrollInside":{"enum":["window","element"],"type":"string","description":"* `window` - window\n* `element` - element"}},"required":["id","originGroupId","scrollInside","scrollTo","type"]},"SelectStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}},"value":{"type":"string"},"selectType":{"enum":["text","index","value"],"type":"string","description":"* `text` - text\n* `index` - index\n* `value` - value"},"selectIsMultiple":{"type":"boolean","default":false}},"required":["id","originGroupId","selectType","type","value"]},"SetLocalVariableStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}},"value":{"type":"string"},"code":{"type":["string","null"]},"localVariableName":{"type":"string"},"localVariableSource":{"enum":["element","value","evaluate"],"type":"string","description":"* `element` - element\n* `value` - value\n* `evaluate` - evaluate"}},"required":["id","localVariableName","localVariableSource","originGroupId","type"]},"SwitchContext":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}},"tabNo":{"type":"integer"},"value":{"enum":["topFrame","iframe"],"type":"string","description":"* `topFrame` - Top Frame\n* `iframe` - Iframe"}},"required":["id","originGroupId","tabNo","type","value"]},"TypeStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"value":{"type":"string"},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","originGroupId","type","value"]},"UploadStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"projectArtifactId":{"type":"string","format":"uuid"},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","originGroupId","projectArtifactId","type"]}}},"paths":{"/api/v2/steps/{id}/":{"get":{"operationId":"v2_steps_retrieve","description":"Return a single step.","summary":"Retrieving step by ID","parameters":[{"in":"path","name":"id","schema":{"type":"string","format":"uuid"},"description":"A UUID string identifying this step.","required":true}],"tags":["Steps"],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StepResponse"}}},"description":""},"401":{"description":"Authentication credentials were missing or invalid."},"404":{"description":"Resource not found."}}}}}}
```

## PUT /api/v2/steps/{id}/

> Updating a step

```json
{"openapi":"3.1.0","info":{"title":"BugBug.io Public API","version":"v2"},"tags":[{"name":"Steps","description":"Managing test steps"}],"security":[{"tokenAuth":[]},{"Bearer":[]}],"components":{"securitySchemes":{"tokenAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"Token-based authentication with required prefix \"Token\""}},"schemas":{"StepResponse":{"oneOf":[{"$ref":"#/components/schemas/V2AnswerPromptStep"},{"$ref":"#/components/schemas/AssertStep"},{"$ref":"#/components/schemas/PastFromClipboardStep"},{"$ref":"#/components/schemas/ChangeStep"},{"$ref":"#/components/schemas/ClearStep"},{"$ref":"#/components/schemas/ClickStep"},{"$ref":"#/components/schemas/CloseTabStep"},{"$ref":"#/components/schemas/V2DragAndDropStep"},{"$ref":"#/components/schemas/ElementVisualRegressionStep"},{"$ref":"#/components/schemas/ExecuteStep"},{"$ref":"#/components/schemas/GotoStep"},{"$ref":"#/components/schemas/GoBackStep"},{"$ref":"#/components/schemas/GoForwardStep"},{"$ref":"#/components/schemas/HoverStep"},{"$ref":"#/components/schemas/IfConditionStep"},{"$ref":"#/components/schemas/MouseDownStep"},{"$ref":"#/components/schemas/MouseUpStep"},{"$ref":"#/components/schemas/NewTabStep"},{"$ref":"#/components/schemas/PageVisualRegressionStep"},{"$ref":"#/components/schemas/ReloadPageStep"},{"$ref":"#/components/schemas/ScrollStep"},{"$ref":"#/components/schemas/SelectStep"},{"$ref":"#/components/schemas/SetLocalVariableStep"},{"$ref":"#/components/schemas/SwitchContext"},{"$ref":"#/components/schemas/TypeStep"},{"$ref":"#/components/schemas/UploadStep"}],"discriminator":{"propertyName":"type","mapping":{"answerPrompt":"#/components/schemas/V2AnswerPromptStep","assert":"#/components/schemas/AssertStep","pasteFromClipboard":"#/components/schemas/PastFromClipboardStep","change":"#/components/schemas/ChangeStep","clear":"#/components/schemas/ClearStep","click":"#/components/schemas/ClickStep","closeTab":"#/components/schemas/CloseTabStep","dblClick":"#/components/schemas/ClickStep","dragAndDrop":"#/components/schemas/V2DragAndDropStep","elementVisualRegression":"#/components/schemas/ElementVisualRegressionStep","execute":"#/components/schemas/ExecuteStep","goto":"#/components/schemas/GotoStep","goBack":"#/components/schemas/GoBackStep","goForward":"#/components/schemas/GoForwardStep","hover":"#/components/schemas/HoverStep","ifCondition":"#/components/schemas/IfConditionStep","mouseDown":"#/components/schemas/MouseDownStep","mouseUp":"#/components/schemas/MouseUpStep","newTab":"#/components/schemas/NewTabStep","pageVisualRegression":"#/components/schemas/PageVisualRegressionStep","reloadPage":"#/components/schemas/ReloadPageStep","rightClick":"#/components/schemas/ClickStep","scroll":"#/components/schemas/ScrollStep","select":"#/components/schemas/SelectStep","setLocalVariable":"#/components/schemas/SetLocalVariableStep","switchContext":"#/components/schemas/SwitchContext","type":"#/components/schemas/TypeStep","uploadFile":"#/components/schemas/UploadStep"}}},"V2AnswerPromptStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"value":{"type":"string"}},"required":["id","originGroupId","type","value"]},"UpdateStepWaitingCondition":{"type":"object","properties":{"type":{"enum":["documentComplete","elementIsVisible","elementIsNotCovered","elementIsNotAnimating","elementIsNotDisabled","elementHasFocus","networkIdle","pageNavigationAfterExecution","elementHasAttribute"],"type":"string","description":"* `documentComplete` - documentComplete\n* `elementIsVisible` - elementIsVisible\n* `elementIsNotCovered` - elementIsNotCovered\n* `elementIsNotAnimating` - elementIsNotAnimating\n* `elementIsNotDisabled` - elementIsNotDisabled\n* `elementHasFocus` - elementHasFocus\n* `networkIdle` - networkIdle\n* `pageNavigationAfterExecution` - pageNavigationAfterExecution\n* `elementHasAttribute` - elementHasAttribute"},"expected":{"type":["string","null"]},"isActive":{"type":"boolean"},"isOverridden":{"type":"boolean","writeOnly":true,"description":"Required for each item when sending waitingConditions."},"timeout":{"type":["integer","null"]}},"required":["isActive","isOverridden","type"]},"AssertStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}},"continueOnFailure":{"type":"boolean","default":false},"assertionProperty":{"enum":["checked","count","customJavaScript","exist","notChecked","notExist","notVisible","textContent","value","visible","pageTitle","pageShowsText","pageDoesNotShowText","pageUrlIs","downloadStarted","variableValue","clipboardValue","disabled","notDisabled"],"type":"string","description":"* `checked` - Checked\n* `count` - Count\n* `customJavaScript` - Custom Javascript\n* `exist` - Exist\n* `notChecked` - Not Checked\n* `notExist` - Not Exist\n* `notVisible` - Not Visible\n* `textContent` - Text Content\n* `value` - Value\n* `visible` - Visible\n* `pageTitle` - Page Has Title\n* `pageShowsText` - Page Shows Text\n* `pageDoesNotShowText` - Page Does Not Show Text\n* `pageUrlIs` - Page Url Is\n* `downloadStarted` - Download Started\n* `variableValue` - Variable Value\n* `clipboardValue` - Clipboard Value\n* `disabled` - Disabled\n* `notDisabled` - Not Disabled"},"assertionType":{"enum":["contain","equal","greaterThan","lessThan","match","notContain","notEqual","any"],"type":"string","description":"* `contain` - Contain\n* `equal` - Equal\n* `greaterThan` - Greater Than\n* `lessThan` - Less Than\n* `match` - Match\n* `notContain` - Not Contain\n* `notEqual` - Not Equal\n* `any` - Any"},"assertionExpectedValue":{"type":["string","null"],"maxLength":10000},"assertionJavaScript":{"type":["string","null"],"description":"Required for assert and ifCondition steps. Send an empty string when unused."},"assertionVariableName":{"type":["string","null"],"description":"Required for assert and ifCondition steps. Send an empty string when unused."}},"required":["assertionExpectedValue","assertionJavaScript","assertionProperty","assertionType","assertionVariableName","id","originGroupId","type"]},"UpdateSelectorsPresetGroup":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"isActive":{"type":"boolean","default":false},"isCustom":{"type":"boolean","default":false},"selectorsGroups":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsGroup"}}},"required":["selectorsGroups"]},"UpdateSelectorsGroup":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"selectors":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelector"}},"relation":{"enum":["descendant","ancestor","sibling"],"type":"string","description":"* `descendant` - Descendant\n* `ancestor` - Ancestor\n* `sibling` - Sibling"}},"required":["relation","selectors"]},"UpdateSelector":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"type":{"enum":["XPath","customCSS","customXPath","",null],"type":["string","null"],"description":"* `XPath` - Xpath\n* `customCSS` - Custom Css\n* `customXPath` - Custom Xpath"},"selector":{"type":["string","null"]},"isActive":{"type":"boolean"},"score":{"type":["string","null"]}},"required":["isActive","selector","type"]},"PastFromClipboardStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","originGroupId","type"]},"ChangeStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"value":{"type":"string"},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","originGroupId","type","value"]},"ClearStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","originGroupId","type"]},"ClickStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"interactionPosition":{"enum":["smart","custom","topLeft","topCenter","topRight","middleLeft","middleCenter","middleRight","bottomLeft","bottomCenter","bottomRight"],"type":"string","description":"Required interaction target position. auto is not supported.\n\n* `smart` - Smart\n* `custom` - Custom\n* `topLeft` - Top Left\n* `topCenter` - Top Center\n* `topRight` - Top Right\n* `middleLeft` - Middle Left\n* `middleCenter` - Middle Center\n* `middleRight` - Middle Right\n* `bottomLeft` - Bottom Left\n* `bottomCenter` - Bottom Center\n* `bottomRight` - Bottom Right"},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","interactionPosition","originGroupId","type"]},"CloseTabStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}}},"required":["id","originGroupId","type"]},"V2DragAndDropStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}},"dndDropSelectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}},"dndDragOn":{"enum":["coords","element"],"type":"string","description":"* `coords` - coords\n* `element` - element"},"interactionPosition":{"enum":["smart","custom","topLeft","topCenter","topRight","middleLeft","middleCenter","middleRight","bottomLeft","bottomCenter","bottomRight"],"type":"string","description":"Required interaction target position. auto is not supported.\n\n* `smart` - Smart\n* `custom` - Custom\n* `topLeft` - Top Left\n* `topCenter` - Top Center\n* `topRight` - Top Right\n* `middleLeft` - Middle Left\n* `middleCenter` - Middle Center\n* `middleRight` - Middle Right\n* `bottomLeft` - Bottom Left\n* `bottomCenter` - Bottom Center\n* `bottomRight` - Bottom Right"},"dndDragX":{"type":["number","null"],"format":"double"},"dndDragY":{"type":["number","null"],"format":"double"},"dndDropOn":{"enum":["coords","element"],"type":"string","description":"* `coords` - coords\n* `element` - element"},"dndDropInteractionPosition":{"enum":["smart","custom","topLeft","topCenter","topRight","middleLeft","middleCenter","middleRight","bottomLeft","bottomCenter","bottomRight"],"type":"string","description":"Required interaction target position. auto is not supported.\n\n* `smart` - Smart\n* `custom` - Custom\n* `topLeft` - Top Left\n* `topCenter` - Top Center\n* `topRight` - Top Right\n* `middleLeft` - Middle Left\n* `middleCenter` - Middle Center\n* `middleRight` - Middle Right\n* `bottomLeft` - Bottom Left\n* `bottomCenter` - Bottom Center\n* `bottomRight` - Bottom Right"},"dndDropX":{"type":["number","null"],"format":"double"},"dndDropY":{"type":["number","null"],"format":"double"}},"required":["dndDragOn","dndDropInteractionPosition","dndDropOn","id","interactionPosition","originGroupId","type"]},"ElementVisualRegressionStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"visualRegressionMaxDiff":{"type":["number","null"],"format":"double","maximum":100,"minimum":0},"visualRegressionRefScreenshots":{"type":"array","items":{"type":"object","additionalProperties":{}},"readOnly":true},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","originGroupId","selectorsPresets","type","visualRegressionRefScreenshots"]},"ExecuteStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"code":{"type":"string"}},"required":["code","id","originGroupId","type"]},"GotoStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"url":{"type":"string"},"username":{"type":["string","null"]},"password":{"type":["string","null"]},"frameLocation":{"type":"string"}},"required":["id","originGroupId","type","url"]},"GoBackStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}}},"required":["id","originGroupId","type"]},"GoForwardStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}}},"required":["id","originGroupId","type"]},"HoverStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"interactionPosition":{"enum":["smart","custom","topLeft","topCenter","topRight","middleLeft","middleCenter","middleRight","bottomLeft","bottomCenter","bottomRight"],"type":"string","description":"Required interaction target position. auto is not supported.\n\n* `smart` - Smart\n* `custom` - Custom\n* `topLeft` - Top Left\n* `topCenter` - Top Center\n* `topRight` - Top Right\n* `middleLeft` - Middle Left\n* `middleCenter` - Middle Center\n* `middleRight` - Middle Right\n* `bottomLeft` - Bottom Left\n* `bottomCenter` - Bottom Center\n* `bottomRight` - Bottom Right"},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","interactionPosition","originGroupId","type"]},"IfConditionStep":{"type":"object","description":"If condition steps reuse assertion_* fields as the branch condition.","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}},"assertionProperty":{"enum":["checked","count","customJavaScript","exist","notChecked","notExist","notVisible","textContent","value","visible","pageTitle","pageShowsText","pageDoesNotShowText","pageUrlIs","downloadStarted","variableValue","clipboardValue","disabled","notDisabled"],"type":"string","description":"* `checked` - Checked\n* `count` - Count\n* `customJavaScript` - Custom Javascript\n* `exist` - Exist\n* `notChecked` - Not Checked\n* `notExist` - Not Exist\n* `notVisible` - Not Visible\n* `textContent` - Text Content\n* `value` - Value\n* `visible` - Visible\n* `pageTitle` - Page Has Title\n* `pageShowsText` - Page Shows Text\n* `pageDoesNotShowText` - Page Does Not Show Text\n* `pageUrlIs` - Page Url Is\n* `downloadStarted` - Download Started\n* `variableValue` - Variable Value\n* `clipboardValue` - Clipboard Value\n* `disabled` - Disabled\n* `notDisabled` - Not Disabled"},"assertionType":{"enum":["contain","equal","greaterThan","lessThan","match","notContain","notEqual","any"],"type":"string","description":"* `contain` - Contain\n* `equal` - Equal\n* `greaterThan` - Greater Than\n* `lessThan` - Less Than\n* `match` - Match\n* `notContain` - Not Contain\n* `notEqual` - Not Equal\n* `any` - Any"},"assertionExpectedValue":{"type":["string","null"],"maxLength":10000},"assertionJavaScript":{"type":["string","null"],"description":"Required for assert and ifCondition steps. Send an empty string when unused."},"assertionVariableName":{"type":["string","null"],"description":"Required for assert and ifCondition steps. Send an empty string when unused."}},"required":["assertionExpectedValue","assertionJavaScript","assertionProperty","assertionType","assertionVariableName","id","originGroupId","type"]},"MouseDownStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"interactionPosition":{"enum":["smart","custom","topLeft","topCenter","topRight","middleLeft","middleCenter","middleRight","bottomLeft","bottomCenter","bottomRight"],"type":"string","description":"Required interaction target position. auto is not supported.\n\n* `smart` - Smart\n* `custom` - Custom\n* `topLeft` - Top Left\n* `topCenter` - Top Center\n* `topRight` - Top Right\n* `middleLeft` - Middle Left\n* `middleCenter` - Middle Center\n* `middleRight` - Middle Right\n* `bottomLeft` - Bottom Left\n* `bottomCenter` - Bottom Center\n* `bottomRight` - Bottom Right"},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","interactionPosition","originGroupId","type"]},"MouseUpStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"interactionPosition":{"enum":["smart","custom","topLeft","topCenter","topRight","middleLeft","middleCenter","middleRight","bottomLeft","bottomCenter","bottomRight"],"type":"string","description":"Required interaction target position. auto is not supported.\n\n* `smart` - Smart\n* `custom` - Custom\n* `topLeft` - Top Left\n* `topCenter` - Top Center\n* `topRight` - Top Right\n* `middleLeft` - Middle Left\n* `middleCenter` - Middle Center\n* `middleRight` - Middle Right\n* `bottomLeft` - Bottom Left\n* `bottomCenter` - Bottom Center\n* `bottomRight` - Bottom Right"},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","interactionPosition","originGroupId","type"]},"NewTabStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"url":{"type":["string","null"]},"username":{"type":["string","null"]},"password":{"type":["string","null"]}},"required":["id","originGroupId","type"]},"PageVisualRegressionStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"visualRegressionMaxDiff":{"type":["number","null"],"format":"double","maximum":100,"minimum":0},"visualRegressionRefScreenshots":{"type":"array","items":{"type":"object","additionalProperties":{}},"readOnly":true}},"required":["id","originGroupId","type","visualRegressionRefScreenshots"]},"ReloadPageStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}}},"required":["id","originGroupId","type"]},"ScrollStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}},"scrollX":{"type":["number","null"],"format":"double"},"scrollY":{"type":["number","null"],"format":"double"},"scrollEdge":{"enum":["topLeft","topCenter","topRight","middleLeft","middleCenter","middleRight","bottomLeft","bottomCenter","bottomRight",null],"type":["string","null"],"description":"* `topLeft` - Top Left\n* `topCenter` - Top Center\n* `topRight` - Top Right\n* `middleLeft` - Middle Left\n* `middleCenter` - Middle Center\n* `middleRight` - Middle Right\n* `bottomLeft` - Bottom Left\n* `bottomCenter` - Bottom Center\n* `bottomRight` - Bottom Right"},"scrollDirection":{"enum":["down","up","right","left",null],"type":["string","null"],"description":"* `down` - Down\n* `up` - Up\n* `right` - Right\n* `left` - Left"},"scrollTo":{"enum":["coords","edge","untilNextStepElementIsVisible","elementIntoView"],"type":"string","description":"* `coords` - Coords\n* `edge` - Edge\n* `untilNextStepElementIsVisible` - Until Next Step Element Is Visible\n* `elementIntoView` - Element Into View"},"scrollInside":{"enum":["window","element"],"type":"string","description":"* `window` - window\n* `element` - element"}},"required":["id","originGroupId","scrollInside","scrollTo","type"]},"SelectStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}},"value":{"type":"string"},"selectType":{"enum":["text","index","value"],"type":"string","description":"* `text` - text\n* `index` - index\n* `value` - value"},"selectIsMultiple":{"type":"boolean","default":false}},"required":["id","originGroupId","selectType","type","value"]},"SetLocalVariableStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}},"value":{"type":"string"},"code":{"type":["string","null"]},"localVariableName":{"type":"string"},"localVariableSource":{"enum":["element","value","evaluate"],"type":"string","description":"* `element` - element\n* `value` - value\n* `evaluate` - evaluate"}},"required":["id","localVariableName","localVariableSource","originGroupId","type"]},"SwitchContext":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}},"tabNo":{"type":"integer"},"value":{"enum":["topFrame","iframe"],"type":"string","description":"* `topFrame` - Top Frame\n* `iframe` - Iframe"}},"required":["id","originGroupId","tabNo","type","value"]},"TypeStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"value":{"type":"string"},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","originGroupId","type","value"]},"UploadStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"projectArtifactId":{"type":"string","format":"uuid"},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","originGroupId","projectArtifactId","type"]}}},"paths":{"/api/v2/steps/{id}/":{"put":{"operationId":"v2_steps_update","summary":"Updating a step","parameters":[{"in":"path","name":"id","schema":{"type":"string","format":"uuid"},"description":"A UUID string identifying this step.","required":true}],"tags":["Steps"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StepResponse"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StepResponse"}}},"description":""},"400":{"description":"Request body failed validation."},"401":{"description":"Authentication credentials were missing or invalid."},"404":{"description":"Resource not found."}}}}}}
```

## Removing a step

> Remove a step.

```json
{"openapi":"3.1.0","info":{"title":"BugBug.io Public API","version":"v2"},"tags":[{"name":"Steps","description":"Managing test steps"}],"security":[{"tokenAuth":[]},{"Bearer":[]}],"components":{"securitySchemes":{"tokenAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"Token-based authentication with required prefix \"Token\""}}},"paths":{"/api/v2/steps/{id}/":{"delete":{"operationId":"v2_steps_destroy","description":"Remove a step.","summary":"Removing a step","parameters":[{"in":"path","name":"id","schema":{"type":"string","format":"uuid"},"description":"A UUID string identifying this step.","required":true}],"tags":["Steps"],"responses":{"204":{"description":"No response body"},"401":{"description":"Authentication credentials were missing or invalid."},"404":{"description":"Resource not found."}}}}}}
```

## PATCH /api/v2/steps/{id}/

> Partially updating a step

```json
{"openapi":"3.1.0","info":{"title":"BugBug.io Public API","version":"v2"},"tags":[{"name":"Steps","description":"Managing test steps"}],"security":[{"tokenAuth":[]},{"Bearer":[]}],"components":{"securitySchemes":{"tokenAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"Token-based authentication with required prefix \"Token\""}},"schemas":{"PatchedStepResponse":{"oneOf":[{"$ref":"#/components/schemas/PatchedV2AnswerPromptStep"},{"$ref":"#/components/schemas/PatchedAssertStep"},{"$ref":"#/components/schemas/PatchedPastFromClipboardStep"},{"$ref":"#/components/schemas/PatchedChangeStep"},{"$ref":"#/components/schemas/PatchedClearStep"},{"$ref":"#/components/schemas/PatchedClickStep"},{"$ref":"#/components/schemas/PatchedCloseTabStep"},{"$ref":"#/components/schemas/PatchedV2DragAndDropStep"},{"$ref":"#/components/schemas/PatchedElementVisualRegressionStep"},{"$ref":"#/components/schemas/PatchedExecuteStep"},{"$ref":"#/components/schemas/PatchedGotoStep"},{"$ref":"#/components/schemas/PatchedGoBackStep"},{"$ref":"#/components/schemas/PatchedGoForwardStep"},{"$ref":"#/components/schemas/PatchedHoverStep"},{"$ref":"#/components/schemas/PatchedIfConditionStep"},{"$ref":"#/components/schemas/PatchedMouseDownStep"},{"$ref":"#/components/schemas/PatchedMouseUpStep"},{"$ref":"#/components/schemas/PatchedNewTabStep"},{"$ref":"#/components/schemas/PatchedPageVisualRegressionStep"},{"$ref":"#/components/schemas/PatchedReloadPageStep"},{"$ref":"#/components/schemas/PatchedScrollStep"},{"$ref":"#/components/schemas/PatchedSelectStep"},{"$ref":"#/components/schemas/PatchedSetLocalVariableStep"},{"$ref":"#/components/schemas/PatchedSwitchContext"},{"$ref":"#/components/schemas/PatchedTypeStep"},{"$ref":"#/components/schemas/PatchedUploadStep"}],"discriminator":{"propertyName":"type","mapping":{"answerPrompt":"#/components/schemas/PatchedV2AnswerPromptStep","assert":"#/components/schemas/PatchedAssertStep","pasteFromClipboard":"#/components/schemas/PatchedPastFromClipboardStep","change":"#/components/schemas/PatchedChangeStep","clear":"#/components/schemas/PatchedClearStep","click":"#/components/schemas/PatchedClickStep","closeTab":"#/components/schemas/PatchedCloseTabStep","dblClick":"#/components/schemas/PatchedClickStep","dragAndDrop":"#/components/schemas/PatchedV2DragAndDropStep","elementVisualRegression":"#/components/schemas/PatchedElementVisualRegressionStep","execute":"#/components/schemas/PatchedExecuteStep","goto":"#/components/schemas/PatchedGotoStep","goBack":"#/components/schemas/PatchedGoBackStep","goForward":"#/components/schemas/PatchedGoForwardStep","hover":"#/components/schemas/PatchedHoverStep","ifCondition":"#/components/schemas/PatchedIfConditionStep","mouseDown":"#/components/schemas/PatchedMouseDownStep","mouseUp":"#/components/schemas/PatchedMouseUpStep","newTab":"#/components/schemas/PatchedNewTabStep","pageVisualRegression":"#/components/schemas/PatchedPageVisualRegressionStep","reloadPage":"#/components/schemas/PatchedReloadPageStep","rightClick":"#/components/schemas/PatchedClickStep","scroll":"#/components/schemas/PatchedScrollStep","select":"#/components/schemas/PatchedSelectStep","setLocalVariable":"#/components/schemas/PatchedSetLocalVariableStep","switchContext":"#/components/schemas/PatchedSwitchContext","type":"#/components/schemas/PatchedTypeStep","uploadFile":"#/components/schemas/PatchedUploadStep"}}},"PatchedV2AnswerPromptStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"value":{"type":"string"}}},"UpdateStepWaitingCondition":{"type":"object","properties":{"type":{"enum":["documentComplete","elementIsVisible","elementIsNotCovered","elementIsNotAnimating","elementIsNotDisabled","elementHasFocus","networkIdle","pageNavigationAfterExecution","elementHasAttribute"],"type":"string","description":"* `documentComplete` - documentComplete\n* `elementIsVisible` - elementIsVisible\n* `elementIsNotCovered` - elementIsNotCovered\n* `elementIsNotAnimating` - elementIsNotAnimating\n* `elementIsNotDisabled` - elementIsNotDisabled\n* `elementHasFocus` - elementHasFocus\n* `networkIdle` - networkIdle\n* `pageNavigationAfterExecution` - pageNavigationAfterExecution\n* `elementHasAttribute` - elementHasAttribute"},"expected":{"type":["string","null"]},"isActive":{"type":"boolean"},"isOverridden":{"type":"boolean","writeOnly":true,"description":"Required for each item when sending waitingConditions."},"timeout":{"type":["integer","null"]}},"required":["isActive","isOverridden","type"]},"PatchedAssertStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}},"continueOnFailure":{"type":"boolean","default":false},"assertionProperty":{"enum":["checked","count","customJavaScript","exist","notChecked","notExist","notVisible","textContent","value","visible","pageTitle","pageShowsText","pageDoesNotShowText","pageUrlIs","downloadStarted","variableValue","clipboardValue","disabled","notDisabled"],"type":"string","description":"* `checked` - Checked\n* `count` - Count\n* `customJavaScript` - Custom Javascript\n* `exist` - Exist\n* `notChecked` - Not Checked\n* `notExist` - Not Exist\n* `notVisible` - Not Visible\n* `textContent` - Text Content\n* `value` - Value\n* `visible` - Visible\n* `pageTitle` - Page Has Title\n* `pageShowsText` - Page Shows Text\n* `pageDoesNotShowText` - Page Does Not Show Text\n* `pageUrlIs` - Page Url Is\n* `downloadStarted` - Download Started\n* `variableValue` - Variable Value\n* `clipboardValue` - Clipboard Value\n* `disabled` - Disabled\n* `notDisabled` - Not Disabled"},"assertionType":{"enum":["contain","equal","greaterThan","lessThan","match","notContain","notEqual","any"],"type":"string","description":"* `contain` - Contain\n* `equal` - Equal\n* `greaterThan` - Greater Than\n* `lessThan` - Less Than\n* `match` - Match\n* `notContain` - Not Contain\n* `notEqual` - Not Equal\n* `any` - Any"},"assertionExpectedValue":{"type":["string","null"],"maxLength":10000},"assertionJavaScript":{"type":["string","null"],"description":"Required for assert and ifCondition steps. Send an empty string when unused."},"assertionVariableName":{"type":["string","null"],"description":"Required for assert and ifCondition steps. Send an empty string when unused."}}},"UpdateSelectorsPresetGroup":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"isActive":{"type":"boolean","default":false},"isCustom":{"type":"boolean","default":false},"selectorsGroups":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsGroup"}}},"required":["selectorsGroups"]},"UpdateSelectorsGroup":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"selectors":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelector"}},"relation":{"enum":["descendant","ancestor","sibling"],"type":"string","description":"* `descendant` - Descendant\n* `ancestor` - Ancestor\n* `sibling` - Sibling"}},"required":["relation","selectors"]},"UpdateSelector":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"type":{"enum":["XPath","customCSS","customXPath","",null],"type":["string","null"],"description":"* `XPath` - Xpath\n* `customCSS` - Custom Css\n* `customXPath` - Custom Xpath"},"selector":{"type":["string","null"]},"isActive":{"type":"boolean"},"score":{"type":["string","null"]}},"required":["isActive","selector","type"]},"PatchedPastFromClipboardStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}}},"PatchedChangeStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"value":{"type":"string"},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}}},"PatchedClearStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}}},"PatchedClickStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"interactionPosition":{"enum":["smart","custom","topLeft","topCenter","topRight","middleLeft","middleCenter","middleRight","bottomLeft","bottomCenter","bottomRight"],"type":"string","description":"Required interaction target position. auto is not supported.\n\n* `smart` - Smart\n* `custom` - Custom\n* `topLeft` - Top Left\n* `topCenter` - Top Center\n* `topRight` - Top Right\n* `middleLeft` - Middle Left\n* `middleCenter` - Middle Center\n* `middleRight` - Middle Right\n* `bottomLeft` - Bottom Left\n* `bottomCenter` - Bottom Center\n* `bottomRight` - Bottom Right"},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}}},"PatchedCloseTabStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}}}},"PatchedV2DragAndDropStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}},"dndDropSelectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}},"dndDragOn":{"enum":["coords","element"],"type":"string","description":"* `coords` - coords\n* `element` - element"},"interactionPosition":{"enum":["smart","custom","topLeft","topCenter","topRight","middleLeft","middleCenter","middleRight","bottomLeft","bottomCenter","bottomRight"],"type":"string","description":"Required interaction target position. auto is not supported.\n\n* `smart` - Smart\n* `custom` - Custom\n* `topLeft` - Top Left\n* `topCenter` - Top Center\n* `topRight` - Top Right\n* `middleLeft` - Middle Left\n* `middleCenter` - Middle Center\n* `middleRight` - Middle Right\n* `bottomLeft` - Bottom Left\n* `bottomCenter` - Bottom Center\n* `bottomRight` - Bottom Right"},"dndDragX":{"type":["number","null"],"format":"double"},"dndDragY":{"type":["number","null"],"format":"double"},"dndDropOn":{"enum":["coords","element"],"type":"string","description":"* `coords` - coords\n* `element` - element"},"dndDropInteractionPosition":{"enum":["smart","custom","topLeft","topCenter","topRight","middleLeft","middleCenter","middleRight","bottomLeft","bottomCenter","bottomRight"],"type":"string","description":"Required interaction target position. auto is not supported.\n\n* `smart` - Smart\n* `custom` - Custom\n* `topLeft` - Top Left\n* `topCenter` - Top Center\n* `topRight` - Top Right\n* `middleLeft` - Middle Left\n* `middleCenter` - Middle Center\n* `middleRight` - Middle Right\n* `bottomLeft` - Bottom Left\n* `bottomCenter` - Bottom Center\n* `bottomRight` - Bottom Right"},"dndDropX":{"type":["number","null"],"format":"double"},"dndDropY":{"type":["number","null"],"format":"double"}}},"PatchedElementVisualRegressionStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"visualRegressionMaxDiff":{"type":["number","null"],"format":"double","maximum":100,"minimum":0},"visualRegressionRefScreenshots":{"type":"array","items":{"type":"object","additionalProperties":{}},"readOnly":true},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}}},"PatchedExecuteStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"code":{"type":"string"}}},"PatchedGotoStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"url":{"type":"string"},"username":{"type":["string","null"]},"password":{"type":["string","null"]},"frameLocation":{"type":"string"}}},"PatchedGoBackStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}}}},"PatchedGoForwardStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}}}},"PatchedHoverStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"interactionPosition":{"enum":["smart","custom","topLeft","topCenter","topRight","middleLeft","middleCenter","middleRight","bottomLeft","bottomCenter","bottomRight"],"type":"string","description":"Required interaction target position. auto is not supported.\n\n* `smart` - Smart\n* `custom` - Custom\n* `topLeft` - Top Left\n* `topCenter` - Top Center\n* `topRight` - Top Right\n* `middleLeft` - Middle Left\n* `middleCenter` - Middle Center\n* `middleRight` - Middle Right\n* `bottomLeft` - Bottom Left\n* `bottomCenter` - Bottom Center\n* `bottomRight` - Bottom Right"},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}}},"PatchedIfConditionStep":{"type":"object","description":"If condition steps reuse assertion_* fields as the branch condition.","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}},"assertionProperty":{"enum":["checked","count","customJavaScript","exist","notChecked","notExist","notVisible","textContent","value","visible","pageTitle","pageShowsText","pageDoesNotShowText","pageUrlIs","downloadStarted","variableValue","clipboardValue","disabled","notDisabled"],"type":"string","description":"* `checked` - Checked\n* `count` - Count\n* `customJavaScript` - Custom Javascript\n* `exist` - Exist\n* `notChecked` - Not Checked\n* `notExist` - Not Exist\n* `notVisible` - Not Visible\n* `textContent` - Text Content\n* `value` - Value\n* `visible` - Visible\n* `pageTitle` - Page Has Title\n* `pageShowsText` - Page Shows Text\n* `pageDoesNotShowText` - Page Does Not Show Text\n* `pageUrlIs` - Page Url Is\n* `downloadStarted` - Download Started\n* `variableValue` - Variable Value\n* `clipboardValue` - Clipboard Value\n* `disabled` - Disabled\n* `notDisabled` - Not Disabled"},"assertionType":{"enum":["contain","equal","greaterThan","lessThan","match","notContain","notEqual","any"],"type":"string","description":"* `contain` - Contain\n* `equal` - Equal\n* `greaterThan` - Greater Than\n* `lessThan` - Less Than\n* `match` - Match\n* `notContain` - Not Contain\n* `notEqual` - Not Equal\n* `any` - Any"},"assertionExpectedValue":{"type":["string","null"],"maxLength":10000},"assertionJavaScript":{"type":["string","null"],"description":"Required for assert and ifCondition steps. Send an empty string when unused."},"assertionVariableName":{"type":["string","null"],"description":"Required for assert and ifCondition steps. Send an empty string when unused."}}},"PatchedMouseDownStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"interactionPosition":{"enum":["smart","custom","topLeft","topCenter","topRight","middleLeft","middleCenter","middleRight","bottomLeft","bottomCenter","bottomRight"],"type":"string","description":"Required interaction target position. auto is not supported.\n\n* `smart` - Smart\n* `custom` - Custom\n* `topLeft` - Top Left\n* `topCenter` - Top Center\n* `topRight` - Top Right\n* `middleLeft` - Middle Left\n* `middleCenter` - Middle Center\n* `middleRight` - Middle Right\n* `bottomLeft` - Bottom Left\n* `bottomCenter` - Bottom Center\n* `bottomRight` - Bottom Right"},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}}},"PatchedMouseUpStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"interactionPosition":{"enum":["smart","custom","topLeft","topCenter","topRight","middleLeft","middleCenter","middleRight","bottomLeft","bottomCenter","bottomRight"],"type":"string","description":"Required interaction target position. auto is not supported.\n\n* `smart` - Smart\n* `custom` - Custom\n* `topLeft` - Top Left\n* `topCenter` - Top Center\n* `topRight` - Top Right\n* `middleLeft` - Middle Left\n* `middleCenter` - Middle Center\n* `middleRight` - Middle Right\n* `bottomLeft` - Bottom Left\n* `bottomCenter` - Bottom Center\n* `bottomRight` - Bottom Right"},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}}},"PatchedNewTabStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"url":{"type":["string","null"]},"username":{"type":["string","null"]},"password":{"type":["string","null"]}}},"PatchedPageVisualRegressionStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"visualRegressionMaxDiff":{"type":["number","null"],"format":"double","maximum":100,"minimum":0},"visualRegressionRefScreenshots":{"type":"array","items":{"type":"object","additionalProperties":{}},"readOnly":true}}},"PatchedReloadPageStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}}}},"PatchedScrollStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}},"scrollX":{"type":["number","null"],"format":"double"},"scrollY":{"type":["number","null"],"format":"double"},"scrollEdge":{"enum":["topLeft","topCenter","topRight","middleLeft","middleCenter","middleRight","bottomLeft","bottomCenter","bottomRight",null],"type":["string","null"],"description":"* `topLeft` - Top Left\n* `topCenter` - Top Center\n* `topRight` - Top Right\n* `middleLeft` - Middle Left\n* `middleCenter` - Middle Center\n* `middleRight` - Middle Right\n* `bottomLeft` - Bottom Left\n* `bottomCenter` - Bottom Center\n* `bottomRight` - Bottom Right"},"scrollDirection":{"enum":["down","up","right","left",null],"type":["string","null"],"description":"* `down` - Down\n* `up` - Up\n* `right` - Right\n* `left` - Left"},"scrollTo":{"enum":["coords","edge","untilNextStepElementIsVisible","elementIntoView"],"type":"string","description":"* `coords` - Coords\n* `edge` - Edge\n* `untilNextStepElementIsVisible` - Until Next Step Element Is Visible\n* `elementIntoView` - Element Into View"},"scrollInside":{"enum":["window","element"],"type":"string","description":"* `window` - window\n* `element` - element"}}},"PatchedSelectStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}},"value":{"type":"string"},"selectType":{"enum":["text","index","value"],"type":"string","description":"* `text` - text\n* `index` - index\n* `value` - value"},"selectIsMultiple":{"type":"boolean","default":false}}},"PatchedSetLocalVariableStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}},"value":{"type":"string"},"code":{"type":["string","null"]},"localVariableName":{"type":"string"},"localVariableSource":{"enum":["element","value","evaluate"],"type":"string","description":"* `element` - element\n* `value` - value\n* `evaluate` - evaluate"}}},"PatchedSwitchContext":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}},"tabNo":{"type":"integer"},"value":{"enum":["topFrame","iframe"],"type":"string","description":"* `topFrame` - Top Frame\n* `iframe` - Iframe"}}},"PatchedTypeStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"value":{"type":"string"},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}}},"PatchedUploadStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"projectArtifactId":{"type":"string","format":"uuid"},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}}},"StepResponse":{"oneOf":[{"$ref":"#/components/schemas/V2AnswerPromptStep"},{"$ref":"#/components/schemas/AssertStep"},{"$ref":"#/components/schemas/PastFromClipboardStep"},{"$ref":"#/components/schemas/ChangeStep"},{"$ref":"#/components/schemas/ClearStep"},{"$ref":"#/components/schemas/ClickStep"},{"$ref":"#/components/schemas/CloseTabStep"},{"$ref":"#/components/schemas/V2DragAndDropStep"},{"$ref":"#/components/schemas/ElementVisualRegressionStep"},{"$ref":"#/components/schemas/ExecuteStep"},{"$ref":"#/components/schemas/GotoStep"},{"$ref":"#/components/schemas/GoBackStep"},{"$ref":"#/components/schemas/GoForwardStep"},{"$ref":"#/components/schemas/HoverStep"},{"$ref":"#/components/schemas/IfConditionStep"},{"$ref":"#/components/schemas/MouseDownStep"},{"$ref":"#/components/schemas/MouseUpStep"},{"$ref":"#/components/schemas/NewTabStep"},{"$ref":"#/components/schemas/PageVisualRegressionStep"},{"$ref":"#/components/schemas/ReloadPageStep"},{"$ref":"#/components/schemas/ScrollStep"},{"$ref":"#/components/schemas/SelectStep"},{"$ref":"#/components/schemas/SetLocalVariableStep"},{"$ref":"#/components/schemas/SwitchContext"},{"$ref":"#/components/schemas/TypeStep"},{"$ref":"#/components/schemas/UploadStep"}],"discriminator":{"propertyName":"type","mapping":{"answerPrompt":"#/components/schemas/V2AnswerPromptStep","assert":"#/components/schemas/AssertStep","pasteFromClipboard":"#/components/schemas/PastFromClipboardStep","change":"#/components/schemas/ChangeStep","clear":"#/components/schemas/ClearStep","click":"#/components/schemas/ClickStep","closeTab":"#/components/schemas/CloseTabStep","dblClick":"#/components/schemas/ClickStep","dragAndDrop":"#/components/schemas/V2DragAndDropStep","elementVisualRegression":"#/components/schemas/ElementVisualRegressionStep","execute":"#/components/schemas/ExecuteStep","goto":"#/components/schemas/GotoStep","goBack":"#/components/schemas/GoBackStep","goForward":"#/components/schemas/GoForwardStep","hover":"#/components/schemas/HoverStep","ifCondition":"#/components/schemas/IfConditionStep","mouseDown":"#/components/schemas/MouseDownStep","mouseUp":"#/components/schemas/MouseUpStep","newTab":"#/components/schemas/NewTabStep","pageVisualRegression":"#/components/schemas/PageVisualRegressionStep","reloadPage":"#/components/schemas/ReloadPageStep","rightClick":"#/components/schemas/ClickStep","scroll":"#/components/schemas/ScrollStep","select":"#/components/schemas/SelectStep","setLocalVariable":"#/components/schemas/SetLocalVariableStep","switchContext":"#/components/schemas/SwitchContext","type":"#/components/schemas/TypeStep","uploadFile":"#/components/schemas/UploadStep"}}},"V2AnswerPromptStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"value":{"type":"string"}},"required":["id","originGroupId","type","value"]},"AssertStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}},"continueOnFailure":{"type":"boolean","default":false},"assertionProperty":{"enum":["checked","count","customJavaScript","exist","notChecked","notExist","notVisible","textContent","value","visible","pageTitle","pageShowsText","pageDoesNotShowText","pageUrlIs","downloadStarted","variableValue","clipboardValue","disabled","notDisabled"],"type":"string","description":"* `checked` - Checked\n* `count` - Count\n* `customJavaScript` - Custom Javascript\n* `exist` - Exist\n* `notChecked` - Not Checked\n* `notExist` - Not Exist\n* `notVisible` - Not Visible\n* `textContent` - Text Content\n* `value` - Value\n* `visible` - Visible\n* `pageTitle` - Page Has Title\n* `pageShowsText` - Page Shows Text\n* `pageDoesNotShowText` - Page Does Not Show Text\n* `pageUrlIs` - Page Url Is\n* `downloadStarted` - Download Started\n* `variableValue` - Variable Value\n* `clipboardValue` - Clipboard Value\n* `disabled` - Disabled\n* `notDisabled` - Not Disabled"},"assertionType":{"enum":["contain","equal","greaterThan","lessThan","match","notContain","notEqual","any"],"type":"string","description":"* `contain` - Contain\n* `equal` - Equal\n* `greaterThan` - Greater Than\n* `lessThan` - Less Than\n* `match` - Match\n* `notContain` - Not Contain\n* `notEqual` - Not Equal\n* `any` - Any"},"assertionExpectedValue":{"type":["string","null"],"maxLength":10000},"assertionJavaScript":{"type":["string","null"],"description":"Required for assert and ifCondition steps. Send an empty string when unused."},"assertionVariableName":{"type":["string","null"],"description":"Required for assert and ifCondition steps. Send an empty string when unused."}},"required":["assertionExpectedValue","assertionJavaScript","assertionProperty","assertionType","assertionVariableName","id","originGroupId","type"]},"PastFromClipboardStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","originGroupId","type"]},"ChangeStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"value":{"type":"string"},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","originGroupId","type","value"]},"ClearStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","originGroupId","type"]},"ClickStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"interactionPosition":{"enum":["smart","custom","topLeft","topCenter","topRight","middleLeft","middleCenter","middleRight","bottomLeft","bottomCenter","bottomRight"],"type":"string","description":"Required interaction target position. auto is not supported.\n\n* `smart` - Smart\n* `custom` - Custom\n* `topLeft` - Top Left\n* `topCenter` - Top Center\n* `topRight` - Top Right\n* `middleLeft` - Middle Left\n* `middleCenter` - Middle Center\n* `middleRight` - Middle Right\n* `bottomLeft` - Bottom Left\n* `bottomCenter` - Bottom Center\n* `bottomRight` - Bottom Right"},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","interactionPosition","originGroupId","type"]},"CloseTabStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}}},"required":["id","originGroupId","type"]},"V2DragAndDropStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}},"dndDropSelectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}},"dndDragOn":{"enum":["coords","element"],"type":"string","description":"* `coords` - coords\n* `element` - element"},"interactionPosition":{"enum":["smart","custom","topLeft","topCenter","topRight","middleLeft","middleCenter","middleRight","bottomLeft","bottomCenter","bottomRight"],"type":"string","description":"Required interaction target position. auto is not supported.\n\n* `smart` - Smart\n* `custom` - Custom\n* `topLeft` - Top Left\n* `topCenter` - Top Center\n* `topRight` - Top Right\n* `middleLeft` - Middle Left\n* `middleCenter` - Middle Center\n* `middleRight` - Middle Right\n* `bottomLeft` - Bottom Left\n* `bottomCenter` - Bottom Center\n* `bottomRight` - Bottom Right"},"dndDragX":{"type":["number","null"],"format":"double"},"dndDragY":{"type":["number","null"],"format":"double"},"dndDropOn":{"enum":["coords","element"],"type":"string","description":"* `coords` - coords\n* `element` - element"},"dndDropInteractionPosition":{"enum":["smart","custom","topLeft","topCenter","topRight","middleLeft","middleCenter","middleRight","bottomLeft","bottomCenter","bottomRight"],"type":"string","description":"Required interaction target position. auto is not supported.\n\n* `smart` - Smart\n* `custom` - Custom\n* `topLeft` - Top Left\n* `topCenter` - Top Center\n* `topRight` - Top Right\n* `middleLeft` - Middle Left\n* `middleCenter` - Middle Center\n* `middleRight` - Middle Right\n* `bottomLeft` - Bottom Left\n* `bottomCenter` - Bottom Center\n* `bottomRight` - Bottom Right"},"dndDropX":{"type":["number","null"],"format":"double"},"dndDropY":{"type":["number","null"],"format":"double"}},"required":["dndDragOn","dndDropInteractionPosition","dndDropOn","id","interactionPosition","originGroupId","type"]},"ElementVisualRegressionStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"visualRegressionMaxDiff":{"type":["number","null"],"format":"double","maximum":100,"minimum":0},"visualRegressionRefScreenshots":{"type":"array","items":{"type":"object","additionalProperties":{}},"readOnly":true},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","originGroupId","selectorsPresets","type","visualRegressionRefScreenshots"]},"ExecuteStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"code":{"type":"string"}},"required":["code","id","originGroupId","type"]},"GotoStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"url":{"type":"string"},"username":{"type":["string","null"]},"password":{"type":["string","null"]},"frameLocation":{"type":"string"}},"required":["id","originGroupId","type","url"]},"GoBackStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}}},"required":["id","originGroupId","type"]},"GoForwardStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}}},"required":["id","originGroupId","type"]},"HoverStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"interactionPosition":{"enum":["smart","custom","topLeft","topCenter","topRight","middleLeft","middleCenter","middleRight","bottomLeft","bottomCenter","bottomRight"],"type":"string","description":"Required interaction target position. auto is not supported.\n\n* `smart` - Smart\n* `custom` - Custom\n* `topLeft` - Top Left\n* `topCenter` - Top Center\n* `topRight` - Top Right\n* `middleLeft` - Middle Left\n* `middleCenter` - Middle Center\n* `middleRight` - Middle Right\n* `bottomLeft` - Bottom Left\n* `bottomCenter` - Bottom Center\n* `bottomRight` - Bottom Right"},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","interactionPosition","originGroupId","type"]},"IfConditionStep":{"type":"object","description":"If condition steps reuse assertion_* fields as the branch condition.","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}},"assertionProperty":{"enum":["checked","count","customJavaScript","exist","notChecked","notExist","notVisible","textContent","value","visible","pageTitle","pageShowsText","pageDoesNotShowText","pageUrlIs","downloadStarted","variableValue","clipboardValue","disabled","notDisabled"],"type":"string","description":"* `checked` - Checked\n* `count` - Count\n* `customJavaScript` - Custom Javascript\n* `exist` - Exist\n* `notChecked` - Not Checked\n* `notExist` - Not Exist\n* `notVisible` - Not Visible\n* `textContent` - Text Content\n* `value` - Value\n* `visible` - Visible\n* `pageTitle` - Page Has Title\n* `pageShowsText` - Page Shows Text\n* `pageDoesNotShowText` - Page Does Not Show Text\n* `pageUrlIs` - Page Url Is\n* `downloadStarted` - Download Started\n* `variableValue` - Variable Value\n* `clipboardValue` - Clipboard Value\n* `disabled` - Disabled\n* `notDisabled` - Not Disabled"},"assertionType":{"enum":["contain","equal","greaterThan","lessThan","match","notContain","notEqual","any"],"type":"string","description":"* `contain` - Contain\n* `equal` - Equal\n* `greaterThan` - Greater Than\n* `lessThan` - Less Than\n* `match` - Match\n* `notContain` - Not Contain\n* `notEqual` - Not Equal\n* `any` - Any"},"assertionExpectedValue":{"type":["string","null"],"maxLength":10000},"assertionJavaScript":{"type":["string","null"],"description":"Required for assert and ifCondition steps. Send an empty string when unused."},"assertionVariableName":{"type":["string","null"],"description":"Required for assert and ifCondition steps. Send an empty string when unused."}},"required":["assertionExpectedValue","assertionJavaScript","assertionProperty","assertionType","assertionVariableName","id","originGroupId","type"]},"MouseDownStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"interactionPosition":{"enum":["smart","custom","topLeft","topCenter","topRight","middleLeft","middleCenter","middleRight","bottomLeft","bottomCenter","bottomRight"],"type":"string","description":"Required interaction target position. auto is not supported.\n\n* `smart` - Smart\n* `custom` - Custom\n* `topLeft` - Top Left\n* `topCenter` - Top Center\n* `topRight` - Top Right\n* `middleLeft` - Middle Left\n* `middleCenter` - Middle Center\n* `middleRight` - Middle Right\n* `bottomLeft` - Bottom Left\n* `bottomCenter` - Bottom Center\n* `bottomRight` - Bottom Right"},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","interactionPosition","originGroupId","type"]},"MouseUpStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"interactionPosition":{"enum":["smart","custom","topLeft","topCenter","topRight","middleLeft","middleCenter","middleRight","bottomLeft","bottomCenter","bottomRight"],"type":"string","description":"Required interaction target position. auto is not supported.\n\n* `smart` - Smart\n* `custom` - Custom\n* `topLeft` - Top Left\n* `topCenter` - Top Center\n* `topRight` - Top Right\n* `middleLeft` - Middle Left\n* `middleCenter` - Middle Center\n* `middleRight` - Middle Right\n* `bottomLeft` - Bottom Left\n* `bottomCenter` - Bottom Center\n* `bottomRight` - Bottom Right"},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","interactionPosition","originGroupId","type"]},"NewTabStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"url":{"type":["string","null"]},"username":{"type":["string","null"]},"password":{"type":["string","null"]}},"required":["id","originGroupId","type"]},"PageVisualRegressionStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"visualRegressionMaxDiff":{"type":["number","null"],"format":"double","maximum":100,"minimum":0},"visualRegressionRefScreenshots":{"type":"array","items":{"type":"object","additionalProperties":{}},"readOnly":true}},"required":["id","originGroupId","type","visualRegressionRefScreenshots"]},"ReloadPageStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}}},"required":["id","originGroupId","type"]},"ScrollStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}},"scrollX":{"type":["number","null"],"format":"double"},"scrollY":{"type":["number","null"],"format":"double"},"scrollEdge":{"enum":["topLeft","topCenter","topRight","middleLeft","middleCenter","middleRight","bottomLeft","bottomCenter","bottomRight",null],"type":["string","null"],"description":"* `topLeft` - Top Left\n* `topCenter` - Top Center\n* `topRight` - Top Right\n* `middleLeft` - Middle Left\n* `middleCenter` - Middle Center\n* `middleRight` - Middle Right\n* `bottomLeft` - Bottom Left\n* `bottomCenter` - Bottom Center\n* `bottomRight` - Bottom Right"},"scrollDirection":{"enum":["down","up","right","left",null],"type":["string","null"],"description":"* `down` - Down\n* `up` - Up\n* `right` - Right\n* `left` - Left"},"scrollTo":{"enum":["coords","edge","untilNextStepElementIsVisible","elementIntoView"],"type":"string","description":"* `coords` - Coords\n* `edge` - Edge\n* `untilNextStepElementIsVisible` - Until Next Step Element Is Visible\n* `elementIntoView` - Element Into View"},"scrollInside":{"enum":["window","element"],"type":"string","description":"* `window` - window\n* `element` - element"}},"required":["id","originGroupId","scrollInside","scrollTo","type"]},"SelectStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}},"value":{"type":"string"},"selectType":{"enum":["text","index","value"],"type":"string","description":"* `text` - text\n* `index` - index\n* `value` - value"},"selectIsMultiple":{"type":"boolean","default":false}},"required":["id","originGroupId","selectType","type","value"]},"SetLocalVariableStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}},"value":{"type":"string"},"code":{"type":["string","null"]},"localVariableName":{"type":"string"},"localVariableSource":{"enum":["element","value","evaluate"],"type":"string","description":"* `element` - element\n* `value` - value\n* `evaluate` - evaluate"}},"required":["id","localVariableName","localVariableSource","originGroupId","type"]},"SwitchContext":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}},"tabNo":{"type":"integer"},"value":{"enum":["topFrame","iframe"],"type":"string","description":"* `topFrame` - Top Frame\n* `iframe` - Iframe"}},"required":["id","originGroupId","tabNo","type","value"]},"TypeStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"value":{"type":"string"},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","originGroupId","type","value"]},"UploadStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"projectArtifactId":{"type":"string","format":"uuid"},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","originGroupId","projectArtifactId","type"]}}},"paths":{"/api/v2/steps/{id}/":{"patch":{"operationId":"v2_steps_partial_update","summary":"Partially updating a step","parameters":[{"in":"path","name":"id","schema":{"type":"string","format":"uuid"},"description":"A UUID string identifying this step.","required":true}],"tags":["Steps"],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchedStepResponse"}}}},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StepResponse"}}},"description":""},"400":{"description":"Request body failed validation."},"401":{"description":"Authentication credentials were missing or invalid."},"404":{"description":"Resource not found."}}}}}}
```


# Components

Retrieving components

## Retrieving components list

> Returns many components.

```json
{"openapi":"3.1.0","info":{"title":"BugBug.io Public API","version":"v2"},"tags":[{"name":"Components","description":"Retrieving components"}],"security":[{"tokenAuth":[]},{"Bearer":[]}],"components":{"securitySchemes":{"tokenAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"Token-based authentication with required prefix \"Token\""}},"schemas":{"PaginatedV2GroupList":{"type":"object","required":["count","results"],"properties":{"count":{"type":"integer"},"next":{"type":"string","nullable":true,"format":"uri"},"previous":{"type":"string","nullable":true,"format":"uri"},"results":{"type":"array","items":{"$ref":"#/components/schemas/V2Group"}}}},"V2Group":{"type":"object","properties":{"id":{"type":"string","readOnly":true},"originGroupId":{"type":"string","format":"uuid","readOnly":true},"name":{"type":["string","null"],"readOnly":true},"isComponent":{"type":"boolean","readOnly":true},"steps":{"type":"array","items":{"$ref":"#/components/schemas/V2GroupStepResponse"},"readOnly":true}},"required":["id","isComponent","name","originGroupId","steps"]},"V2GroupStepResponse":{"oneOf":[{"$ref":"#/components/schemas/V2AnswerPromptStep"},{"$ref":"#/components/schemas/AssertStep"},{"$ref":"#/components/schemas/PastFromClipboardStep"},{"$ref":"#/components/schemas/ChangeStep"},{"$ref":"#/components/schemas/ClearStep"},{"$ref":"#/components/schemas/ClickStep"},{"$ref":"#/components/schemas/CloseTabStep"},{"$ref":"#/components/schemas/V2DragAndDropStep"},{"$ref":"#/components/schemas/ElementVisualRegressionStep"},{"$ref":"#/components/schemas/ExecuteStep"},{"$ref":"#/components/schemas/GotoStep"},{"$ref":"#/components/schemas/GoBackStep"},{"$ref":"#/components/schemas/GoForwardStep"},{"$ref":"#/components/schemas/HoverStep"},{"$ref":"#/components/schemas/IfConditionStep"},{"$ref":"#/components/schemas/MouseDownStep"},{"$ref":"#/components/schemas/MouseUpStep"},{"$ref":"#/components/schemas/NewTabStep"},{"$ref":"#/components/schemas/PageVisualRegressionStep"},{"$ref":"#/components/schemas/ReloadPageStep"},{"$ref":"#/components/schemas/ScrollStep"},{"$ref":"#/components/schemas/SelectStep"},{"$ref":"#/components/schemas/SetLocalVariableStep"},{"$ref":"#/components/schemas/SwitchContext"},{"$ref":"#/components/schemas/TypeStep"},{"$ref":"#/components/schemas/UploadStep"}],"discriminator":{"propertyName":"type","mapping":{"answerPrompt":"#/components/schemas/V2AnswerPromptStep","assert":"#/components/schemas/AssertStep","pasteFromClipboard":"#/components/schemas/PastFromClipboardStep","change":"#/components/schemas/ChangeStep","clear":"#/components/schemas/ClearStep","click":"#/components/schemas/ClickStep","closeTab":"#/components/schemas/CloseTabStep","dblClick":"#/components/schemas/ClickStep","dragAndDrop":"#/components/schemas/V2DragAndDropStep","elementVisualRegression":"#/components/schemas/ElementVisualRegressionStep","execute":"#/components/schemas/ExecuteStep","goto":"#/components/schemas/GotoStep","goBack":"#/components/schemas/GoBackStep","goForward":"#/components/schemas/GoForwardStep","hover":"#/components/schemas/HoverStep","ifCondition":"#/components/schemas/IfConditionStep","mouseDown":"#/components/schemas/MouseDownStep","mouseUp":"#/components/schemas/MouseUpStep","newTab":"#/components/schemas/NewTabStep","pageVisualRegression":"#/components/schemas/PageVisualRegressionStep","reloadPage":"#/components/schemas/ReloadPageStep","rightClick":"#/components/schemas/ClickStep","scroll":"#/components/schemas/ScrollStep","select":"#/components/schemas/SelectStep","setLocalVariable":"#/components/schemas/SetLocalVariableStep","switchContext":"#/components/schemas/SwitchContext","type":"#/components/schemas/TypeStep","uploadFile":"#/components/schemas/UploadStep"}}},"V2AnswerPromptStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"value":{"type":"string"}},"required":["id","originGroupId","type","value"]},"UpdateStepWaitingCondition":{"type":"object","properties":{"type":{"enum":["documentComplete","elementIsVisible","elementIsNotCovered","elementIsNotAnimating","elementIsNotDisabled","elementHasFocus","networkIdle","pageNavigationAfterExecution","elementHasAttribute"],"type":"string","description":"* `documentComplete` - documentComplete\n* `elementIsVisible` - elementIsVisible\n* `elementIsNotCovered` - elementIsNotCovered\n* `elementIsNotAnimating` - elementIsNotAnimating\n* `elementIsNotDisabled` - elementIsNotDisabled\n* `elementHasFocus` - elementHasFocus\n* `networkIdle` - networkIdle\n* `pageNavigationAfterExecution` - pageNavigationAfterExecution\n* `elementHasAttribute` - elementHasAttribute"},"expected":{"type":["string","null"]},"isActive":{"type":"boolean"},"isOverridden":{"type":"boolean","writeOnly":true,"description":"Required for each item when sending waitingConditions."},"timeout":{"type":["integer","null"]}},"required":["isActive","isOverridden","type"]},"AssertStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}},"continueOnFailure":{"type":"boolean","default":false},"assertionProperty":{"enum":["checked","count","customJavaScript","exist","notChecked","notExist","notVisible","textContent","value","visible","pageTitle","pageShowsText","pageDoesNotShowText","pageUrlIs","downloadStarted","variableValue","clipboardValue","disabled","notDisabled"],"type":"string","description":"* `checked` - Checked\n* `count` - Count\n* `customJavaScript` - Custom Javascript\n* `exist` - Exist\n* `notChecked` - Not Checked\n* `notExist` - Not Exist\n* `notVisible` - Not Visible\n* `textContent` - Text Content\n* `value` - Value\n* `visible` - Visible\n* `pageTitle` - Page Has Title\n* `pageShowsText` - Page Shows Text\n* `pageDoesNotShowText` - Page Does Not Show Text\n* `pageUrlIs` - Page Url Is\n* `downloadStarted` - Download Started\n* `variableValue` - Variable Value\n* `clipboardValue` - Clipboard Value\n* `disabled` - Disabled\n* `notDisabled` - Not Disabled"},"assertionType":{"enum":["contain","equal","greaterThan","lessThan","match","notContain","notEqual","any"],"type":"string","description":"* `contain` - Contain\n* `equal` - Equal\n* `greaterThan` - Greater Than\n* `lessThan` - Less Than\n* `match` - Match\n* `notContain` - Not Contain\n* `notEqual` - Not Equal\n* `any` - Any"},"assertionExpectedValue":{"type":["string","null"],"maxLength":10000},"assertionJavaScript":{"type":["string","null"],"description":"Required for assert and ifCondition steps. Send an empty string when unused."},"assertionVariableName":{"type":["string","null"],"description":"Required for assert and ifCondition steps. Send an empty string when unused."}},"required":["assertionExpectedValue","assertionJavaScript","assertionProperty","assertionType","assertionVariableName","id","originGroupId","type"]},"UpdateSelectorsPresetGroup":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"isActive":{"type":"boolean","default":false},"isCustom":{"type":"boolean","default":false},"selectorsGroups":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsGroup"}}},"required":["selectorsGroups"]},"UpdateSelectorsGroup":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"selectors":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelector"}},"relation":{"enum":["descendant","ancestor","sibling"],"type":"string","description":"* `descendant` - Descendant\n* `ancestor` - Ancestor\n* `sibling` - Sibling"}},"required":["relation","selectors"]},"UpdateSelector":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"type":{"enum":["XPath","customCSS","customXPath","",null],"type":["string","null"],"description":"* `XPath` - Xpath\n* `customCSS` - Custom Css\n* `customXPath` - Custom Xpath"},"selector":{"type":["string","null"]},"isActive":{"type":"boolean"},"score":{"type":["string","null"]}},"required":["isActive","selector","type"]},"PastFromClipboardStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","originGroupId","type"]},"ChangeStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"value":{"type":"string"},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","originGroupId","type","value"]},"ClearStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","originGroupId","type"]},"ClickStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"interactionPosition":{"enum":["smart","custom","topLeft","topCenter","topRight","middleLeft","middleCenter","middleRight","bottomLeft","bottomCenter","bottomRight"],"type":"string","description":"Required interaction target position. auto is not supported.\n\n* `smart` - Smart\n* `custom` - Custom\n* `topLeft` - Top Left\n* `topCenter` - Top Center\n* `topRight` - Top Right\n* `middleLeft` - Middle Left\n* `middleCenter` - Middle Center\n* `middleRight` - Middle Right\n* `bottomLeft` - Bottom Left\n* `bottomCenter` - Bottom Center\n* `bottomRight` - Bottom Right"},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","interactionPosition","originGroupId","type"]},"CloseTabStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}}},"required":["id","originGroupId","type"]},"V2DragAndDropStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}},"dndDropSelectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}},"dndDragOn":{"enum":["coords","element"],"type":"string","description":"* `coords` - coords\n* `element` - element"},"interactionPosition":{"enum":["smart","custom","topLeft","topCenter","topRight","middleLeft","middleCenter","middleRight","bottomLeft","bottomCenter","bottomRight"],"type":"string","description":"Required interaction target position. auto is not supported.\n\n* `smart` - Smart\n* `custom` - Custom\n* `topLeft` - Top Left\n* `topCenter` - Top Center\n* `topRight` - Top Right\n* `middleLeft` - Middle Left\n* `middleCenter` - Middle Center\n* `middleRight` - Middle Right\n* `bottomLeft` - Bottom Left\n* `bottomCenter` - Bottom Center\n* `bottomRight` - Bottom Right"},"dndDragX":{"type":["number","null"],"format":"double"},"dndDragY":{"type":["number","null"],"format":"double"},"dndDropOn":{"enum":["coords","element"],"type":"string","description":"* `coords` - coords\n* `element` - element"},"dndDropInteractionPosition":{"enum":["smart","custom","topLeft","topCenter","topRight","middleLeft","middleCenter","middleRight","bottomLeft","bottomCenter","bottomRight"],"type":"string","description":"Required interaction target position. auto is not supported.\n\n* `smart` - Smart\n* `custom` - Custom\n* `topLeft` - Top Left\n* `topCenter` - Top Center\n* `topRight` - Top Right\n* `middleLeft` - Middle Left\n* `middleCenter` - Middle Center\n* `middleRight` - Middle Right\n* `bottomLeft` - Bottom Left\n* `bottomCenter` - Bottom Center\n* `bottomRight` - Bottom Right"},"dndDropX":{"type":["number","null"],"format":"double"},"dndDropY":{"type":["number","null"],"format":"double"}},"required":["dndDragOn","dndDropInteractionPosition","dndDropOn","id","interactionPosition","originGroupId","type"]},"ElementVisualRegressionStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"visualRegressionMaxDiff":{"type":["number","null"],"format":"double","maximum":100,"minimum":0},"visualRegressionRefScreenshots":{"type":"array","items":{"type":"object","additionalProperties":{}},"readOnly":true},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","originGroupId","selectorsPresets","type","visualRegressionRefScreenshots"]},"ExecuteStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"code":{"type":"string"}},"required":["code","id","originGroupId","type"]},"GotoStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"url":{"type":"string"},"username":{"type":["string","null"]},"password":{"type":["string","null"]},"frameLocation":{"type":"string"}},"required":["id","originGroupId","type","url"]},"GoBackStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}}},"required":["id","originGroupId","type"]},"GoForwardStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}}},"required":["id","originGroupId","type"]},"HoverStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"interactionPosition":{"enum":["smart","custom","topLeft","topCenter","topRight","middleLeft","middleCenter","middleRight","bottomLeft","bottomCenter","bottomRight"],"type":"string","description":"Required interaction target position. auto is not supported.\n\n* `smart` - Smart\n* `custom` - Custom\n* `topLeft` - Top Left\n* `topCenter` - Top Center\n* `topRight` - Top Right\n* `middleLeft` - Middle Left\n* `middleCenter` - Middle Center\n* `middleRight` - Middle Right\n* `bottomLeft` - Bottom Left\n* `bottomCenter` - Bottom Center\n* `bottomRight` - Bottom Right"},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","interactionPosition","originGroupId","type"]},"IfConditionStep":{"type":"object","description":"If condition steps reuse assertion_* fields as the branch condition.","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}},"assertionProperty":{"enum":["checked","count","customJavaScript","exist","notChecked","notExist","notVisible","textContent","value","visible","pageTitle","pageShowsText","pageDoesNotShowText","pageUrlIs","downloadStarted","variableValue","clipboardValue","disabled","notDisabled"],"type":"string","description":"* `checked` - Checked\n* `count` - Count\n* `customJavaScript` - Custom Javascript\n* `exist` - Exist\n* `notChecked` - Not Checked\n* `notExist` - Not Exist\n* `notVisible` - Not Visible\n* `textContent` - Text Content\n* `value` - Value\n* `visible` - Visible\n* `pageTitle` - Page Has Title\n* `pageShowsText` - Page Shows Text\n* `pageDoesNotShowText` - Page Does Not Show Text\n* `pageUrlIs` - Page Url Is\n* `downloadStarted` - Download Started\n* `variableValue` - Variable Value\n* `clipboardValue` - Clipboard Value\n* `disabled` - Disabled\n* `notDisabled` - Not Disabled"},"assertionType":{"enum":["contain","equal","greaterThan","lessThan","match","notContain","notEqual","any"],"type":"string","description":"* `contain` - Contain\n* `equal` - Equal\n* `greaterThan` - Greater Than\n* `lessThan` - Less Than\n* `match` - Match\n* `notContain` - Not Contain\n* `notEqual` - Not Equal\n* `any` - Any"},"assertionExpectedValue":{"type":["string","null"],"maxLength":10000},"assertionJavaScript":{"type":["string","null"],"description":"Required for assert and ifCondition steps. Send an empty string when unused."},"assertionVariableName":{"type":["string","null"],"description":"Required for assert and ifCondition steps. Send an empty string when unused."}},"required":["assertionExpectedValue","assertionJavaScript","assertionProperty","assertionType","assertionVariableName","id","originGroupId","type"]},"MouseDownStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"interactionPosition":{"enum":["smart","custom","topLeft","topCenter","topRight","middleLeft","middleCenter","middleRight","bottomLeft","bottomCenter","bottomRight"],"type":"string","description":"Required interaction target position. auto is not supported.\n\n* `smart` - Smart\n* `custom` - Custom\n* `topLeft` - Top Left\n* `topCenter` - Top Center\n* `topRight` - Top Right\n* `middleLeft` - Middle Left\n* `middleCenter` - Middle Center\n* `middleRight` - Middle Right\n* `bottomLeft` - Bottom Left\n* `bottomCenter` - Bottom Center\n* `bottomRight` - Bottom Right"},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","interactionPosition","originGroupId","type"]},"MouseUpStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"interactionPosition":{"enum":["smart","custom","topLeft","topCenter","topRight","middleLeft","middleCenter","middleRight","bottomLeft","bottomCenter","bottomRight"],"type":"string","description":"Required interaction target position. auto is not supported.\n\n* `smart` - Smart\n* `custom` - Custom\n* `topLeft` - Top Left\n* `topCenter` - Top Center\n* `topRight` - Top Right\n* `middleLeft` - Middle Left\n* `middleCenter` - Middle Center\n* `middleRight` - Middle Right\n* `bottomLeft` - Bottom Left\n* `bottomCenter` - Bottom Center\n* `bottomRight` - Bottom Right"},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","interactionPosition","originGroupId","type"]},"NewTabStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"url":{"type":["string","null"]},"username":{"type":["string","null"]},"password":{"type":["string","null"]}},"required":["id","originGroupId","type"]},"PageVisualRegressionStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"visualRegressionMaxDiff":{"type":["number","null"],"format":"double","maximum":100,"minimum":0},"visualRegressionRefScreenshots":{"type":"array","items":{"type":"object","additionalProperties":{}},"readOnly":true}},"required":["id","originGroupId","type","visualRegressionRefScreenshots"]},"ReloadPageStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}}},"required":["id","originGroupId","type"]},"ScrollStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}},"scrollX":{"type":["number","null"],"format":"double"},"scrollY":{"type":["number","null"],"format":"double"},"scrollEdge":{"enum":["topLeft","topCenter","topRight","middleLeft","middleCenter","middleRight","bottomLeft","bottomCenter","bottomRight",null],"type":["string","null"],"description":"* `topLeft` - Top Left\n* `topCenter` - Top Center\n* `topRight` - Top Right\n* `middleLeft` - Middle Left\n* `middleCenter` - Middle Center\n* `middleRight` - Middle Right\n* `bottomLeft` - Bottom Left\n* `bottomCenter` - Bottom Center\n* `bottomRight` - Bottom Right"},"scrollDirection":{"enum":["down","up","right","left",null],"type":["string","null"],"description":"* `down` - Down\n* `up` - Up\n* `right` - Right\n* `left` - Left"},"scrollTo":{"enum":["coords","edge","untilNextStepElementIsVisible","elementIntoView"],"type":"string","description":"* `coords` - Coords\n* `edge` - Edge\n* `untilNextStepElementIsVisible` - Until Next Step Element Is Visible\n* `elementIntoView` - Element Into View"},"scrollInside":{"enum":["window","element"],"type":"string","description":"* `window` - window\n* `element` - element"}},"required":["id","originGroupId","scrollInside","scrollTo","type"]},"SelectStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}},"value":{"type":"string"},"selectType":{"enum":["text","index","value"],"type":"string","description":"* `text` - text\n* `index` - index\n* `value` - value"},"selectIsMultiple":{"type":"boolean","default":false}},"required":["id","originGroupId","selectType","type","value"]},"SetLocalVariableStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}},"value":{"type":"string"},"code":{"type":["string","null"]},"localVariableName":{"type":"string"},"localVariableSource":{"enum":["element","value","evaluate"],"type":"string","description":"* `element` - element\n* `value` - value\n* `evaluate` - evaluate"}},"required":["id","localVariableName","localVariableSource","originGroupId","type"]},"SwitchContext":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}},"tabNo":{"type":"integer"},"value":{"enum":["topFrame","iframe"],"type":"string","description":"* `topFrame` - Top Frame\n* `iframe` - Iframe"}},"required":["id","originGroupId","tabNo","type","value"]},"TypeStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"value":{"type":"string"},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","originGroupId","type","value"]},"UploadStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"projectArtifactId":{"type":"string","format":"uuid"},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","originGroupId","projectArtifactId","type"]}}},"paths":{"/api/v2/components/":{"get":{"operationId":"v2_components_list","description":"Returns many components.","summary":"Retrieving components list","parameters":[{"in":"query","name":"fields","schema":{"type":"string"},"description":"Comma-separated response fields to include. Available fields: id,originGroupId,name,isComponent,steps."},{"in":"query","name":"ordering","schema":{"type":"string","enum":["-created","-name","created","name"]}},{"name":"page","required":false,"in":"query","description":"A page number within the paginated result set.","schema":{"type":"integer"}},{"name":"page_size","required":false,"in":"query","description":"Number of results to return per page.","schema":{"type":"integer"}},{"in":"query","name":"query","schema":{"type":"string"},"description":"Search in names with the following query"}],"tags":["Components"],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaginatedV2GroupList"}}},"description":""},"401":{"description":"Authentication credentials were missing or invalid."}}}}}}
```

## Creating a component

> Create a standalone component (not attached to any test).

```json
{"openapi":"3.1.0","info":{"title":"BugBug.io Public API","version":"v2"},"tags":[{"name":"Components","description":"Retrieving components"}],"security":[{"tokenAuth":[]},{"Bearer":[]}],"components":{"securitySchemes":{"tokenAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"Token-based authentication with required prefix \"Token\""}},"schemas":{"V2ComponentCreate":{"type":"object","properties":{"name":{"type":["string","null"],"maxLength":255},"isActive":{"type":"boolean"}}},"V2Group":{"type":"object","properties":{"id":{"type":"string","readOnly":true},"originGroupId":{"type":"string","format":"uuid","readOnly":true},"name":{"type":["string","null"],"readOnly":true},"isComponent":{"type":"boolean","readOnly":true},"steps":{"type":"array","items":{"$ref":"#/components/schemas/V2GroupStepResponse"},"readOnly":true}},"required":["id","isComponent","name","originGroupId","steps"]},"V2GroupStepResponse":{"oneOf":[{"$ref":"#/components/schemas/V2AnswerPromptStep"},{"$ref":"#/components/schemas/AssertStep"},{"$ref":"#/components/schemas/PastFromClipboardStep"},{"$ref":"#/components/schemas/ChangeStep"},{"$ref":"#/components/schemas/ClearStep"},{"$ref":"#/components/schemas/ClickStep"},{"$ref":"#/components/schemas/CloseTabStep"},{"$ref":"#/components/schemas/V2DragAndDropStep"},{"$ref":"#/components/schemas/ElementVisualRegressionStep"},{"$ref":"#/components/schemas/ExecuteStep"},{"$ref":"#/components/schemas/GotoStep"},{"$ref":"#/components/schemas/GoBackStep"},{"$ref":"#/components/schemas/GoForwardStep"},{"$ref":"#/components/schemas/HoverStep"},{"$ref":"#/components/schemas/IfConditionStep"},{"$ref":"#/components/schemas/MouseDownStep"},{"$ref":"#/components/schemas/MouseUpStep"},{"$ref":"#/components/schemas/NewTabStep"},{"$ref":"#/components/schemas/PageVisualRegressionStep"},{"$ref":"#/components/schemas/ReloadPageStep"},{"$ref":"#/components/schemas/ScrollStep"},{"$ref":"#/components/schemas/SelectStep"},{"$ref":"#/components/schemas/SetLocalVariableStep"},{"$ref":"#/components/schemas/SwitchContext"},{"$ref":"#/components/schemas/TypeStep"},{"$ref":"#/components/schemas/UploadStep"}],"discriminator":{"propertyName":"type","mapping":{"answerPrompt":"#/components/schemas/V2AnswerPromptStep","assert":"#/components/schemas/AssertStep","pasteFromClipboard":"#/components/schemas/PastFromClipboardStep","change":"#/components/schemas/ChangeStep","clear":"#/components/schemas/ClearStep","click":"#/components/schemas/ClickStep","closeTab":"#/components/schemas/CloseTabStep","dblClick":"#/components/schemas/ClickStep","dragAndDrop":"#/components/schemas/V2DragAndDropStep","elementVisualRegression":"#/components/schemas/ElementVisualRegressionStep","execute":"#/components/schemas/ExecuteStep","goto":"#/components/schemas/GotoStep","goBack":"#/components/schemas/GoBackStep","goForward":"#/components/schemas/GoForwardStep","hover":"#/components/schemas/HoverStep","ifCondition":"#/components/schemas/IfConditionStep","mouseDown":"#/components/schemas/MouseDownStep","mouseUp":"#/components/schemas/MouseUpStep","newTab":"#/components/schemas/NewTabStep","pageVisualRegression":"#/components/schemas/PageVisualRegressionStep","reloadPage":"#/components/schemas/ReloadPageStep","rightClick":"#/components/schemas/ClickStep","scroll":"#/components/schemas/ScrollStep","select":"#/components/schemas/SelectStep","setLocalVariable":"#/components/schemas/SetLocalVariableStep","switchContext":"#/components/schemas/SwitchContext","type":"#/components/schemas/TypeStep","uploadFile":"#/components/schemas/UploadStep"}}},"V2AnswerPromptStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"value":{"type":"string"}},"required":["id","originGroupId","type","value"]},"UpdateStepWaitingCondition":{"type":"object","properties":{"type":{"enum":["documentComplete","elementIsVisible","elementIsNotCovered","elementIsNotAnimating","elementIsNotDisabled","elementHasFocus","networkIdle","pageNavigationAfterExecution","elementHasAttribute"],"type":"string","description":"* `documentComplete` - documentComplete\n* `elementIsVisible` - elementIsVisible\n* `elementIsNotCovered` - elementIsNotCovered\n* `elementIsNotAnimating` - elementIsNotAnimating\n* `elementIsNotDisabled` - elementIsNotDisabled\n* `elementHasFocus` - elementHasFocus\n* `networkIdle` - networkIdle\n* `pageNavigationAfterExecution` - pageNavigationAfterExecution\n* `elementHasAttribute` - elementHasAttribute"},"expected":{"type":["string","null"]},"isActive":{"type":"boolean"},"isOverridden":{"type":"boolean","writeOnly":true,"description":"Required for each item when sending waitingConditions."},"timeout":{"type":["integer","null"]}},"required":["isActive","isOverridden","type"]},"AssertStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}},"continueOnFailure":{"type":"boolean","default":false},"assertionProperty":{"enum":["checked","count","customJavaScript","exist","notChecked","notExist","notVisible","textContent","value","visible","pageTitle","pageShowsText","pageDoesNotShowText","pageUrlIs","downloadStarted","variableValue","clipboardValue","disabled","notDisabled"],"type":"string","description":"* `checked` - Checked\n* `count` - Count\n* `customJavaScript` - Custom Javascript\n* `exist` - Exist\n* `notChecked` - Not Checked\n* `notExist` - Not Exist\n* `notVisible` - Not Visible\n* `textContent` - Text Content\n* `value` - Value\n* `visible` - Visible\n* `pageTitle` - Page Has Title\n* `pageShowsText` - Page Shows Text\n* `pageDoesNotShowText` - Page Does Not Show Text\n* `pageUrlIs` - Page Url Is\n* `downloadStarted` - Download Started\n* `variableValue` - Variable Value\n* `clipboardValue` - Clipboard Value\n* `disabled` - Disabled\n* `notDisabled` - Not Disabled"},"assertionType":{"enum":["contain","equal","greaterThan","lessThan","match","notContain","notEqual","any"],"type":"string","description":"* `contain` - Contain\n* `equal` - Equal\n* `greaterThan` - Greater Than\n* `lessThan` - Less Than\n* `match` - Match\n* `notContain` - Not Contain\n* `notEqual` - Not Equal\n* `any` - Any"},"assertionExpectedValue":{"type":["string","null"],"maxLength":10000},"assertionJavaScript":{"type":["string","null"],"description":"Required for assert and ifCondition steps. Send an empty string when unused."},"assertionVariableName":{"type":["string","null"],"description":"Required for assert and ifCondition steps. Send an empty string when unused."}},"required":["assertionExpectedValue","assertionJavaScript","assertionProperty","assertionType","assertionVariableName","id","originGroupId","type"]},"UpdateSelectorsPresetGroup":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"isActive":{"type":"boolean","default":false},"isCustom":{"type":"boolean","default":false},"selectorsGroups":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsGroup"}}},"required":["selectorsGroups"]},"UpdateSelectorsGroup":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"selectors":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelector"}},"relation":{"enum":["descendant","ancestor","sibling"],"type":"string","description":"* `descendant` - Descendant\n* `ancestor` - Ancestor\n* `sibling` - Sibling"}},"required":["relation","selectors"]},"UpdateSelector":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"type":{"enum":["XPath","customCSS","customXPath","",null],"type":["string","null"],"description":"* `XPath` - Xpath\n* `customCSS` - Custom Css\n* `customXPath` - Custom Xpath"},"selector":{"type":["string","null"]},"isActive":{"type":"boolean"},"score":{"type":["string","null"]}},"required":["isActive","selector","type"]},"PastFromClipboardStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","originGroupId","type"]},"ChangeStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"value":{"type":"string"},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","originGroupId","type","value"]},"ClearStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","originGroupId","type"]},"ClickStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"interactionPosition":{"enum":["smart","custom","topLeft","topCenter","topRight","middleLeft","middleCenter","middleRight","bottomLeft","bottomCenter","bottomRight"],"type":"string","description":"Required interaction target position. auto is not supported.\n\n* `smart` - Smart\n* `custom` - Custom\n* `topLeft` - Top Left\n* `topCenter` - Top Center\n* `topRight` - Top Right\n* `middleLeft` - Middle Left\n* `middleCenter` - Middle Center\n* `middleRight` - Middle Right\n* `bottomLeft` - Bottom Left\n* `bottomCenter` - Bottom Center\n* `bottomRight` - Bottom Right"},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","interactionPosition","originGroupId","type"]},"CloseTabStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}}},"required":["id","originGroupId","type"]},"V2DragAndDropStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}},"dndDropSelectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}},"dndDragOn":{"enum":["coords","element"],"type":"string","description":"* `coords` - coords\n* `element` - element"},"interactionPosition":{"enum":["smart","custom","topLeft","topCenter","topRight","middleLeft","middleCenter","middleRight","bottomLeft","bottomCenter","bottomRight"],"type":"string","description":"Required interaction target position. auto is not supported.\n\n* `smart` - Smart\n* `custom` - Custom\n* `topLeft` - Top Left\n* `topCenter` - Top Center\n* `topRight` - Top Right\n* `middleLeft` - Middle Left\n* `middleCenter` - Middle Center\n* `middleRight` - Middle Right\n* `bottomLeft` - Bottom Left\n* `bottomCenter` - Bottom Center\n* `bottomRight` - Bottom Right"},"dndDragX":{"type":["number","null"],"format":"double"},"dndDragY":{"type":["number","null"],"format":"double"},"dndDropOn":{"enum":["coords","element"],"type":"string","description":"* `coords` - coords\n* `element` - element"},"dndDropInteractionPosition":{"enum":["smart","custom","topLeft","topCenter","topRight","middleLeft","middleCenter","middleRight","bottomLeft","bottomCenter","bottomRight"],"type":"string","description":"Required interaction target position. auto is not supported.\n\n* `smart` - Smart\n* `custom` - Custom\n* `topLeft` - Top Left\n* `topCenter` - Top Center\n* `topRight` - Top Right\n* `middleLeft` - Middle Left\n* `middleCenter` - Middle Center\n* `middleRight` - Middle Right\n* `bottomLeft` - Bottom Left\n* `bottomCenter` - Bottom Center\n* `bottomRight` - Bottom Right"},"dndDropX":{"type":["number","null"],"format":"double"},"dndDropY":{"type":["number","null"],"format":"double"}},"required":["dndDragOn","dndDropInteractionPosition","dndDropOn","id","interactionPosition","originGroupId","type"]},"ElementVisualRegressionStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"visualRegressionMaxDiff":{"type":["number","null"],"format":"double","maximum":100,"minimum":0},"visualRegressionRefScreenshots":{"type":"array","items":{"type":"object","additionalProperties":{}},"readOnly":true},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","originGroupId","selectorsPresets","type","visualRegressionRefScreenshots"]},"ExecuteStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"code":{"type":"string"}},"required":["code","id","originGroupId","type"]},"GotoStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"url":{"type":"string"},"username":{"type":["string","null"]},"password":{"type":["string","null"]},"frameLocation":{"type":"string"}},"required":["id","originGroupId","type","url"]},"GoBackStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}}},"required":["id","originGroupId","type"]},"GoForwardStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}}},"required":["id","originGroupId","type"]},"HoverStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"interactionPosition":{"enum":["smart","custom","topLeft","topCenter","topRight","middleLeft","middleCenter","middleRight","bottomLeft","bottomCenter","bottomRight"],"type":"string","description":"Required interaction target position. auto is not supported.\n\n* `smart` - Smart\n* `custom` - Custom\n* `topLeft` - Top Left\n* `topCenter` - Top Center\n* `topRight` - Top Right\n* `middleLeft` - Middle Left\n* `middleCenter` - Middle Center\n* `middleRight` - Middle Right\n* `bottomLeft` - Bottom Left\n* `bottomCenter` - Bottom Center\n* `bottomRight` - Bottom Right"},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","interactionPosition","originGroupId","type"]},"IfConditionStep":{"type":"object","description":"If condition steps reuse assertion_* fields as the branch condition.","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}},"assertionProperty":{"enum":["checked","count","customJavaScript","exist","notChecked","notExist","notVisible","textContent","value","visible","pageTitle","pageShowsText","pageDoesNotShowText","pageUrlIs","downloadStarted","variableValue","clipboardValue","disabled","notDisabled"],"type":"string","description":"* `checked` - Checked\n* `count` - Count\n* `customJavaScript` - Custom Javascript\n* `exist` - Exist\n* `notChecked` - Not Checked\n* `notExist` - Not Exist\n* `notVisible` - Not Visible\n* `textContent` - Text Content\n* `value` - Value\n* `visible` - Visible\n* `pageTitle` - Page Has Title\n* `pageShowsText` - Page Shows Text\n* `pageDoesNotShowText` - Page Does Not Show Text\n* `pageUrlIs` - Page Url Is\n* `downloadStarted` - Download Started\n* `variableValue` - Variable Value\n* `clipboardValue` - Clipboard Value\n* `disabled` - Disabled\n* `notDisabled` - Not Disabled"},"assertionType":{"enum":["contain","equal","greaterThan","lessThan","match","notContain","notEqual","any"],"type":"string","description":"* `contain` - Contain\n* `equal` - Equal\n* `greaterThan` - Greater Than\n* `lessThan` - Less Than\n* `match` - Match\n* `notContain` - Not Contain\n* `notEqual` - Not Equal\n* `any` - Any"},"assertionExpectedValue":{"type":["string","null"],"maxLength":10000},"assertionJavaScript":{"type":["string","null"],"description":"Required for assert and ifCondition steps. Send an empty string when unused."},"assertionVariableName":{"type":["string","null"],"description":"Required for assert and ifCondition steps. Send an empty string when unused."}},"required":["assertionExpectedValue","assertionJavaScript","assertionProperty","assertionType","assertionVariableName","id","originGroupId","type"]},"MouseDownStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"interactionPosition":{"enum":["smart","custom","topLeft","topCenter","topRight","middleLeft","middleCenter","middleRight","bottomLeft","bottomCenter","bottomRight"],"type":"string","description":"Required interaction target position. auto is not supported.\n\n* `smart` - Smart\n* `custom` - Custom\n* `topLeft` - Top Left\n* `topCenter` - Top Center\n* `topRight` - Top Right\n* `middleLeft` - Middle Left\n* `middleCenter` - Middle Center\n* `middleRight` - Middle Right\n* `bottomLeft` - Bottom Left\n* `bottomCenter` - Bottom Center\n* `bottomRight` - Bottom Right"},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","interactionPosition","originGroupId","type"]},"MouseUpStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"interactionPosition":{"enum":["smart","custom","topLeft","topCenter","topRight","middleLeft","middleCenter","middleRight","bottomLeft","bottomCenter","bottomRight"],"type":"string","description":"Required interaction target position. auto is not supported.\n\n* `smart` - Smart\n* `custom` - Custom\n* `topLeft` - Top Left\n* `topCenter` - Top Center\n* `topRight` - Top Right\n* `middleLeft` - Middle Left\n* `middleCenter` - Middle Center\n* `middleRight` - Middle Right\n* `bottomLeft` - Bottom Left\n* `bottomCenter` - Bottom Center\n* `bottomRight` - Bottom Right"},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","interactionPosition","originGroupId","type"]},"NewTabStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"url":{"type":["string","null"]},"username":{"type":["string","null"]},"password":{"type":["string","null"]}},"required":["id","originGroupId","type"]},"PageVisualRegressionStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"visualRegressionMaxDiff":{"type":["number","null"],"format":"double","maximum":100,"minimum":0},"visualRegressionRefScreenshots":{"type":"array","items":{"type":"object","additionalProperties":{}},"readOnly":true}},"required":["id","originGroupId","type","visualRegressionRefScreenshots"]},"ReloadPageStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}}},"required":["id","originGroupId","type"]},"ScrollStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}},"scrollX":{"type":["number","null"],"format":"double"},"scrollY":{"type":["number","null"],"format":"double"},"scrollEdge":{"enum":["topLeft","topCenter","topRight","middleLeft","middleCenter","middleRight","bottomLeft","bottomCenter","bottomRight",null],"type":["string","null"],"description":"* `topLeft` - Top Left\n* `topCenter` - Top Center\n* `topRight` - Top Right\n* `middleLeft` - Middle Left\n* `middleCenter` - Middle Center\n* `middleRight` - Middle Right\n* `bottomLeft` - Bottom Left\n* `bottomCenter` - Bottom Center\n* `bottomRight` - Bottom Right"},"scrollDirection":{"enum":["down","up","right","left",null],"type":["string","null"],"description":"* `down` - Down\n* `up` - Up\n* `right` - Right\n* `left` - Left"},"scrollTo":{"enum":["coords","edge","untilNextStepElementIsVisible","elementIntoView"],"type":"string","description":"* `coords` - Coords\n* `edge` - Edge\n* `untilNextStepElementIsVisible` - Until Next Step Element Is Visible\n* `elementIntoView` - Element Into View"},"scrollInside":{"enum":["window","element"],"type":"string","description":"* `window` - window\n* `element` - element"}},"required":["id","originGroupId","scrollInside","scrollTo","type"]},"SelectStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}},"value":{"type":"string"},"selectType":{"enum":["text","index","value"],"type":"string","description":"* `text` - text\n* `index` - index\n* `value` - value"},"selectIsMultiple":{"type":"boolean","default":false}},"required":["id","originGroupId","selectType","type","value"]},"SetLocalVariableStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}},"value":{"type":"string"},"code":{"type":["string","null"]},"localVariableName":{"type":"string"},"localVariableSource":{"enum":["element","value","evaluate"],"type":"string","description":"* `element` - element\n* `value` - value\n* `evaluate` - evaluate"}},"required":["id","localVariableName","localVariableSource","originGroupId","type"]},"SwitchContext":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}},"tabNo":{"type":"integer"},"value":{"enum":["topFrame","iframe"],"type":"string","description":"* `topFrame` - Top Frame\n* `iframe` - Iframe"}},"required":["id","originGroupId","tabNo","type","value"]},"TypeStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"value":{"type":"string"},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","originGroupId","type","value"]},"UploadStep":{"type":"object","properties":{"id":{"type":"string","format":"uuid","readOnly":true},"atIndex":{"type":["integer","null"],"writeOnly":true},"type":{"type":"string"},"name":{"type":["string","null"],"maxLength":255},"blockId":{"type":["string","null"],"format":"uuid"},"groupId":{"type":["string","null"],"format":"uuid"},"originGroupId":{"type":"string","readOnly":true},"notes":{"type":["string","null"],"maxLength":1024},"isActive":{"type":"boolean","default":true},"runTimeout":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"sleep":{"type":["number","null"],"format":"double","minimum":0,"maximum":300},"waitingConditions":{"type":"array","items":{"$ref":"#/components/schemas/UpdateStepWaitingCondition"}},"projectArtifactId":{"type":"string","format":"uuid"},"selectorsPresets":{"type":"array","items":{"$ref":"#/components/schemas/UpdateSelectorsPresetGroup"}}},"required":["id","originGroupId","projectArtifactId","type"]}}},"paths":{"/api/v2/components/":{"post":{"operationId":"v2_components_create","description":"Create a standalone component (not attached to any test).","summary":"Creating a component","parameters":[],"tags":["Components"],"requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/V2ComponentCreate"}},"application/json":{"schema":{"$ref":"#/components/schemas/V2ComponentCreate"}}}},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/V2Group"}}},"description":""},"400":{"description":"Request body failed validation."},"401":{"description":"Authentication credentials were missing or invalid."}}}}}}
```

## Retrieving component usage

> Returns component usage details.

```json
{"openapi":"3.1.0","info":{"title":"BugBug.io Public API","version":"v2"},"tags":[{"name":"Components","description":"Retrieving components"}],"security":[{"tokenAuth":[]},{"Bearer":[]}],"components":{"securitySchemes":{"tokenAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"Token-based authentication with required prefix \"Token\""}}},"paths":{"/api/v2/components/{id}/usage/":{"get":{"operationId":"v2_components_usage_retrieve","description":"Returns component usage details.","summary":"Retrieving component usage","parameters":[{"in":"path","name":"id","schema":{"type":"string","format":"uuid"},"description":"A UUID string identifying this group.","required":true}],"tags":["Components"],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object","properties":{"usage":{"type":"integer"},"testsIds":{"type":"array","items":{"type":"string","format":"uuid"}}}}}},"description":""},"401":{"description":"Authentication credentials were missing or invalid."},"404":{"description":"Resource not found."}}}}}}
```




---

[Next Page](/llms-full.txt/1)

