{"record":{"id":"a3d81cf589cb87a0","repo":"unclecode/crawl4ai","slug":"virtual-scroll-config-must-be-virtualscrollconfig","errorCode":null,"errorMessage":"virtual_scroll_config must be VirtualScrollConfig object or dict","messagePattern":"virtual_scroll_config must be VirtualScrollConfig object or dict","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"crawl4ai/async_configs.py","lineNumber":1891,"sourceCode":"            self.link_preview_config = None\n        elif isinstance(link_preview_config, LinkPreviewConfig):\n            self.link_preview_config = link_preview_config\n        elif isinstance(link_preview_config, dict):\n            # Convert dict to config object for backward compatibility\n            self.link_preview_config = LinkPreviewConfig.from_dict(link_preview_config)\n        else:\n            raise ValueError(\"link_preview_config must be LinkPreviewConfig object or dict\")\n        \n        # Virtual Scroll Parameters\n        if virtual_scroll_config is None:\n            self.virtual_scroll_config = None\n        elif isinstance(virtual_scroll_config, VirtualScrollConfig):\n            self.virtual_scroll_config = virtual_scroll_config\n        elif isinstance(virtual_scroll_config, dict):\n            # Convert dict to config object for backward compatibility\n            self.virtual_scroll_config = VirtualScrollConfig.from_dict(virtual_scroll_config)\n        else:\n            raise ValueError(\"virtual_scroll_config must be VirtualScrollConfig object or dict\")\n        \n        # URL Matching Parameters\n        self.url_matcher = url_matcher\n        self.match_mode = match_mode\n        \n        # Experimental Parameters\n        self.experimental = experimental or {}\n\n        # Anti-Bot Retry Parameters\n        self.max_retries = max_retries\n        self.fallback_fetch_function = fallback_fetch_function\n\n        # Compile C4A scripts if provided\n        if self.c4a_script and not self.js_code:\n            self._compile_c4a_script()\n\n\n    @staticmethod","sourceCodeStart":1873,"sourceCodeEnd":1909,"githubUrl":"https://github.com/unclecode/crawl4ai/blob/7e801521428ee12509994d39151006f64055ebe3/crawl4ai/async_configs.py#L1873-L1909","documentation":"CrawlerRunConfig accepts virtual_scroll_config as None, a VirtualScrollConfig instance, or a plain dict (converted via VirtualScrollConfig.from_dict). Any other type is rejected because the crawler needs typed fields (container selector, scroll step, etc.) to drive virtual-scroll page loading.","triggerScenarios":"Passing virtual_scroll_config as a string, list, or an object of an unrelated class; passing a dict whose values then fail VirtualScrollConfig's own validation.","commonSituations":"Loading config from JSON where the nested object was flattened or stringified; version mismatches after VirtualScrollConfig was introduced or moved.","solutions":["Pass a dict: virtual_scroll_config={\"container\": \"#results\", \"scroll_count\": 10}","Or an instance: VirtualScrollConfig(container=\"#results\")","Parse JSON strings before passing; verify the nested structure survived your config loader"],"exampleFix":"// before\ncfg = CrawlerRunConfig(virtual_scroll_config=[\"#results\", 10])\n// after\ncfg = CrawlerRunConfig(virtual_scroll_config=VirtualScrollConfig(container=\"#results\", scroll_count=10))","handlingStrategy":"type-guard","validationCode":"from crawl4ai.async_configs import VirtualScrollConfig\n\nassert virtual_scroll_config is None or isinstance(virtual_scroll_config, (VirtualScrollConfig, dict)), \\\n    \"virtual_scroll_config must be VirtualScrollConfig or dict\"","typeGuard":"def is_virtual_scroll_config(v) -> bool:\n    return v is None or isinstance(v, (VirtualScrollConfig, dict))","tryCatchPattern":null,"preventionTips":["Validate nested config shapes at the API boundary","Construct VirtualScrollConfig explicitly in typed code"],"tags":["validation","virtual-scroll","configuration","type-error"],"backgroundTag":null,"analyzedSha":"7e801521428ee12509994d39151006f64055ebe3","analyzedAt":"2026-08-14T20:46:20.673Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}