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
- Use the field that allows JSONPath extraction
- 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
- Treat 'jq not permitted in this field!' on a json: line as 'JSONPath not allowed here'
- Keep extraction rules in the designated extract/JSON field
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
- Backup archive decompressed size ({total_uncompressed // (10
- Zip Slip path traversal detected in backup archive: {member.
- Invalid JSON object for field: {value}
- One of the 'conditions' rulesets is incomplete, cannot run.
- Non200ErrorCodeReceived
AI-assisted analysis of dgtlmoon/changedetection.io@5d9c7c6da7 (2026-08-27).
Data as JSON: /api/errors/92f5761177b55393.
Report an issue: GitHub.