ScreenshotNeo

BlogComparisons

PageCrawl.io vs Playwright for Scheduled Website Screenshots

Choose PageCrawl for hosted visual monitoring and alerts, or Playwright for a screenshot pipeline you control. Here is how scheduling, storage, and capture differ.

By the ScreenshotNeo team4 October 202612 min read

Use PageCrawl.io if you want a hosted recurring monitoring workflow with change history and notifications, and visual monitoring fits your needs. Use Playwright if you want to control browser navigation and capture in code and are prepared to provide the scheduler, screenshot storage, comparison logic, and operational upkeep. PageCrawl currently labels visual tracking beta, so account for that before relying on it for a production visual-diff workflow. ScreenshotNeo is another option to try first when the main requirement is to request clean screenshots through an API rather than operate a browser capture pipeline.

First decide what “scheduled screenshots” means for your project. A periodic archive gives you images to inspect later. Visual monitoring also needs a way to identify changes, retain history, and notify someone. PageCrawl documents a hosted monitoring workflow; Playwright supplies browser capture primitives that you combine with a runner and the rest of that workflow.

1. Choose by the outcome you need

Need Better fit Why
Recurring checks, change history, notifications in a hosted service PageCrawl Its documentation describes page intervals, workspace schedules, monitoring history, notifications, and API/webhook options.
Control over browser code, navigation, and capture details Playwright The screenshot API supports viewport, full-page, and element captures plus output options. You supply the recurring trigger and the surrounding workflow.
A scheduled image archive without automatic alerting Either Choose PageCrawl for hosted checks or Playwright if your team wants to own the capture and archive pipeline.
Automated visual change detection PageCrawl, with its beta status in mind; or Playwright plus your comparison workflow PageCrawl documents visual monitoring as beta. Playwright can capture images, but your own workflow must provide comparison, history, and notifications.

