diff --git a/ftest/playwright_request.py b/ftest/playwright_request.py new file mode 100644 index 0000000000..6c837d5644 --- /dev/null +++ b/ftest/playwright_request.py @@ -0,0 +1,6 @@ +from minet.browser import ThreadsafeBrowser + +with ThreadsafeBrowser(headless=False) as browser: + response = browser.request("http://lemonde.fr") + + print(response) diff --git a/minet/browser/plawright_shim.py b/minet/browser/plawright_shim.py index aee3b5e3cf..d8ddfb1069 100644 --- a/minet/browser/plawright_shim.py +++ b/minet/browser/plawright_shim.py @@ -14,9 +14,10 @@ def run_playwright(*args: str) -> int: env = get_driver_env() env.setdefault("PLAYWRIGHT_BROWSERS_PATH", get_browsers_path()) - driver_executable = compute_driver_executable() + node, pw = compute_driver_executable() + completed_process = subprocess.run( - [str(driver_executable), *args], env=env, stdout=subprocess.DEVNULL + [node, pw, *args], env=env, stdout=subprocess.DEVNULL ) return completed_process.returncode diff --git a/minet/browser/threadsafe_browser.py b/minet/browser/threadsafe_browser.py index acad3f5dbf..45443535ae 100644 --- a/minet/browser/threadsafe_browser.py +++ b/minet/browser/threadsafe_browser.py @@ -7,11 +7,14 @@ from concurrent.futures import Future from threading import Thread, Event, Lock from playwright.async_api import async_playwright, Browser, BrowserContext +from urllib3._collections import HTTPHeaderDict from minet.exceptions import UnknownBrowserError +from minet.web import Response from minet.browser.plawright_shim import install_browser from minet.browser.utils import get_browsers_path, get_temp_persistent_context_path from minet.browser.extensions import get_extension_path, ensure_extension_is_downloaded +from minet.types import Redirection SUPPORTED_BROWSERS = ("chromium", "firefox") @@ -227,3 +230,28 @@ def run_in_browser_or_default_context( ) return self.__handle_future(future) + + async def __request(self, context: BrowserContext, url: str) -> Response: + async with await context.new_page() as page: + emulated_response = await page.goto(url) + + assert emulated_response is not None + + headers = HTTPHeaderDict() + + for header in await emulated_response.headers_array(): + headers[header["name"]] = header["value"] + + response = Response( + url, + [Redirection(url, status=emulated_response.status)], + headers, + emulated_response.status, + (await page.content()).encode(), + known_encoding="utf-8", + ) + + return response + + def request(self, url: str) -> Response: + return self.run_in_default_context(self.__request, url)