ChromiumFrame增加rect属性;修复内部元素不能获取屏幕坐标问题;frame_size改名为page_size;修复小问题

This commit is contained in:
g1879 2023-11-15 15:52:49 +08:00
parent a4bf7da0bd
commit ee89ce948c
12 changed files with 62 additions and 16 deletions

View File

@ -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

View File

@ -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):

View File

@ -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}'))
# 设置代理

View File

@ -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

View File

@ -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):
"""返回上面某一级父元素,可指定层数或用查询语法定位

View File

@ -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: ...

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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: ...

View File

@ -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

View File

@ -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]: ...