4.0.4.1Settings增加cdp_timeout属性;ini内容内置到代码中

This commit is contained in:
g1879 2024-01-28 00:32:37 +08:00
parent c07d90195d
commit 014f86db49
9 changed files with 130 additions and 88 deletions

View File

@ -14,4 +14,4 @@ from ._configs.chromium_options import ChromiumOptions
from ._configs.session_options import SessionOptions
__all__ = ['ChromiumPage', 'ChromiumOptions', 'SessionOptions', 'SessionPage', 'WebPage', '__version__']
__version__ = '4.0.4'
__version__ = '4.0.4.1'

View File

@ -14,6 +14,7 @@ from requests import get
from websocket import (WebSocketTimeoutException, WebSocketConnectionClosedException, create_connection,
WebSocketException, WebSocketBadStatusException)
from .._functions.settings import Settings
from ..errors import PageDisconnectedError, TargetNotFoundError
@ -186,7 +187,7 @@ class Driver(object):
if self._stopped.is_set():
return {'error': 'connection disconnected', 'type': 'connection_error'}
timeout = kwargs.pop('_timeout', 30)
timeout = kwargs.pop('_timeout', Settings.cdp_timeout)
result = self._send({'method': _method, 'params': kwargs}, timeout=timeout)
if 'result' not in result and 'error' in result:
kwargs['_timeout'] = timeout

View File

@ -23,67 +23,56 @@ class ChromiumOptions(object):
self.clear_file_flags = False
self._headless = None
if read_file is not False:
ini_path = str(ini_path) if ini_path else None
om = OptionsManager(ini_path)
self.ini_path = str(Path(om.ini_path).absolute())
if read_file is False:
ini_path = False
self.ini_path = None
elif ini_path:
ini_path = Path(ini_path).absolute()
if not ini_path.exists():
raise ValueError(f'文件不存在:{ini_path}')
self.ini_path = str(ini_path)
else:
self.ini_path = str(Path(__file__).parent / 'configs.ini')
om = OptionsManager(ini_path)
options = om.chromium_options
self._download_path = om.paths.get('download_path', None) or None
self._tmp_path = om.paths.get('tmp_path', None) or None
self._arguments = options.get('arguments', [])
self._browser_path = options.get('browser_path', '')
self._extensions = options.get('extensions', [])
self._prefs = options.get('prefs', {})
self._flags = options.get('flags', {})
self._address = options.get('address', None)
self._load_mode = options.get('load_mode', 'normal')
self._system_user_path = options.get('system_user_path', False)
self._existing_only = options.get('existing_only', False)
options = om.chromium_options
self._download_path = om.paths.get('download_path', None) or None
self._tmp_path = om.paths.get('tmp_path', None) or None
self._arguments = options.get('arguments', [])
self._browser_path = options.get('browser_path', '')
self._extensions = options.get('extensions', [])
self._prefs = options.get('prefs', {})
self._flags = options.get('flags', {})
self._address = options.get('address', None)
self._load_mode = options.get('load_mode', 'normal')
self._system_user_path = options.get('system_user_path', False)
self._existing_only = options.get('existing_only', False)
self._proxy = om.proxies.get('http', None) or om.proxies.get('https', None)
self._proxy = om.proxies.get('http', None) or om.proxies.get('https', None)
user_path = user = False
for arg in self._arguments:
if arg.startswith('--user-data-dir='):
self.set_paths(user_data_path=arg[16:])
user_path = True
if arg.startswith('--profile-directory='):
self.set_user(arg[20:])
user = True
if user and user_path:
break
user_path = user = False
for arg in self._arguments:
if arg.startswith('--user-data-dir='):
self.set_paths(user_data_path=arg[16:])
user_path = True
if arg.startswith('--profile-directory='):
self.set_user(arg[20:])
user = True
if user and user_path:
break
timeouts = om.timeouts
self._timeouts = {'base': timeouts['base'],
'page_load': timeouts['page_load'],
'script': timeouts['script']}
timeouts = om.timeouts
self._timeouts = {'base': timeouts['base'],
'page_load': timeouts['page_load'],
'script': timeouts['script']}
self._auto_port = options.get('auto_port', False)
self._auto_port = options.get('auto_port', False)
others = om.others
self._retry_times = others.get('retry_times', 3)
self._retry_interval = others.get('retry_interval', 2)
others = om.others
self._retry_times = others.get('retry_times', 3)
self._retry_interval = others.get('retry_interval', 2)
return
self.ini_path = None
self._browser_path = "chrome"
self._arguments = []
self._download_path = None
self._tmp_path = None
self._extensions = []
self._prefs = {}
self._flags = {}
self._timeouts = {'base': 10, 'page_load': 30, 'script': 30}
self._address = '127.0.0.1:9222'
self._load_mode = 'normal'
self._proxy = None
self._auto_port = False
self._system_user_path = False
self._existing_only = False
self._retry_times = 3
self._retry_interval = 2
return
@property
def download_path(self):
@ -538,8 +527,8 @@ class ChromiumOptions(object):
for i in attrs:
om.set_item('chromium_options', i, self.__getattribute__(f'_{i}'))
# 设置代理
om.set_item('proxies', 'http', self._proxy)
om.set_item('proxies', 'https', self._proxy)
om.set_item('proxies', 'http', self._proxy or '')
om.set_item('proxies', 'https', self._proxy or '')
# 设置路径
om.set_item('paths', 'download_path', self._download_path or '')
om.set_item('paths', 'tmp_path', self._tmp_path or '')

