From ee89ce948c6804f748a918725aeccbd34befcbf0 Mon Sep 17 00:00:00 2001 From: g1879 Date: Wed, 15 Nov 2023 15:52:49 +0800 Subject: [PATCH] =?UTF-8?q?ChromiumFrame=E5=A2=9E=E5=8A=A0rect=E5=B1=9E?= =?UTF-8?q?=E6=80=A7=EF=BC=9B=E4=BF=AE=E5=A4=8D=E5=86=85=E9=83=A8=E5=85=83?= =?UTF-8?q?=E7=B4=A0=E4=B8=8D=E8=83=BD=E8=8E=B7=E5=8F=96=E5=B1=8F=E5=B9=95?= =?UTF-8?q?=E5=9D=90=E6=A0=87=E9=97=AE=E9=A2=98=EF=BC=9Bframe=5Fsize?= =?UTF-8?q?=E6=94=B9=E5=90=8D=E4=B8=BApage=5Fsize=EF=BC=9B=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E5=B0=8F=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DrissionPage/_base/base.py | 2 +- DrissionPage/_base/chromium_driver.py | 2 +- DrissionPage/_configs/chromium_options.py | 4 ++-- DrissionPage/_elements/chromium_element.py | 3 +-- DrissionPage/_pages/chromium_frame.py | 12 +++++++--- DrissionPage/_pages/chromium_frame.pyi | 6 ++++- DrissionPage/_pages/chromium_page.py | 2 +- DrissionPage/_pages/chromium_page.pyi | 2 +- DrissionPage/_pages/chromium_tab.py | 2 +- DrissionPage/_pages/chromium_tab.pyi | 6 ++--- DrissionPage/_units/{tab_rect.py => rect.py} | 22 +++++++++++++++++++ .../_units/{tab_rect.pyi => rect.pyi} | 15 +++++++++++++ 12 files changed, 62 insertions(+), 16 deletions(-) rename DrissionPage/_units/{tab_rect.py => rect.py} (81%) rename DrissionPage/_units/{tab_rect.pyi => rect.pyi} (73%) diff --git a/DrissionPage/_base/base.py b/DrissionPage/_base/base.py index fbf4f67..eea2c3e 100644 --- a/DrissionPage/_base/base.py +++ b/DrissionPage/_base/base.py @@ -414,7 +414,7 @@ class BasePage(BaseParser): :param interval: 重试间隔 :return: 重试次数和间隔组成的tuple """ - self._url = quote(url, safe='-_.~!*\'();:@&=+$,/?#[]') + self._url = quote(url, safe='-_.~!*\'"();:@&=+$,/\\?#[]%') retry = retry if retry is not None else self.retry_times interval = interval if interval is not None else self.retry_interval return retry, interval diff --git a/DrissionPage/_base/chromium_driver.py b/DrissionPage/_base/chromium_driver.py index 26284e3..a7392a4 100644 --- a/DrissionPage/_base/chromium_driver.py +++ b/DrissionPage/_base/chromium_driver.py @@ -110,7 +110,7 @@ class ChromiumDriver(object): if self._debug: if self._debug is True or 'id' in msg or (isinstance(self._debug, str) and msg.get('method', '').startswith(self._debug)): - print(f'<收 {self.id} {msg_json}') + print(f'<收 {msg_json}') elif isinstance(self._debug, (list, tuple, set)): for m in self._debug: if msg.get('method', '').startswith(m): diff --git a/DrissionPage/_configs/chromium_options.py b/DrissionPage/_configs/chromium_options.py index e5a09d0..b35c8f9 100644 --- a/DrissionPage/_configs/chromium_options.py +++ b/DrissionPage/_configs/chromium_options.py @@ -38,7 +38,7 @@ class ChromiumOptions(object): self._page_load_strategy = options.get('page_load_strategy', 'normal') self._proxy = om.proxies.get('http', None) self._system_user_path = options.get('system_user_path', False) - self._existing_only = options.get('existing_only', False) + self._existing_only = options.get('is_existing_only', False) user_path = user = False for arg in self._arguments: @@ -446,7 +446,7 @@ class ChromiumOptions(object): # 设置chrome_options attrs = ('debugger_address', 'binary_location', 'arguments', 'extensions', 'user', 'page_load_strategy', - 'auto_port', 'system_user_path', 'is_existing_only') + 'auto_port', 'system_user_path', 'existing_only') for i in attrs: om.set_item('chrome_options', i, self.__getattribute__(f'_{i}')) # 设置代理 diff --git a/DrissionPage/_elements/chromium_element.py b/DrissionPage/_elements/chromium_element.py index a19b02f..f9a2d4c 100644 --- a/DrissionPage/_elements/chromium_element.py +++ b/DrissionPage/_elements/chromium_element.py @@ -450,8 +450,7 @@ class ChromiumElement(DrissionElement): """ if pseudo_ele: pseudo_ele = f', "{pseudo_ele}"' if pseudo_ele.startswith(':') else f', "::{pseudo_ele}"' - js = f'return window.getComputedStyle(this{pseudo_ele}).getPropertyValue("{style}");' - return self.run_js(js) + return self.run_js(f'return window.getComputedStyle(this{pseudo_ele}).getPropertyValue("{style}");') def get_src(self, timeout=None, base64_to_bytes=True): """返回元素src资源,base64的可转为bytes返回,其它返回str diff --git a/DrissionPage/_pages/chromium_frame.py b/DrissionPage/_pages/chromium_frame.py index 887e697..ba0871f 100644 --- a/DrissionPage/_pages/chromium_frame.py +++ b/DrissionPage/_pages/chromium_frame.py @@ -10,6 +10,7 @@ from time import sleep, perf_counter from .._elements.chromium_element import ChromiumElement from .._pages.chromium_base import ChromiumBase from .._units.ids import FrameIds +from .._units.rect import FrameRect from .._units.scroller import FrameScroller from .._units.setter import ChromiumFrameSetter from .._units.waiter import FrameWaiter @@ -315,7 +316,7 @@ class ChromiumFrame(ChromiumBase): return self.frame_ele.attrs @property - def frame_size(self): + def page_size(self): """返回frame内页面尺寸,格式:(长, 高)""" w = self.doc_ele.run_js('return this.body.scrollWidth') h = self.doc_ele.run_js('return this.body.scrollHeight') @@ -326,6 +327,11 @@ class ChromiumFrame(ChromiumBase): """返回frame元素大小""" return self.frame_ele.size + @property + def rect(self): + """返回获取坐标和大小的对象""" + return FrameRect(self) + @property def active_ele(self): """返回当前焦点所在元素""" @@ -440,9 +446,9 @@ class ChromiumFrame(ChromiumBase): :return: 运行的结果 """ if script.startswith('this.scrollIntoView'): - return self.frame_ele.run_js(script, args, as_expr=as_expr, timeout=timeout) + return self.frame_ele.run_js(script, *args, as_expr=as_expr, timeout=timeout) else: - return self.doc_ele.run_js(script, args, as_expr=as_expr, timeout=timeout) + return self.doc_ele.run_js(script, *args, as_expr=as_expr, timeout=timeout) def parent(self, level_or_loc=1, index=1): """返回上面某一级父元素,可指定层数或用查询语法定位 diff --git a/DrissionPage/_pages/chromium_frame.pyi b/DrissionPage/_pages/chromium_frame.pyi index 1aebd95..facbb5f 100644 --- a/DrissionPage/_pages/chromium_frame.pyi +++ b/DrissionPage/_pages/chromium_frame.pyi @@ -14,6 +14,7 @@ from .._elements.chromium_element import ChromiumElement from .._units.element_states import ElementStates from .._units.ids import FrameIds from .._units.locations import Locations +from .._units.rect import FrameRect from .._units.scroller import FrameScroller from .._units.setter import ChromiumFrameSetter from .._units.waiter import FrameWaiter @@ -88,11 +89,14 @@ class ChromiumFrame(ChromiumBase): def attrs(self) -> dict: ... @property - def frame_size(self) -> Tuple[int, int]: ... + def page_size(self) -> Tuple[int, int]: ... @property def size(self) -> Tuple[int, int]: ... + @property + def rect(self) -> FrameRect: ... + @property def active_ele(self) -> ChromiumElement: ... diff --git a/DrissionPage/_pages/chromium_page.py b/DrissionPage/_pages/chromium_page.py index 11353fb..87c7c10 100644 --- a/DrissionPage/_pages/chromium_page.py +++ b/DrissionPage/_pages/chromium_page.py @@ -13,8 +13,8 @@ from .._commons.browser import connect_browser from .._configs.chromium_options import ChromiumOptions from .._pages.chromium_base import ChromiumBase, Timeout from .._pages.chromium_tab import ChromiumTab +from .._units.rect import TabRect from .._units.setter import ChromiumPageSetter -from .._units.tab_rect import TabRect from .._units.waiter import PageWaiter from ..errors import BrowserConnectError diff --git a/DrissionPage/_pages/chromium_page.pyi b/DrissionPage/_pages/chromium_page.pyi index a6c7603..62f7e95 100644 --- a/DrissionPage/_pages/chromium_page.pyi +++ b/DrissionPage/_pages/chromium_page.pyi @@ -9,8 +9,8 @@ from .._base.browser import Browser from .._configs.chromium_options import ChromiumOptions from .._pages.chromium_base import ChromiumBase from .._pages.chromium_tab import ChromiumTab +from .._units.rect import TabRect from .._units.setter import ChromiumPageSetter -from .._units.tab_rect import TabRect from .._units.waiter import PageWaiter diff --git a/DrissionPage/_pages/chromium_tab.py b/DrissionPage/_pages/chromium_tab.py index b65bb03..66edc32 100644 --- a/DrissionPage/_pages/chromium_tab.py +++ b/DrissionPage/_pages/chromium_tab.py @@ -9,8 +9,8 @@ from .._base.base import BasePage from .._commons.web import set_session_cookies, set_browser_cookies from .._pages.chromium_base import ChromiumBase from .._pages.session_page import SessionPage +from .._units.rect import TabRect from .._units.setter import TabSetter, WebPageTabSetter -from .._units.tab_rect import TabRect from .._units.waiter import TabWaiter diff --git a/DrissionPage/_pages/chromium_tab.pyi b/DrissionPage/_pages/chromium_tab.pyi index ef034b3..5adb85f 100644 --- a/DrissionPage/_pages/chromium_tab.pyi +++ b/DrissionPage/_pages/chromium_tab.pyi @@ -7,7 +7,6 @@ from typing import Union, Tuple, Any, List, Optional from requests import Session, Response -from .._units.tab_rect import ChromiumTabRect from .chromium_base import ChromiumBase from .chromium_frame import ChromiumFrame from .chromium_page import ChromiumPage @@ -16,6 +15,7 @@ from .web_page import WebPage from .._base.browser import Browser from .._elements.chromium_element import ChromiumElement from .._elements.session_element import SessionElement +from .._units.rect import TabRect from .._units.setter import TabSetter, WebPageTabSetter from .._units.waiter import TabWaiter @@ -25,7 +25,7 @@ class ChromiumTab(ChromiumBase): def __init__(self, page: ChromiumPage, tab_id: str = None): self._page: ChromiumPage = ... self._browser: Browser = ... - self._rect: Optional[ChromiumTabRect] = ... + self._rect: Optional[TabRect] = ... def _d_set_runtime_settings(self) -> None: ... @@ -35,7 +35,7 @@ class ChromiumTab(ChromiumBase): def page(self) -> ChromiumPage: ... @property - def rect(self) -> ChromiumTabRect: ... + def rect(self) -> TabRect: ... @property def set(self) -> TabSetter: ... diff --git a/DrissionPage/_units/tab_rect.py b/DrissionPage/_units/rect.py similarity index 81% rename from DrissionPage/_units/tab_rect.py rename to DrissionPage/_units/rect.py index b72107b..8ebf0fe 100644 --- a/DrissionPage/_units/tab_rect.py +++ b/DrissionPage/_units/rect.py @@ -74,3 +74,25 @@ class TabRect(object): def _get_window_rect(self): """获取窗口范围信息""" return self._page.browser.get_window_bounds(self._page.tab_id) + + +class FrameRect(object): + """异域iframe使用""" + + def __init__(self, frame): + self._frame = frame + + @property + def viewport_location(self): + """返回视口在屏幕中坐标,左上角为(0, 0)""" + return self._frame.frame_ele.locations.screen_location + + @property + def page_size(self): + """返回页面总宽高,格式:(宽, 高)""" + return self._frame.page_size + + @property + def viewport_size(self): + """返回视口宽高,不包括滚动条,格式:(宽, 高)""" + return self._frame.frame_ele.size diff --git a/DrissionPage/_units/tab_rect.pyi b/DrissionPage/_units/rect.pyi similarity index 73% rename from DrissionPage/_units/tab_rect.pyi rename to DrissionPage/_units/rect.pyi index d4c1223..678b34f 100644 --- a/DrissionPage/_units/tab_rect.pyi +++ b/DrissionPage/_units/rect.pyi @@ -5,6 +5,7 @@ """ from typing import Tuple, Union +from .._pages.chromium_frame import ChromiumFrame from .._pages.chromium_page import ChromiumPage from .._pages.chromium_tab import ChromiumTab, WebPageTab from .._pages.web_page import WebPage @@ -41,3 +42,17 @@ class TabRect(object): def _get_page_rect(self) -> dict: ... def _get_window_rect(self) -> dict: ... + + +class FrameRect(object): + def __init__(self, frame: ChromiumFrame): + self._frame: ChromiumFrame = ... + + @property + def viewport_location(self) -> Tuple[float, float]: ... + + @property + def page_size(self) -> Tuple[float, float]: ... + + @property + def viewport_size(self) -> Tuple[float, float]: ...