4.1.0.0b15 quit()增加del_data参数

This commit is contained in:
g1879 2024-07-29 16:21:30 +08:00
parent 0d6a8b67f2
commit 9736f16e8e
7 changed files with 44 additions and 34 deletions

View File

@ -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'

View File

@ -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浏览器连接失败,请确认浏览器是否启动。')

View File

@ -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: ...

View File

@ -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'<BrowserDriver {self.id}>'

View File

@ -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'})

View File

@ -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):
"""浏览器退出时执行"""

View File

@ -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: ...