Convert messy manual test cases into automated scripts—instantly
Powered by generative AI, we turn simple test case descriptions into Selenium, Playwright, or Cucumber scripts. Designed to handle complex test scenarios without user intervention, we enable unmatched bulk automation.
See for yourself how we automate complexity
Complex commands
Making the data a bit tricky to understand, so only those with the right key can
On the top menu, hover over Mens, then Tops, and click on Jackets
We should see a page with "Jackets" heading
On the left sidebar, select SIZE, then click on M
On the left sidebar select Price Range then click on of of the options that has > 3 items
Go through each result. The M size should be highlighed for every result
Press 'ctrl+k' to open search drawer
Enter the term "TestCase" in the search bar and hit entrxd.
Confirm that search results are displayed.
For each result with a description, ensure it fits within two lines and ends with "..." if it exceeds more than two lines.
Click on "Apps" category and click on "Last 7 Days" date option
Go through each result and ensure that each result’s date is within last 7 days
Go to this url https://abcd.com//ABC-form
User should able to see the "ABC Activity Form".
Enter "242525" in ID
Enter "test@test.com" in Business Email
Enter "Test Customer Name" in Customer Name.
Enter "Test Customer Account Number" in Customer Account Number.
Enter "Test Brief Description" in Brief Description.
//Enter "8888888888" in Phone Number.
Enter "aaaaa" in Phone Number.
Verify that the Phone Number field is still empty.
//Click on Submit button - Submit button should not be enabled b/c chars were entered in phone field
Verify that Submit button is not enabled
test('Verify size selection', async ({ page }) => { try { //On the top menu, hover over Mens, then Tops, and click on Jackets await Page_.menuHoverAndClick(page); //We should see a page with "Jackets" heading await Page_men_topsmen_jacketsmenhtml.VerifyPageHeading(page, 'Jackets'); //On the left sidebar, select SIZE, then click on M await Page_men_topsmen_jacketsmenhtml.CheckboxSelect(page, 'M'); //On the left sidebar select Price Range then click on of of the options that has > 3 items await.Page_men_topsmen_jacketsmenhtml.SelectPriceRange(IWebDriver driver, 3) //Go through each result. The M size should be highlighed for every result await Page_men_topsmen_jacketsmenhtml.fieldSizeHighlightedResults(page, 'M'); } catch (error) { console.log('An error occurred during the test execution:', error); throw error; } class Page_ { static async MenuHoverAndClick(page) { // Locate the 'Men' menu item console.log("Locate the 'Men' menu item"); const mensMenu = await page.locator("xpath=//a[@id='ui-id-5']/span[text()='Men']"); // Hover over the 'Men' menu item console.log("Hover over the 'Men' menu item"); await mensMenu.hover(); // Locate the 'Tops' submenu item console.log("Locate the 'Tops' submenu item"); const topsSubMenu = await page.locator("xpath=//a[@id='ui-id-17']/span[text()='Tops']"); // Hover over the 'Tops' submenu item console.log("Hover over the 'Tops' submenu item"); await topsSubMenu.hover(); // Locate the 'Jackets' item and click it console.log("Locate the 'Jackets' item and click it"); const jacketsItem = await page.locator("xpath=//a[@id='ui-id-19']/span[text()='Jackets']"); await jacketsItem.click(); // CLICK ACTION await page.waitForTimeout(1000); await page.waitForLoadState('networkidle', { timeout: 60000 }); } } public static void SelectPriceRange(IWebDriver driver, int minItems) { // Locate the Price filter section string priceFilterXPath = "//div[@class='filter-options-title' and text()='Price']/following-sibling::div//ol[@class='items']/li/a"; // Find all price range elements var priceElements = driver.FindElements(By.XPath(priceFilterXPath)); // Iterate over each price element foreach(var priceElement in priceElements) { // Get the count of items for each price range string itemCountText = priceElement.FindElement(By.XPath(".//span[@class='count']")).Text; int itemCount = int.Parse(itemCountText.Split(' ')[0]); // Check if the item count is greater than the specified minimum if (itemCount > minItems) { // Click on the price range element priceElement.Click(); // CLICK ACTION break; } } } class Page_men_topsmen_jacketsmenhtml { static async CheckboxSelect(page, filterOption) { // Find the SIZE filter on the left sidebar console.log('Find the SIZE filter on the left sidebar'); const sizeFilterElement = await page.locator("//div[@class='filter-options-title' and text()='Size']"); await sizeFilterElement.click(); // CLICK ACTION await page.waitForTimeout(1000); await page.waitForLoadState('networkidle', { timeout: 60000 }); // Wait for the element console.log('Wait for the element'); await page.waitForSelector("//div[@class='filter-options-content']//div[@class='swatch-option text ' and text()='" + filterOption + "']", { state: 'visible', timeout: 20000 }); // Select the M size checkbox console.log('Select the M size checkbox'); const mSizeElement = await page.locator("//div[@class='filter-options-content']//div[@class='swatch-option text ' and text()='" + filterOption + "']"); await mSizeElement.click(); // CLICK ACTION await page.waitForTimeout(1000); await page.waitForLoadState('networkidle', { timeout: 60000 }); } static async FieldSizeHighlightedResults(page, size) { // Define the XPath for the highlighted size option in each product result console.log('Define the XPath for the highlighted size option in each product result'); const xpath = `//div[contains(@class, 'swatch-attribute size')]//div[@aria-label='${size}' and contains(@class, 'selected')]`; // Check if the size is highlighted for every result console.log('Check if the size is highlighted for every result'); const elements = await page.$$(xpath); // ASSERT console.log('ASSERT'); if (elements.length === 0) { throw new Error(`Size ${size} is not highlighted in any results.`); } for (const element of elements) { const className = await element.getAttribute('class'); if (!className.includes('selected')) { throw new Error(`Size ${size} is not highlighted.`); } } } });
// Playwright version: 1.38.0 const { test, expect } = require('@playwright/test'); test('Advance search test', async ({ page }) => { try { // Press 'ctrl+k' to open search drawer console.log("Press 'ctrl+k' to open search drawer"); await page.keyboard.press('Control+k'); await page.waitForTimeout(1000); // No network load to wait for here, but adding for consistency // Enter the term "TestCase" in the search bar and hit enter. console.log('Enter the term "TestCase" in the search bar and hit enter.'); await page.type("//input[@id='search']", "TestCase"); await page.keyboard.press('Enter'); await page.waitForTimeout(1000); await page.waitForLoadState('networkidle', { timeout: 60000 }); // Confirm that search results are displayed. console.log('Confirm that search results are displayed.'); await page.waitForSelector("//div[@class='one-search']//div[@class='header']/span[text()='Search Results']", { state: 'visible' }); // For each result with a description, ensure it fits within two lines and ends with "..." if it exceeds more than two lines. console.log('For every result that has a description, verify that it is within one or two lines and truncated with ellipsis "..." if it exceeds more than two lines.'); const descriptions = await page.$$eval(".search-section .skeleton .loader-card p-skeleton:nth-child(2) > div", elements => { return elements.map(element => element.textContent.trim()); }); await page.waitForTimeout(1000); // Ensure the page is rendered completely before validation. for (const descText of descriptions) { const lineCount = descText.split('\n').length; expect(lineCount <= 2, 'Description exceeds 2 lines').toBeTruthy(); if (lineCount === 2) { expect(descText.endsWith('...'), 'Description is not truncated with ellipsis').toBeTruthy(); } } //Click on "Apps" category and click on "Last 7 Days" date option // Locate the checkbox for the specified category console.log('Locate the checkbox for the specified category'); const categoryXpath = `//h3[text()='Category']/following-sibling::div//p-checkbox//label[contains(text(), 'Apps')]`; const categoryElement = await page.locator(categoryXpath); await categoryElement.click(); // CLICK ACTION // Locate the radio button for the specified date console.log('Locate the radio button for the specified date'); const dateXpath = `//h3[text()='Date']/following-sibling::div//p-radiobutton//label[text() = 'Last 7 Days']//preceding-sibling::div`; const dateElement = await page.locator(dateXpath); await dateElement.click(); // CLICK ACTION // Go through each result and ensure that each result’s date is within last 7 days await page.waitForTimeout(1000); const date7DaysResults = await page.$$("//div[contains(@class, 'results')]//div[contains(@class, 'foot')]//span[@class='date']"); const today = new Date(); for (const dateElement of date7DaysResults) { const dateText = await dateElement.textContent(); const parsedDate = new Date(dateText.trim()); expect(parsedDate >= new Date(today.getTime() - 7 * 24 * 60 * 60 * 1000) && parsedDate <= today).toBeTruthy(); } } } catch (error) { console.log('Error encountered:', error); throw error;);
test('Test exception case', async ({ page }) => { try { //Go to this url abcd.com/ABC-form await Page_home.navigateToABCFormPage(page, 'abcd.com/ABC-form'); //User should able to see the "ABC Activity Form". await Page_ABC.verifyABCActivityFormVisibility(page) //Enter "242525" in ID await Page_ABC.fieldEnterRepId(page, '242525'); //Enter "test@test.com" in Business Email. await Page_ABC.fieldEnterBusinessEmail(page, 'test@test.com'); //Enter "Test Customer Name" in Customer Name. await Page_ABC.fieldEnterCustomerName(page, 'Test Customer Name'); //Enter "Test Customer Account Number" in Customer Account Number. await Page_Page_ABC.fieldCustomerAccountNumber(page, 'Test Customer Account Number'); //Enter "Test Brief Description" in Brief Description (include who, what, when, and why). \ await Page_ABC.fieldBriefDescription(page, 'Test Brief Description'); //Enter "aaaaa" in Phone Number. await Page_ABC.fieldPhoneNumberEnter(page, 'aaaaa'); //Verify that the Phone Number field is still empty. await Page_ABC.FieldIsEmptyPhoneNumber(page) //Verify that Submit button is not enabled await Page_ABC.buttonVerifySubmitNotEnabled(page } catch (error) { console.log('An error occurred during the test execution:', error); throw error; } class Page_home { static async navigateToABCFormPage(page, url) { // Navigate to the specified URL await page.goto(url, { waitUntil: 'load' }); // CLICK ACTION } class Page_ABC { static async buttonVerifySubmitNotEnabled(page) { // Locate the Submit button using XPath const submitButton = await page.locator("//button[contains(@class, 'p-button') and span[text()='Submit']]").elementHandle(); // Verify that the Submit button is not enabled const isEnabled = await submitButton.isEnabled(); // Assert that the button is not enabled if (isEnabled) { throw new Error('Submit button is unexpectedly enabled.'); } // ASSERT } static async fieldBriefDescription(page, descriptionText) { // Find the Brief Description field using its XPath const briefDescriptionField = await page.locator('//label[contains(text(), "Brief Description (include who, what, when, and why)")]//parent::web-label//following-sibling::textarea'); // Enter the provided description text into the Brief Description field await briefDescriptionField.fill(''); await briefDescriptionField.type(descriptionText); } static async fieldCustomerAccountNumber(page, accountNumber) { // Locate the Customer Account Number input field using XPath const CustomerAccountNumberField = await page.locator('//label[contains(text(), "*Customer Account Number")]/parent::web-label/following-sibling::web-input-text//input'); // Enter the provided account number into the Customer Account Number field await CustomerAccountNumberField.fill(accountNumber); } static async fieldEnterBusinessEmail(page, email) { // Locate the Business Email field const emailField = await page.locator('//label[contains(text(), "*Business Email")]/parent::web-label/following-sibling::web-input-text//input'); // Enter the email into the Business Email field await emailField.fill(email); // ENTER ACTION } static async fieldEnterCustomerName(page, CustomerName) { // Locate the Customer Name input field const CustomerNameField = await page.locator('//label[contains(text(), "*Customer Name")]//parent::web-label//following-sibling::web-input-text//input'); // Enter the provided Customer name await CustomerNameField.fill(''); await CustomerNameField.type(CustomerName); } static async fieldEnterRepId(page, repId) { // Find the input field for Rep ID const repIdInput = await page.locator('//label[contains(text(), "*Rep ID")]/parent::web-label/following-sibling::web-input-text//input'); // Enter the Rep ID into the input field await repIdInput.fill(repId); } static async fieldPhoneNumberEnter(page, phoneNumber) { // Locate the Phone Number input field const phoneNumberField = await page.locator('//label[contains(text(), "*Phone Number")]//parent::web-label//following-sibling::web-input-mask//input'); // Enter the phone number await phoneNumberField.fill(''); await phoneNumberField.type(phoneNumber); } //Verify that the Phone Number field is still empty. static async FieldIsEmptyPhoneNumber(page) { // Locate the Phone Number field input element const phoneNumberField = await page.locator("//label[contains(text(), '*Phone Number')]/following-sibling::web-input-mask//input[@title='phoneNumber']"); // Assert that the Phone Number field is empty const fieldValue = await phoneNumberField.inputValue(); if (fieldValue) { throw new Error('Phone Number field is not empty.'); } } static async verifyABC Activity FormVisibility(page) { // XPath to verify the visibility of the 'ABC Activity Form' const xpath = "//div[@class='headerText line-clip' and text()='ABC Activity Form']"; // Wait for the element await page.waitForSelector(xpath, { state: 'visible', timeout: 20000 }); // ASSERT const isVisible = await page.isVisible(xpath); if (!isVisible) { throw new Error("The 'ABC Activity Form' is not visible."); } } } } });
See for yourself how we automate complexity
Complex commands
Making the data a bit tricky to understand, so only those with the right key can
On the top menu, hover over Mens, then Tops, and click on Jackets
We should see a page with "Jackets" heading
On the left sidebar, select SIZE, then click on M
On the left sidebar select Price Range then click on of of the options that has > 3 items
Go through each result. The M size should be highlighed for every result
Press 'ctrl+k' to open search drawer
Enter the term "TestCase" in the search bar and hit entrxd.
Confirm that search results are displayed.
For each result with a description, ensure it fits within two lines and ends with "..." if it exceeds more than two lines.
Click on "Apps" category and click on "Last 7 Days" date option
Go through each result and ensure that each result’s date is within last 7 days
Go to this url https://abcd.com//ABC-form
User should able to see the "ABC Activity Form".
Enter "242525" in ID
Enter "test@test.com" in Business Email
Enter "Test Customer Name" in Customer Name.
Enter "Test Customer Account Number" in Customer Account Number.
Enter "Test Brief Description" in Brief Description.
//Enter "8888888888" in Phone Number.
Enter "aaaaa" in Phone Number.
Verify that the Phone Number field is still empty.
//Click on Submit button - Submit button should not be enabled b/c chars were entered in phone field
Verify that Submit button is not enabled
test('Verify size selection', async ({ page }) => { try { //On the top menu, hover over Mens, then Tops, and click on Jackets await Page_.menuHoverAndClick(page); //We should see a page with "Jackets" heading await Page_men_topsmen_jacketsmenhtml.VerifyPageHeading(page, 'Jackets'); //On the left sidebar, select SIZE, then click on M await Page_men_topsmen_jacketsmenhtml.CheckboxSelect(page, 'M'); //On the left sidebar select Price Range then click on of of the options that has > 3 items await.Page_men_topsmen_jacketsmenhtml.SelectPriceRange(IWebDriver driver, 3) //Go through each result. The M size should be highlighed for every result await Page_men_topsmen_jacketsmenhtml.fieldSizeHighlightedResults(page, 'M'); } catch (error) { console.log('An error occurred during the test execution:', error); throw error; } class Page_ { static async MenuHoverAndClick(page) { // Locate the 'Men' menu item console.log("Locate the 'Men' menu item"); const mensMenu = await page.locator("xpath=//a[@id='ui-id-5']/span[text()='Men']"); // Hover over the 'Men' menu item console.log("Hover over the 'Men' menu item"); await mensMenu.hover(); // Locate the 'Tops' submenu item console.log("Locate the 'Tops' submenu item"); const topsSubMenu = await page.locator("xpath=//a[@id='ui-id-17']/span[text()='Tops']"); // Hover over the 'Tops' submenu item console.log("Hover over the 'Tops' submenu item"); await topsSubMenu.hover(); // Locate the 'Jackets' item and click it console.log("Locate the 'Jackets' item and click it"); const jacketsItem = await page.locator("xpath=//a[@id='ui-id-19']/span[text()='Jackets']"); await jacketsItem.click(); // CLICK ACTION await page.waitForTimeout(1000); await page.waitForLoadState('networkidle', { timeout: 60000 }); } } public static void SelectPriceRange(IWebDriver driver, int minItems) { // Locate the Price filter section string priceFilterXPath = "//div[@class='filter-options-title' and text()='Price']/following-sibling::div//ol[@class='items']/li/a"; // Find all price range elements var priceElements = driver.FindElements(By.XPath(priceFilterXPath)); // Iterate over each price element foreach(var priceElement in priceElements) { // Get the count of items for each price range string itemCountText = priceElement.FindElement(By.XPath(".//span[@class='count']")).Text; int itemCount = int.Parse(itemCountText.Split(' ')[0]); // Check if the item count is greater than the specified minimum if (itemCount > minItems) { // Click on the price range element priceElement.Click(); // CLICK ACTION break; } } } class Page_men_topsmen_jacketsmenhtml { static async CheckboxSelect(page, filterOption) { // Find the SIZE filter on the left sidebar console.log('Find the SIZE filter on the left sidebar'); const sizeFilterElement = await page.locator("//div[@class='filter-options-title' and text()='Size']"); await sizeFilterElement.click(); // CLICK ACTION await page.waitForTimeout(1000); await page.waitForLoadState('networkidle', { timeout: 60000 }); // Wait for the element console.log('Wait for the element'); await page.waitForSelector("//div[@class='filter-options-content']//div[@class='swatch-option text ' and text()='" + filterOption + "']", { state: 'visible', timeout: 20000 }); // Select the M size checkbox console.log('Select the M size checkbox'); const mSizeElement = await page.locator("//div[@class='filter-options-content']//div[@class='swatch-option text ' and text()='" + filterOption + "']"); await mSizeElement.click(); // CLICK ACTION await page.waitForTimeout(1000); await page.waitForLoadState('networkidle', { timeout: 60000 }); } static async FieldSizeHighlightedResults(page, size) { // Define the XPath for the highlighted size option in each product result console.log('Define the XPath for the highlighted size option in each product result'); const xpath = `//div[contains(@class, 'swatch-attribute size')]//div[@aria-label='${size}' and contains(@class, 'selected')]`; // Check if the size is highlighted for every result console.log('Check if the size is highlighted for every result'); const elements = await page.$$(xpath); // ASSERT console.log('ASSERT'); if (elements.length === 0) { throw new Error(`Size ${size} is not highlighted in any results.`); } for (const element of elements) { const className = await element.getAttribute('class'); if (!className.includes('selected')) { throw new Error(`Size ${size} is not highlighted.`); } } } });
// Playwright version: 1.38.0 const { test, expect } = require('@playwright/test'); test('Advance search test', async ({ page }) => { try { // Press 'ctrl+k' to open search drawer console.log("Press 'ctrl+k' to open search drawer"); await page.keyboard.press('Control+k'); await page.waitForTimeout(1000); // No network load to wait for here, but adding for consistency // Enter the term "TestCase" in the search bar and hit enter. console.log('Enter the term "TestCase" in the search bar and hit enter.'); await page.type("//input[@id='search']", "TestCase"); await page.keyboard.press('Enter'); await page.waitForTimeout(1000); await page.waitForLoadState('networkidle', { timeout: 60000 }); // Confirm that search results are displayed. console.log('Confirm that search results are displayed.'); await page.waitForSelector("//div[@class='one-search']//div[@class='header']/span[text()='Search Results']", { state: 'visible' }); // For each result with a description, ensure it fits within two lines and ends with "..." if it exceeds more than two lines. console.log('For every result that has a description, verify that it is within one or two lines and truncated with ellipsis "..." if it exceeds more than two lines.'); const descriptions = await page.$$eval(".search-section .skeleton .loader-card p-skeleton:nth-child(2) > div", elements => { return elements.map(element => element.textContent.trim()); }); await page.waitForTimeout(1000); // Ensure the page is rendered completely before validation. for (const descText of descriptions) { const lineCount = descText.split('\n').length; expect(lineCount <= 2, 'Description exceeds 2 lines').toBeTruthy(); if (lineCount === 2) { expect(descText.endsWith('...'), 'Description is not truncated with ellipsis').toBeTruthy(); } } //Click on "Apps" category and click on "Last 7 Days" date option // Locate the checkbox for the specified category console.log('Locate the checkbox for the specified category'); const categoryXpath = `//h3[text()='Category']/following-sibling::div//p-checkbox//label[contains(text(), 'Apps')]`; const categoryElement = await page.locator(categoryXpath); await categoryElement.click(); // CLICK ACTION // Locate the radio button for the specified date console.log('Locate the radio button for the specified date'); const dateXpath = `//h3[text()='Date']/following-sibling::div//p-radiobutton//label[text() = 'Last 7 Days']//preceding-sibling::div`; const dateElement = await page.locator(dateXpath); await dateElement.click(); // CLICK ACTION // Go through each result and ensure that each result’s date is within last 7 days await page.waitForTimeout(1000); const date7DaysResults = await page.$$("//div[contains(@class, 'results')]//div[contains(@class, 'foot')]//span[@class='date']"); const today = new Date(); for (const dateElement of date7DaysResults) { const dateText = await dateElement.textContent(); const parsedDate = new Date(dateText.trim()); expect(parsedDate >= new Date(today.getTime() - 7 * 24 * 60 * 60 * 1000) && parsedDate <= today).toBeTruthy(); } } } catch (error) { console.log('Error encountered:', error); throw error;);
test('Test exception case', async ({ page }) => { try { //Go to this url abcd.com/ABC-form await Page_home.navigateToABCFormPage(page, 'abcd.com/ABC-form'); //User should able to see the "ABC Activity Form". await Page_ABC.verifyABCActivityFormVisibility(page) //Enter "242525" in ID await Page_ABC.fieldEnterRepId(page, '242525'); //Enter "test@test.com" in Business Email. await Page_ABC.fieldEnterBusinessEmail(page, 'test@test.com'); //Enter "Test Customer Name" in Customer Name. await Page_ABC.fieldEnterCustomerName(page, 'Test Customer Name'); //Enter "Test Customer Account Number" in Customer Account Number. await Page_Page_ABC.fieldCustomerAccountNumber(page, 'Test Customer Account Number'); //Enter "Test Brief Description" in Brief Description (include who, what, when, and why). \ await Page_ABC.fieldBriefDescription(page, 'Test Brief Description'); //Enter "aaaaa" in Phone Number. await Page_ABC.fieldPhoneNumberEnter(page, 'aaaaa'); //Verify that the Phone Number field is still empty. await Page_ABC.FieldIsEmptyPhoneNumber(page) //Verify that Submit button is not enabled await Page_ABC.buttonVerifySubmitNotEnabled(page } catch (error) { console.log('An error occurred during the test execution:', error); throw error; } class Page_home { static async navigateToABCFormPage(page, url) { // Navigate to the specified URL await page.goto(url, { waitUntil: 'load' }); // CLICK ACTION } class Page_ABC { static async buttonVerifySubmitNotEnabled(page) { // Locate the Submit button using XPath const submitButton = await page.locator("//button[contains(@class, 'p-button') and span[text()='Submit']]").elementHandle(); // Verify that the Submit button is not enabled const isEnabled = await submitButton.isEnabled(); // Assert that the button is not enabled if (isEnabled) { throw new Error('Submit button is unexpectedly enabled.'); } // ASSERT } static async fieldBriefDescription(page, descriptionText) { // Find the Brief Description field using its XPath const briefDescriptionField = await page.locator('//label[contains(text(), "Brief Description (include who, what, when, and why)")]//parent::web-label//following-sibling::textarea'); // Enter the provided description text into the Brief Description field await briefDescriptionField.fill(''); await briefDescriptionField.type(descriptionText); } static async fieldCustomerAccountNumber(page, accountNumber) { // Locate the Customer Account Number input field using XPath const CustomerAccountNumberField = await page.locator('//label[contains(text(), "*Customer Account Number")]/parent::web-label/following-sibling::web-input-text//input'); // Enter the provided account number into the Customer Account Number field await CustomerAccountNumberField.fill(accountNumber); } static async fieldEnterBusinessEmail(page, email) { // Locate the Business Email field const emailField = await page.locator('//label[contains(text(), "*Business Email")]/parent::web-label/following-sibling::web-input-text//input'); // Enter the email into the Business Email field await emailField.fill(email); // ENTER ACTION } static async fieldEnterCustomerName(page, CustomerName) { // Locate the Customer Name input field const CustomerNameField = await page.locator('//label[contains(text(), "*Customer Name")]//parent::web-label//following-sibling::web-input-text//input'); // Enter the provided Customer name await CustomerNameField.fill(''); await CustomerNameField.type(CustomerName); } static async fieldEnterRepId(page, repId) { // Find the input field for Rep ID const repIdInput = await page.locator('//label[contains(text(), "*Rep ID")]/parent::web-label/following-sibling::web-input-text//input'); // Enter the Rep ID into the input field await repIdInput.fill(repId); } static async fieldPhoneNumberEnter(page, phoneNumber) { // Locate the Phone Number input field const phoneNumberField = await page.locator('//label[contains(text(), "*Phone Number")]//parent::web-label//following-sibling::web-input-mask//input'); // Enter the phone number await phoneNumberField.fill(''); await phoneNumberField.type(phoneNumber); } //Verify that the Phone Number field is still empty. static async FieldIsEmptyPhoneNumber(page) { // Locate the Phone Number field input element const phoneNumberField = await page.locator("//label[contains(text(), '*Phone Number')]/following-sibling::web-input-mask//input[@title='phoneNumber']"); // Assert that the Phone Number field is empty const fieldValue = await phoneNumberField.inputValue(); if (fieldValue) { throw new Error('Phone Number field is not empty.'); } } static async verifyABC Activity FormVisibility(page) { // XPath to verify the visibility of the 'ABC Activity Form' const xpath = "//div[@class='headerText line-clip' and text()='ABC Activity Form']"; // Wait for the element await page.waitForSelector(xpath, { state: 'visible', timeout: 20000 }); // ASSERT const isVisible = await page.isVisible(xpath); if (!isVisible) { throw new Error("The 'ABC Activity Form' is not visible."); } } } } });
See for yourself
How we automate
Manual test cases written in plain English have inherent complexity — multi-step actions, conditional logic, loops, typos, vague commands, or locating complex UI elements —
we automate it all.
Complex commands
Sample test case navigates to men's jackets and evaluates which price range options have >3 clothing items.
Complex validations
Form data entry and validation
Download
Input Manual Test Case
On the top menu, hover over Mens, then Tops, and click on Jackets
We should see a page with "Jackets" heading
On the left sidebar, select SIZE, then click on M
On the left sidebar select Price Range then click on of of the options that has > 3 items
Go through each result. The M size should be highlighed for every result
Press 'ctrl+k' to open search drawer
Enter the term "TestCase" in the search bar and hit entrxd.
Confirm that search results are displayed.
For each result with a description, ensure it fits within two lines and ends with "..." if it exceeds more than two lines.
Click on "Apps" category and click on "Last 7 Days" date option
Go through each result and ensure that each result’s date is within last 7 days
Download
Input Manual Test Case
Go to this url https://abcd.com//ABC-form
User should able to see the "ABC Activity Form".
Enter "242525" in ID
Enter "test@test.com" in Business Email
Enter "Test Customer Name" in Customer Name.
Enter "Test Customer Account Number" in Customer Account Number.
Enter "Test Brief Description" in Brief Description.
//Enter "8888888888" in Phone Number.
Enter "aaaaa" in Phone Number.
Verify that the Phone Number field is still empty.
//Click on Submit button - Submit button should not be enabled b/c chars were entered in phone field
Verify that Submit button is not enabled
Upload
Playwright Code Generated by EverTest
test('Verify size selection', async ({ page }) => { try { //On the top menu, hover over Mens, then Tops, and click on Jackets await Page_.menuHoverAndClick(page); //We should see a page with "Jackets" heading await Page_men_topsmen_jacketsmenhtml.VerifyPageHeading(page, 'Jackets'); //On the left sidebar, select SIZE, then click on M await Page_men_topsmen_jacketsmenhtml.CheckboxSelect(page, 'M'); //On the left sidebar select Price Range then click on of of the options that has > 3 items await.Page_men_topsmen_jacketsmenhtml.SelectPriceRange(IWebDriver driver, 3) //Go through each result. The M size should be highlighed for every result await Page_men_topsmen_jacketsmenhtml.fieldSizeHighlightedResults(page, 'M'); } catch (error) { console.log('An error occurred during the test execution:', error); throw error; } class Page_ { static async MenuHoverAndClick(page) { // Locate the 'Men' menu item console.log("Locate the 'Men' menu item"); const mensMenu = await page.locator("xpath=//a[@id='ui-id-5']/span[text()='Men']"); // Hover over the 'Men' menu item console.log("Hover over the 'Men' menu item"); await mensMenu.hover(); // Locate the 'Tops' submenu item console.log("Locate the 'Tops' submenu item"); const topsSubMenu = await page.locator("xpath=//a[@id='ui-id-17']/span[text()='Tops']"); // Hover over the 'Tops' submenu item console.log("Hover over the 'Tops' submenu item"); await topsSubMenu.hover(); // Locate the 'Jackets' item and click it console.log("Locate the 'Jackets' item and click it"); const jacketsItem = await page.locator("xpath=//a[@id='ui-id-19']/span[text()='Jackets']"); await jacketsItem.click(); // CLICK ACTION await page.waitForTimeout(1000); await page.waitForLoadState('networkidle', { timeout: 60000 }); } } public static void SelectPriceRange(IWebDriver driver, int minItems) { // Locate the Price filter section string priceFilterXPath = "//div[@class='filter-options-title' and text()='Price']/following-sibling::div//ol[@class='items']/li/a"; // Find all price range elements var priceElements = driver.FindElements(By.XPath(priceFilterXPath)); // Iterate over each price element foreach(var priceElement in priceElements) { // Get the count of items for each price range string itemCountText = priceElement.FindElement(By.XPath(".//span[@class='count']")).Text; int itemCount = int.Parse(itemCountText.Split(' ')[0]); // Check if the item count is greater than the specified minimum if (itemCount > minItems) { // Click on the price range element priceElement.Click(); // CLICK ACTION break; } } } class Page_men_topsmen_jacketsmenhtml { static async CheckboxSelect(page, filterOption) { // Find the SIZE filter on the left sidebar console.log('Find the SIZE filter on the left sidebar'); const sizeFilterElement = await page.locator("//div[@class='filter-options-title' and text()='Size']"); await sizeFilterElement.click(); // CLICK ACTION await page.waitForTimeout(1000); await page.waitForLoadState('networkidle', { timeout: 60000 }); // Wait for the element console.log('Wait for the element'); await page.waitForSelector("//div[@class='filter-options-content']//div[@class='swatch-option text ' and text()='" + filterOption + "']", { state: 'visible', timeout: 20000 }); // Select the M size checkbox console.log('Select the M size checkbox'); const mSizeElement = await page.locator("//div[@class='filter-options-content']//div[@class='swatch-option text ' and text()='" + filterOption + "']"); await mSizeElement.click(); // CLICK ACTION await page.waitForTimeout(1000); await page.waitForLoadState('networkidle', { timeout: 60000 }); } static async FieldSizeHighlightedResults(page, size) { // Define the XPath for the highlighted size option in each product result console.log('Define the XPath for the highlighted size option in each product result'); const xpath = `//div[contains(@class, 'swatch-attribute size')]//div[@aria-label='${size}' and contains(@class, 'selected')]`; // Check if the size is highlighted for every result console.log('Check if the size is highlighted for every result'); const elements = await page.$$(xpath); // ASSERT console.log('ASSERT'); if (elements.length === 0) { throw new Error(`Size ${size} is not highlighted in any results.`); } for (const element of elements) { const className = await element.getAttribute('class'); if (!className.includes('selected')) { throw new Error(`Size ${size} is not highlighted.`); } } } });
Upload
Playwright Code Generated by EverTest
test('Verify user will see the confirmation', async ({ page }) => { try { //Go to this url abcd.com/ABC-form await Page_home.navigateToABCFormPage(page, 'XXXXXXXX.com/ABC-form'); //User should able to see the "ABC Activity Form". await Page_ABC.verifyABCActivityFormVisibility(page) //Enter "242525" in ID await Page_ABC.fieldEnterRepId(page, '242525'); //Enter "test@test.com" in Business Email. await Page_ABC.fieldEnterBusinessEmail(page, 'test@test.com'); //Enter "Test Customer Name" in Customer Name. await Page_ABC.fieldEnterCustomerName(page, 'Test Customer Name'); //Enter "Test Customer Account Number" in Customer Account Number. await Page_Page_ABC.fieldCustomerAccountNumber(page, 'Test Customer Account Number'); //Enter "Test Brief Description" in Brief Description (include who, what, when, and why). \ await Page_ABC.fieldBriefDescription(page, 'Test Brief Description'); //Enter "aaaaa" in Phone Number. await Page_ABC.fieldPhoneNumberEnter(page, 'aaaaa'); //Verify that the Phone Number field is still empty. await Page_ABC.FieldIsEmptyPhoneNumber(page) //Verify that Submit button is not enabled await Page_ABC.buttonVerifySubmitNotEnabled(page } catch (error) { console.log('An error occurred during the test execution:', error); throw error; } class Page_home { static async navigateToABCFormPage(page, url) { // Navigate to the specified URL await page.goto(url, { waitUntil: 'load' }); // CLICK ACTION } class Page_ABC { static async buttonVerifySubmitNotEnabled(page) { // Locate the Submit button using XPath const submitButton = await page.locator("//button[contains(@class, 'p-button') and span[text()='Submit']]").elementHandle(); // Verify that the Submit button is not enabled const isEnabled = await submitButton.isEnabled(); // Assert that the button is not enabled if (isEnabled) { throw new Error('Submit button is unexpectedly enabled.'); } // ASSERT } static async fieldBriefDescription(page, descriptionText) { // Find the Brief Description field using its XPath const briefDescriptionField = await page.locator('//label[contains(text(), "Brief Description (include who, what, when, and why)")]//parent::web-label//following-sibling::textarea'); // Enter the provided description text into the Brief Description field await briefDescriptionField.fill(''); await briefDescriptionField.type(descriptionText); } static async fieldCustomerAccountNumber(page, accountNumber) { // Locate the Customer Account Number input field using XPath const CustomerAccountNumberField = await page.locator('//label[contains(text(), "*Customer Account Number")]/parent::web-label/following-sibling::web-input-text//input'); // Enter the provided account number into the Customer Account Number field await CustomerAccountNumberField.fill(accountNumber); } static async fieldEnterBusinessEmail(page, email) { // Locate the Business Email field const emailField = await page.locator('//label[contains(text(), "*Business Email")]/parent::web-label/following-sibling::web-input-text//input'); // Enter the email into the Business Email field await emailField.fill(email); // ENTER ACTION } static async fieldEnterCustomerName(page, CustomerName) { // Locate the Customer Name input field const CustomerNameField = await page.locator('//label[contains(text(), "*Customer Name")]//parent::web-label//following-sibling::web-input-text//input'); // Enter the provided Customer name await CustomerNameField.fill(''); await CustomerNameField.type(CustomerName); } static async fieldEnterRepId(page, repId) { // Find the input field for Rep ID const repIdInput = await page.locator('//label[contains(text(), "*Rep ID")]/parent::web-label/following-sibling::web-input-text//input'); // Enter the Rep ID into the input field await repIdInput.fill(repId); } static async fieldPhoneNumberEnter(page, phoneNumber) { // Locate the Phone Number input field const phoneNumberField = await page.locator('//label[contains(text(), "*Phone Number")]//parent::web-label//following-sibling::web-input-mask//input'); // Enter the phone number await phoneNumberField.fill(''); await phoneNumberField.type(phoneNumber); } //Verify that the Phone Number field is still empty. static async FieldIsEmptyPhoneNumber(page) { // Locate the Phone Number field input element const phoneNumberField = await page.locator("//label[contains(text(), '*Phone Number')]/following-sibling::web-input-mask//input[@title='phoneNumber']"); // Assert that the Phone Number field is empty const fieldValue = await phoneNumberField.inputValue(); if (fieldValue) { throw new Error('Phone Number field is not empty.'); } } static async verifyABC Activity FormVisibility(page) { // XPath to verify the visibility of the 'ABC Activity Form' const xpath = "//div[@class='headerText line-clip' and text()='ABC Activity Form']"; // Wait for the element await page.waitForSelector(xpath, { state: 'visible', timeout: 20000 }); // ASSERT const isVisible = await page.isVisible(xpath); if (!isVisible) { throw new Error("The 'ABC Activity Form' is not visible."); } } } });
Automation at scale, hold the syntax
We take all of your manual test cases in plain English—no rewriting, no reformatting—and convert them into automated scripts. This means unmatched speed, for simple and complex test scenarios alike - more than 10x faster than traditional automation.
We take all of your manual test cases in plain English—no rewriting, no reformatting—and convert them into automated scripts. This means unmatched speed, for simple and complex test scenarios alike - more than 10x faster than traditional automation.
Stacks
Bulk Automation
Clear your manual test case backlog and accelerate Agile sprints with large-scale automation—no more one-at-a-time bottlenecks.
Stacks
Bulk Automation
Clear your manual test case backlog and accelerate Agile sprints with large-scale automation—no more one-at-a-time bottlenecks.
Draw
Plain English Translation of Test Cases
Plain English Translation
If you can write it, we can automate it. We democratize testing by enabling your whole team to contribute.
Draw
Plain English Translation of Test Cases
If you can write it, we can automate it. We democratize testing by enabling your whole team to contribute.
Approval_Delegation
White Glove Service
E2E automation, fully managed by our professional services, so you can focus on higher level testing.
Approval_Delegation
White Glove Service
E2E automation, fully managed by our professional services, so you can focus on higher level testing.
Reset_Wrench
Seamless Self Healing
Stale tests are history. By converting high-level plain English instructions, we ensure automation code stays accurate.
Stale tests are history. By converting high-level plain English instructions, we ensure automation code stays accurate.
Reset_Wrench
Seamless Self Healing
Stale tests are history. By converting high-level plain English instructions, we ensure automation code stays accurate.
Shield
Enterprise-Grade Security
Sensitive data stays secure with script code separated from your automation data.
Shield
Enterprise-Grade Security
Sensitive data stays secure with script code separated from your automation data.
Device_Hub
No Platform Lock-In
Receive automation scripts in your preferred framework—Selenium, Playwright, Cucumber, or others.
Device_Hub
No Platform Lock-In
Receive automation scripts in your preferred framework—Selenium, Playwright, Cucumber, or others.
Regression testing is tedious. So let us handle it, while you do the fun stuff
Our solution rapidly automates 100% of your regression suite, empowering your QA team to focus on high-impact, strategic initiatives.
Our solution rapidly automates 100% of your regression suite, empowering your QA team to focus on high-impact, strategic initiatives.
Verified
Speed
Step_Out
Robust Products, Fewer Defects
Accelerate Time-to-Market
Elevate QA to Higher Level Work
A whopping 12% of regression tests fail because of bugs, costing the global economy trillions.
Our automation ensures comprehensive test coverage, reducing defects and delivering robust, reliable products.
In an Agile and DevOps world, testing should never bottleneck your releases.
Our solution is more than 10x faster than traditional automation and 5x faster than manual testing, all while achieving 100% coverage.
Imagine the impact of freeing your team from repetitive regression testing. With our solution, QA can shift focus to high-value tasks like exploratory testing and QA strategy.
Verified
Robust Products, Fewer Defects
A whopping 12% of regression tests fail because of bugs, costing the global economy trillions.
Our automation ensures comprehensive test coverage, reducing defects and delivering robust, reliable products.
Speed
Accelerate Time-to-Market
In an Agile and DevOps world, testing should never bottleneck your releases.
Our solution is 10x faster than traditional automation and 5x faster than manual testing, all while achieving 100% coverage.
Step_Out
Elevate QA to Higher Level Work
Imagine the impact of freeing your team from repetitive regression testing. With our solution, QA can shift focus to high-value tasks like exploratory testing and QA strategy.
Mission impossible - Backlog automation
Manual testing - still two-thirds of all testing - is so time-consuming that it limits how much testing gets done, causing huge backlogs to accumulate.
This is the power of our bulk automation technology: EverTest's speed enables us to clear backlogs once thought impossible.


