from typing import Any, Dict, Optional, Union, overload from playwright.sync_api import ( Browser, BrowserContext, Playwright, PlaywrightContextManager, ) from typing_extensions import Literal from camoufox.virtdisplay import VirtualDisplay from .utils import launch_options, sync_attach_vd class Camoufox(PlaywrightContextManager): """ Wrapper around playwright.sync_api.PlaywrightContextManager that automatically launches a browser and closes it when the context manager is exited. """ def __init__(self, **launch_options): super().__init__() self.launch_options = launch_options self.browser: Optional[Union[Browser, BrowserContext]] = None def __enter__(self) -> Union[Browser, BrowserContext]: super().__enter__() self.browser = NewBrowser(self._playwright, **self.launch_options) return self.browser def __exit__(self, *args: Any): if self.browser: self.browser.close() super().__exit__(*args) @overload def NewBrowser( playwright: Playwright, *, from_options: Optional[Dict[str, Any]] = None, persistent_context: Literal[False] = False, **kwargs, ) -> Browser: ... @overload def NewBrowser( playwright: Playwright, *, from_options: Optional[Dict[str, Any]] = None, persistent_context: Literal[True], **kwargs, ) -> BrowserContext: ... def NewBrowser( playwright: Playwright, *, headless: Optional[Union[bool, Literal['virtual']]] = None, from_options: Optional[Dict[str, Any]] = None, persistent_context: bool = False, debug: Optional[bool] = None, **kwargs, ) -> Union[Browser, BrowserContext]: """ Launches a new browser instance for Camoufox given a set of launch options. Parameters: from_options (Dict[str, Any]): A set of launch options generated by `launch_options()` to use persistent_context (bool): Whether to use a persistent context. **kwargs: All other keyword arugments passed to `launch_options()`. """ if headless == 'virtual': virtual_display = VirtualDisplay(debug=debug) kwargs['virtual_display'] = virtual_display.get() headless = False else: virtual_display = None opt = from_options or launch_options(headless=headless, debug=debug, **kwargs) # Persistent context if persistent_context: context = playwright.firefox.launch_persistent_context(**opt) return sync_attach_vd(context, virtual_display) # Browser browser = playwright.firefox.launch(**opt) return sync_attach_vd(browser, virtual_display)