diff --git a/scrapling/engines/_browsers/_base.py b/scrapling/engines/_browsers/_base.py index fa95419..16a995d 100644 --- a/scrapling/engines/_browsers/_base.py +++ b/scrapling/engines/_browsers/_base.py @@ -458,6 +458,8 @@ class BaseSessionMixin: "channel": "chrome" if config.real_chrome else "chromium", } ) + if config.executable_path: + self._browser_options["executable_path"] = config.executable_path self._user_data_dir = config.user_data_dir else: diff --git a/scrapling/engines/_browsers/_types.py b/scrapling/engines/_browsers/_types.py index f4f31cd..6ab40b9 100644 --- a/scrapling/engines/_browsers/_types.py +++ b/scrapling/engines/_browsers/_types.py @@ -90,6 +90,7 @@ class PlaywrightSession(TypedDict, total=False): retries: int retry_delay: int | float capture_xhr: str | None + executable_path: Optional[str] class PlaywrightFetchParams(TypedDict, total=False): diff --git a/scrapling/engines/_browsers/_validators.py b/scrapling/engines/_browsers/_validators.py index dfe7310..69b3766 100644 --- a/scrapling/engines/_browsers/_validators.py +++ b/scrapling/engines/_browsers/_validators.py @@ -88,6 +88,7 @@ class PlaywrightConfig(Struct, kw_only=True, frozen=False, weakref=True): retries: RetriesCount = 3 retry_delay: Seconds = 1 capture_xhr: str | None = None + executable_path: Optional[str] = None def __post_init__(self): # pragma: no cover """Custom validation after msgspec validation""" @@ -121,6 +122,11 @@ class PlaywrightConfig(Struct, kw_only=True, frozen=False, weakref=True): if validation_msg: raise ValueError(validation_msg) + if self.executable_path is not None: + validation_msg = _is_invalid_file_path(self.executable_path) + if validation_msg: + raise ValueError(validation_msg) + class StealthConfig(PlaywrightConfig, kw_only=True, frozen=False, weakref=True): allow_webgl: bool = True