From 987f94104bd91c89e25973a8fa57cef58f4bef8d Mon Sep 17 00:00:00 2001 From: g1879 Date: Thu, 22 Aug 2024 18:03:06 +0800 Subject: [PATCH] =?UTF-8?q?auto=5Fhandle=5Falert()=E4=B8=8B=E7=BA=A7?= =?UTF-8?q?=E4=BC=9A=E8=A6=86=E7=9B=96=E4=B8=8A=E7=BA=A7=E8=AE=BE=E7=BD=AE?= =?UTF-8?q?=EF=BC=8C=E5=8C=85=E6=8B=ACSettings=E7=9A=84=EF=BC=9BPage?= =?UTF-8?q?=E5=AF=B9=E8=B1=A1=E5=88=A0=E9=99=A4set.auto=5Fhandle=5Falert()?= =?UTF-8?q?=E6=96=B9=E6=B3=95=E7=9A=84all=5Ftabs=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DrissionPage/_base/browser.py | 2 + DrissionPage/_base/browser.pyi | 7 ++-- DrissionPage/_pages/chromium_base.py | 11 +++--- DrissionPage/_pages/chromium_base.pyi | 8 +++- DrissionPage/_pages/chromium_frame.py | 1 + DrissionPage/_pages/chromium_page.py | 1 + DrissionPage/_pages/mix_page.py | 2 +- DrissionPage/_pages/tabs.py | 1 + DrissionPage/_units/setter.py | 35 +---------------- DrissionPage/_units/setter.pyi | 55 ++++++++++++++++----------- DrissionPage/_units/states.pyi | 2 +- DrissionPage/_units/waiter.pyi | 6 +-- 12 files changed, 61 insertions(+), 70 deletions(-) diff --git a/DrissionPage/_base/browser.py b/DrissionPage/_base/browser.py index 3af6b07..7368362 100644 --- a/DrissionPage/_base/browser.py +++ b/DrissionPage/_base/browser.py @@ -69,6 +69,7 @@ class Chromium(object): self._timeouts = Timeout(**self._chromium_options.timeouts) self._load_mode = self._chromium_options.load_mode self._download_path = str(Path(self._chromium_options.download_path).absolute()) + self._auto_handle_alert = None self.retry_times = self._chromium_options.retry_times self.retry_interval = self._chromium_options.retry_interval self.address = self._chromium_options.address @@ -86,6 +87,7 @@ class Chromium(object): self._driver = BrowserDriver(self.id, 'browser', self.address, self) ws.close() s.close() + self._is_exists = False self._frames = {} self._drivers = {} self._all_drivers = {} diff --git a/DrissionPage/_base/browser.pyi b/DrissionPage/_base/browser.pyi index 446839b..683a491 100644 --- a/DrissionPage/_base/browser.pyi +++ b/DrissionPage/_base/browser.pyi @@ -6,7 +6,7 @@ @License : BSD 3-Clause. """ from threading import Lock -from typing import List, Optional, Set, Dict, Union, Tuple +from typing import List, Optional, Set, Dict, Union, Tuple, Literal from .driver import BrowserDriver, Driver from .._configs.chromium_options import ChromiumOptions @@ -44,6 +44,7 @@ class Chromium(object): _timeouts: Timeout = ... _load_mode: str = ... _download_path: str = ... + _auto_handle_alert: Optional[bool] = ... _is_exists: bool = ... _is_headless: bool = ... @@ -85,8 +86,8 @@ class Chromium(object): ... @property - def load_mode(self) -> str: - """返回加载模式""" + def load_mode(self) -> Literal['none', 'normal', 'eager']: + """返回页面加载模式,包括 'none', 'normal', 'eager' 三种""" ... @property diff --git a/DrissionPage/_pages/chromium_base.py b/DrissionPage/_pages/chromium_base.py index a41658a..1d1b021 100644 --- a/DrissionPage/_pages/chromium_base.py +++ b/DrissionPage/_pages/chromium_base.py @@ -58,7 +58,7 @@ class ChromiumBase(BasePage): self._console = None self._upload_list = None self._doc_got = False # 用于在LoadEventFired和FrameStoppedLoading间标记是否已获取doc - self._download_path = None + self._auto_handle_alert = None self._load_end_time = 0 self._init_jss = [] self._type = 'ChromiumBase' @@ -107,7 +107,7 @@ class ChromiumBase(BasePage): self._is_loading = True self._driver = self.browser._get_driver(target_id, self) - self._alert = Alert() + self._alert = Alert(self._auto_handle_alert) self._driver.set_callback('Page.javascriptDialogOpening', self._on_alert_open, immediate=True) self._driver.set_callback('Page.javascriptDialogClosed', self._on_alert_close) @@ -703,7 +703,8 @@ class ChromiumBase(BasePage): self._has_alert = True if self._alert.auto is not None: - self._handle_alert(self._alert.auto) + if self._alert.auto != 'close': + self._handle_alert(self._alert.auto) elif Settings.auto_handle_alert is not None: self._handle_alert(Settings.auto_handle_alert) elif self._alert.handle_next is not None: @@ -882,7 +883,7 @@ class Timeout(object): class Alert(object): """用于保存alert信息的类""" - def __init__(self): + def __init__(self, auto=None): self.activated = False self.text = None self.type = None @@ -891,7 +892,7 @@ class Alert(object): self.response_text = None self.handle_next = None self.next_text = None - self.auto = None + self.auto = auto def close_privacy_dialog(page, tid): diff --git a/DrissionPage/_pages/chromium_base.pyi b/DrissionPage/_pages/chromium_base.pyi index c5a58ed..f2c552a 100644 --- a/DrissionPage/_pages/chromium_base.pyi +++ b/DrissionPage/_pages/chromium_base.pyi @@ -8,6 +8,8 @@ from pathlib import Path from typing import Union, Tuple, List, Any, Optional, Literal +from .chromium_page import ChromiumPage +from .mix_page import MixPage from .tabs import ChromiumTab, MixTab from .._base.base import BasePage from .._base.browser import Chromium @@ -53,6 +55,7 @@ class ChromiumBase(BasePage): _states: Optional[PageStates] = ... _alert: Alert = ... _has_alert: bool = ... + _auto_handle_alert: Optional[bool] = ... _doc_got: bool = ... _load_end_time: float = ... _init_jss: list = ... @@ -60,12 +63,13 @@ class ChromiumBase(BasePage): _rect: Optional[TabRect] = ... _console: Optional[Console] = ... _type: str = ... + def __init__(self, browser: Chromium, tab_id: str = None): """ :param browser: Chromium - :param target_id: 要控制的target id,不指定默认为激活的标签页 + :param tab_id: 要控制的tab id,不指定默认为激活的标签页 """ ... @@ -652,3 +656,5 @@ class Alert(object): handle_next: Optional[bool] = ... next_text: Optional[str] = ... auto: Optional[bool] = ... + + def __init__(self, auto: bool = None): ... diff --git a/DrissionPage/_pages/chromium_frame.py b/DrissionPage/_pages/chromium_frame.py index fc2ecc6..1466649 100644 --- a/DrissionPage/_pages/chromium_frame.py +++ b/DrissionPage/_pages/chromium_frame.py @@ -83,6 +83,7 @@ class ChromiumFrame(ChromiumBase): self.retry_times = self._target_page.retry_times self.retry_interval = self._target_page.retry_interval self._download_path = self._target_page.download_path + self._auto_handle_alert = self._target_page._auto_handle_alert self._load_mode = self._target_page._load_mode if not self._is_diff_domain else 'normal' def _driver_init(self, target_id, is_init=True): diff --git a/DrissionPage/_pages/chromium_page.py b/DrissionPage/_pages/chromium_page.py index ef50d21..1d251c4 100644 --- a/DrissionPage/_pages/chromium_page.py +++ b/DrissionPage/_pages/chromium_page.py @@ -49,6 +49,7 @@ class ChromiumPage(ChromiumBase): self._download_path = self.browser.download_path self.retry_times = self.browser.retry_times self.retry_interval = self.browser.retry_interval + self._auto_handle_alert = self.browser._auto_handle_alert @property def set(self): diff --git a/DrissionPage/_pages/mix_page.py b/DrissionPage/_pages/mix_page.py index ed994ed..0e6ae54 100644 --- a/DrissionPage/_pages/mix_page.py +++ b/DrissionPage/_pages/mix_page.py @@ -52,7 +52,7 @@ class MixPage(SessionPage, ChromiumPage, BasePage): @property def latest_tab(self): - return self.browser.get_mix_tab(self.tab_ids[0], as_id=not Settings.singleton_tab_obj) + return self.browser._get_tab(id_or_num=self.tab_ids[0], mix=True, as_id=not Settings.singleton_tab_obj) @property def set(self): diff --git a/DrissionPage/_pages/tabs.py b/DrissionPage/_pages/tabs.py index 1470895..49be8d4 100644 --- a/DrissionPage/_pages/tabs.py +++ b/DrissionPage/_pages/tabs.py @@ -48,6 +48,7 @@ class ChromiumTab(ChromiumBase): self.retry_interval = self.browser.retry_interval self._load_mode = self.browser._load_mode self._download_path = self.browser.download_path + self._auto_handle_alert = self.browser._auto_handle_alert def close(self, others=False): self.browser.close_tabs(self.tab_id, others=others) diff --git a/DrissionPage/_units/setter.py b/DrissionPage/_units/setter.py index 8076db1..a3185f0 100644 --- a/DrissionPage/_units/setter.py +++ b/DrissionPage/_units/setter.py @@ -11,7 +11,6 @@ from time import sleep from requests.structures import CaseInsensitiveDict from .cookies_setter import SessionCookiesSetter, CookiesSetter, MixPageCookiesSetter, BrowserCookiesSetter -from .._functions.settings import Settings from .._functions.tools import show_or_hide_browser from .._functions.web import format_headers from ..errors import ElementLostError, JavaScriptError @@ -39,9 +38,6 @@ class BaseSetter(object): class SessionPageSetter(BaseSetter): def __init__(self, owner): - """ - :param owner: SessionPage对象 - """ super().__init__(owner) self._cookies_setter = None @@ -106,12 +102,7 @@ class SessionPageSetter(BaseSetter): class BrowserBaseSetter(BaseSetter): - """Browser和ChromiumBase设置""" - def __init__(self, owner): - """ - :param owner: ChromiumBase对象 - """ super().__init__(owner) self._cookies_setter = None @@ -139,7 +130,7 @@ class BrowserSetter(BrowserBaseSetter): return self._cookies_setter def auto_handle_alert(self, on_off=True, accept=True): - Settings.auto_handle_alert = accept if on_off else None + self._owner._auto_handle_alert = None if on_off is None else accept if on_off else 'close' def download_path(self, path): super().download_path(path) @@ -213,7 +204,7 @@ class ChromiumBaseSetter(BrowserBaseSetter): self._owner._upload_list = [str(Path(i).absolute()) for i in files] def auto_handle_alert(self, on_off=True, accept=True): - self._owner._alert.auto = accept if on_off else None + self._owner._alert.auto = None if on_off is None else accept if on_off else 'close' def blocked_urls(self, urls): if not urls: @@ -258,39 +249,22 @@ class TabSetter(ChromiumBaseSetter): class ChromiumPageSetter(TabSetter): def NoneElement_value(self, value=None, on_off=True): - """设置空元素是否返回设定值 - :param value: 返回的设定值 - :param on_off: 是否启用 - :return: None - """ super().NoneElement_value(value, on_off) self._owner.browser._none_ele_return_value = on_off self._owner.browser._none_ele_value = value def retry_times(self, times): - """设置连接失败重连次数""" super().retry_times(times) self._owner.browser.retry_times = times def retry_interval(self, interval): - """设置连接失败重连间隔""" super().retry_interval(interval) self._owner.browser.retry_interval = interval def download_path(self, path): - """设置下载路径 - :param path: 下载路径 - :return: None - """ super().download_path(path) self._owner.browser._download_path = self._owner._download_path - def auto_handle_alert(self, on_off=True, accept=True, all_tabs=False): - if all_tabs: - Settings.auto_handle_alert = on_off - else: - self._owner._alert.auto = accept if on_off else None - class MixPageSetter(ChromiumPageSetter): def __init__(self, owner): @@ -300,7 +274,6 @@ class MixPageSetter(ChromiumPageSetter): @property def cookies(self): - """返回用于设置cookies的对象""" if self._cookies_setter is None: self._cookies_setter = MixPageCookiesSetter(self._owner) return self._cookies_setter @@ -390,8 +363,6 @@ class ChromiumFrameSetter(ChromiumBaseSetter): class LoadMode(object): - """用于设置页面加载策略的类""" - def __init__(self, owner): self._owner = owner @@ -430,8 +401,6 @@ class PageScrollSetter(object): class WindowSetter(object): - """用于设置窗口大小的类""" - def __init__(self, owner): self._owner = owner self._window_id = self._get_info()['windowId'] diff --git a/DrissionPage/_units/setter.pyi b/DrissionPage/_units/setter.pyi index b29e24c..9ea7692 100644 --- a/DrissionPage/_units/setter.pyi +++ b/DrissionPage/_units/setter.pyi @@ -53,7 +53,7 @@ class BaseSetter(object): ... def retry_interval(self, interval: float) -> None: - """设置连接失败重连间隔 + """设置连接失败重连间隔(秒) :param interval: 重试间隔 :return: None """ @@ -71,7 +71,11 @@ class SessionPageSetter(BaseSetter): _owner: SessionPage = ... _cookies_setter: Optional[SessionCookiesSetter] = ... - def __init__(self, owner: SessionPage): ... + def __init__(self, owner: SessionPage): + """ + :param owner: SessionPage对象 + """ + ... @property def cookies(self) -> SessionCookiesSetter: @@ -196,11 +200,18 @@ class SessionPageSetter(BaseSetter): class BrowserBaseSetter(BaseSetter): + """Browser和ChromiumBase设置""" _cookies_setter: Optional[CookiesSetter] = ... + def __init__(self, owner: ChromiumBase): + """ + :param owner: ChromiumBase对象 + """ + ... + @property def load_mode(self) -> LoadMode: - """返回用于设置页面加载策略的对象""" + """返回用于设置页面加载模式的对象""" ... def timeouts(self, @@ -220,6 +231,12 @@ class BrowserSetter(BrowserBaseSetter): _owner: Chromium = ... _cookies_setter: BrowserCookiesSetter = ... + def __init__(self, owner: Chromium): + """ + :param owner: Chromium对象 + """ + ... + @property def cookies(self) -> BrowserCookiesSetter: """返回用于设置cookies的对象""" @@ -227,15 +244,15 @@ class BrowserSetter(BrowserBaseSetter): def auto_handle_alert(self, on_off: bool = True, - accept: bool = True): - """设置是否启用自动处理弹窗 - :param on_off: bool表示开或关 + accept: bool = True) -> None: + """设置本浏览器是否启用自动处理弹窗 + :param on_off: bool表示开或关,传入None表示使用Settings设置 :param accept: bool表示确定还是取消 :return: None """ ... - def download_path(self, path: Union[Path, str, None]): + def download_path(self, path: Union[Path, str, None]) -> None: """设置下载路径 :param path: 下载路径 :return: None @@ -244,7 +261,7 @@ class BrowserSetter(BrowserBaseSetter): def download_file_name(self, name: str = None, - suffix: str = None): + suffix: str = None) -> None: """设置下一个被下载文件的名称 :param name: 文件名,可不含后缀,会自动使用远程文件后缀 :param suffix: 后缀名,显式设置后缀名,不使用远程文件后缀 @@ -252,7 +269,7 @@ class BrowserSetter(BrowserBaseSetter): """ ... - def when_download_file_exists(self, mode: FILE_EXISTS): + def when_download_file_exists(self, mode: FILE_EXISTS) -> None: """设置当存在同名文件时的处理方式 :param mode: 可在 'rename', 'overwrite', 'skip', 'r', 'o', 's'中选择 :return: None @@ -335,7 +352,7 @@ class ChromiumBaseSetter(BrowserBaseSetter): class TabSetter(ChromiumBaseSetter): _owner: ChromiumTab = ... - def __init__(self, owner: Union[ChromiumTab, MixTab, MixPage, ChromiumPage]): + def __init__(self, owner: ChromiumTab): """ :param owner: 标签页对象 """ @@ -384,18 +401,6 @@ class ChromiumPageSetter(TabSetter): """ ... - def auto_handle_alert(self, - on_off: bool = True, - accept: bool = True, - all_tabs: bool = False) -> None: - """设置是否启用自动处理弹窗 - :param on_off: bool表示开或关 - :param accept: bool表示确定还是取消 - :param all_tabs: 是否为全局设置 - :return: None - """ - ... - class MixPageSetter(ChromiumPageSetter): _owner: MixPage = ... @@ -409,7 +414,9 @@ class MixPageSetter(ChromiumPageSetter): ... @property - def cookies(self) -> MixPageCookiesSetter: ... + def cookies(self) -> MixPageCookiesSetter: + """返回用于设置cookies的对象""" + ... class MixTabSetter(TabSetter): @@ -518,6 +525,7 @@ class ChromiumFrameSetter(ChromiumBaseSetter): class LoadMode(object): + """用于设置页面加载策略的类""" _owner: Union[Chromium, ChromiumBase] = ... def __init__(self, owner: Union[Chromium, ChromiumBase]): @@ -571,6 +579,7 @@ class PageScrollSetter(object): class WindowSetter(object): + """用于设置窗口大小的类""" _owner: ChromiumBase = ... _window_id: str = ... diff --git a/DrissionPage/_units/states.pyi b/DrissionPage/_units/states.pyi index 988cede..fc0fb0e 100644 --- a/DrissionPage/_units/states.pyi +++ b/DrissionPage/_units/states.pyi @@ -115,7 +115,7 @@ class BrowserStates(object): """返回浏览器是否接管的""" ... - def is_incognito(self): + def is_incognito(self) -> bool: """返回浏览器是否无痕模式""" ... diff --git a/DrissionPage/_units/waiter.pyi b/DrissionPage/_units/waiter.pyi index 46a5b62..c74d6dc 100644 --- a/DrissionPage/_units/waiter.pyi +++ b/DrissionPage/_units/waiter.pyi @@ -50,17 +50,17 @@ class BrowserWaiter(OriginWaiter): def new_tab(self, timeout: float = None, - curr_tab: Union[str, ChromiumTab] = None, + curr_tab: Union[str, ChromiumTab, MixTab] = None, raise_err: bool = None) -> Union[str, bool]: """等待新标签页出现 - :param timeout: 超时时间(秒),为None则使用页面对象timeout属性 + :param timeout: 超时时间(秒),为None则使用对象timeout属性 :param curr_tab: 指定当前最新的tab对象或tab id,用于判断新tab出现,为None自动获取 :param raise_err: 等待失败时是否报错,为None时根据Settings设置 :return: 等到新标签页返回其id,否则返回False """ ... - def download_begin(self, timeout: float = None, cancel_it: bool = False) -> DownloadMission: + def download_begin(self, timeout: float = None, cancel_it: bool = False) -> Union[DownloadMission, False]: """等待浏览器下载开始,可将其拦截 :param timeout: 超时时间(秒),None使用页面对象超时时间 :param cancel_it: 是否取消该任务