diff --git a/DrissionPage/__init__.py b/DrissionPage/__init__.py index 1774967..b4bb936 100644 --- a/DrissionPage/__init__.py +++ b/DrissionPage/__init__.py @@ -14,4 +14,4 @@ from ._pages.chromium_page import ChromiumPage from ._pages.mix_page import MixPage from ._pages.mix_page import MixPage as WebPage -__version__ = '4.1.0.0b14' +__version__ = '4.1.0.0b15' diff --git a/DrissionPage/_base/browser.py b/DrissionPage/_base/browser.py index a22810e..b3be05e 100644 --- a/DrissionPage/_base/browser.py +++ b/DrissionPage/_base/browser.py @@ -87,6 +87,7 @@ class Chromium(object): connect_browser(self._chromium_options) s = Session() s.trust_env = False + s.keep_alive = False ws = s.get(f'http://{self._chromium_options.address}/json/version', headers={'Connection': 'close'}) self.id = ws.json()['webSocketDebuggerUrl'].split('/')[-1] self._driver = BrowserDriver(self.id, 'browser', self.address, self) @@ -400,10 +401,11 @@ class Chromium(object): self._driver.set_callback('Target.targetDestroyed', self._onTargetDestroyed) self._driver.set_callback('Target.targetCreated', self._onTargetCreated) - def quit(self, timeout=5, force=False): + def quit(self, timeout=5, force=False, del_data=False): """关闭浏览器 :param timeout: 等待浏览器关闭超时时间(秒) :param force: 是否立刻强制终止进程 + :param del_data: 是否删除用户文件夹 :return: None """ try: @@ -417,39 +419,43 @@ class Chromium(object): for driver in tab: driver.stop() - if not force: - return - - try: - pids = [pid['id'] for pid in self._run_cdp('SystemInfo.getProcessInfo')['processInfo']] - except: - return - - from psutil import Process - for pid in pids: + if force: + pids = None try: - Process(pid).kill() + pids = [pid['id'] for pid in self._run_cdp('SystemInfo.getProcessInfo')['processInfo']] except: pass - from os import popen - from platform import system - end_time = perf_counter() + timeout - while perf_counter() < end_time: - ok = True - for pid in pids: - txt = f'tasklist | findstr {pid}' if system().lower() == 'windows' else f'ps -ef | grep {pid}' - p = popen(txt) - sleep(.05) - try: - if f' {pid} ' in p.read(): - ok = False - break - except TypeError: - pass + if pids: + from psutil import Process + for pid in pids: + try: + Process(pid).kill() + except: + pass - if ok: - break + from os import popen + from platform import system + end_time = perf_counter() + timeout + while perf_counter() < end_time: + ok = True + for pid in pids: + txt = f'tasklist | findstr {pid}' if system().lower() == 'windows' else f'ps -ef | grep {pid}' + p = popen(txt) + sleep(.05) + try: + if f' {pid} ' in p.read(): + ok = False + break + except TypeError: + pass + + if ok: + break + + if del_data and not self._chromium_options.is_auto_port and self._chromium_options.user_data_path: + path = Path(self._chromium_options.user_data_path) + rmtree(path, True) def _get_driver(self, tab_id, owner=None): """新建并返回指定tab id的Driver @@ -555,6 +561,7 @@ def run_browser(chromium_options): try: s = Session() s.trust_env = False + s.keep_alive = False ws = s.get(f'http://{chromium_options.address}/json/version', headers={'Connection': 'close'}) if not ws: raise BrowserConnectError('\n浏览器连接失败,请确认浏览器是否启动。') diff --git a/DrissionPage/_base/browser.pyi b/DrissionPage/_base/browser.pyi index fa906ed..9bd107c 100644 --- a/DrissionPage/_base/browser.pyi +++ b/DrissionPage/_base/browser.pyi @@ -162,6 +162,6 @@ class Chromium(object): def _onTargetDestroyed(self, **kwargs) -> None: ... - def quit(self, timeout: float = 5, force: bool = False) -> None: ... + def quit(self, timeout: float = 5, force: bool = False, del_data: bool = False) -> None: ... def _on_disconnect(self) -> None: ... diff --git a/DrissionPage/_base/driver.py b/DrissionPage/_base/driver.py index c95485a..8a75f01 100644 --- a/DrissionPage/_base/driver.py +++ b/DrissionPage/_base/driver.py @@ -285,6 +285,7 @@ class BrowserDriver(Driver): super().__init__(tab_id, tab_type, address, owner) self._control_session = Session() self._control_session.trust_env = False + self._control_session.keep_alive = False def __repr__(self): return f'' diff --git a/DrissionPage/_functions/browser.py b/DrissionPage/_functions/browser.py index 9958bf0..895bd94 100644 --- a/DrissionPage/_functions/browser.py +++ b/DrissionPage/_functions/browser.py @@ -194,6 +194,7 @@ def test_connect(ip, port, timeout=30): end_time = perf_counter() + timeout s = Session() s.trust_env = False + s.keep_alive = False while perf_counter() < end_time: try: r = s.get(f'http://{ip}:{port}/json', timeout=10, headers={'Connection': 'close'}) diff --git a/DrissionPage/_pages/chromium_page.py b/DrissionPage/_pages/chromium_page.py index d0ddee4..ef4ee2f 100644 --- a/DrissionPage/_pages/chromium_page.py +++ b/DrissionPage/_pages/chromium_page.py @@ -172,13 +172,14 @@ class ChromiumPage(ChromiumBase): """ self.browser.close_tabs(tabs_or_ids=tabs_or_ids or self.tab_id, others=others) - def quit(self, timeout=5, force=True): + def quit(self, timeout=5, force=True, del_data=False): """关闭浏览器 :param timeout: 等待浏览器关闭超时时间(秒) :param force: 关闭超时是否强制终止进程 + :param del_data: 是否删除用户文件夹 :return: None """ - self.browser.quit(timeout, force) + self.browser.quit(timeout, force, del_data=del_data) def _on_disconnect(self): """浏览器退出时执行""" diff --git a/DrissionPage/_pages/chromium_page.pyi b/DrissionPage/_pages/chromium_page.pyi index 8178e46..992ced3 100644 --- a/DrissionPage/_pages/chromium_page.pyi +++ b/DrissionPage/_pages/chromium_page.pyi @@ -111,6 +111,6 @@ class ChromiumPage(ChromiumBase): def close_tabs(self, tabs_or_ids: Union[str, ChromiumTab, List[Union[str, ChromiumTab]], Tuple[Union[str, ChromiumTab]]] = None, others: bool = False) -> None: ... - def quit(self, timeout: float = 5, force: bool = True) -> None: ... + def quit(self, timeout: float = 5, force: bool = True, del_data: bool = False) -> None: ... def _on_disconnect(self) -> None: ...