From 4c427042e3978b412ba12010da60d221c6dc295f Mon Sep 17 00:00:00 2001 From: g1879 Date: Fri, 20 Sep 2024 18:16:38 +0800 Subject: [PATCH] =?UTF-8?q?4.1.0.3=E4=BF=AE=E5=A4=8Dcookies=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE=E9=97=AE=E9=A2=98=EF=BC=9B=E4=BF=AE=E5=A4=8Dedge?= =?UTF-8?q?=E4=B8=8D=E8=83=BD=E8=BF=9B=E5=85=A5=E9=9A=90=E7=A7=81=E6=A8=A1?= =?UTF-8?q?=E5=BC=8F=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DrissionPage/__init__.py | 2 +- DrissionPage/_base/chromium.py | 3 ++ DrissionPage/_configs/chromium_options.py | 3 +- DrissionPage/_units/cookies_setter.py | 32 ++++++++++++++---- DrissionPage/_units/cookies_setter.pyi | 41 +++++++++++++++++++++-- DrissionPage/_units/setter.py | 5 +-- 6 files changed, 73 insertions(+), 13 deletions(-) diff --git a/DrissionPage/__init__.py b/DrissionPage/__init__.py index 1a18e89..f5a3c61 100644 --- a/DrissionPage/__init__.py +++ b/DrissionPage/__init__.py @@ -12,4 +12,4 @@ from ._pages.chromium_page import ChromiumPage from ._pages.session_page import SessionPage from ._pages.web_page import WebPage -__version__ = '4.1.0.2' +__version__ = '4.1.0.3' diff --git a/DrissionPage/_base/chromium.py b/DrissionPage/_base/chromium.py index 8803c63..8475eee 100644 --- a/DrissionPage/_base/chromium.py +++ b/DrissionPage/_base/chromium.py @@ -6,6 +6,7 @@ @License : BSD 3-Clause. """ from pathlib import Path +from re import match from shutil import rmtree from threading import Lock from time import sleep, perf_counter @@ -476,6 +477,8 @@ def _new_tab_by_js(browser: Chromium, url, obj, new_window): mix = isinstance(obj, MixTab) tab = browser._get_tab(mix=mix) url = f'"{url}"' if url else '' + if url and not match(r'^.*?://.*', url): + raise ValueError(f'url也许需要加上http://?') new = 'target="_new"' if new_window else 'target="_blank"' tid = browser.latest_tab.tab_id tab.run_js(f'window.open({url}, {new})') diff --git a/DrissionPage/_configs/chromium_options.py b/DrissionPage/_configs/chromium_options.py index 9ab44de..29b00b1 100644 --- a/DrissionPage/_configs/chromium_options.py +++ b/DrissionPage/_configs/chromium_options.py @@ -271,7 +271,8 @@ class ChromiumOptions(object): def incognito(self, on_off=True): on_off = None if on_off else False - return self.set_argument('--incognito', on_off) + self.set_argument('--incognito', on_off) + return self.set_argument('--inprivate', on_off) # edge def new_env(self, on_off=True): self._new_env = on_off diff --git a/DrissionPage/_units/cookies_setter.py b/DrissionPage/_units/cookies_setter.py index 651d26d..1dab0fa 100644 --- a/DrissionPage/_units/cookies_setter.py +++ b/DrissionPage/_units/cookies_setter.py @@ -20,7 +20,6 @@ class BrowserCookiesSetter(object): class CookiesSetter(BrowserCookiesSetter): - def __call__(self, cookies): set_tab_cookies(self._owner, cookies) @@ -56,13 +55,12 @@ class SessionCookiesSetter(object): self._owner.session.cookies.clear() -class WebPageCookiesSetter(CookiesSetter, SessionCookiesSetter): - +class WebPageCookiesSetter(CookiesSetter): def __call__(self, cookies): if self._owner.mode == 'd' and self._owner._has_driver: super().__call__(cookies) elif self._owner.mode == 's' and self._owner._has_session: - super(CookiesSetter, self).__call__(cookies) + set_session_cookies(self._owner.session, cookies) def remove(self, name, url=None, domain=None, path=None): if self._owner.mode == 'd' and self._owner._has_driver: @@ -70,10 +68,32 @@ class WebPageCookiesSetter(CookiesSetter, SessionCookiesSetter): elif self._owner.mode == 's' and self._owner._has_session: if url or domain or path: raise AttributeError('url、domain、path参数只有d模式下有效。') - super(CookiesSetter, self).remove(name) + self._owner.session.cookies.set(name, None) def clear(self): if self._owner.mode == 'd' and self._owner._has_driver: super().clear() elif self._owner.mode == 's' and self._owner._has_session: - super(CookiesSetter, self).clear() + self._owner.session.cookies.clear() + + +class MixTabCookiesSetter(CookiesSetter): + def __call__(self, cookies): + if self._owner._d_mode and self._owner._driver.is_running: + super().__call__(cookies) + elif not self._owner._d_mode and self._owner._session: + set_session_cookies(self._owner.session, cookies) + + def remove(self, name, url=None, domain=None, path=None): + if self._owner._d_mode and self._owner._driver.is_running: + super().remove(name, url, domain, path) + elif not self._owner._d_mode and self._owner._session: + if url or domain or path: + raise AttributeError('url、domain、path参数只有d模式下有效。') + self._owner.session.cookies.set(name, None) + + def clear(self): + if self._owner._d_mode and self._owner._driver.is_running: + super().clear() + elif not self._owner._d_mode and self._owner._session: + self._owner.session.cookies.clear() diff --git a/DrissionPage/_units/cookies_setter.pyi b/DrissionPage/_units/cookies_setter.pyi index a90ad61..a1cf78f 100644 --- a/DrissionPage/_units/cookies_setter.pyi +++ b/DrissionPage/_units/cookies_setter.pyi @@ -100,11 +100,46 @@ class SessionCookiesSetter(object): class WebPageCookiesSetter(CookiesSetter, SessionCookiesSetter): - _owner: Union[WebPage, MixTab] = ... + _owner: WebPage = ... - def __init__(self, owner: Union[WebPage, MixTab]): + def __init__(self, owner: WebPage): """ - :param owner: WebPage, MixTab对象 + :param owner: WebPage对象 + """ + ... + + def __call__(self, cookies: Union[CookieJar, Cookie, list, tuple, str, dict]) -> None: + """设置一个或多个cookie + :param cookies: cookies信息 + :return: None + """ + ... + + def remove(self, + name: str, + url: str = None, + domain: str = None, + path: str = None) -> None: + """删除一个cookie + :param name: cookie的name字段 + :param url: cookie的url字段,可选,d模式时才有效 + :param domain: cookie的domain字段,可选,d模式时才有效 + :param path: cookie的path字段,可选,d模式时才有效 + :return: None + """ + ... + + def clear(self) -> None: + """清除cookies""" + ... + + +class MixTabCookiesSetter(CookiesSetter, SessionCookiesSetter): + _owner: MixTab = ... + + def __init__(self, owner: MixTab): + """ + :param owner: MixTab对象 """ ... diff --git a/DrissionPage/_units/setter.py b/DrissionPage/_units/setter.py index 731732d..0eccf16 100644 --- a/DrissionPage/_units/setter.py +++ b/DrissionPage/_units/setter.py @@ -10,7 +10,8 @@ from time import sleep from requests.structures import CaseInsensitiveDict -from .cookies_setter import SessionCookiesSetter, CookiesSetter, WebPageCookiesSetter, BrowserCookiesSetter +from .cookies_setter import (SessionCookiesSetter, CookiesSetter, WebPageCookiesSetter, BrowserCookiesSetter, + MixTabCookiesSetter) from .._functions.tools import show_or_hide_browser from .._functions.web import format_headers from ..errors import ElementLostError, JavaScriptError @@ -300,7 +301,7 @@ class MixTabSetter(TabSetter): @property def cookies(self): if self._cookies_setter is None: - self._cookies_setter = WebPageCookiesSetter(self._owner) + self._cookies_setter = MixTabCookiesSetter(self._owner) return self._cookies_setter def headers(self, headers):