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
- Set the watch (or global) fetch backend to a real browser: Playwright/Chrome
- Verify the browser is installed (e.g. playwright install chromium or the browser-enabled Docker image)
- Check the watch's error log for an earlier browser startup failure that left screenshot empty
- 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
- Only assign the image_ssim_diff processor to watches using a real browser fetcher
- Verify Playwright/Chromium is installed in the container before enabling visual watches
- Monitor for silent browser failures — a crashed browser later surfaces here
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
- UUID: {watch.get('uuid')} - Screenshot comparison failed: {e
- Selection mode must be either "element" or "draw"
- Cannot run, more than one price detected, this plugin is onl
- {self.filter_config.include_filters}
- Processor module '{processor}' not found.
AI-assisted analysis of dgtlmoon/changedetection.io@5d9c7c6da7 (2026-08-27).
Data as JSON: /api/errors/efc13ca44dd4ef82.
Report an issue: GitHub.