
Product
Introducing Repository Access Permissions and Custom Roles
Socket now supports Custom Roles and Repository Access Permissions so organizations can control who can access specific repositories and actions.
@cerios/playwright-expectly
Advanced tools
Comprehensive Playwright test matchers for strings, numbers, dates, arrays, objects, and locators. Simplify your E2E tests with intuitive assertions like toBeAlphanumeric, toHaveAscendingOrder, toBeInTheFuture, and 50+ more matchers.
Comprehensive Playwright test matchers for strings, numbers, dates, arrays, objects, and locators. Simplify your E2E tests with intuitive assertions.
npm install @cerios/playwright-expectly --save-dev
expectly directlyimport { expectly } from "@cerios/playwright-expectly";
// String validation
expectly("user@example.com").toBeValidEmail();
// Number array validation
expectly([1, 2, 3, 4, 5]).toHaveAscendingOrder();
// Date validation
expectly(new Date()).toBeInTheFuture(new Date("2020-01-01"));
// Locator validation
await expectly(page.locator(".username")).toBeAlphanumeric();
expect with setupExpectlyThe simplest way to add all matchers to Playwright's native expect. Call setupExpectly() once and every test file gets full type support automatically.
// playwright.config.ts
import { setupExpectly } from "@cerios/playwright-expectly";
setupExpectly();
Then use expect as usual in your tests — no extra imports needed:
import { expect, test } from "@playwright/test";
test("extended expect example", async ({ page }) => {
expect("john@example.com").toBeValidEmail();
expect([1, 2, 3, 4]).toHaveAscendingOrder();
await expect(page.locator(".username")).toBeAlphanumeric();
});
If your playwright.config is JavaScript or not included in your TypeScript project, add one ambient import once so IntelliSense sees the matcher types:
import "@cerios/playwright-expectly";
expect manuallyIf you prefer more control, extend expect yourself in a shared fixtures file:
// tests/fixtures.ts
import { expect, test as base } from "@playwright/test";
import { expectlyMatchers } from "@cerios/playwright-expectly";
expect.extend(expectlyMatchers);
export { expect };
export const test = base;
Then use the re-exported expect in tests:
import { expect, test } from "./fixtures";
test("extended expect example", async ({ page }) => {
expect("john@example.com").toBeValidEmail();
expect([1, 2, 3, 4]).toHaveAscendingOrder();
await expect(page.locator(".username")).toBeAlphanumeric();
});
toBeValidEmail() - Validate email formattoBeValidUrl() - Validate URL formattoBeUUID(version?) - Validate UUID (optionally specific version)toBeAlphanumeric() - Only letters and numberstoBeNumericString() - Only digitstoStartWith(prefix) / toEndWith(suffix) - String boundariestoMatchPattern(regex) - Regular expression matchingtoHaveAscendingOrder() / toHaveDescendingOrder() - Sort validationtoHaveAverage(value) / toHaveMedian(value) - Statistical validationtoHaveMin(value) / toHaveMax(value) - Boundary validationtoBeAllPositive() / toBeAllNegative() - Sign validationtoBeMonotonic() - Consistent directiontoHaveConsecutiveIntegers() - Sequential validation📖 View all number array matchers →
toBeCloseTo(date, deviation) - Within time deviationtoBeInTheFuture(refDate?) / toBeInThePast(refDate?) - Temporal validationtoBeSameDay(date) / toBeSameMonth(date) / toBeSameYear(date) - Date comparisontoBeInQuarter(quarter) - Quarter validationtoBeLeapYear() - Leap year checktoHaveConsecutiveDates(unit) - Sequential datestoBeAlphanumeric() - Alphanumeric texttoBeNumericString() - Numeric texttoBeUUID(version?) - UUID formattoBeUpperCase() / toBeLowerCase() - Case validationtoBeTitleCase() - Title case formattoHaveSrc(value) / toHaveHref(value) / toHaveAlt(value) - Attribute validationtoHaveObjectsInAscendingOrderBy(property) - Sort by propertytoHaveObjectsInDescendingOrderBy(property) - Reverse sort by propertytoHaveOnlyUniqueObjects() - Uniqueness validation📖 View all object array matchers →
toHaveAscendingOrder() / toHaveDescendingOrder() - Alphabetical ordertoHaveStrictlyAscendingOrder() - No duplicates ascendingtoBeMonotonic() - Consistent directiontoHaveUniqueValues() - No duplicates📖 View all string array matchers →
toBeInteger() / toBeFloat() - Number type validationtoBeAnyOf(...values) - Multiple value matchingtoEqualPartially(expected) - Partial object matchingtoBeNullish() - Null or undefined checktoBePrimitive() / toBeArray() / toBeObject() - Type checkingimport { expectly } from "@cerios/playwright-expectly";
test("validate user input", async () => {
expectly("john.doe@example.com").toBeValidEmail();
expectly("https://example.com").toBeValidUrl();
expectly("550e8400-e29b-41d4-a716-446655440000").toBeUUID(4);
});
test("validate sorted data", async () => {
const scores = [85, 90, 92, 95];
expectly(scores).toHaveAscendingOrder();
expectly(scores).toHaveAverage(90.5);
expectly(scores).toBeAllPositive();
});
test("validate dates", async () => {
const now = new Date();
const tomorrow = new Date(now.getTime() + 86400000);
expectly(tomorrow).toBeInTheFuture(now);
expectly(tomorrow).toBeCloseTo(now, { hours: 24 });
});
test("validate form elements", async ({ page }) => {
await expectly(page.locator(".email")).toBeValidEmail();
await expectly(page.locator(".username")).toBeAlphanumeric();
await expectly(page.locator("img")).toHaveAlt("Company Logo");
});
Use this when you want all tests to use the extra matchers without importing expectly everywhere.
// e.g. tests/fixtures.ts or a shared setup module imported by your tests
import { expect } from "@playwright/test";
import { expectlyMatchers } from "@cerios/playwright-expectly";
expect.extend(expectlyMatchers);
All matcher objects are exported, so you can extend expect with everything or only specific families.
import { expectlyDateMatchers, expectlyMatchers, expectlyStringMatchers } from "@cerios/playwright-expectly";
// All matchers
expect.extend(expectlyMatchers);
// Or only selected matcher families
expect.extend({
...expectlyStringMatchers,
...expectlyDateMatchers,
});
Use this when you want a smaller, explicit API per matcher family.
import { expectlyDate, expectlyLocator, expectlyNumberArray, expectlyString } from "@cerios/playwright-expectly";
expectlyString("ABC123").toBeAlphanumeric();
expectlyNumberArray([10, 20, 30]).toHaveAscendingOrder();
expectlyDate(new Date()).toBeSameYear(new Date("2026-01-01"));
await expectlyLocator(page.locator(".email")).toBeValidEmail();
For tree-shaking optimization, import only what you need:
import { expectlyString } from "@cerios/playwright-expectly";
import { expectlyNumberArray } from "@cerios/playwright-expectly";
import { expectlyDate } from "@cerios/playwright-expectly";
expectlyString("test@example.com").toBeValidEmail();
expectlyNumberArray([1, 2, 3]).toHaveAscendingOrder();
expectlyDate(new Date()).toBeInTheFuture(new Date("2020-01-01"));
All matchers support .not for inverse assertions:
expectly("not-an-email").not.toBeValidEmail();
expectly([5, 3, 1]).not.toHaveAscendingOrder();
await expectly(page.locator(".text")).not.toBeNumericString();
Contributions are welcome! Feel free to open an issue or submit a pull request.
MIT © Cerios
Built with ❤️ by Cerios
FAQs
Comprehensive Playwright test matchers for strings, numbers, dates, arrays, objects, and locators. Simplify your E2E tests with intuitive assertions like toBeAlphanumeric, toHaveAscendingOrder, toBeInTheFuture, and 50+ more matchers.
The npm package @cerios/playwright-expectly receives a total of 72 weekly downloads. As such, @cerios/playwright-expectly popularity was classified as not popular.
We found that @cerios/playwright-expectly demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 2 open source maintainers collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Product
Socket now supports Custom Roles and Repository Access Permissions so organizations can control who can access specific repositories and actions.

Product
Socket MCP now lets AI assistants review org alerts, investigate threats using the Socket threat feed, and inspect package files in addition to dependency scoring.

Product
Socket Firewall blocks malicious VS Code and Open VSX extensions before install, protecting developers from compromised editor marketplaces.