diff --git a/DrissionPage/chromium_page.py b/DrissionPage/chromium_page.py index 9932aa0..c87f62f 100644 --- a/DrissionPage/chromium_page.py +++ b/DrissionPage/chromium_page.py @@ -11,10 +11,11 @@ from time import perf_counter, sleep from requests import Session from .chromium_base import Timeout, ChromiumBase +from .chromium_driver import ChromiumDriver from .chromium_tab import ChromiumTab from .common import connect_browser from .config import DriverOptions -from .chromium_driver import ChromiumDriver +from .session_page import DownloadSetter class ChromiumPage(ChromiumBase): @@ -86,7 +87,7 @@ class ChromiumPage(ChromiumBase): self._tab_obj.Page.javascriptDialogOpening = self._on_alert_open self._tab_obj.Page.javascriptDialogClosed = self._on_alert_close - self._download_path = self.set_download_path(self.options.download_path) + self.download_set.save_path(self.options.download_path) def _set_options(self): """从配置中读取设置""" @@ -131,17 +132,10 @@ class ChromiumPage(ChromiumBase): p = self._download_path or '' return str(Path(p).absolute()) - def set_download_path(self, path): - """设置下载路径 \n - :param path: 下载路径 - :return: None - """ - path = path or '' - path = Path(path).absolute() - path.mkdir(parents=True, exist_ok=True) - path = str(path) - self._download_path = path - self.run_cdp('Browser.setDownloadBehavior', behavior='allow', downloadPath=path, not_change=True) + @property + def download_set(self): + """返回用于设置下载参数的对象""" + return ChromiumDownloadSetter(self) def get_tab(self, tab_id=None): """获取一个标签页对象 \n @@ -371,6 +365,25 @@ class ChromiumPage(ChromiumBase): self._tab_obj.has_alert = True +class ChromiumDownloadSetter(DownloadSetter): + """用于设置下载参数的类""" + + def save_path(self, path): + """设置下载路径 \n + :param path: 下载路径 + :return: None + """ + path = path or '' + path = Path(path).absolute() + path.mkdir(parents=True, exist_ok=True) + path = str(path) + self._page._download_path = path + try: + self._page.run_cdp('Browser.setDownloadBehavior', behavior='allow', downloadPath=path, not_change=True) + except: + self._page.run_cdp('Page.setDownloadBehavior', behavior='allow', downloadPath=path, not_change=True) + + class Alert(object): """用于保存alert信息的类""" diff --git a/DrissionPage/chromium_page.pyi b/DrissionPage/chromium_page.pyi index 25d6094..68142d4 100644 --- a/DrissionPage/chromium_page.pyi +++ b/DrissionPage/chromium_page.pyi @@ -8,9 +8,9 @@ from pathlib import Path from typing import Union, Tuple, List from .chromium_base import ChromiumBase +from .chromium_driver import ChromiumDriver from .chromium_tab import ChromiumTab from .config import DriverOptions -from .chromium_driver import ChromiumDriver class ChromiumPage(ChromiumBase): @@ -53,13 +53,11 @@ class ChromiumPage(ChromiumBase): def download_list(self) -> list: ... @property - def set_download(self) -> DownloadSetter: ... + def download_set(self) -> ChromiumDownloadSetter: ... @property def download_path(self) -> str: ... - def set_download_path(self, path: Union[str, Path]) -> None: ... - def get_tab(self, tab_id: str = None) -> ChromiumTab: ... def get_screenshot(self, path: [str, Path] = None, @@ -95,6 +93,13 @@ class ChromiumPage(ChromiumBase): def _on_alert_open(self, **kwargs): ... +class ChromiumDownloadSetter(object): + def __init__(self, page: ChromiumPage): + self._page: ChromiumPage = ... + + def save_path(self, path: Union[str, Path]): ... + + class Alert(object): def __init__(self): diff --git a/DrissionPage/session_page.py b/DrissionPage/session_page.py index 7ea3301..ab62187 100644 --- a/DrissionPage/session_page.py +++ b/DrissionPage/session_page.py @@ -120,14 +120,10 @@ class SessionPage(BasePage): """返回下载路径""" return self._download_path - def set_download_path(self, path): - """设置下载路径 \n - :param path: 下载路径 - :return: None - """ - self._download_path = str(path) - if self._download_kit is not None: - self._download_kit.goal_path = self._download_path + @property + def download_set(self): + """返回用于设置下载参数的对象""" + return DownloadSetter(self) def get(self, url, show_errmsg=False, retry=None, interval=None, timeout=None, **kwargs): """用get方式跳转到url \n @@ -327,6 +323,23 @@ class SessionPage(BasePage): return r, f'状态码:{r.status_code}' +class DownloadSetter(object): + """用于设置下载参数的类""" + + def __init__(self, page): + self._page = page + + def save_path(self, path): + """设置下载保存路径 \n + :param path: 下载保存路径 + :return: None + """ + path = path if path is None else str(path) + self._page._download_path = path + if self._page._download_kit is not None: + self._page._download_kit.goal_path = path + + def check_headers(kwargs, headers, arg) -> bool: """检查kwargs或headers中是否有arg所示属性""" return arg in kwargs['headers'] or arg in headers diff --git a/DrissionPage/session_page.pyi b/DrissionPage/session_page.pyi index 247ce08..6c8a6d3 100644 --- a/DrissionPage/session_page.pyi +++ b/DrissionPage/session_page.pyi @@ -12,8 +12,8 @@ from requests.cookies import RequestsCookieJar from requests.structures import CaseInsensitiveDict from .base import BasePage -from .session_element import SessionElement from .config import SessionOptions +from .session_element import SessionElement class SessionPage(BasePage): @@ -56,7 +56,8 @@ class SessionPage(BasePage): @property def download_path(self) -> str: ... - def set_download_path(self, path: Union[str, Path]) -> None: ... + @property + def download_set(self) -> DownloadSetter: ... def get(self, url: str, @@ -149,6 +150,13 @@ class SessionPage(BasePage): **kwargs) -> tuple: ... +class DownloadSetter(object): + def __init__(self, page: SessionPage): + self._page: SessionPage = ... + + def save_path(self, path: Union[str, Path]): ... + + def check_headers(kwargs: Union[dict, CaseInsensitiveDict], headers: Union[dict, CaseInsensitiveDict], arg: str) -> bool: ... diff --git a/DrissionPage/web_page.py b/DrissionPage/web_page.py index fdaa46a..6df7c00 100644 --- a/DrissionPage/web_page.py +++ b/DrissionPage/web_page.py @@ -3,6 +3,7 @@ @Author : g1879 @Contact : g1879@qq.com """ +from pathlib import Path from time import sleep from requests import Session @@ -10,10 +11,10 @@ from tldextract import extract from .base import BasePage from .chromium_base import ChromiumBase, Timeout -from .chromium_page import ChromiumPage +from .chromium_driver import ChromiumDriver +from .chromium_page import ChromiumPage, ChromiumDownloadSetter from .config import DriverOptions, SessionOptions, cookies_to_tuple from .session_page import SessionPage -from .chromium_driver import ChromiumDriver class WebPage(SessionPage, ChromiumPage, BasePage): @@ -42,6 +43,7 @@ class WebPage(SessionPage, ChromiumPage, BasePage): self._setting_tab_id = tab_id self._response = None self._download_kit = None + self._download_set = None if self._mode == 'd': self._to_d_mode() @@ -159,28 +161,12 @@ class WebPage(SessionPage, ChromiumPage, BasePage): """返回默认下载路径""" return super(SessionPage, self).download_path - def set_download_tool(self, use_browser=False): - """设置下载释是否使用浏览器 \n - :param use_browser: 是否使用浏览器 - :return: None - """ - if use_browser: - self._tab_obj.Browser.setDownloadBehavior(behavior='allow') - self._tab_obj.Page.downloadWillBegin = None - else: - self._tab_obj.Page.downloadWillBegin = self._on_download_begin - self._tab_obj.Browser.downloadWillBegin = self._on_download_begin - self._tab_obj.Browser.setDownloadBehavior(behavior='deny') - - def set_download_path(self, path): - """设置默认下载路径 - :param path: 下载路径 - :return: None - """ - if self._has_driver: - super(SessionPage, self).set_download_path(path) - else: - super().set_download_path(path) + @property + def download_set(self): + """返回下载设置对象""" + if self._download_set is None: + self._download_set = WebPageDownloadSetter(self) + return self._download_set def get(self, url, show_errmsg=False, retry=None, interval=None, timeout=None, **kwargs): """跳转到一个url \n @@ -480,9 +466,53 @@ class WebPage(SessionPage, ChromiumPage, BasePage): self._tab_obj = None self._has_driver = None - def _on_download_begin(self, **kwargs): + +class WebPageDownloadSetter(ChromiumDownloadSetter): + """用于设置下载参数的类""" + + def __init__(self, page): + super().__init__(page) + self._behavior = 'allow' + + def save_path(self, path): + """设置下载路径 \n + :param path: 下载路径 + :return: None + """ + # todo: 设置时判断模式,初始设置 + path = path or '' + path = Path(path).absolute() + path.mkdir(parents=True, exist_ok=True) + path = str(path) + self._page._download_path = path + if self._page._has_driver: + try: + self._page.run_cdp('Browser.setDownloadBehavior', behavior=self._behavior, downloadPath=path, + not_change=True) + except: + self._page.run_cdp('Page.setDownloadBehavior', behavior=self._behavior, downloadPath=path, + not_change=True) + + def use_browser(self): + """设置使用浏览器下载文件""" + if not self._page._has_driver: + raise RuntimeError('浏览器未连接。') + self._page.driver.Page.downloadWillBegin = None + self._page.driver.Browser.downloadWillBegin = None + self._page.driver.Browser.setDownloadBehavior(behavior='allow') + self._behavior = 'allow' + + def use_DownloadKit(self): + """设置使用DownloadKit下载文件""" + self._page.driver.Page.downloadWillBegin = self._download_by_DownloadKit + self._page.driver.Browser.downloadWillBegin = self._download_by_DownloadKit + self._page.driver.Browser.setDownloadBehavior(behavior='deny') + self._behavior = 'deny' + + def _download_by_DownloadKit(self, **kwargs): gid = kwargs['guid'] - self._tab_obj.Browser.cancelDownload(guid=gid) + self._page.run_cdp('Browser.cancelDownload', guid=gid, not_change=True) url = kwargs['url'] name = kwargs['suggestedFilename'] - self.download(url, goal_path=self.download_path, rename=name) + print(f'开始下载:{url}') + self._page.download.add(url, goal_path=self._page.download_path, rename=name) diff --git a/DrissionPage/web_page.pyi b/DrissionPage/web_page.pyi index e278df9..8305abd 100644 --- a/DrissionPage/web_page.pyi +++ b/DrissionPage/web_page.pyi @@ -3,20 +3,19 @@ @Author : g1879 @Contact : g1879@qq.com """ -from pathlib import Path from typing import Union, Tuple, List, Any from DownloadKit import DownloadKit from requests import Session, Response from .base import BasePage +from .chromium_driver import ChromiumDriver from .chromium_element import ChromiumElement from .chromium_frame import ChromiumFrame -from .chromium_page import ChromiumPage +from .chromium_page import ChromiumPage, ChromiumDownloadSetter from .config import DriverOptions, SessionOptions from .session_element import SessionElement from .session_page import SessionPage -from .chromium_driver import ChromiumDriver class WebPage(SessionPage, ChromiumPage, BasePage): @@ -33,6 +32,8 @@ class WebPage(SessionPage, ChromiumPage, BasePage): self._session_options: dict = ... self._driver_options: DriverOptions = ... self._setting_tab_id: str = ... + self._download_kit: DownloadKit = ... + self._download_set: WebPageDownloadSetter = ... def __call__(self, loc_or_str: Union[Tuple[str, str], str, ChromiumElement, SessionElement], @@ -84,7 +85,8 @@ class WebPage(SessionPage, ChromiumPage, BasePage): @property def download_path(self) -> str: ... - def set_download_tool(self, use_browser:bool=False) -> None: ... + @property + def download_set(self) -> WebPageDownloadSetter: ... def get(self, url: str, @@ -177,10 +179,15 @@ class WebPage(SessionPage, ChromiumPage, BasePage): def _on_download_begin(self, **kwargs): ... -class DownloadSetter(object): - def __init__(self, page: ChromiumPage): - self._page: ChromiumPage = ... +class WebPageDownloadSetter(ChromiumDownloadSetter): + def __init__(self, page: WebPage): + self._page: WebPage = ... + self._behavior: str = ... - def deny(self) -> None: ... + def save_path(self, path) -> None: ... - def save_path(self, path: Union[str, Path] = '') -> None: ... + def use_browser(self) -> None: ... + + def use_DownloadKit(self) -> None: ... + + def _download_by_DownloadKit(self, **kwargs) -> None: ...