diff --git a/DrissionPage/chromium_base.pyi b/DrissionPage/chromium_base.pyi index abd045c..4fdb880 100644 --- a/DrissionPage/chromium_base.pyi +++ b/DrissionPage/chromium_base.pyi @@ -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, diff --git a/DrissionPage/chromium_element.py b/DrissionPage/chromium_element.py index d15515f..b8bdc99 100644 --- a/DrissionPage/chromium_element.py +++ b/DrissionPage/chromium_element.py @@ -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'' @@ -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) diff --git a/DrissionPage/chromium_element.pyi b/DrissionPage/chromium_element.pyi index 0ea9f99..bc38d5e 100644 --- a/DrissionPage/chromium_element.pyi +++ b/DrissionPage/chromium_element.pyi @@ -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 = ... diff --git a/DrissionPage/chromium_frame.py b/DrissionPage/chromium_frame.py index 6cfe1e9..d4ad311 100644 --- a/DrissionPage/chromium_frame.py +++ b/DrissionPage/chromium_frame.py @@ -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}' @@ -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): diff --git a/DrissionPage/chromium_frame.pyi b/DrissionPage/chromium_frame.pyi index d4bccaf..db449da 100644 --- a/DrissionPage/chromium_frame.pyi +++ b/DrissionPage/chromium_frame.pyi @@ -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: ... diff --git a/DrissionPage/chromium_page.py b/DrissionPage/chromium_page.py index 1b9b35a..9d522e5 100644 --- a/DrissionPage/chromium_page.py +++ b/DrissionPage/chromium_page.py @@ -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 diff --git a/DrissionPage/chromium_page.pyi b/DrissionPage/chromium_page.pyi index 344d6d1..7852103 100644 --- a/DrissionPage/chromium_page.pyi +++ b/DrissionPage/chromium_page.pyi @@ -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: ... diff --git a/DrissionPage/session_page.py b/DrissionPage/session_page.py index 44037d5..0c8c587 100644 --- a/DrissionPage/session_page.py +++ b/DrissionPage/session_page.py @@ -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信息 diff --git a/DrissionPage/session_page.pyi b/DrissionPage/session_page.pyi index 9de258a..916c628 100644 --- a/DrissionPage/session_page.pyi +++ b/DrissionPage/session_page.pyi @@ -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]: ... diff --git a/DrissionPage/web_page.py b/DrissionPage/web_page.py index 21ff46c..c5e56a4 100644 --- a/DrissionPage/web_page.py +++ b/DrissionPage/web_page.py @@ -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` diff --git a/DrissionPage/web_page.pyi b/DrissionPage/web_page.pyi index 77efc2f..bbbc136 100644 --- a/DrissionPage/web_page.pyi +++ b/DrissionPage/web_page.pyi @@ -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: ...