dgtlmoon/changedetection.io · error · ProcessorException

No screenshot available. Ensure the watch is configured to u

Error message

No screenshot available. Ensure the watch is configured to use a real browser.

What it means

A ProcessorException raised at the start of run_changedetection in the image_ssim_diff processor when self.fetcher.screenshot is empty. The SSIM diff processor needs an actual rendered screenshot, which is only produced by a real-browser fetcher (Playwright/Chrome); plain HTTP fetchers never populate fetcher.screenshot.

Source

Thrown at changedetectionio/processors/image_ssim_diff/processor.py:43

list_badge_text = "Visual"

class perform_site_check(difference_detection_processor):
    """Fast screenshot comparison processor using OpenCV."""

    # Override to use PNG format for better image comparison (JPEG compression creates noise)
    screenshot_format = SCREENSHOT_FORMAT_PNG

    def run_changedetection(self, watch, force_reprocess=False):
        """
        Perform screenshot comparison using OpenCV subprocess handler.

        Returns:
            tuple: (changed_detected, update_obj, screenshot_bytes)
        """
        now = time.time()
        # Get the current screenshot
        if not self.fetcher.screenshot:
            raise ProcessorException(
                message="No screenshot available. Ensure the watch is configured to use a real browser.",
                url=watch.get('url')
            )
        self.screenshot = self.fetcher.screenshot
        self.xpath_data = self.fetcher.xpath_data

        # Quick MD5 check - skip expensive comparison if images are identical
        from changedetectionio.content_fetchers.exceptions import checksumFromPreviousCheckWasTheSame
        current_md5 = hashlib.md5(self.screenshot).hexdigest()
        previous_md5 = watch.get('previous_md5')
        if previous_md5 and current_md5 == previous_md5:
            logger.debug(f"UUID: {watch.get('uuid')} - Screenshot MD5 unchanged ({current_md5}), skipping comparison")
            raise checksumFromPreviousCheckWasTheSame()
        else:
            logger.debug(f"UUID: {watch.get('uuid')} - Screenshot MD5 changed")


View on GitHub (pinned to 5d9c7c6da7)

Solutions

  1. Set the watch (or global) fetch backend to a real browser: Playwright/Chrome
  2. Verify the browser is installed (e.g. playwright install chromium or the browser-enabled Docker image)
  3. Check the watch's error log for an earlier browser startup failure that left screenshot empty
  4. Run a single 'Check now' after fixing and confirm a snapshot thumbnail appears
Defensive patterns

Strategy: validation

Validate before calling

watch['fetch_backend'] = 'playwright'  # or your deployment's browser backend name
# ensure the browser binary exists before enabling image_ssim_diff watches

Try / catch

try:
    handler.run_changedetection(watch, ...)
except ProcessorException as e:
    if 'No screenshot available' in str(e):
        # switch watch to a browser fetcher and requeue
        ...

Prevention

When it happens

Trigger: Running a watch with the 'Visual element selection / screenshot' (image_ssim_diff) processor while the watch (or global settings) uses the default requests/HTTP fetcher instead of a browser, or the browser step failed silently and returned no screenshot bytes.

Common situations: Switching a watch's processor to visual diff without switching its fetch method to Playwright; running in a slim Docker image without the browser installed; browser crashed/OOM so screenshot is None.

Related errors


AI-assisted analysis of dgtlmoon/changedetection.io@5d9c7c6da7 (2026-08-27). Data as JSON: /api/errors/efc13ca44dd4ef82. Report an issue: GitHub.