多开浏览器支持可配置;

This commit is contained in:
kedaji 2023-01-13 14:45:15 +08:00
parent 5b7ecbc504
commit bcdea4b480
4 changed files with 55 additions and 11 deletions

View File

@ -4,6 +4,8 @@
@Contact : g1879@qq.com @Contact : g1879@qq.com
""" """
import os import os
import shutil
import sys
from configparser import RawConfigParser, NoSectionError, NoOptionError from configparser import RawConfigParser, NoSectionError, NoOptionError
from http.cookiejar import Cookie from http.cookiejar import Cookie
@ -478,6 +480,8 @@ class DriverOptions(Options):
""" """
super().__init__() super().__init__()
self._user_data_path = None self._user_data_path = None
self.multiple_open_browser = None
self.default_user_data_parent = None
if read_file: if read_file:
self.ini_path = ini_path or str(Path(__file__).parent / 'configs.ini') self.ini_path = ini_path or str(Path(__file__).parent / 'configs.ini')
@ -489,17 +493,21 @@ class DriverOptions(Options):
self._arguments = options_dict.get('arguments', []) self._arguments = options_dict.get('arguments', [])
self._extensions = options_dict.get('extensions', []) self._extensions = options_dict.get('extensions', [])
self._experimental_options = options_dict.get('experimental_options', {}) self._experimental_options = options_dict.get('experimental_options', {})
# 从配置文件中读取默认用户数据父级目录 self.default_user_data_parent = options_dict.get("default_user_data_parent", os.path.dirname(sys.argv[0]))
DynamicPortAllocator.default_user_data_parent = options_dict.get('default_user_data_parent', '') # 使用中间值避免重复分配的问题
if not os.path.exists(DynamicPortAllocator.default_user_data_parent): tmp_bool = options_dict.get("multiple_open_browser", True)
os.makedirs(DynamicPortAllocator.default_user_data_parent) if tmp_bool is True:
# 端口和调试地址将不再从配置文件中读取,而是直接动态分配 self.set_multiple_open_browser()
port_and_user_data_path = DynamicPortAllocator.allocate() else:
self._user_data_path = port_and_user_data_path[1] self._debugger_address = options_dict.get('debugger_address', None)
self.set_argument('--user-data-dir', self._user_data_path)
port = port_and_user_data_path[0]
self.debugger_address = f"127.0.0.1:{port}"
self.page_load_strategy = options_dict.get('page_load_strategy', 'normal') self.page_load_strategy = options_dict.get('page_load_strategy', 'normal')
for arg in self._arguments:
if arg.startswith('--user-data-dir='):
self.set_paths(user_data_path=arg[16:])
break
self.timeouts = options_dict.get('timeouts', {'implicit': 10, 'pageLoad': 30, 'script': 30}) self.timeouts = options_dict.get('timeouts', {'implicit': 10, 'pageLoad': 30, 'script': 30})
return return
@ -508,6 +516,13 @@ class DriverOptions(Options):
self.timeouts = {'implicit': 10, 'pageLoad': 30, 'script': 30} self.timeouts = {'implicit': 10, 'pageLoad': 30, 'script': 30}
self._debugger_address = '127.0.0.1:9222' self._debugger_address = '127.0.0.1:9222'
def __del__(self):
"""清理生成的目录"""
print("调用del")
for key in DynamicPortAllocator.mapping:
if key is str:
shutil.rmtree(key)
@property @property
def driver_path(self): def driver_path(self):
"""chromedriver文件路径""" """chromedriver文件路径"""
@ -738,6 +753,28 @@ class DriverOptions(Options):
self.page_load_strategy = value.lower() self.page_load_strategy = value.lower()
return self return self
def set_multiple_open_browser(self, default_user_data_parent=None):
"""设置是否支持多开浏览器
开启后系统将自动分配浏览器端口号与用户数据目录不会产生浏览器端口冲突的问题但是浏览器接管功能将会失效
:param default_user_data_parent 浏览器用户数据目录的父目录如果不设置将使用配置文件中的预设的目录如果配置文件也没有设置默认数据父目录系统将在脚本执行的路径设置为默认数据父目录
"""
if self.multiple_open_browser is not True:
if default_user_data_parent is not None:
self.default_user_data_parent = default_user_data_parent
# 从配置文件中读取默认用户数据父级目录
DynamicPortAllocator.default_user_data_parent = self.default_user_data_parent
if not os.path.exists(DynamicPortAllocator.default_user_data_parent):
os.makedirs(DynamicPortAllocator.default_user_data_parent)
# 端口和调试地址将不再从配置文件中读取,而是直接动态分配
port_and_user_data_path = DynamicPortAllocator.allocate()
self._user_data_path = port_and_user_data_path[1]
self.set_argument('--user-data-dir', self._user_data_path)
port = port_and_user_data_path[0]
self.debugger_address = f"127.0.0.1:{port}"
self.multiple_open_browser = True
return self
def set_paths(self, driver_path=None, chrome_path=None, browser_path=None, local_port=None, def set_paths(self, driver_path=None, chrome_path=None, browser_path=None, local_port=None,
debugger_address=None, download_path=None, user_data_path=None, cache_path=None): debugger_address=None, download_path=None, user_data_path=None, cache_path=None):
"""快捷的路径设置函数 \n """快捷的路径设置函数 \n

View File

@ -158,6 +158,8 @@ class SessionOptions(object):
class DriverOptions(Options): class DriverOptions(Options):
def __init__(self, read_file: bool = True, ini_path: str = None): def __init__(self, read_file: bool = True, ini_path: str = None):
self.default_user_data_parent = None
self.multiple_open_browser = False
self.ini_path: str = ... self.ini_path: str = ...
self._driver_path: str = ... self._driver_path: str = ...
self._user_data_path: str = ... self._user_data_path: str = ...
@ -215,6 +217,8 @@ class DriverOptions(Options):
def set_page_load_strategy(self, value: str) -> 'DriverOptions': ... def set_page_load_strategy(self, value: str) -> 'DriverOptions': ...
def set_multiple_open_browser(self, default_user_data_parent: str=None) -> 'DriverOptions': ...
def set_paths(self, def set_paths(self,
driver_path: Union[str, Path] = None, driver_path: Union[str, Path] = None,
chrome_path: Union[str, Path] = None, chrome_path: Union[str, Path] = None,

View File

@ -10,7 +10,8 @@ extensions = []
experimental_options = {'prefs': {'profile.default_content_settings.popups': 0, 'profile.default_content_setting_values': {'notifications': 2}, 'plugins.plugins_list': [{'enabled': False, 'name': 'Chrome PDF Viewer'}]}, 'useAutomationExtension': False, 'excludeSwitches': ['enable-automation']} experimental_options = {'prefs': {'profile.default_content_settings.popups': 0, 'profile.default_content_setting_values': {'notifications': 2}, 'plugins.plugins_list': [{'enabled': False, 'name': 'Chrome PDF Viewer'}]}, 'useAutomationExtension': False, 'excludeSwitches': ['enable-automation']}
timeouts = {'implicit': 10.0, 'pageLoad': 30.0, 'script': 30.0} timeouts = {'implicit': 10.0, 'pageLoad': 30.0, 'script': 30.0}
page_load_strategy = normal page_load_strategy = normal
default_user_data_parent = D:\\tmp default_user_data_parent = D:/tmp
multiple_open_browser = True
[session_options] [session_options]
headers = { headers = {

View File

@ -1,6 +1,8 @@
""" """
@author: kedaji @author: kedaji
""" """
class DynamicPortAllocator: class DynamicPortAllocator:
@staticmethod @staticmethod