Modern web testing, simplified

TestCafe is a user-friendly end-to-end testing solution. Free and open-source test runner. Powerful desktop app.
  • chrome
  • firefox
  • safari
  • edge
  • opera
  • browserstack
  • lambdatest

From zero to testing in minutes

from-zero-ul-holder-background
  • 1
    % npm i -g testcafe
    Just one npm package.
  • 2
    % testcafe chrome test.js
    Works with common browsers out of the box.
  • 3
    % docker pull testcafe/testcafe
    Ready for your CI/CD pipeline.
Get Started

Write or Record Tests

  • Get started with our free and open source framework in minutes.
  • Create easy-to-read JavaScript and TypeScript tests.
  • Simulate complex page interactions and multi-window scenarios.
  • Code your tests by hand or record in your browser.

Run and Analyze

  • Run your tests in any modern browser — local or remote.
  • Run your tests concurrently to speed up the testing process.
  • Easily integrate TestCafe with your CI solution of choice.
  • Store test reports in many convenient formats.

Write tests with ease

The intuitive syntax of TestCafe makes teams more productive from day one.
Check the test below and see for yourself.
TestCafe 😊
fixture('Pizza Palace')
    .page('https://testcafe-demo-page.glitch.me/');

test('Submit a form', async t => {
    await t
        // automatically dismiss dialog boxes
        .setNativeDialogHandler(() => true)

        // drag the pizza size slider
        .drag('.noUi-handle', 100, 0)

        // select the toppings
        .click('.next-step')
        .click('label[for="pepperoni"]')
        .click('#step2 .next-step')

        // fill the address form
        .click('.confirm-address')
        .typeText('#phone-input', '+1-541-754-3001')
        .click('#step3 .next-step')

        // zoom into the iframe map
        .switchToIframe('.restaurant-location iframe')
        .click('button[title="Zoom in"]')

        // submit the order
        .switchToMainWindow()
        .click('.complete-order');
});
Selenium (JavaScript) 😕
const {Builder, By, Key, until} = require('selenium-webdriver');

(async function pizzaPalace() {

    const driver = await new Builder().forBrowser('firefox').build();
    
    try {
        await driver.get('https://testcafe-demo-page.glitch.me/');

        // drag the pizza size slider
        const sourceEle = driver.findElement(By.className("noUi-handle"));
        const actions = driver.actions({async: true});
        await actions.dragAndDrop(sourceEle, {x:100, y:0}).perform();

        // select the toppings
        await driver.findElement(By.className("next-step")).click();
        await driver.findElement(By.css('label[for="pepperoni"]')).click(); 
        await driver.findElement(By.css('#step2 .next-step')).click();

        // fill the address form
        await driver.wait(until.elementLocated(By.css('.google-map')),10000);
        await driver.findElement(By.className("confirm-address")).click();   
        await driver.findElement(By.id('phone-input')).sendKeys('+1-541-754-3001');
        await driver.findElement(By.css('#step3 .next-step')).click();

        // zoom into the iframe map
        await driver.wait(until.elementLocated(By.css('.restaurant-location iframe')),10000);
        const restaurantLocationFrame = await driver.findElement(By.css('.restaurant-location iframe'));
        await driver.switchTo().frame(restaurantLocationFrame);
        await driver.wait(until.elementLocated(By.css('button[title="Zoom in"]')),10000);
        await driver.findElement(By.css('button[title="Zoom in"]')).click();

        // submit the order
        await driver.switchTo().defaultContent();
        await driver.findElement(By.className("complete-order")).click();

        // dismiss the confirmation dialog
        await driver.wait(until.alertIsPresent());
        const confirmationMessage = driver.switchTo().alert();
        await confirmationMessage.accept();
                
    } finally {
        await driver.quit();
    }
})();

Deploy without fear

  • CI/CD-ready

    CI/CD-ready

    TestCafe integrates with all popular CI/CD solutions.
  • Concurrent Test Runs

    Concurrent Test Runs

    Save time and resources: run your tests in multiple browsers at once.
  • If something goes wrong...

    If something goes wrong...

    Use the built-in Debug Mode to pin-point the source of your frustration.
qa-engineer-picture
Get Started

Comments from your peers

  • image

    Rodrigo Finger

    @RodrigoFinger@DXTestCafe is the best automated front-end testing tool I've used so far. @TestCafeStudio is a good starting point to explore its features, easy to use for the testing team. Writing a js script with it allows to build more complex test scenarios. Easy and fast to setup and use.
  • image

    Christine Zierold

    @ChrisZie_Since I'm using #testcafe on a daily basis now to build my #automatedUItest, I love it every day more and more. The code looks so clean and I don't need to 'waitForElementVisible' or just 'wait()'. Everyone should try this out. It is amazing. #TestAutomation #QAisAwesome
  • image

    Damien Hampton

    @damien_hamptonI used to hate JavaScript, but that was because I didn't understand it. Now I can't get enough! More #javascript koolaid: TestCafé looks like a very cool UI testing framework: buff.ly/2EeJUPX Very easy to use! @dxtestcafe