{"record":{"id":"efc13ca44dd4ef82","repo":"dgtlmoon/changedetection.io","slug":"no-screenshot-available-ensure-the-watch-is-confi","errorCode":null,"errorMessage":"No screenshot available. Ensure the watch is configured to use a real browser.","messagePattern":"No screenshot available\\. Ensure the watch is configured to use a real browser\\.","errorType":"exception","errorClass":"ProcessorException","httpStatus":null,"severity":"error","filePath":"changedetectionio/processors/image_ssim_diff/processor.py","lineNumber":43,"sourceCode":"list_badge_text = \"Visual\"\n\nclass perform_site_check(difference_detection_processor):\n    \"\"\"Fast screenshot comparison processor using OpenCV.\"\"\"\n\n    # Override to use PNG format for better image comparison (JPEG compression creates noise)\n    screenshot_format = SCREENSHOT_FORMAT_PNG\n\n    def run_changedetection(self, watch, force_reprocess=False):\n        \"\"\"\n        Perform screenshot comparison using OpenCV subprocess handler.\n\n        Returns:\n            tuple: (changed_detected, update_obj, screenshot_bytes)\n        \"\"\"\n        now = time.time()\n        # Get the current screenshot\n        if not self.fetcher.screenshot:\n            raise ProcessorException(\n                message=\"No screenshot available. Ensure the watch is configured to use a real browser.\",\n                url=watch.get('url')\n            )\n        self.screenshot = self.fetcher.screenshot\n        self.xpath_data = self.fetcher.xpath_data\n\n        # Quick MD5 check - skip expensive comparison if images are identical\n        from changedetectionio.content_fetchers.exceptions import checksumFromPreviousCheckWasTheSame\n        current_md5 = hashlib.md5(self.screenshot).hexdigest()\n        previous_md5 = watch.get('previous_md5')\n        if previous_md5 and current_md5 == previous_md5:\n            logger.debug(f\"UUID: {watch.get('uuid')} - Screenshot MD5 unchanged ({current_md5}), skipping comparison\")\n            raise checksumFromPreviousCheckWasTheSame()\n        else:\n            logger.debug(f\"UUID: {watch.get('uuid')} - Screenshot MD5 changed\")\n\n\n","sourceCodeStart":25,"sourceCodeEnd":61,"githubUrl":"https://github.com/dgtlmoon/changedetection.io/blob/5d9c7c6da76340597243e8163c4f2439237fa0e8/changedetectionio/processors/image_ssim_diff/processor.py#L25-L61","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","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"],"exampleFix":null,"handlingStrategy":"validation","validationCode":"watch['fetch_backend'] = 'playwright'  # or your deployment's browser backend name\n# ensure the browser binary exists before enabling image_ssim_diff watches","typeGuard":null,"tryCatchPattern":"try:\n    handler.run_changedetection(watch, ...)\nexcept ProcessorException as e:\n    if 'No screenshot available' in str(e):\n        # switch watch to a browser fetcher and requeue\n        ...","preventionTips":["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"],"tags":["screenshot","processor","playwright","image-ssim-diff"],"backgroundTag":"missing-screenshot","analyzedSha":"5d9c7c6da76340597243e8163c4f2439237fa0e8","analyzedAt":"2026-08-27T19:41:16.067Z","schemaVersion":2},"datasetVersion":"2026-08-28T00:17:15.603Z"}