View File

@ -8,7 +8,6 @@
from configparser import RawConfigParser, NoSectionError, NoOptionError
from pathlib import Path
from pprint import pprint
from time import sleep
class OptionsManager(object):
@ -18,22 +17,63 @@ class OptionsManager(object):
"""初始化,读取配置文件,如没有设置临时文件夹,则设置并新建
:param path: ini文件的路径为None则找项目文件夹下的找不到则读取模块文件夹下的
"""
if path is None:
if Path('dp_configs.ini').exists():
self.ini_path = 'dp_configs.ini'
else:
self.ini_path = str(Path(__file__).parent / 'configs.ini')
elif path == 'default':
self.ini_path = str(Path(__file__).parent / 'configs.ini')
if path is False:
self.ini_path = None
else:
self.ini_path = str(path)
default_configs = Path(__file__).parent / 'configs.ini'
if path is None:
dp_configs = Path('dp_configs.ini')
if dp_configs.exists():
self.ini_path = dp_configs
else:
self.ini_path = default_configs
elif path == 'default':
self.ini_path = default_configs
else:
self.ini_path = Path(path)
if not Path(self.ini_path).exists():
print('\nini文件不存在。\n如果是打包使用,请查看打包注意事项\n'
'https://g1879.gitee.io/drissionpagedocs/advance/packaging/')
sleep(10)
self._conf = RawConfigParser()
self._conf.read(self.ini_path, encoding='utf-8')
if path is not False and self.ini_path.exists():
self.file_exists = True
self._conf.read(self.ini_path, encoding='utf-8')
else:
self.file_exists = False
self._conf.add_section('paths')
self._conf.add_section('chromium_options')
self._conf.add_section('session_options')
self._conf.add_section('timeouts')
self._conf.add_section('proxies')
self._conf.add_section('others')
self.set_item('paths', 'download_path', '')
self.set_item('paths', 'tmp_path', '')
self.set_item('chromium_options', 'address', '127.0.0.1:9222')
self.set_item('chromium_options', 'browser_path', 'chrome')
self.set_item('chromium_options', 'arguments', "['--no-default-browser-check', '--disable-suggestions-ui', "
"'--no-first-run', '--disable-infobars', "
"'--disable-popup-blocking', '--hide-crash-restore-bubble', "
"'--disable-features=PrivacySandboxSettings4']")
self.set_item('chromium_options', 'extensions', '[]')
self.set_item('chromium_options', 'prefs', "{'profile.default_content_settings.popups': 0, "
"'profile.default_content_setting_values': "
"{'notifications': 2}}")
self.set_item('chromium_options', 'flags', '{}')
self.set_item('chromium_options', 'load_mode', 'normal')
self.set_item('chromium_options', 'user', 'Default')
self.set_item('chromium_options', 'auto_port', 'False')
self.set_item('chromium_options', 'system_user_path', 'False')
self.set_item('chromium_options', 'existing_only', 'False')
self.set_item('session_options', 'headers', "{'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X "
"10_12_6) AppleWebKit/603.3.8 (KHTML, like Gecko) Version/10."
"1.2 Safari/603.3.8', 'accept': 'text/html,application/xhtml"
"+xml,application/xml;q=0.9,*/*;q=0.8', 'connection': "
"'keep-alive', 'accept-charset': 'GB2312,utf-8;q=0.7,*;q=0.7'}")
self.set_item('timeouts', 'base', '10')
self.set_item('timeouts', 'page_load', '30')
self.set_item('timeouts', 'script', '30')
self.set_item('proxies', 'http', '')
self.set_item('proxies', 'https', '')
self.set_item('others', 'retry_times', '3')
self.set_item('others', 'retry_interval', '2')
def __getattr__(self, item):
"""以dict形似返回获取大项信息
@ -100,7 +140,9 @@ class OptionsManager(object):
if path == 'default':
path = default_path
elif path is None:
path = Path(self.ini_path).absolute()
if self.ini_path is None:
raise ValueError('ini_path未设置。')
path = self.ini_path.absolute()
else:
path = Path(path).absolute()
@ -113,6 +155,7 @@ class OptionsManager(object):
if path == str(default_path):
print('以后程序可自动从文件加载配置。')
self.file_exists = True
return path
def save_to_default(self):

View File

@ -6,11 +6,13 @@
@License : BSD 3-Clause.
"""
from configparser import RawConfigParser
from typing import Any
from pathlib import Path
from typing import Any, Optional
class OptionsManager(object):
ini_path: str = ...
ini_path: Optional[Path] = ...
file_exists: bool = ...
_conf: RawConfigParser = ...
def __init__(self, path: str = None): ...

