{"record":{"id":"4e00e01037c2ec37","repo":"unclecode/crawl4ai","slug":"failed-on-navigating-acs-goto-str-e","errorCode":null,"errorMessage":"Failed on navigating ACS-GOTO:\n{str(e)}","messagePattern":"Failed on navigating ACS-GOTO:\n(.+?)","errorType":"exception","errorClass":"RuntimeError","httpStatus":null,"severity":"error","filePath":"crawl4ai/async_crawler_strategy.py","lineNumber":778,"sourceCode":"                            )\n\n                        response = await page.goto(\n                            url, wait_until=config.wait_until, timeout=config.page_timeout\n                        )\n                        redirected_url = page.url\n                        redirected_status_code = response.status if response else None\n                    except Error as e:\n                        # Allow navigation to be aborted when downloading files\n                        # This is expected behavior for downloads in some browser engines\n                        if 'net::ERR_ABORTED' in str(e) and self.browser_config.accept_downloads:\n                            self.logger.info(\n                                message=f\"Navigation aborted, likely due to file download: {url}\",\n                                tag=\"GOTO\",\n                                params={\"url\": url},\n                            )\n                            response = None\n                        else:\n                            raise RuntimeError(f\"Failed on navigating ACS-GOTO:\\n{str(e)}\")\n\n                    # ──────────────────────────────────────────────────────────────\n                    # Walk the redirect chain.  Playwright returns only the last\n                    # hop, so we trace the `request.redirected_from` links until the\n                    # first response that differs from the final one and surface its\n                    # status-code.\n                    # ──────────────────────────────────────────────────────────────\n                    if response is None:\n                        status_code = 200\n                        response_headers = {}\n                    else:\n                        first_resp = response\n                        req = response.request\n                        while req and req.redirected_from:\n                            prev_req = req.redirected_from\n                            prev_resp = await prev_req.response()\n                            if prev_resp:                       # keep earliest\n                                first_resp = prev_resp","sourceCodeStart":760,"sourceCodeEnd":796,"githubUrl":"https://github.com/unclecode/crawl4ai/blob/7e801521428ee12509994d39151006f64055ebe3/crawl4ai/async_crawler_strategy.py#L760-L796","documentation":"Raised when Playwright's page.goto() raises an Error during navigation that is not the expected 'net::ERR_ABORTED' download-abort case. The underlying Playwright exception (DNS failure, TLS error, timeout, net::ERR_CONNECTION_REFUSED, etc.) is stringified and wrapped in a RuntimeError with the ACS-GOTO tag, aborting the crawl of that URL.","triggerScenarios":"Any page.goto() failure: unreachable host (ERR_NAME_NOT_RESOLVED), refused connection, certificate errors with ignore_https_errors off, navigation exceeding config.page_timeout (TimeoutError from Playwright), or a target that resets the connection. Downloads abort with ERR_ABORTED are exempt only when browser_config.accept_downloads is true.","commonSituations":"Corporate proxies blocking direct egress; sites with invalid/self-signed TLS certs; slow pages exceeding page_timeout; transient DNS failures in CI; crawling localhost ports where the dev server is not running.","solutions":["Read the embedded Playwright error text to identify the root cause (DNS vs TLS vs timeout) and fix that specifically.","For slow pages, increase CrawlerRunConfig.page_timeout; for TLS issues set BrowserConfig(ignore_https_errors=True) or install the CA cert.","For download-triggering pages that abort navigation, set BrowserConfig(accept_downloads=True) so ERR_ABORTED is treated as expected.","For transient network issues, retry the URL with backoff at the caller level."],"exampleFix":"// before\ncfg = CrawlerRunConfig(page_timeout=10000)\nresult = await crawler.arun(url=url, config=cfg)\n\n// after\ncfg = CrawlerRunConfig(page_timeout=60000)\nbrowser_cfg = BrowserConfig(ignore_https_errors=True)\nasync with AsyncWebCrawler(config=browser_cfg) as crawler:\n    try:\n        result = await crawler.arun(url=url, config=cfg)\n    except RuntimeError as e:\n        logger.warning(f\"goto failed for {url}: {e}\")","handlingStrategy":"retry","validationCode":"import socket\nfrom urllib.parse import urlparse\n\ndef host_reachable(url: str) -> bool:\n    h = urlparse(url).hostname\n    try:\n        socket.getaddrinfo(h or \"\", 80)\n        return True\n    except socket.gaierror:\n        return False","typeGuard":null,"tryCatchPattern":"try:\n    result = await crawler.arun(url, config=cfg)\nexcept RuntimeError as e:\n    msg = str(e)\n    if \"ERR_NAME_NOT_RESOLVED\" in msg or \"ERR_CONNECTION_REFUSED\" in msg:\n        mark_dead(url)\n    elif \"Timeout\" in msg:\n        await asyncio.sleep(2)\n        result = await crawler.arun(url, config=cfg)","preventionTips":["Set page_timeout generously for slow sites","Configure ignore_https_errors or CA certs for TLS-strict environments","Enable accept_downloads when crawling download links"],"tags":["navigation","playwright","network","timeout"],"backgroundTag":null,"analyzedSha":"7e801521428ee12509994d39151006f64055ebe3","analyzedAt":"2026-08-14T20:46:20.673Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}