一些修改(+)

fullscreen()改为full();
corners返回tuple;
Frame增加states.is_displayed和states.is_loading;
has_alert移到states中
This commit is contained in:
g1879 2023-12-14 00:45:13 +08:00
parent 731d40a891
commit 545b7a0732
11 changed files with 43 additions and 22 deletions

View File

@ -1287,7 +1287,7 @@ def run_js(page_or_ele, script, as_expr=False, timeout=None, args=None):
obj_id = page_or_ele._root_id
is_page = True
if page.has_alert:
if page.states.has_alert:
raise AlertExistsError
try:
@ -1309,7 +1309,7 @@ def run_js(page_or_ele, script, as_expr=False, timeout=None, args=None):
else:
raise ElementLostError('原来获取到的元素对象已不在页面内。')
if res is None and page.driver.has_alert: # 存在alert的情况
if res is None and page.states.has_alert: # 存在alert的情况
return None
exceptionDetails = res.get('exceptionDetails')

View File

@ -426,11 +426,6 @@ class ChromiumBase(BasePage):
"""返回等待上传文件列表"""
return self._upload_list
@property
def has_alert(self):
"""返回是否存在提示框"""
return self._has_alert
@property
def _js_ready_state(self):
"""返回js获取的ready state信息"""

View File

@ -162,9 +162,6 @@ class ChromiumBase(BasePage):
@property
def states(self) -> PageStates: ...
@property
def has_alert(self) -> bool: ...
def run_js(self, script: str, *args, as_expr: bool = False, timeout: float = None) -> Any: ...
def run_js_loaded(self, script: str, *args, as_expr: bool = False, timeout: float = None) -> Any: ...

View File

@ -349,7 +349,7 @@ class WebPage(SessionPage, ChromiumPage, BasePage):
self._has_session = None
def close(self):
"""关闭标签页"""
"""关闭标签页和Session"""
if self._has_driver:
self.close_tabs(self.tab_id)
if self._session:

View File

@ -131,6 +131,8 @@ class WebPage(SessionPage, ChromiumPage, BasePage):
def close_session(self) -> None: ...
def close(self) -> None: ...
# ----------------重写SessionPage的函数-----------------------
def post(self,
url: str,

View File

@ -19,14 +19,13 @@ class ElementRect(object):
r = self._ele.page.run_cdp_loaded('Page.getLayoutMetrics')['visualViewport']
sx = r['pageX']
sy = r['pageY']
return [(vr[0] + sx, vr[1] + sy), (vr[2] + sx, vr[3] + sy),
(vr[4] + sx, vr[5] + sy), (vr[6] + sx, vr[7] + sy)]
return [(vr[0] + sx, vr[1] + sy), (vr[2] + sx, vr[3] + sy), (vr[4] + sx, vr[5] + sy), (vr[6] + sx, vr[7] + sy)]
@property
def viewport_corners(self):
"""返回元素四个角视口坐标顺序坐上、右上、右下、左下没有大小的元素抛出NoRectError"""
r = self._get_viewport_rect('border')
return [(r[0], r[1]), (r[2], r[3]), (r[4], r[5]), (r[6], r[7])]
return (r[0], r[1]), (r[2], r[3]), (r[4], r[5]), (r[6], r[7])
@property
def size(self):
@ -188,12 +187,12 @@ class FrameRect(object):
@property
def location(self):
"""返回元素左上角的绝对坐标"""
"""返回iframe元素左上角的绝对坐标"""
return self._frame.frame_ele.rect.location
@property
def viewport_location(self):
"""返回视口在屏幕中坐标,左上角为(0, 0)"""
"""返回元素在视口中坐标,左上角为(0, 0)"""
return self._frame.frame_ele.rect.viewport_location
@property

View File

@ -49,10 +49,10 @@ class ElementRect(object):
def screen_click_point(self) -> Tuple[float, float]: ...
@property
def corners(self) -> List[Tuple[float, float], ...]: ...
def corners(self) -> Tuple[Tuple[float, float], ...]: ...
@property
def viewport_corners(self) -> List[Tuple[float, float], ...]: ...
def viewport_corners(self) -> Tuple[Tuple[float, float], ...]: ...
def _get_viewport_rect(self, quad: str) -> Union[list, None]: ...
@ -112,7 +112,7 @@ class FrameRect(object):
def viewport_size(self) -> Tuple[float, float]: ...
@property
def corners(self) -> List[Tuple[float, float], ...]: ...
def corners(self) -> Tuple[Tuple[float, float], ...]: ...
@property
def viewport_corners(self) -> List[Tuple[float, float], ...]: ...
def viewport_corners(self) -> Tuple[Tuple[float, float], ...]: ...

View File

@ -572,7 +572,7 @@ class WindowSetter(object):
self._perform({'windowState': 'normal'})
self._perform({'windowState': 'minimized'})
def fullscreen(self):
def full(self):
"""设置窗口为全屏"""
s = self._get_info()['bounds']['windowState']
if s == 'minimized':
@ -635,6 +635,10 @@ class WindowSetter(object):
"""窗口最小化"""
self.mini()
def fullscreen(self):
"""设置窗口为全屏"""
self.full()
class PageWindowSetter(WindowSetter):
def hide(self):

View File

@ -207,7 +207,7 @@ class WindowSetter(object):
def mini(self) -> None: ...
def fullscreen(self) -> None: ...
def full(self) -> None: ...
def normal(self) -> None: ...

View File

@ -132,6 +132,11 @@ class PageStates(object):
"""返回当前页面加载状态,'loading' 'interactive' 'complete'"""
return self._page._ready_state
@property
def has_alert(self):
"""返回当前页面加载状态,'loading' 'interactive' 'complete'"""
return self._page._has_alert
class FrameStates(object):
def __init__(self, frame):
@ -140,6 +145,11 @@ class FrameStates(object):
"""
self._frame = frame
@property
def is_loading(self):
"""返回页面是否在加载状态"""
return self._frame._is_loading
@property
def is_alive(self):
"""返回frame元素是否可用且里面仍挂载有frame"""
@ -152,4 +162,12 @@ class FrameStates(object):
@property
def ready_state(self):
"""返回加载状态"""
return self._frame._ready_state
@property
def is_displayed(self):
"""返回iframe是否显示"""
return not (self._frame.frame_ele.style('visibility') == 'hidden'
or self._frame.frame_ele.run_js('return this.offsetParent === null;')
or self._frame.frame_ele.style('display') == 'none')

View File

@ -69,11 +69,17 @@ class PageStates(object):
@property
def ready_state(self) -> Optional[str]: ...
@property
def has_alert(self) -> bool: ...
class FrameStates(object):
def __init__(self, frame: ChromiumFrame):
self._frame: ChromiumFrame = ...
@property
def is_loading(self) -> bool: ...
@property
def is_alive(self) -> bool: ...