mirror of
https://gitee.com/g1879/DrissionPage.git
synced 2024-12-10 04:00:23 +08:00
元素和frame对象的id和状态都集成到属性
This commit is contained in:
parent
3513760408
commit
afc9414600
@ -63,8 +63,6 @@ class ChromiumBase(BasePage):
|
||||
|
||||
def _onFileChooserOpened(self, **kwargs): ...
|
||||
|
||||
def set_upload_files(self, files: Union[str, list, tuple]) -> None: ...
|
||||
|
||||
def _set_start_options(self, address, none) -> None: ...
|
||||
|
||||
def _set_runtime_settings(self) -> None: ...
|
||||
@ -123,15 +121,6 @@ class ChromiumBase(BasePage):
|
||||
@property
|
||||
def set(self) -> ChromiumBaseSetter: ...
|
||||
|
||||
@property
|
||||
def set_page_load_strategy(self) -> PageLoadStrategy: ...
|
||||
|
||||
def set_cookies(self, cookies: Union[RequestsCookieJar, list, tuple, str, dict]) -> None: ...
|
||||
|
||||
def set_headers(self, headers: dict) -> None: ...
|
||||
|
||||
def set_timeouts(self, implicit: float = None, page_load: float = None, script: float = None) -> None: ...
|
||||
|
||||
def run_js(self, script: str, as_expr: bool = False, *args: Any) -> Any: ...
|
||||
|
||||
def run_js_loaded(self, script: str, as_expr: bool = False, *args: Any) -> Any: ...
|
||||
@ -145,8 +134,6 @@ class ChromiumBase(BasePage):
|
||||
interval: float = None,
|
||||
timeout: float = None) -> Union[None, bool]: ...
|
||||
|
||||
def wait_loading(self, timeout: float = None) -> bool: ...
|
||||
|
||||
def get_cookies(self, as_dict: bool = False) -> Union[list, dict]: ...
|
||||
|
||||
def ele(self,
|
||||
@ -167,12 +154,6 @@ class ChromiumBase(BasePage):
|
||||
timeout: float = None, single: bool = True, relative: bool = False) \
|
||||
-> Union[ChromiumElement, ChromiumFrame, NoneElement, List[Union[ChromiumElement, ChromiumFrame]]]: ...
|
||||
|
||||
def wait_ele(self,
|
||||
loc_or_ele: Union[str, tuple, ChromiumElement],
|
||||
timeout: float = None) -> ChromiumElementWaiter: ...
|
||||
|
||||
def scroll_to_see(self, loc_or_ele: Union[str, tuple, ChromiumElement]) -> None: ...
|
||||
|
||||
def refresh(self, ignore_cache: bool = False) -> None: ...
|
||||
|
||||
def forward(self, steps: int = 1) -> None: ...
|
||||
@ -187,16 +168,10 @@ class ChromiumBase(BasePage):
|
||||
|
||||
def run_cdp_loaded(self, cmd: str, **cmd_args) -> dict: ...
|
||||
|
||||
def set_user_agent(self, ua: str, platform: str = None) -> None: ...
|
||||
|
||||
def get_session_storage(self, item: str = None) -> Union[str, dict, None]: ...
|
||||
|
||||
def get_local_storage(self, item: str = None) -> Union[str, dict, None]: ...
|
||||
|
||||
def set_session_storage(self, item: str, value: Union[str, bool]) -> None: ...
|
||||
|
||||
def set_local_storage(self, item: str, value: Union[str, bool]) -> None: ...
|
||||
|
||||
def get_screenshot(self, path: [str, Path] = None,
|
||||
as_bytes: [bool, str] = None,
|
||||
full_page: bool = False,
|
||||
|
@ -52,8 +52,9 @@ class ChromiumElement(DrissionElement):
|
||||
self._node_id = self._get_node_id(obj_id=self._obj_id)
|
||||
self._backend_id = backend_id
|
||||
else:
|
||||
raise ElementLossError('原来获取到的元素对象已不在页面内。')
|
||||
raise ElementLossError
|
||||
|
||||
self._ids = ChromiumElementIds(self)
|
||||
doc = self.run_js('return this.ownerDocument;')
|
||||
self._doc_id = doc['objectId'] if doc else None
|
||||
|
||||
@ -106,24 +107,9 @@ class ChromiumElement(DrissionElement):
|
||||
|
||||
# -----------------d模式独有属性-------------------
|
||||
@property
|
||||
def obj_id(self):
|
||||
"""返回js中的object id"""
|
||||
return self._obj_id
|
||||
|
||||
@property
|
||||
def node_id(self):
|
||||
"""返回cdp中的node id"""
|
||||
return self._node_id
|
||||
|
||||
@property
|
||||
def backend_id(self):
|
||||
"""返回backend id"""
|
||||
return self._backend_id
|
||||
|
||||
@property
|
||||
def doc_id(self):
|
||||
"""返回所在document的object id"""
|
||||
return self._doc_id
|
||||
def ids(self):
|
||||
"""返回获取内置id的对象"""
|
||||
return self._ids
|
||||
|
||||
@property
|
||||
def size(self):
|
||||
@ -170,7 +156,7 @@ class ChromiumElement(DrissionElement):
|
||||
@property
|
||||
def shadow_root(self):
|
||||
"""返回当前元素的shadow_root元素对象"""
|
||||
info = self.page.run_cdp('DOM.describeNode', nodeId=self.node_id)['node']
|
||||
info = self.page.run_cdp('DOM.describeNode', nodeId=self.ids.node_id)['node']
|
||||
if not info.get('shadowRoots', None):
|
||||
return None
|
||||
|
||||
@ -668,7 +654,6 @@ class ChromiumElement(DrissionElement):
|
||||
self.page.run_cdp('DOM.setFileInputFiles', files=files, nodeId=self._node_id)
|
||||
|
||||
# ---------------准备废弃-----------------
|
||||
|
||||
def wait_ele(self, loc_or_ele, timeout=None):
|
||||
"""返回用于等待子元素到达某个状态的等待器对象
|
||||
:param loc_or_ele: 可以是元素、查询字符串、loc元组
|
||||
@ -793,6 +778,30 @@ class ChromiumElement(DrissionElement):
|
||||
warn("pseudo_after属性即将弃用,请用pseudo.after属性代替。", DeprecationWarning)
|
||||
return self.pseudo.after
|
||||
|
||||
@property
|
||||
def obj_id(self):
|
||||
"""返回js中的object id"""
|
||||
warn("obj_id属性即将弃用,请用ids.obj_id属性代替。", DeprecationWarning)
|
||||
return self._obj_id
|
||||
|
||||
@property
|
||||
def node_id(self):
|
||||
"""返回cdp中的node id"""
|
||||
warn("node_id属性即将弃用,请用ids.node_id属性代替。", DeprecationWarning)
|
||||
return self._node_id
|
||||
|
||||
@property
|
||||
def backend_id(self):
|
||||
"""返回backend id"""
|
||||
warn("backend_id属性即将弃用,请用ids.backend_id属性代替。", DeprecationWarning)
|
||||
return self._backend_id
|
||||
|
||||
@property
|
||||
def doc_id(self):
|
||||
"""返回所在document的object id"""
|
||||
warn("doc_id属性即将弃用,请用ids.doc_id属性代替。", DeprecationWarning)
|
||||
return self._doc_id
|
||||
|
||||
|
||||
class ChromiumShadowRootElement(BaseElement):
|
||||
"""ChromiumShadowRootElement是用于处理ShadowRoot的类,使用方法和ChromiumElement基本一致"""
|
||||
@ -813,6 +822,8 @@ class ChromiumShadowRootElement(BaseElement):
|
||||
self._obj_id = obj_id
|
||||
self._node_id = self._get_node_id(obj_id)
|
||||
self._backend_id = self._get_backend_id(self._node_id)
|
||||
self._ids = Ids(self)
|
||||
self._states = None
|
||||
|
||||
def __repr__(self):
|
||||
return f'<ShadowRootElement in {self.parent_ele} >'
|
||||
@ -826,35 +837,6 @@ class ChromiumShadowRootElement(BaseElement):
|
||||
"""
|
||||
return self.ele(loc_or_str, timeout)
|
||||
|
||||
@property
|
||||
def is_enabled(self):
|
||||
"""返回元素是否可用"""
|
||||
return not self.run_js('return this.disabled;')
|
||||
|
||||
@property
|
||||
def is_alive(self):
|
||||
"""返回元素是否仍在DOM中"""
|
||||
try:
|
||||
self.page.run_cdp('DOM.describeNode', nodeId=self._node_id)
|
||||
return True
|
||||
except Exception:
|
||||
return False
|
||||
|
||||
@property
|
||||
def node_id(self):
|
||||
"""返回元素cdp中的node id"""
|
||||
return self._node_id
|
||||
|
||||
@property
|
||||
def obj_id(self):
|
||||
"""返回元素js中的object id"""
|
||||
return self._obj_id
|
||||
|
||||
@property
|
||||
def backend_id(self):
|
||||
"""返回backend id"""
|
||||
return self._backend_id
|
||||
|
||||
@property
|
||||
def tag(self):
|
||||
"""返回元素标签名"""
|
||||
@ -870,6 +852,18 @@ class ChromiumShadowRootElement(BaseElement):
|
||||
"""返回内部的html文本"""
|
||||
return self.run_js('return this.innerHTML;')
|
||||
|
||||
@property
|
||||
def ids(self):
|
||||
"""返回获取内置id的对象"""
|
||||
return self._ids
|
||||
|
||||
@property
|
||||
def states(self):
|
||||
"""返回用于获取元素状态的对象"""
|
||||
if self._states is None:
|
||||
self._states = ShadowRootElementStates(self)
|
||||
return self._states
|
||||
|
||||
def run_js(self, script, as_expr=False, *args):
|
||||
"""运行javascript代码
|
||||
:param script: js文本
|
||||
@ -1049,6 +1043,64 @@ class ChromiumShadowRootElement(BaseElement):
|
||||
"""返回元素object id"""
|
||||
return self.page.run_cdp('DOM.describeNode', nodeId=node_id)['node']['backendNodeId']
|
||||
|
||||
# ------------准备废弃--------------
|
||||
@property
|
||||
def obj_id(self):
|
||||
"""返回js中的object id"""
|
||||
warn("obj_id属性即将弃用,请用ids.obj_id属性代替。", DeprecationWarning)
|
||||
return self._obj_id
|
||||
|
||||
@property
|
||||
def node_id(self):
|
||||
"""返回cdp中的node id"""
|
||||
warn("node_id属性即将弃用,请用ids.node_id属性代替。", DeprecationWarning)
|
||||
return self._node_id
|
||||
|
||||
@property
|
||||
def backend_id(self):
|
||||
"""返回backend id"""
|
||||
warn("backend_id属性即将弃用,请用ids.backend_id属性代替。", DeprecationWarning)
|
||||
return self._backend_id
|
||||
|
||||
@property
|
||||
def is_enabled(self):
|
||||
"""返回元素是否可用"""
|
||||
warn("is_enabled属性即将弃用,请用states.is_enabled属性代替。", DeprecationWarning)
|
||||
return self.states.is_enabled
|
||||
|
||||
@property
|
||||
def is_alive(self):
|
||||
"""返回元素是否仍在DOM中"""
|
||||
warn("is_alive属性即将弃用,请用states.is_alive属性代替。", DeprecationWarning)
|
||||
return self.states.is_alive
|
||||
|
||||
|
||||
class Ids(object):
|
||||
def __init__(self, ele):
|
||||
self._ele = ele
|
||||
|
||||
@property
|
||||
def node_id(self):
|
||||
"""返回元素cdp中的node id"""
|
||||
return self._ele._node_id
|
||||
|
||||
@property
|
||||
def obj_id(self):
|
||||
"""返回元素js中的object id"""
|
||||
return self._ele._obj_id
|
||||
|
||||
@property
|
||||
def backend_id(self):
|
||||
"""返回backend id"""
|
||||
return self._ele._backend_id
|
||||
|
||||
|
||||
class ChromiumElementIds(Ids):
|
||||
@property
|
||||
def doc_id(self):
|
||||
"""返回所在document的object id"""
|
||||
return self._ele._doc_id
|
||||
|
||||
|
||||
def find_in_chromium_ele(ele, loc, single=True, timeout=None, relative=True):
|
||||
"""在chromium元素中查找
|
||||
@ -1095,7 +1147,7 @@ def find_by_xpath(ele, xpath, single, timeout, relative=True):
|
||||
node_txt = 'this.contentDocument' if ele.tag in FRAME_ELEMENT and not relative else 'this'
|
||||
js = make_js_for_find_ele_by_xpath(xpath, type_txt, node_txt)
|
||||
r = ele.page.run_cdp('Runtime.callFunctionOn',
|
||||
functionDeclaration=js, objectId=ele.obj_id, returnByValue=False, awaitPromise=True,
|
||||
functionDeclaration=js, objectId=ele.ids.obj_id, returnByValue=False, awaitPromise=True,
|
||||
userGesture=True)
|
||||
if r['result']['type'] == 'string':
|
||||
return r['result']['value']
|
||||
@ -1104,7 +1156,8 @@ def find_by_xpath(ele, xpath, single, timeout, relative=True):
|
||||
if 'The result is not a node set' in r['result']['description']:
|
||||
js = make_js_for_find_ele_by_xpath(xpath, '1', node_txt)
|
||||
r = ele.page.run_cdp('Runtime.callFunctionOn',
|
||||
functionDeclaration=js, objectId=ele.obj_id, returnByValue=False, awaitPromise=True,
|
||||
functionDeclaration=js, objectId=ele.ids.obj_id, returnByValue=False,
|
||||
awaitPromise=True,
|
||||
userGesture=True)
|
||||
return r['result']['value']
|
||||
else:
|
||||
@ -1114,7 +1167,7 @@ def find_by_xpath(ele, xpath, single, timeout, relative=True):
|
||||
while (r['result']['subtype'] == 'null'
|
||||
or r['result']['description'] == 'NodeList(0)') and perf_counter() < end_time:
|
||||
r = ele.page.run_cdp('Runtime.callFunctionOn',
|
||||
functionDeclaration=js, objectId=ele.obj_id, returnByValue=False, awaitPromise=True,
|
||||
functionDeclaration=js, objectId=ele.ids.obj_id, returnByValue=False, awaitPromise=True,
|
||||
userGesture=True)
|
||||
|
||||
if single:
|
||||
@ -1143,7 +1196,7 @@ def find_by_css(ele, selector, single, timeout):
|
||||
node_txt = 'this.contentDocument' if ele.tag in ('iframe', 'frame', 'shadow-root') else 'this'
|
||||
js = f'function(){{return {node_txt}.querySelector{find_all}("{selector}");}}'
|
||||
r = ele.page.run_cdp('Runtime.callFunctionOn',
|
||||
functionDeclaration=js, objectId=ele.obj_id, returnByValue=False, awaitPromise=True,
|
||||
functionDeclaration=js, objectId=ele.ids.obj_id, returnByValue=False, awaitPromise=True,
|
||||
userGesture=True)
|
||||
if 'exceptionDetails' in r:
|
||||
raise SyntaxError(f'查询语句错误:\n{r}')
|
||||
@ -1152,7 +1205,7 @@ def find_by_css(ele, selector, single, timeout):
|
||||
while (r['result']['subtype'] == 'null'
|
||||
or r['result']['description'] == 'NodeList(0)') and perf_counter() < end_time:
|
||||
r = ele.page.run_cdp('Runtime.callFunctionOn',
|
||||
functionDeclaration=js, objectId=ele.obj_id, returnByValue=False, awaitPromise=True,
|
||||
functionDeclaration=js, objectId=ele.ids.obj_id, returnByValue=False, awaitPromise=True,
|
||||
userGesture=True)
|
||||
|
||||
if single:
|
||||
@ -1233,7 +1286,7 @@ def run_js(page_or_ele, script, as_expr=False, timeout=None, args=None):
|
||||
"""
|
||||
if isinstance(page_or_ele, (ChromiumElement, ChromiumShadowRootElement)):
|
||||
page = page_or_ele.page
|
||||
obj_id = page_or_ele.obj_id
|
||||
obj_id = page_or_ele.ids.obj_id
|
||||
is_page = False
|
||||
else:
|
||||
page = page_or_ele
|
||||
@ -1311,7 +1364,7 @@ def parse_js_result(page, ele, result):
|
||||
def convert_argument(arg):
|
||||
"""把参数转换成js能够接收的形式"""
|
||||
if isinstance(arg, ChromiumElement):
|
||||
return {'objectId': arg.obj_id}
|
||||
return {'objectId': arg.ids.obj_id}
|
||||
|
||||
elif isinstance(arg, (int, float, str, bool)):
|
||||
return {'value': arg}
|
||||
@ -1397,6 +1450,28 @@ class ChromiumElementStates(object):
|
||||
return location_in_viewport(self._ele.page, x, y) if x else False
|
||||
|
||||
|
||||
class ShadowRootElementStates(object):
|
||||
def __init__(self, ele):
|
||||
"""
|
||||
:param ele: ChromiumElement
|
||||
"""
|
||||
self._ele = ele
|
||||
|
||||
@property
|
||||
def is_enabled(self):
|
||||
"""返回元素是否可用"""
|
||||
return not self._ele.run_js('return this.disabled;')
|
||||
|
||||
@property
|
||||
def is_alive(self):
|
||||
"""返回元素是否仍在DOM中"""
|
||||
try:
|
||||
self._ele.page.run_cdp('DOM.describeNode', nodeId=self._ele.ids.node_id)
|
||||
return True
|
||||
except Exception:
|
||||
return False
|
||||
|
||||
|
||||
class ChromiumElementSetter(object):
|
||||
def __init__(self, ele):
|
||||
"""
|
||||
@ -1410,7 +1485,7 @@ class ChromiumElementSetter(object):
|
||||
:param value: 属性值
|
||||
:return: None
|
||||
"""
|
||||
self._ele.page.run_cdp('DOM.setAttributeValue', nodeId=self._ele.node_id, name=attr, value=str(value))
|
||||
self._ele.page.run_cdp('DOM.setAttributeValue', nodeId=self._ele.ids.node_id, name=attr, value=str(value))
|
||||
|
||||
def prop(self, prop, value):
|
||||
"""设置元素property属性
|
||||
@ -1485,7 +1560,7 @@ class Locations(object):
|
||||
:return: 四个角坐标,大小为0时返回None
|
||||
"""
|
||||
try:
|
||||
return self._ele.page.run_cdp('DOM.getBoxModel', nodeId=self._ele.node_id)['model'][quad]
|
||||
return self._ele.page.run_cdp('DOM.getBoxModel', nodeId=self._ele.ids.node_id)['model'][quad]
|
||||
except CallMethodError:
|
||||
return None
|
||||
|
||||
@ -1532,7 +1607,7 @@ class Click(object):
|
||||
except Exception:
|
||||
return None
|
||||
|
||||
if retry and r.get('nodeId') != self._ele.node_id:
|
||||
if retry and r.get('nodeId') != self._ele.ids.node_id:
|
||||
return False
|
||||
|
||||
self._click(cx, cy)
|
||||
|
@ -26,6 +26,7 @@ class ChromiumElement(DrissionElement):
|
||||
self._obj_id: str = ...
|
||||
self._backend_id: str = ...
|
||||
self._doc_id: str = ...
|
||||
self._ids: ChromiumElementIds = ...
|
||||
self._scroll: ChromiumScroll = ...
|
||||
self._click: Click = ...
|
||||
self._select: ChromiumSelect = ...
|
||||
@ -61,16 +62,7 @@ class ChromiumElement(DrissionElement):
|
||||
|
||||
# -----------------d模式独有属性-------------------
|
||||
@property
|
||||
def obj_id(self) -> str: ...
|
||||
|
||||
@property
|
||||
def node_id(self) -> str: ...
|
||||
|
||||
@property
|
||||
def backend_id(self) -> str: ...
|
||||
|
||||
@property
|
||||
def doc_id(self) -> str: ...
|
||||
def ids(self) -> ChromiumElementIds: ...
|
||||
|
||||
@property
|
||||
def size(self) -> Tuple[int, int]: ...
|
||||
@ -90,27 +82,12 @@ class ChromiumElement(DrissionElement):
|
||||
@property
|
||||
def pseudo(self) -> Pseudo: ...
|
||||
|
||||
@property
|
||||
def client_location(self) -> Tuple[int, int]: ...
|
||||
|
||||
@property
|
||||
def client_midpoint(self) -> Tuple[int, int]: ...
|
||||
|
||||
@property
|
||||
def midpoint(self) -> Tuple[int, int]: ...
|
||||
|
||||
@property
|
||||
def shadow_root(self) -> Union[None, ChromiumShadowRootElement]: ...
|
||||
|
||||
@property
|
||||
def sr(self) -> Union[None, ChromiumShadowRootElement]: ...
|
||||
|
||||
@property
|
||||
def pseudo_before(self) -> str: ...
|
||||
|
||||
@property
|
||||
def pseudo_after(self) -> str: ...
|
||||
|
||||
@property
|
||||
def scroll(self) -> ChromiumScroll: ...
|
||||
|
||||
@ -155,43 +132,18 @@ class ChromiumElement(DrissionElement):
|
||||
filter_loc: Union[tuple, str] = '',
|
||||
timeout: float = None) -> List[Union[ChromiumElement, str]]: ...
|
||||
|
||||
def wait_ele(self,
|
||||
loc_or_ele: Union[str, tuple, ChromiumElement],
|
||||
timeout: float = None) -> ChromiumWaiter: ...
|
||||
|
||||
@property
|
||||
def wait(self) -> ChromiumWaiter: ...
|
||||
|
||||
@property
|
||||
def select(self) -> ChromiumSelect: ...
|
||||
|
||||
@property
|
||||
def is_selected(self) -> bool: ...
|
||||
|
||||
@property
|
||||
def is_displayed(self) -> bool: ...
|
||||
|
||||
@property
|
||||
def is_enabled(self) -> bool: ...
|
||||
|
||||
@property
|
||||
def is_alive(self) -> bool: ...
|
||||
|
||||
@property
|
||||
def is_in_viewport(self) -> bool: ...
|
||||
|
||||
def attr(self, attr: str) -> Union[str, None]: ...
|
||||
|
||||
def remove_attr(self, attr: str) -> None: ...
|
||||
|
||||
def prop(self, prop: str) -> Union[str, int, None]: ...
|
||||
|
||||
def set_attr(self, attr: str, value: str) -> None: ...
|
||||
|
||||
def set_prop(self, prop: str, value: str) -> None: ...
|
||||
|
||||
def set_innerHTML(self, html: str) -> None: ...
|
||||
|
||||
def run_js(self, script: str, as_expr: bool = False, *args: Any) -> Any: ...
|
||||
|
||||
def run_async_js(self, script: str, as_expr: bool = False, *args: Any) -> None: ...
|
||||
@ -228,14 +180,6 @@ class ChromiumElement(DrissionElement):
|
||||
|
||||
def clear(self, by_js: bool = False) -> None: ...
|
||||
|
||||
def click_at(self, offset_x: int = None, offset_y: int = None, button: str = 'left') -> None: ...
|
||||
|
||||
def r_click(self) -> None: ...
|
||||
|
||||
def r_click_at(self, offset_x: int = None, offset_y: int = None) -> None: ...
|
||||
|
||||
def m_click(self) -> None: ...
|
||||
|
||||
def hover(self, offset_x: int = None, offset_y: int = None) -> None: ...
|
||||
|
||||
def drag(self, offset_x: int = 0, offset_y: int = 0, speed: int = 40, shake: bool = True) -> None: ...
|
||||
@ -281,10 +225,12 @@ class ChromiumShadowRootElement(BaseElement):
|
||||
obj_id: str = None,
|
||||
backend_id: str = None):
|
||||
self._obj_id: str = ...
|
||||
self._ids: Ids = ...
|
||||
self._node_id: str = ...
|
||||
self._backend_id: str = ...
|
||||
self.page: ChromiumPage = ...
|
||||
self.parent_ele: ChromiumElement = ...
|
||||
self._states: ShadowRootElementStates = ...
|
||||
|
||||
def __repr__(self) -> str: ...
|
||||
|
||||
@ -293,19 +239,10 @@ class ChromiumShadowRootElement(BaseElement):
|
||||
timeout: float = None) -> Union[ChromiumElement, ChromiumFrame, None]: ...
|
||||
|
||||
@property
|
||||
def is_enabled(self) -> bool: ...
|
||||
def ids(self) -> Ids: ...
|
||||
|
||||
@property
|
||||
def is_alive(self) -> bool: ...
|
||||
|
||||
@property
|
||||
def node_id(self) -> str: ...
|
||||
|
||||
@property
|
||||
def obj_id(self) -> str: ...
|
||||
|
||||
@property
|
||||
def backend_id(self) -> str: ...
|
||||
def states(self) -> ShadowRootElementStates: ...
|
||||
|
||||
@property
|
||||
def tag(self) -> str: ...
|
||||
@ -366,6 +303,25 @@ class ChromiumShadowRootElement(BaseElement):
|
||||
def _get_backend_id(self, node_id: str) -> str: ...
|
||||
|
||||
|
||||
class Ids(object):
|
||||
def __init__(self, ele: Union[ChromiumElement, ChromiumShadowRootElement]):
|
||||
self._ele: Union[ChromiumElement, ChromiumShadowRootElement] = ...
|
||||
|
||||
@property
|
||||
def node_id(self) -> str: ...
|
||||
|
||||
@property
|
||||
def obj_id(self) -> str: ...
|
||||
|
||||
@property
|
||||
def backend_id(self) -> str: ...
|
||||
|
||||
|
||||
class ChromiumElementIds(Ids):
|
||||
@property
|
||||
def doc_id(self) -> str: ...
|
||||
|
||||
|
||||
def find_in_chromium_ele(ele: ChromiumElement,
|
||||
loc: Union[str, Tuple[str, str]],
|
||||
single: bool = True,
|
||||
@ -421,6 +377,20 @@ class ChromiumElementSetter(object):
|
||||
def innerHTML(self, html: str) -> None: ...
|
||||
|
||||
|
||||
class ShadowRootElementStates(object):
|
||||
def __init__(self, ele: ChromiumShadowRootElement):
|
||||
"""
|
||||
:param ele: ChromiumElement
|
||||
"""
|
||||
self._ele: ChromiumShadowRootElement = ...
|
||||
|
||||
@property
|
||||
def is_enabled(self) -> bool: ...
|
||||
|
||||
@property
|
||||
def is_alive(self) -> bool: ...
|
||||
|
||||
|
||||
class Locations(object):
|
||||
def __init__(self, ele: ChromiumElement):
|
||||
self._ele: ChromiumElement = ...
|
||||
|
@ -15,10 +15,11 @@ class ChromiumFrame(ChromiumBase):
|
||||
def __init__(self, page, ele):
|
||||
self.page = page
|
||||
self.address = page.address
|
||||
node = page.run_cdp('DOM.describeNode', nodeId=ele.node_id)['node']
|
||||
node = page.run_cdp('DOM.describeNode', nodeId=ele.ids.node_id)['node']
|
||||
self.frame_id = node['frameId']
|
||||
self._backend_id = ele.backend_id
|
||||
self._backend_id = ele.ids.backend_id
|
||||
self._frame_ele = ele
|
||||
self._states = None
|
||||
|
||||
if self._is_inner_frame():
|
||||
self._is_diff_domain = False
|
||||
@ -29,6 +30,7 @@ class ChromiumFrame(ChromiumBase):
|
||||
super().__init__(page.address, self.frame_id, page.timeout)
|
||||
obj_id = super().run_js('document;', as_expr=True)['objectId']
|
||||
self.doc_ele = ChromiumElement(self, obj_id=obj_id)
|
||||
self._ids = ChromiumFrameIds(self)
|
||||
|
||||
def __call__(self, loc_or_str, timeout=None):
|
||||
"""在内部查找元素
|
||||
@ -63,7 +65,7 @@ class ChromiumFrame(ChromiumBase):
|
||||
def _reload(self):
|
||||
"""重新获取document"""
|
||||
self._frame_ele = ChromiumElement(self.page, backend_id=self._backend_id)
|
||||
node = self.page.run_cdp('DOM.describeNode', nodeId=self._frame_ele.node_id)['node']
|
||||
node = self.page.run_cdp('DOM.describeNode', nodeId=self._frame_ele.ids.node_id)['node']
|
||||
|
||||
if self._is_inner_frame():
|
||||
self._is_diff_domain = False
|
||||
@ -82,7 +84,7 @@ class ChromiumFrame(ChromiumBase):
|
||||
self._reload()
|
||||
|
||||
try:
|
||||
self.run_cdp('DOM.describeNode', nodeId=self.node_id)
|
||||
self.run_cdp('DOM.describeNode', nodeId=self.ids.node_id)
|
||||
except Exception:
|
||||
self._reload()
|
||||
# sleep(2)
|
||||
@ -99,7 +101,7 @@ class ChromiumFrame(ChromiumBase):
|
||||
try:
|
||||
if self._is_diff_domain is False:
|
||||
node = self.page.run_cdp('DOM.describeNode',
|
||||
backendNodeId=self.backend_id)['node']
|
||||
backendNodeId=self.ids.backend_id)['node']
|
||||
self.doc_ele = ChromiumElement(self.page, backend_id=node['contentDocument']['backendNodeId'])
|
||||
|
||||
else:
|
||||
@ -133,24 +135,8 @@ class ChromiumFrame(ChromiumBase):
|
||||
self._get_new_document()
|
||||
|
||||
@property
|
||||
def tab_id(self):
|
||||
"""返回当前标签页id"""
|
||||
return self.page.tab_id
|
||||
|
||||
@property
|
||||
def backend_id(self):
|
||||
"""返回cdp中的node id"""
|
||||
return self._backend_id
|
||||
|
||||
@property
|
||||
def obj_id(self):
|
||||
"""返回frame元素的object id"""
|
||||
return self.frame_ele.obj_id
|
||||
|
||||
@property
|
||||
def node_id(self):
|
||||
"""返回cdp中的node id"""
|
||||
return self.frame_ele.node_id
|
||||
def ids(self):
|
||||
return self._ids
|
||||
|
||||
@property
|
||||
def frame_ele(self):
|
||||
@ -175,7 +161,7 @@ class ChromiumFrame(ChromiumBase):
|
||||
self._check_ok()
|
||||
tag = self.tag
|
||||
out_html = self.page.run_cdp('DOM.getOuterHTML',
|
||||
nodeId=self.frame_ele.node_id)['outerHTML']
|
||||
nodeId=self.frame_ele.ids.node_id)['outerHTML']
|
||||
sign = search(rf'<{tag}.*?>', out_html).group(0)
|
||||
return f'{sign}{self.inner_html}</{tag}>'
|
||||
|
||||
@ -229,12 +215,6 @@ class ChromiumFrame(ChromiumBase):
|
||||
self._check_ok()
|
||||
return self.frame_ele.location
|
||||
|
||||
@property
|
||||
def is_displayed(self):
|
||||
"""返回frame元素是否显示"""
|
||||
self._check_ok()
|
||||
return self.frame_ele.states.is_displayed
|
||||
|
||||
@property
|
||||
def xpath(self):
|
||||
"""返回frame的xpath绝对路径"""
|
||||
@ -275,6 +255,13 @@ class ChromiumFrame(ChromiumBase):
|
||||
self._set = ChromiumFrameSetter(self)
|
||||
return self._set
|
||||
|
||||
@property
|
||||
def states(self):
|
||||
"""返回用于获取状态信息的对象"""
|
||||
if self._states is None:
|
||||
self._states = ChromiumFrameStates(self)
|
||||
return self._states
|
||||
|
||||
def refresh(self):
|
||||
"""刷新frame页面"""
|
||||
self._check_ok()
|
||||
@ -453,6 +440,7 @@ class ChromiumFrame(ChromiumBase):
|
||||
"""返回当前frame是否同域"""
|
||||
return self.frame_id in str(self.page.run_cdp('Page.getFrameTree')['frameTree'])
|
||||
|
||||
# -------------准备废弃------------
|
||||
def set_attr(self, attr, value):
|
||||
"""设置frame元素attribute属性
|
||||
:param attr: 属性名
|
||||
@ -462,6 +450,71 @@ class ChromiumFrame(ChromiumBase):
|
||||
warn("set_attr()方法即将弃用,请用set.attr()方法代替。", DeprecationWarning)
|
||||
self.set.attr(attr, value)
|
||||
|
||||
@property
|
||||
def is_displayed(self):
|
||||
"""返回frame元素是否显示"""
|
||||
warn("is_displayed属性即将弃用,请用states.is_displayed属性代替。", DeprecationWarning)
|
||||
return self.states.is_displayed()
|
||||
|
||||
@property
|
||||
def tab_id(self):
|
||||
"""返回当前标签页id"""
|
||||
warn("tab_id属性即将弃用,请用ids.tab_id属性代替。", DeprecationWarning)
|
||||
return self.ids.tab_id
|
||||
|
||||
@property
|
||||
def backend_id(self):
|
||||
"""返回cdp中的node id"""
|
||||
warn("backend_id属性即将弃用,请用ids.backend_id属性代替。", DeprecationWarning)
|
||||
return self.ids.backend_id
|
||||
|
||||
@property
|
||||
def obj_id(self):
|
||||
"""返回frame元素的object id"""
|
||||
warn("obj_id属性即将弃用,请用ids.obj_id属性代替。", DeprecationWarning)
|
||||
return self.ids.obj_id
|
||||
|
||||
@property
|
||||
def node_id(self):
|
||||
"""返回cdp中的node id"""
|
||||
warn("node_id属性即将弃用,请用ids.node_id属性代替。", DeprecationWarning)
|
||||
return self.ids.node_id
|
||||
|
||||
|
||||
class ChromiumFrameIds(object):
|
||||
def __init__(self, frame):
|
||||
self._frame = frame
|
||||
|
||||
@property
|
||||
def tab_id(self):
|
||||
"""返回当前标签页id"""
|
||||
return self._frame.page.tab_id
|
||||
|
||||
@property
|
||||
def backend_id(self):
|
||||
"""返回cdp中的node id"""
|
||||
return self._frame._backend_id
|
||||
|
||||
@property
|
||||
def obj_id(self):
|
||||
"""返回frame元素的object id"""
|
||||
return self._frame.frame_ele.ids.obj_id
|
||||
|
||||
@property
|
||||
def node_id(self):
|
||||
"""返回cdp中的node id"""
|
||||
return self._frame.frame_ele.ids.node_id
|
||||
|
||||
|
||||
class ChromiumFrameStates(object):
|
||||
def __init__(self, frame):
|
||||
self._frame = frame
|
||||
|
||||
def is_displayed(self):
|
||||
"""返回frame元素是否显示"""
|
||||
self._frame._check_ok()
|
||||
return self._frame.frame_ele.states.is_displayed
|
||||
|
||||
|
||||
class ChromiumFrameScroll(ChromiumPageScroll):
|
||||
def __init__(self, frame):
|
||||
|
@ -20,6 +20,8 @@ class ChromiumFrame(ChromiumBase):
|
||||
self._doc_ele: ChromiumElement = ...
|
||||
self._is_diff_domain: bool = ...
|
||||
self.doc_ele: ChromiumElement = ...
|
||||
self._states: ChromiumFrameStates = ...
|
||||
self._ids: ChromiumFrameIds = ...
|
||||
# self.is_loading: bool = ...
|
||||
|
||||
def __call__(self,
|
||||
@ -43,16 +45,7 @@ class ChromiumFrame(ChromiumBase):
|
||||
def _onFrameDetached(self, **kwargs): ...
|
||||
|
||||
@property
|
||||
def tab_id(self) -> str: ...
|
||||
|
||||
@property
|
||||
def backend_id(self) -> str: ...
|
||||
|
||||
@property
|
||||
def obj_id(self) -> str: ...
|
||||
|
||||
@property
|
||||
def node_id(self) -> str: ...
|
||||
def ids(self) -> ChromiumFrameIds: ...
|
||||
|
||||
@property
|
||||
def frame_ele(self) -> ChromiumElement: ...
|
||||
@ -90,9 +83,6 @@ class ChromiumFrame(ChromiumBase):
|
||||
@property
|
||||
def location(self) -> Tuple[int, int]: ...
|
||||
|
||||
@property
|
||||
def is_displayed(self) -> bool: ...
|
||||
|
||||
@property
|
||||
def xpath(self) -> str: ...
|
||||
|
||||
@ -108,12 +98,13 @@ class ChromiumFrame(ChromiumBase):
|
||||
@property
|
||||
def set(self) -> ChromiumFrameSetter: ...
|
||||
|
||||
@property
|
||||
def states(self) -> ChromiumFrameStates: ...
|
||||
|
||||
def refresh(self) -> None: ...
|
||||
|
||||
def attr(self, attr: str) -> Union[str, None]: ...
|
||||
|
||||
def set_attr(self, attr: str, value: str) -> None: ...
|
||||
|
||||
def remove_attr(self, attr: str) -> None: ...
|
||||
|
||||
def run_js(self, script: str, as_expr: bool = False, *args: Any) -> Any: ...
|
||||
@ -171,6 +162,23 @@ class ChromiumFrame(ChromiumBase):
|
||||
def _is_inner_frame(self) -> bool: ...
|
||||
|
||||
|
||||
class ChromiumFrameIds(object):
|
||||
def __init__(self, frame: ChromiumFrame):
|
||||
self._frame: ChromiumFrame = ...
|
||||
|
||||
@property
|
||||
def tab_id(self) -> str: ...
|
||||
|
||||
@property
|
||||
def backend_id(self) -> str: ...
|
||||
|
||||
@property
|
||||
def obj_id(self) -> str: ...
|
||||
|
||||
@property
|
||||
def node_id(self) -> str: ...
|
||||
|
||||
|
||||
class ChromiumFrameScroll(ChromiumPageScroll):
|
||||
def __init__(self, frame: ChromiumFrame) -> None: ...
|
||||
|
||||
@ -179,3 +187,10 @@ class ChromiumFrameSetter(ChromiumBaseSetter):
|
||||
_page: ChromiumFrame = ...
|
||||
|
||||
def attr(self, attr: str, value: str) -> None: ...
|
||||
|
||||
|
||||
class ChromiumFrameStates(object):
|
||||
def __init__(self, frame: ChromiumFrame):
|
||||
self._frame: ChromiumFrame = ...
|
||||
|
||||
def is_displayed(self) -> bool: ...
|
||||
|
@ -358,6 +358,7 @@ class ChromiumPage(ChromiumBase):
|
||||
self._alert.response_text = None
|
||||
self._tab_obj.has_alert = True
|
||||
|
||||
# --------------准备弃用-------------
|
||||
def set_main_tab(self, tab_id=None):
|
||||
"""设置主tab
|
||||
:param tab_id: 标签页id,不传入则设置当前tab
|
||||
|
@ -67,9 +67,6 @@ class ChromiumPage(ChromiumBase):
|
||||
@property
|
||||
def set(self) -> ChromiumPageSetter: ...
|
||||
|
||||
@property
|
||||
def set_window(self) -> WindowSetter: ...
|
||||
|
||||
@property
|
||||
def download_set(self) -> ChromiumDownloadSetter: ...
|
||||
|
||||
@ -85,8 +82,6 @@ class ChromiumPage(ChromiumBase):
|
||||
|
||||
def new_tab(self, url: str = None, switch_to: bool = True) -> None: ...
|
||||
|
||||
def set_main_tab(self, tab_id: str = None) -> None: ...
|
||||
|
||||
def to_main_tab(self) -> None: ...
|
||||
|
||||
def to_tab(self, tab_id: str = None, activate: bool = True) -> None: ...
|
||||
|
@ -329,6 +329,7 @@ class SessionPage(BasePage):
|
||||
raise ConnectionError(f'状态码:{r.status_code}')
|
||||
return r, f'状态码:{r.status_code}'
|
||||
|
||||
# --------------准备废弃----------------
|
||||
def set_cookies(self, cookies):
|
||||
"""为Session对象设置cookies
|
||||
:param cookies: cookies信息
|
||||
|
@ -45,12 +45,6 @@ class SessionPage(BasePage):
|
||||
|
||||
def _set_runtime_settings(self) -> None: ...
|
||||
|
||||
def set_cookies(self, cookies: Union[RequestsCookieJar, list, tuple, str, dict]) -> None: ...
|
||||
|
||||
def set_headers(self, headers: dict) -> None: ...
|
||||
|
||||
def set_user_agent(self, ua: str) -> None: ...
|
||||
|
||||
def __call__(self,
|
||||
loc_or_str: Union[Tuple[str, str], str, SessionElement],
|
||||
timeout: float = None) -> Union[SessionElement, str, NoneElement]: ...
|
||||
|
@ -400,6 +400,7 @@ class WebPage(SessionPage, ChromiumPage, BasePage):
|
||||
self.driver.Browser.close()
|
||||
except Exception:
|
||||
pass
|
||||
self._tab_obj.stop()
|
||||
self._tab_obj = None
|
||||
self._has_driver = None
|
||||
|
||||
@ -437,6 +438,7 @@ class WebPage(SessionPage, ChromiumPage, BasePage):
|
||||
self._tab_obj = None
|
||||
self._has_driver = None
|
||||
|
||||
# ---------------准备废弃---------------
|
||||
def set_cookies(self, cookies, set_session=False, set_driver=False):
|
||||
"""添加cookies信息到浏览器或session对象
|
||||
:param cookies: 可以接收`CookieJar`、`list`、`tuple`、`str`、`dict`格式的`cookies`
|
||||
|
@ -122,12 +122,6 @@ class WebPage(SessionPage, ChromiumPage, BasePage):
|
||||
|
||||
def get_cookies(self, as_dict: bool = False, all_domains: bool = False) -> Union[dict, list]: ...
|
||||
|
||||
def set_user_agent(self, ua: str, platform: str = None) -> None: ...
|
||||
|
||||
def set_headers(self, headers: dict) -> None: ...
|
||||
|
||||
def set_cookies(self, cookies, set_session: bool = False, set_driver: bool = False) -> None: ...
|
||||
|
||||
def _get_driver_cookies(self, as_dict: bool = False) -> dict: ...
|
||||
|
||||
def close_driver(self) -> None: ...
|
||||
|
Loading…
x
Reference in New Issue
Block a user