2020-08-13 11:34:16 +08:00

147 lines
4.7 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# -*- coding:utf-8 -*-
"""
@Author : g1879
@Contact : g1879@qq.com
@File : driver_page.py
"""
from typing import Union
from selenium import webdriver
from DrissionPage.config import OptionsManager, DriverOptions
def set_paths(driver_path: str = None,
chrome_path: str = None,
debugger_address: str = None,
tmp_path: str = None,
download_path: str = None,
user_data_path: str = None,
cache_path: str = None,
check_version: bool = True) -> None:
"""快捷的路径设置函数 \n
:param driver_path: chromedriver.exe路径
:param chrome_path: chrome.exe路径
:param debugger_address: 调试浏览器地址127.0.0.1:9222
:param download_path: 下载文件路径
:param tmp_path: 临时文件夹路径
:param user_data_path: 用户数据路径
:param cache_path: 缓存路径
:param check_version: 是否检查chromedriver和chrome是否匹配
:return: None
"""
om = OptionsManager()
def format_path(path: str) -> str:
return path.replace('/', '\\')
if driver_path is not None:
om.set_item('paths', 'chromedriver_path', format_path(driver_path))
if chrome_path is not None:
om.set_item('chrome_options', 'binary_location', format_path(chrome_path))
if debugger_address is not None:
om.set_item('chrome_options', 'debugger_address', format_path(debugger_address))
if tmp_path is not None:
om.set_item('paths', 'global_tmp_path', format_path(tmp_path))
if download_path is not None:
experimental_options = om.get_value('chrome_options', 'experimental_options')
experimental_options['prefs']['download.default_directory'] = format_path(download_path)
om.set_item('chrome_options', 'experimental_options', experimental_options)
om.save()
if user_data_path is not None:
set_argument('--user-data-dir', format_path(user_data_path))
if cache_path is not None:
set_argument('--disk-cache-dir', format_path(cache_path))
if check_version:
check_driver_version(format_path(driver_path), format_path(chrome_path))
def set_argument(arg: str, value: Union[bool, str]) -> None:
"""设置浏览器配置argument属性 \n
:param arg: 属性名
:param value: 属性值有值的属性传入值没有的传入bool
:return: None
"""
do = DriverOptions()
do.remove_argument(arg)
if value:
arg_str = arg if isinstance(value, bool) else f'{arg}={value}'
do.add_argument(arg_str)
do.save()
def set_headless(on_off: bool = True) -> None:
"""设置是否隐藏浏览器界面 \n
:param on_off: 开或关
:return: None
"""
set_argument('--headless', on_off)
def set_no_imgs(on_off: bool = True) -> None:
"""设置是否禁止加载图片 \n
:param on_off: 开或关
:return: None
"""
set_argument('--blink-settings=imagesEnabled=false', on_off)
def set_no_js(on_off: bool = True) -> None:
"""设置是否禁用js \n
:param on_off: 开或关
:return: None
"""
set_argument('--disable-javascript', on_off)
def set_mute(on_off: bool = True) -> None:
"""设置是否静音 \n
:param on_off: 开或关
:return: None
"""
set_argument('--mute-audio', on_off)
def set_user_agent(user_agent: str) -> None:
"""设置user agent \n
:param user_agent: user agent文本
:return: None
"""
set_argument('user-agent', user_agent)
def set_proxy(proxy: str) -> None:
"""设置代理 \n
:param proxy: 代理网址和端口
:return: None
"""
set_argument('--proxy-server', proxy)
def check_driver_version(driver_path: str = None, chrome_path: str = None) -> bool:
"""检查传入的chrome和chromedriver是否匹配 \n
:param driver_path: chromedriver.exe路径
:param chrome_path: chrome.exe路径
:return: 是否匹配
"""
print('正在检测可用性...')
om = OptionsManager()
driver_path = driver_path or om.get_value('paths', 'chromedriver_path') or 'chromedriver'
chrome_path = chrome_path or om.get_value('chrome_options', 'binary_location')
do = DriverOptions(read_file=False)
do.add_argument('--headless')
if chrome_path:
do.binary_location = chrome_path
try:
driver = webdriver.Chrome(driver_path, options=do)
driver.quit()
print('版本匹配,可正常使用。')
return True
except Exception as e:
info = f'''
出现异常:
{e}chromedriver下载网址https://chromedriver.chromium.org/downloads
'''
print(info)
return False