dgtlmoon/changedetection.io · error · BrowserStepsStepException

BrowserStepsStepException

Error message

BrowserStepsStepException

What it means

The validator checks allow_json again after successfully parsing a json: expression and rejects it with 'jq not permitted in this field!' (a misleading message — it actually means JSONPath extraction is not permitted here). It is a second gate for fields that disallow the json: prefix.

Source

Thrown at changedetectionio/content_fetchers/base.py:240

                    # Support for jinja2 template in step values, with date module added
                    if '{%' in step['optional_value'] or '{{' in step['optional_value']:
                        optional_value = jinja_render(template_str=step['optional_value'])
                    if '{%' in step['selector'] or '{{' in step['selector']:
                        selector = jinja_render(template_str=step['selector'])

                    await getattr(interface, "call_action")(action_name=step['operation'],
                                                      selector=selector,
                                                      optional_value=optional_value)
                    await self.screenshot_step(step_n)
                    await self.save_step_html(step_n)
                except (Error, TimeoutError, ValueError) as e:
                    # ValueError is what validate_fetch_url_async() raises when a step's URL is
                    # refused (file://, private IP, bad scheme) - report it against the offending
                    # step number like any other step failure, rather than failing the whole watch
                    # with an opaque error.
                    logger.debug(str(e))
                    # Stop processing here
                    raise BrowserStepsStepException(step_n=step_n, original_e=e)

    # It's always good to reset these
    def delete_browser_steps_screenshots(self):
        import glob
        if self.browser_steps_screenshot_path is not None:
            dest = os.path.join(self.browser_steps_screenshot_path, 'step_*.jpeg')
            files = glob.glob(dest)
            for f in files:
                if os.path.isfile(f):
                    os.unlink(f)

    def save_step_html(self, step_n):
        if self.browser_steps_screenshot_path and not os.path.isdir(self.browser_steps_screenshot_path):
            logger.debug(f"> Creating data dir {self.browser_steps_screenshot_path}")
            os.mkdir(self.browser_steps_screenshot_path)
        pass

View on GitHub (pinned to 5d9c7c6da7)

Solutions

  1. Use the field that allows JSONPath extraction
  2. Enable allow_json=True when constructing the validator in custom forms

Example fix

null
Defensive patterns

Strategy: validation

Validate before calling

def can_use_json_lines(allow_json: bool) -> bool:
    return allow_json  # gate UI/inputs on the same flag the validator uses

Prevention

When it happens

Trigger: A json: line that parses successfully but the field's allow_json flag is False — i.e. the same condition as error [42], reached via a slightly different code path/message. Triggered by entering valid JSONPath in a JSON-disallowed field.

Common situations: Same as the JSONPath-not-permitted case: pasting extraction rules into the wrong field; custom forms reusing the validator with allow_json unset.

Related errors


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