dgtlmoon/changedetection.io · error · BrowserStepsInUnsupportedFetcher

BrowserStepsInUnsupportedFetcher

Error message

BrowserStepsInUnsupportedFetcher

What it means

The plain requests-based fetcher cannot execute browser steps, so if a watch has browser_steps configured it immediately raises BrowserStepsInUnsupportedFetcher.

Source

Thrown at changedetectionio/content_fetchers/requests.py:43

            url,
            timeout,
            request_headers,
            request_body,
            request_method,
            ignore_status_codes=False,
            current_include_filters=None,
            is_binary=False,
            empty_pages_are_a_change=False,
            watch_uuid=None,
            ):
        """Synchronous version of run - the original requests implementation"""

        import chardet
        import requests
        from requests.exceptions import ProxyError, ConnectionError, RequestException

        if self.browser_steps:
            raise BrowserStepsInUnsupportedFetcher(url=url)

        proxies = {}

        # Allows override the proxy on a per-request basis
        # https://requests.readthedocs.io/en/latest/user/advanced/#socks
        # Should also work with `socks5://user:pass@host:port` type syntax.

        if self.proxy_override:
            proxies = {'http': self.proxy_override, 'https': self.proxy_override, 'ftp': self.proxy_override}
        else:
            if self.system_http_proxy:
                proxies['http'] = self.system_http_proxy
            if self.system_https_proxy:
                proxies['https'] = self.system_https_proxy

        session = requests.Session()

        # Configure retry adapter for low-level network errors only

View on GitHub (pinned to 5d9c7c6da7)

Solutions

  1. Switch the watch's fetcher to Playwright (or puppeteer)
  2. Or delete the browser steps if they are not needed
Defensive patterns

Strategy: validation

Validate before calling

def fetcher_supports_steps(fetcher_name: str, has_steps: bool) -> bool:
    return not has_steps or fetcher_name in ('playwright', 'puppeteer')

Try / catch

try:
    fetcher.run()
except BrowserStepsInUnsupportedFetcher:
    watch['fetcher'] = 'playwright'
    retry_check()

Prevention

When it happens

Trigger: Watch has browser steps defined but its fetcher is 'requests' (plain HTTP) — either explicitly chosen or falling back from a missing browser service.

Common situations: User records steps then switches fetcher to requests for speed; default fetcher used on a watch created via API with steps payload.

Related errors


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