Tests read like what the user does
Page objects hold the locators, fixed assertions wait and retry on their own, and Jev checks the things that are about meaning rather than exact text.
Write your first test →import { expect, test } from "./fixtures";
test("a user can save a note", async ({ page, newNotePage }) => {
await newNotePage.goto();
await newNotePage.save("Groceries");
const heading = page.getByRole("heading", { name: "Groceries" });
await expect(heading).toBeVisible();
await expect(page).toSatisfy("the new note is shown with its title");
});
Page objects first
Locators live in page object classes. intelliwright init scaffolds them, and BasePage gives each one goto() and a ready check.
Plain-English checks
toSatisfy("the cart shows 3 items") asks Jev about the page. Every answer is a probability, and you choose the threshold.
Actions by description
ai.click("the Sign in button in the header") picks the element, turns it into a readable locator, and caches it so later runs skip Jev.
Goals that become code
ai.run("create an account") works through the page one step at a time, then hands back the same flow as fixed Playwright code.
Failure triage
Each failure is labeled as a regression, a test bug, flaky, or the environment, next to the screenshot, trace and logs.
Real browsers, familiar API
Chromium, Firefox and WebKit through Playwright, with test, expect, fixtures and hooks that work like Playwright Test.