Skip to content

Screenshots

Capture screenshots and run visual regression tests.

Capture

Page Screenshot

typescript
const buffer = await page.screenshot();
const buffer = await page.screenshot({ fullPage: true });
const buffer = await page.screenshot({ path: "output.png" });

Element Screenshot

typescript
const h1 = page.locator("h1");
const buffer = await h1.screenshot();

Options

OptionTypeDefaultDescription
pathstring-Save to file
fullPagebooleanfalseCapture entire scrollable page
clip{ x, y, width, height }-Crop to region
qualitynumber-JPEG quality (0-100)
type"png" | "jpeg""png"Image format

Save to File

typescript
await page.screenshot({ path: "./screenshots/homepage.png" });
await page.screenshot({ path: "./screenshots/homepage.jpg", type: "jpeg", quality: 90 });

Full Page

Capture the entire page, not just the viewport:

typescript
const buffer = await page.screenshot({ fullPage: true });

Crop Region

typescript
const buffer = await page.screenshot({
  clip: { x: 0, y: 0, width: 800, height: 600 },
});

Visual Regression

page.expectScreenshot(baselinePath, threshold?)

Compare the current page against a baseline image.

typescript
await page.expectScreenshot("./screenshots/homepage.png");

First run: Creates the baseline file automatically.

Subsequent runs: Compares pixel-by-pixel. Throws if diff exceeds threshold.

ParameterTypeDefaultDescription
baselinePathstringrequiredPath to baseline image
thresholdnumber0.1Max allowed diff percentage (0-100)
typescript
// Allow up to 5% difference
await page.expectScreenshot("./baseline.png", 5);

compareScreenshots(actual, expected)

Manual comparison. Returns detailed diff info.

typescript
import { compareScreenshots } from "unibrowser";

const result = await compareScreenshots(actualBuffer, expectedBuffer);
// {
//   match: false,
//   diffPercent: 2.34,
//   diffPixels: 23400,
//   totalPixels: 1000000
// }
FieldTypeDescription
matchbooleanExact pixel match
diffPercentnumberPercentage of different pixels
diffPixelsnumberCount of different pixels
totalPixelsnumberTotal pixel count

Cross-Browser Screenshots

Screenshots may differ slightly between browsers. Use a threshold:

typescript
crossBrowserSuite("Visual", (test) => {
  test("homepage looks correct", async ({ page }) => {
    await page.goto("https://example.com");
    // Allow 2% difference between browsers
    await page.expectScreenshot(`./screenshots/home.png`, 2);
  });
});

Released under the Apache 2.0 License.