4.1.0.3修复cookies设置问题;修复edge不能进入隐私模式问题

This commit is contained in:
g1879 2024-09-20 18:16:38 +08:00
parent 705fbb398c
commit 4c427042e3
6 changed files with 73 additions and 13 deletions

View File

@ -12,4 +12,4 @@ from ._pages.chromium_page import ChromiumPage
from ._pages.session_page import SessionPage from ._pages.session_page import SessionPage
from ._pages.web_page import WebPage from ._pages.web_page import WebPage
__version__ = '4.1.0.2' __version__ = '4.1.0.3'

View File

@ -6,6 +6,7 @@
@License : BSD 3-Clause. @License : BSD 3-Clause.
""" """
from pathlib import Path from pathlib import Path
from re import match
from shutil import rmtree from shutil import rmtree
from threading import Lock from threading import Lock
from time import sleep, perf_counter 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) mix = isinstance(obj, MixTab)
tab = browser._get_tab(mix=mix) tab = browser._get_tab(mix=mix)
url = f'"{url}"' if url else '' 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"' new = 'target="_new"' if new_window else 'target="_blank"'
tid = browser.latest_tab.tab_id tid = browser.latest_tab.tab_id
tab.run_js(f'window.open({url}, {new})') tab.run_js(f'window.open({url}, {new})')

View File

@ -271,7 +271,8 @@ class ChromiumOptions(object):
def incognito(self, on_off=True): def incognito(self, on_off=True):
on_off = None if on_off else False 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): def new_env(self, on_off=True):
self._new_env = on_off self._new_env = on_off

View File

@ -20,7 +20,6 @@ class BrowserCookiesSetter(object):
class CookiesSetter(BrowserCookiesSetter): class CookiesSetter(BrowserCookiesSetter):
def __call__(self, cookies): def __call__(self, cookies):
set_tab_cookies(self._owner, cookies) set_tab_cookies(self._owner, cookies)
@ -56,13 +55,12 @@ class SessionCookiesSetter(object):
self._owner.session.cookies.clear() self._owner.session.cookies.clear()
class WebPageCookiesSetter(CookiesSetter, SessionCookiesSetter): class WebPageCookiesSetter(CookiesSetter):
def __call__(self, cookies): def __call__(self, cookies):
if self._owner.mode == 'd' and self._owner._has_driver: if self._owner.mode == 'd' and self._owner._has_driver:
super().__call__(cookies) super().__call__(cookies)
elif self._owner.mode == 's' and self._owner._has_session: 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): def remove(self, name, url=None, domain=None, path=None):
if self._owner.mode == 'd' and self._owner._has_driver: 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: elif self._owner.mode == 's' and self._owner._has_session:
if url or domain or path: if url or domain or path:
raise AttributeError('url、domain、path参数只有d模式下有效。') raise AttributeError('url、domain、path参数只有d模式下有效。')
super(CookiesSetter, self).remove(name) self._owner.session.cookies.set(name, None)
def clear(self): def clear(self):
if self._owner.mode == 'd' and self._owner._has_driver: if self._owner.mode == 'd' and self._owner._has_driver:
super().clear() super().clear()
elif self._owner.mode == 's' and self._owner._has_session: 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()

View File

@ -100,11 +100,46 @@ class SessionCookiesSetter(object):
class WebPageCookiesSetter(CookiesSetter, SessionCookiesSetter): 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对象
""" """
... ...

View File

@ -10,7 +10,8 @@ from time import sleep
from requests.structures import CaseInsensitiveDict 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.tools import show_or_hide_browser
from .._functions.web import format_headers from .._functions.web import format_headers
from ..errors import ElementLostError, JavaScriptError from ..errors import ElementLostError, JavaScriptError
@ -300,7 +301,7 @@ class MixTabSetter(TabSetter):
@property @property
def cookies(self): def cookies(self):
if self._cookies_setter is None: if self._cookies_setter is None:
self._cookies_setter = WebPageCookiesSetter(self._owner) self._cookies_setter = MixTabCookiesSetter(self._owner)
return self._cookies_setter return self._cookies_setter
def headers(self, headers): def headers(self, headers):