WebQA² is the
best and simplest automated end-to-end
testing option for solutions with web user interface
Why WebQA² ?
Any platform
any browser, any device resolution
Java Script
Implemenation - use existing knowledge
No installation
really none :) ²
Free use
no limit ¹
  • Optionally use local tests and screenshots for full privacy
  • Optionally confirm screenshots of states is unchanged, warn and optionally accept the latest screenshot as correct
  • Optionally use the integrated interactive editor to simplify setting element values, verifying element values, or simulating events like clicks
¹ Unlimited number of tests; limited number of screenshots in cloud storage, unlimited in local storage
² If using WebQA² cloud, minimal setup if local screenshots are used
Where can WebQA² be used?
confirming solutions work as expected in Production and get alerts whenever it fails
Product Managers
confirming solutions work properly before approving a new Release
automating some of their test plans
Development Teams
adding gating to build workflows like CI/CD to ensure code changes do not break the solution
confirming latest code changes do not break the solution before submitting it
confirming latest code changes do not break
To show how such test script work, we created a small sample web app at https://webqa2.com/todo

To manage the test scripts we should access the app and include the secret key https://webqa2.com/todo?wqKey=oCCqbi

Press Alt/Option+Control+Shift+T to open the test management panel.

We already pressed the short-key to run a simple test script with plain JS here https://webqa2.com/todo?wqKey=oCCqbi&wqTest=example
How to use WebQA²
Register and get a secret key
Include WebQA²
<script src="https://webqa2.com/infra">
just before your final
In case you're using some templates or other resuable include files, WebQA² will worked if included in other places in the markup but just before the end of body is optimal.
Edit your tests by navigating to your system with the secret key and use the provided user interface
Use Alt/Option+Control+Shift+T to open the test management panel.
Run specific tests on one or multiple platforms and browsers for a range of needs: Production monitoring, QA, automated build pipelines, improving the quality of changed code, or confirming code changes correctness before pushing it
If using screenshots, inspect when screenshots differ from past executions and accept the new one if it is correct
Review the list of failed test steps, fix and re-run
Write your test

// a special "test" called "common" is always included, if exists, to support shared code
// the test main function must be named the same as the test name, "_" instead of space
async function Test_1() {

    // sleep for specified milliseconds
    await new Promise(resolve => setTimeout(resolve, 1000)); 

    // set input to specific value using the input's CSS selector
    input = await wq2("#inputSelector");
    // set value
    input.value = "The new value";

    // access an element
    // if the element doesn't exists, wait for 5 sec as it may still render
    // fail the test if waiting for the element timed-out
    elem = await wq2("#labelSelector");

    // verify that an element's content is what we expect
    if (elem.innerText != "The text we expect") {
        wq2.failTest("<test step name>");

    // when you expect an action (like the next click) to navigate to another page,
    // set which next test step in what test should be executed once the other page loads

    // you can choose element by searching for the text in it
    goNextPageButton = await wq2("text:textOnButton");

// this function will be called after the page navigation
async function step2() {
    // perform your own special tests
    mytable = await wq2("#tableSelector");

    // manually pass or fail steps with your custom verifications
    if (mytable.rows.length == 0) {
        wq2.failTest("step2 - no rows in table");

    // confirm the screen looks like it did last time we ran
    // the screenshot is stored by the platform, browser, window size and name you provide
    // for example, "windows-chrome-1280x800-results-table"
    // if no screenshot yet, the first one will be created
    // if previous and current screenshots do not match, you can interactively accept the new
    await wq2.confirmScreenshot("results-table");

    // retrieve list of failed steps; if none, the test passed
    failedSteps = wqCompleteTests();
    if (failedSteps.length > 0) {
        alert("Test failed:\n" + failedSteps.join("\n"));
    } else {
        alert("Test passed");
Useful links