PageCrawl’s [visual tracking documentation](https://pagecrawl.io/help) describes monitoring a selected area and labels the visual feature beta. Its [engine guidance](https://pagecrawl.io/help) recommends Default or Stealth modes for screenshots or visual differences, and says Fast mode does not support screenshots or visual comparisons. Check the live help pages for current details before choosing a plan or engine.

2. What PageCrawl handles

PageCrawl documents per-page check frequencies and workspace schedules. Its current help article lists minimum intervals by plan: Free every hour, Standard every 15 minutes, Enterprise every 5 minutes, and Ultimate every 2 minutes. It also lists choices from every two minutes through monthly. These are vendor-published plan details, not independent measurements; verify current plan terms before purchase.

A workspace schedule can restrict checks to selected weekdays and active hours. The documented behavior converts hours to UTC using the workspace timezone and pauses checks outside active periods, resuming at the next active period. For ongoing programmatic workflows, PageCrawl documents monitor creation and frequency configuration, webhooks for change or error events, check history, diff retrieval, and screenshot information in webhook payloads. Consult its [API and webhook guide](https://pagecrawl.io/help) and live API reference for current endpoints and response fields; this article does not invent endpoint paths.

PageCrawl trade-offs to weigh

  • Less infrastructure to assemble: the hosted service handles recurring checks and offers monitoring history and notifications.
  • Feature qualification: visual tracking is documented as beta. Test the specific pages and workflow you depend on before making it a critical alert path.
  • Engine selection matters: according to PageCrawl, Fast mode is not suitable for screenshots, visual comparisons, or browser actions; use a documented recommended mode for those tasks.
  • Frequency depends on plan: the published minimum intervals differ by plan. Confirm limits and schedule behavior against current terms.

3. Build a scheduled screenshot pipeline with Playwright

Playwright captures when your code calls its screenshot API. To make captures recurring, connect the script to a scheduler such as GitHub Actions, cron, or another CI runner. Playwright’s [CI guide](https://playwright.dev/docs/ci) describes running Playwright on CI providers; GitHub documents [scheduled workflow triggers](https://docs.github.com/en/actions/reference/workflows-and-actions/events-that-trigger-workflows).

Step 1: Create a small Node.js capture script

Install Playwright and its browser in your project using the instructions for your chosen Playwright release. The following script opens a URL from an environment variable, waits for the page load event, then saves a full-page PNG. It creates the output directory and includes a timeout and nonzero exit on failure.

const { chromium } = require('playwright');
const fs = require('node:fs/promises');
const path = require('node:path');

async function main() {
  const target = process.env.TARGET_URL;
  if (!target) throw new Error('Set TARGET_URL to the page to capture');

  const outputDir = process.env.OUTPUT_DIR || 'screenshots';
  await fs.mkdir(outputDir, { recursive: true });
  const filename = `${new Date().toISOString().replaceAll(':', '-')}.png`;
  const outputPath = path.join(outputDir, filename);

  const browser = await chromium.launch({ headless: true });
  try {
    const page = await browser.newPage({ viewport: { width: 1440, height: 900 } });
    const response = await page.goto(target, {
      waitUntil: 'load',
      timeout: 60_000,
    });
    if (response && !response.ok()) {
      throw new Error(`Navigation returned HTTP ${response.status()}`);
    }
    await page.screenshot({ path: outputPath, fullPage: true, type: 'png' });
    console.log(`Saved ${outputPath}`);
  } finally {
    await browser.close();
  }
}

main().catch((error) => {
  console.error(error);
  process.exitCode = 1;
});

Run it locally with TARGET_URL=https://example.com node capture.js. Replace the target with a page you are authorized to access. The example treats a non-success HTTP response as a failed capture; remove or change that policy if your monitoring purpose is specifically to archive error pages.

Step 2: Schedule it with GitHub Actions

Save this as .github/workflows/capture.yml. Replace the URL with your page. GitHub schedule events use cron syntax, run against the default branch, and can be delayed during periods of high load. The documentation says the shortest supported interval is every five minutes; avoid treating a scheduled time as a precise deadline.

name: Scheduled website screenshot

on:
  schedule:
    - cron: '17 8 * * 1-5'
  workflow_dispatch:

jobs:
  capture:
    runs-on: ubuntu-latest
    timeout-minutes: 10
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: 22
      - run: npm ci
      - run: npx playwright install --with-deps chromium
      - name: Capture page
        run: node capture.js
        env:
          TARGET_URL: https://example.com
      - name: Upload screenshot
        uses: actions/upload-artifact@v4
        with:
          name: scheduled-screenshot
          path: screenshots/
          retention-days: 14

This workflow uploads artifacts with a finite retention period. For a long-lived archive, choose durable object storage and define naming, retention, access control, and cleanup. For actual change detection, add a comparison step and decide how to handle expected changes, dynamic regions, and alerts. Those are workflow choices rather than capabilities supplied by the Playwright screenshot call.

Step 3: Make the capture meaningful and repeatable

  • Choose a readiness condition: load is a general starting point. If the important content renders later, wait for a specific locator or application signal. Avoid waiting indefinitely for network idle on pages with persistent requests.
  • Fix the viewport: use the same viewport and browser environment for every run so layout changes are easier to interpret.
  • Handle time-varying content: decide whether timestamps, rotating banners, ads, animation, and personalized content should be hidden, frozen, or included. Playwright can add page styles or interact with elements before capture; keep any such changes explicit in the script.
  • Separate capture from comparison: save the image first, then compare against an approved baseline. Keep the baseline versioned or stored with clear provenance.
  • Set retention intentionally: full-page images can accumulate quickly. Retain only what the investigation or compliance requirement needs.

4. Screenshot options and capture boundaries

Playwright’s screenshot APIs support viewport captures by default, full-page captures, and element screenshots through a locator. The screenshot options include output path or returned buffer, image type, JPEG quality, scale, clipping, and related controls. See the [Playwright screenshot guide](https://playwright.dev/docs/next/screenshots) and [Page API](https://playwright.dev/docs/api/class-page) for the exact options available in your installed release; the screenshot guide is marked Next, so confirm version-specific behavior.

// Viewport PNG
await page.screenshot({ path: 'viewport.png', type: 'png' });

// Entire scrollable page
await page.screenshot({ path: 'full-page.png', fullPage: true });

// One element
await page.locator('main .product-card').screenshot({ path: 'card.png' });

// JPEG with quality setting
await page.screenshot({ path: 'preview.jpg', type: 'jpeg', quality: 80 });

// Return bytes for storage or downstream processing
const image = await page.screenshot({ type: 'png' });

Full-page images can be very tall; some sites use sticky elements, lazy loading, or virtualized lists whose contents change while scrolling. A full-page option does not guarantee that every below-the-fold asset has loaded or that a virtualized page exposes all rows at once. For those cases, scroll deliberately, wait for the relevant content, or capture targeted elements. Use locator screenshots when a component matters more than the whole document.

5. Scheduling, history, and reliability comparison

Responsibility PageCrawl.io Playwright pipeline
Recurring trigger Hosted page intervals and workspace schedules are documented. Your runner invokes the capture code. GitHub Actions is one option.
Capture logic Configure the hosted monitor and engine options available to your account. Your code controls browser setup, navigation, readiness, and capture choices.
History Documentation describes stored monitor history and API access to checks/diffs. You choose artifact or object storage, naming, retention, and access.
Change alerts Notifications and webhook events are documented. You implement or connect the comparison and alert path.
Failure ownership The hosted monitoring service operates its scheduled check workflow; inspect its error reporting and current service terms. Your team handles runner failures, retries, logs, browser installation, storage, and alert delivery.

Neither a cron expression nor an interval guarantees an exact execution time. GitHub explicitly notes scheduled runs may be delayed during high-load periods, especially near the start of an hour, and that queued runs may be dropped under sufficiently high load. Schedule away from the hour boundary when timing matters, monitor workflow outcomes, and provide a manual rerun path. For critical monitoring, have a separate signal for “the capture did not run”; a missing image alone can otherwise look like an unchanged page.

6. Performance, reliability, and cost considerations

Performance

  • PageCrawl’s published interval limits determine how frequently its hosted checks can run on a given plan. Check the live plan terms for the current limits.
  • For Playwright, each run must start or access a browser, navigate the page, wait for readiness, and write the output. Keep jobs bounded with timeouts and avoid capturing more pages or pixels than the monitoring question needs.
  • Full-page images and high-resolution output use more storage and can take longer to create or transfer than a viewport capture. Element captures can reduce output when only one region matters.
  • Parallelize only when the runner and target site can handle the added requests. Avoid creating a monitoring schedule that burdens a site you do not operate.

Reliability

  • Use explicit navigation and operation timeouts, log the URL and capture timestamp, and preserve enough error context to diagnose failures.
  • Make retries bounded. Retrying transient network failures can help, but repeated retries may create duplicate images or excessive load; use stable filenames or run identifiers.
  • Keep browser and dependency versions controlled. For visual comparisons, consistent operating system, browser version, viewport, and rendering conditions reduce irrelevant differences. Playwright notes that rendering can vary by host OS, version, settings, hardware, power source, and headless mode in its [visual comparison guide](https://playwright.dev/docs/test-snapshots).
  • Protect credentials. Store tokens and authenticated cookies in the runner’s secret store, never in committed workflow files or screenshot artifacts.

Cost and operations

The research available for this comparison does not establish comparable current prices for PageCrawl and a Playwright pipeline, so compare the plan terms directly. With Playwright, account for runner minutes, browser execution, storage and retention, comparison/alert services if used, and the engineering time to maintain the workflow. With PageCrawl, check the current plan’s interval limits and included features against the number of monitored pages and required schedule.

7. Troubleshooting scheduled captures

Symptom Likely cause Fix
No GitHub scheduled run appears Workflow is not on the default branch, schedule syntax is invalid, repository inactivity disabled schedules, or the event was delayed. Check the workflow on the default branch, inspect Actions settings and run history, validate cron syntax, and add workflow_dispatch for manual runs. See GitHub’s [schedule event documentation](https://docs.github.com/en/actions/reference/workflows-and-actions/events-that-trigger-workflows).
Browser executable is missing in CI Playwright package is installed but the required browser was not installed in the runner. Install the browser for the project’s Playwright version in the workflow, as in the example, and keep package/browser versions aligned.
Navigation times out Slow page, network issue, bot challenge, or a readiness condition that never occurs. Check the runner’s network access and logs, set a realistic timeout, and wait for the content your capture requires instead of an overly broad condition. Do not bypass access controls.
Screenshot is blank or incomplete The app rendered after the chosen event, content is lazy-loaded, or the page requires a specific interaction. Wait for a meaningful locator or app-ready signal; scroll or interact where appropriate; capture a targeted element to isolate the issue.
Images differ on every run Dynamic content, animation, timestamps, rotating ads, fonts, or a changed rendering environment. Stabilize the environment and page state, mask or hide known dynamic regions where appropriate, and review diffs before updating baselines.
Full-page output omits content Lazy loading or virtualized content only appears when scrolled into view. Scroll through the page and wait for the required content before capturing; for virtualized pages, capture the relevant states separately.
PageCrawl visual checks do not behave as expected Visual tracking is beta or the selected engine does not support the screenshot/visual comparison workflow. Review current feature status and use a documented recommended engine (Default or Stealth for screenshot/diff needs, per PageCrawl guidance); avoid Fast for this use.
Checks pause outside expected hours Workspace schedule restricts active days or hours and uses its configured timezone. Review workspace timezone and active schedule; PageCrawl documents that checks pause outside those periods and resume during the next active period.

8. Or skip the browser setup

If your job is to request an image or PDF and save the response, ScreenshotNeo provides a one-request screenshot API. The parameters used by other screenshot APIs also work, which can make switching easier. See the ScreenshotNeo API documentation.

curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://stripe.com -o shot.webp

ScreenshotNeo accepts cookie/consent banners and removes more than 60 known consent platforms, newsletter popups, and chat widgets before capture; each step can be turned off. Bot checks, blank pages, timeouts, failed loads, and cache hits are not billed, and response headers report the page verdict and billing status. Its MCP server gives AI agents tools including take_screenshot, get_page_info, and capture_pdf. The free plan includes 1,000 screenshots per month with no card; paid plans start at $5 for 3,000 screenshots.

Other supported options include full-page and CSS-selector element capture, dark mode, device presets and custom viewports, retina scale, PDF settings, HTML/CSS rendering, custom CSS and JavaScript, clicks and waits, request blocking, headers/cookies/user agent/authorization, timezone and geolocation, transparent backgrounds, resizing, chosen cache TTL, signed image links, async jobs with signed webhooks, bulk capture of up to 100 URLs per call, and a usage API. All features are available on every plan.

Try ScreenshotNeo free: 1,000 screenshots a month, no card required.

9. Frequently asked questions

Can Playwright run on a schedule without GitHub Actions?

Yes. The capture script can be invoked by cron, another CI service, or a scheduler you operate. GitHub Actions is one documented route, not a Playwright requirement.

Does PageCrawl visual tracking compare screenshots?

PageCrawl documents visual tracking and change monitoring, but its help documentation labels the visual feature beta. Confirm current behavior and suitability for your pages in the live documentation.

Is a screenshot archive the same as visual monitoring?

No. An archive stores images over time. Monitoring adds a way to identify meaningful differences and route an alert or review task.

Which one should I choose for the least operational work?

PageCrawl is the closer fit when you want hosted scheduling, history, and notifications. Playwright is appropriate when owning the capture pipeline is itself a requirement.

Sources