Modern web testing, simplified
TestCafe is a user-friendly end-to-end testing solution. Free and open-source test runner. Powerful desktop app.
From zero to testing in minutes
- 1% npm i -g testcafeJust one npm package.
- 2% testcafe chrome test.jsWorks with common browsers out of the box.
- 3% docker pull testcafe/testcafeReady for your CI/CD pipeline.
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.
Check the test below and see for yourself.
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');
});
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
TestCafe integrates with all popular CI/CD solutions.Concurrent Test Runs
Save time and resources: run your tests in multiple browsers at once.If something goes wrong...
Use the built-in Debug Mode to pin-point the source of your frustration.
Comments from your peers
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.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 #QAisAwesomeDamien 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