From 3dfbfb957f05a7d60acd03ccf71d57ba7e8c0dc7 Mon Sep 17 00:00:00 2001 From: g1879 Date: Tue, 7 Nov 2023 18:04:18 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B5=8F=E8=A7=88=E5=99=A8=E5=85=B3=E9=97=AD?= =?UTF-8?q?=E6=97=B6=E5=88=A0=E9=99=A4=E8=AE=B0=E5=BD=95=E7=9A=84id?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DrissionPage/_base/browser.py | 6 ++++-- DrissionPage/_base/browser.pyi | 2 ++ DrissionPage/_base/chromium_driver.py | 9 +++++++-- DrissionPage/_base/chromium_driver.pyi | 7 +++++++ 4 files changed, 20 insertions(+), 4 deletions(-) diff --git a/DrissionPage/_base/browser.py b/DrissionPage/_base/browser.py index 46ad7c1..1a0d932 100644 --- a/DrissionPage/_base/browser.py +++ b/DrissionPage/_base/browser.py @@ -35,7 +35,7 @@ class Browser(object): self.page = page self.address = address - self._driver = BrowserDriver(browser_id, 'browser', address) + self._driver = BrowserDriver(browser_id, 'browser', address, self) self.id = browser_id self._frames = {} self._drivers = {} @@ -63,7 +63,8 @@ class Browser(object): def _onTargetCreated(self, **kwargs): """标签页创建时执行""" if kwargs['targetInfo']['type'] == 'page' and not kwargs['targetInfo']['url'].startswith('devtools://'): - self._drivers[kwargs['targetInfo']['targetId']] = ChromiumDriver(kwargs['targetInfo']['targetId'], 'page', self.address) + self._drivers[kwargs['targetInfo']['targetId']] = ChromiumDriver(kwargs['targetInfo']['targetId'], 'page', + self.address) def _onTargetDestroyed(self, **kwargs): """标签页关闭时执行""" @@ -166,4 +167,5 @@ class Browser(object): break sleep(.2) + def _on_quit(self): Browser.BROWSERS.pop(self.id, None) diff --git a/DrissionPage/_base/browser.pyi b/DrissionPage/_base/browser.pyi index cb1a13a..fed394c 100644 --- a/DrissionPage/_base/browser.pyi +++ b/DrissionPage/_base/browser.pyi @@ -58,3 +58,5 @@ class Browser(object): def _onTargetDestroyed(self, **kwargs) -> None: ... def quit(self) -> None: ... + + def _on_quit(self) -> None: ... diff --git a/DrissionPage/_base/chromium_driver.py b/DrissionPage/_base/chromium_driver.py index b9f1c9e..9d63a0d 100644 --- a/DrissionPage/_base/chromium_driver.py +++ b/DrissionPage/_base/chromium_driver.py @@ -211,17 +211,18 @@ class ChromiumDriver(object): class BrowserDriver(ChromiumDriver): BROWSERS = {} - def __new__(cls, tab_id, tab_type, address): + def __new__(cls, tab_id, tab_type, address, browser): if tab_id in cls.BROWSERS: return cls.BROWSERS[tab_id] return object.__new__(cls) - def __init__(self, tab_id, tab_type, address): + def __init__(self, tab_id, tab_type, address, browser): if hasattr(self, '_created'): return self._created = True BrowserDriver.BROWSERS[tab_id] = self super().__init__(tab_id, tab_type, address) + self.browser = browser def __repr__(self): return f"" @@ -230,3 +231,7 @@ class BrowserDriver(ChromiumDriver): r = get(url, headers={'Connection': 'close'}) r.close() return r + + def stop(self): + super().stop() + self.browser._on_quit() diff --git a/DrissionPage/_base/chromium_driver.pyi b/DrissionPage/_base/chromium_driver.pyi index fac8ab5..8977874 100644 --- a/DrissionPage/_base/chromium_driver.pyi +++ b/DrissionPage/_base/chromium_driver.pyi @@ -10,6 +10,8 @@ from typing import Union, Callable, Dict, Optional from requests import Response from websocket import WebSocket +from .browser import Browser + class GenericAttr(object): def __init__(self, name: str, tab: ChromiumDriver): ... @@ -58,5 +60,10 @@ class ChromiumDriver(object): class BrowserDriver(ChromiumDriver): BROWSERS: Dict[str, ChromiumDriver] = ... + browser: Browser = ... + + def __new__(cls, tab_id: str, tab_type: str, address: str, browser: Browser): ... + + def __init__(self, tab_id: str, tab_type: str, address: str, browser: Browser): ... def get(self, url) -> Response: ...