View File

@ -27,6 +27,18 @@ class SessionOptions(object):
self._timeout = 10
self._del_set = set() # 记录要从ini文件删除的参数
if read_file is False:
ini_path = False
self.ini_path = None
elif ini_path:
ini_path = Path(ini_path).absolute()
if not ini_path.exists():
raise ValueError(f'文件不存在:{ini_path}')
self.ini_path = str(ini_path)
else:
self.ini_path = str(Path(__file__).parent / 'configs.ini')
om = OptionsManager(ini_path)
self._headers = None
self._cookies = None
self._auth = None
@ -39,15 +51,6 @@ class SessionOptions(object):
self._stream = None
self._trust_env = None
self._max_redirects = None
self._retry_times = 3
self._retry_interval = 2
if read_file is False:
return
ini_path = str(ini_path) if ini_path else None
om = OptionsManager(ini_path)
self.ini_path = om.ini_path
options = om.session_options
if options.get('headers', None) is not None:
@ -381,8 +384,8 @@ class SessionOptions(object):
om.set_item('paths', 'download_path', self.download_path or '')
om.set_item('timeouts', 'base', self.timeout)
om.set_item('proxies', 'http', self.proxies.get('http', None))
om.set_item('proxies', 'https', self.proxies.get('https', None))
om.set_item('proxies', 'http', self.proxies.get('http', ''))
om.set_item('proxies', 'https', self.proxies.get('https', ''))
om.set_item('others', 'retry_times', self.retry_times)
om.set_item('others', 'retry_interval', self.retry_interval)

View File

@ -285,7 +285,7 @@ def _remove_arg_from_dict(target_dict: dict, arg: str) -> None:
def get_chrome_path(ini_path):
"""从ini文件或系统变量中获取chrome可执行文件的路径"""
# -----------从ini文件中获取--------------
if ini_path:
if ini_path and Path(ini_path).exists():
path = OptionsManager(ini_path).chromium_options.get('browser_path', None)
if path and Path(path).is_file():
return str(path)

View File

@ -12,3 +12,4 @@ class Settings(object):
raise_when_click_failed = False
raise_when_wait_failed = False
singleton_tab_obj = True
cdp_timeout = 30

View File

@ -627,7 +627,10 @@ class WindowSetter(object):
:param bounds: 控制数据
:return: None
"""
self._page.run_cdp('Browser.setWindowBounds', windowId=self._window_id, bounds=bounds)
try:
self._page.run_cdp('Browser.setWindowBounds', windowId=self._window_id, bounds=bounds)
except:
raise RuntimeError('浏览器全屏或最小化状态时请先调用set.window.normal()恢复正常状态。')
# ------------即将废除----------