{"record":{"id":"dedc1d55ff7e6ecf","repo":"dgtlmoon/changedetection.io","slug":"emptyreply","errorCode":null,"errorMessage":"EmptyReply","messagePattern":"EmptyReply","errorType":"exception","errorClass":"EmptyReply","httpStatus":null,"severity":"error","filePath":"changedetectionio/content_fetchers/playwright.py","lineNumber":313,"sourceCode":"            )\n\n            self.page = await context.new_page()\n\n            # Listen for all console events and handle errors\n            self.page.on(\"console\", lambda msg: logger.debug(f\"Playwright console: Watch URL: {url} {msg.type}: {msg.text} {msg.args}\"))\n\n            # Re-use as much code from browser steps as possible so its the same\n            from changedetectionio.browser_steps.browser_steps import steppable_browser_interface\n            browsersteps_interface = steppable_browser_interface(start_url=url)\n            browsersteps_interface.page = self.page\n\n            response = await browsersteps_interface.action_goto_url(value=url)\n\n            if response is None:\n                await context.close()\n                await browser.close()\n                logger.debug(\"Content Fetcher > Response object from the browser communication was none\")\n                raise EmptyReply(url=url, status_code=None)\n\n            # In async_playwright, all_headers() returns a coroutine\n            try:\n                self.headers = await response.all_headers()\n            except TypeError:\n                # Fallback for sync version\n                self.headers = response.all_headers()\n\n            try:\n                if self.webdriver_js_execute_code is not None and len(self.webdriver_js_execute_code):\n                    await browsersteps_interface.action_execute_js(value=self.webdriver_js_execute_code, selector=None)\n            except playwright._impl._errors.TimeoutError as e:\n                await context.close()\n                await browser.close()\n                # This can be ok, we will try to grab what we could retrieve\n                pass\n            except Exception as e:\n                logger.debug(f\"Content Fetcher > Other exception when executing custom JS code {str(e)}\")","sourceCodeStart":295,"sourceCodeEnd":331,"githubUrl":"https://github.com/dgtlmoon/changedetection.io/blob/5d9c7c6da76340597243e8163c4f2439237fa0e8/changedetectionio/content_fetchers/playwright.py#L295-L331","documentation":"When a submitted line starts with 'jq:', the validator tries `import jq`. If the Python jq binding package is not installed (ModuleNotFoundError), it rejects with 'jq not support not found' (sic). The jq module needs native compilation and is often unavailable, notably on Windows.","triggerScenarios":"Entering a jq:... expression on an installation where the 'jq' PyPI package is missing — e.g. Windows builds of changedetection.io, slim Docker images, or environments where the optional dependency was not installed.","commonSituations":"Running changedetection.io on Windows or a container without the jq python package; switching a config from JSONPath to jq filters without installing the optional dependency.","solutions":["Install the binding: pip install jq (on Linux/macOS; needs build tools or wheel)","On Windows, use a Docker-based deployment or stick to json: JSONPath instead of jq:","Check your requirements/variant of the app includes the jq extra"],"exampleFix":"# before\njq:.foo // \"default\"   # jq package not installed\n# after (no jq available)\njson:$.foo","handlingStrategy":"type-guard","validationCode":"def jq_available() -> bool:\n    try:\n        import jq  # noqa\n        return True\n    except ModuleNotFoundError:\n        return False","typeGuard":"def jq_available() -> bool:\n    try:\n        import jq\n        return True\n    except ModuleNotFoundError:\n        return False","tryCatchPattern":null,"preventionTips":["pip install jq (needs compiler/wheel) before enabling jq: filters","Fall back to json: JSONPath when jq isn't installed","On Windows, run via Docker where jq is available"],"tags":["jq","optional-dependency","module-not-found","changedetectionio"],"backgroundTag":"missing-optional-dependency","analyzedSha":"5d9c7c6da76340597243e8163c4f2439237fa0e8","analyzedAt":"2026-08-27T19:41:16.067Z","schemaVersion":2},"datasetVersion":"2026-08-28T00:17:15.603Z"}