From fd5e8aa89d3d6a00c7e81e57ac125c1721e8282f Mon Sep 17 00:00:00 2001 From: g1879 Date: Sat, 26 Aug 2023 08:46:25 +0800 Subject: [PATCH] =?UTF-8?q?ChromiumFrame=E5=A2=9E=E5=8A=A0=5Ftarget=5Fpage?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DrissionPage/chromium_driver.py | 23 ++++++++-------- DrissionPage/chromium_driver.pyi | 2 +- DrissionPage/chromium_frame.py | 47 +++++++++++++++++++------------- DrissionPage/chromium_frame.pyi | 3 ++ DrissionPage/chromium_page.py | 6 +++- 5 files changed, 49 insertions(+), 32 deletions(-) diff --git a/DrissionPage/chromium_driver.py b/DrissionPage/chromium_driver.py index 01aede3..fde230f 100644 --- a/DrissionPage/chromium_driver.py +++ b/DrissionPage/chromium_driver.py @@ -25,7 +25,7 @@ class ChromiumDriver(object): self.id = tab_id self.address = address self.type = tab_type - self.debug = False + self._debug = False self.has_alert = False self._websocket_url = f'ws://{address}/devtools/{tab_type}/{tab_id}' @@ -57,11 +57,12 @@ class ChromiumDriver(object): message_json = dumps(message) - if self.debug: - if self.debug is True or (isinstance(self.debug, str) and message.get('method', '').startswith(self.debug)): + if self._debug: + if self._debug is True or ( + isinstance(self._debug, str) and message.get('method', '').startswith(self._debug)): print(f'发> {message_json}') - elif isinstance(self.debug, (list, tuple, set)): - for m in self.debug: + elif isinstance(self._debug, (list, tuple, set)): + for m in self._debug: if message.get('method', '').startswith(m): print(f'发> {message_json}') break @@ -112,12 +113,12 @@ class ChromiumDriver(object): self.stop() return - if self.debug: - if self.debug is True or 'id' in mes or (isinstance(self.debug, str) - and mes.get('method', '').startswith(self.debug)): + if self._debug: + if self._debug is True or 'id' in mes or (isinstance(self._debug, str) + and mes.get('method', '').startswith(self._debug)): print(f'<收 {message_json}') - elif isinstance(self.debug, (list, tuple, set)): - for m in self.debug: + elif isinstance(self._debug, (list, tuple, set)): + for m in self._debug: if mes.get('method', '').startswith(m): print(f'<收 {message_json}') break @@ -129,7 +130,7 @@ class ChromiumDriver(object): if mes["id"] in self.method_results: self.method_results[mes['id']].put(mes) - elif self.debug: + elif self._debug: print(f'未知信息:{mes}') def _handle_event_loop(self): diff --git a/DrissionPage/chromium_driver.pyi b/DrissionPage/chromium_driver.pyi index 0c63041..9ba7feb 100644 --- a/DrissionPage/chromium_driver.pyi +++ b/DrissionPage/chromium_driver.pyi @@ -23,7 +23,7 @@ class ChromiumDriver(object): id: str address: str type: str - debug: bool + _debug: bool has_alert: bool _websocket_url: str _cur_id: int diff --git a/DrissionPage/chromium_frame.py b/DrissionPage/chromium_frame.py index d9d797d..a5fbebe 100644 --- a/DrissionPage/chromium_frame.py +++ b/DrissionPage/chromium_frame.py @@ -21,7 +21,14 @@ class ChromiumFrame(ChromiumBase): :param page: frame所在的页面对象 :param ele: frame所在元素 """ - self.page = page + page_type = str(type(page)) + if 'ChromiumPage' in page_type or 'WebPage' in page: + self.page = self._target_page = self.tab = page + else: # Tab、Frame + self.page = page.page + self._target_page = page + self.tab = page.tab if 'ChromiumFrame' in page_type else page + self.address = page.address node = page.run_cdp('DOM.describeNode', backendNodeId=ele.ids.backend_id)['node'] self.frame_id = node['frameId'] @@ -32,7 +39,7 @@ class ChromiumFrame(ChromiumBase): if self._is_inner_frame(): self._is_diff_domain = False - self.doc_ele = ChromiumElement(self.page, backend_id=node['contentDocument']['backendNodeId']) + self.doc_ele = ChromiumElement(self._target_page, backend_id=node['contentDocument']['backendNodeId']) super().__init__(page.address, page.tab_id, page.timeout) else: self._is_diff_domain = True @@ -65,8 +72,8 @@ class ChromiumFrame(ChromiumBase): def _runtime_settings(self): """重写设置浏览器运行参数方法""" - self._timeouts = self.page.timeouts - self._page_load_strategy = self.page.page_load_strategy + self._timeouts = self._target_page.timeouts + self._page_load_strategy = self._target_page.page_load_strategy def _driver_init(self, tab_id): """避免出现服务器500错误 @@ -87,18 +94,18 @@ class ChromiumFrame(ChromiumBase): if debug: print('重新获取document') - self._frame_ele = ChromiumElement(self.page, backend_id=self._backend_id) - node = self.page.run_cdp('DOM.describeNode', backendNodeId=self._frame_ele.ids.backend_id)['node'] + self._frame_ele = ChromiumElement(self._target_page, backend_id=self._backend_id) + node = self._target_page.run_cdp('DOM.describeNode', backendNodeId=self._frame_ele.ids.backend_id)['node'] if self._is_inner_frame(): self._is_diff_domain = False - self.doc_ele = ChromiumElement(self.page, backend_id=node['contentDocument']['backendNodeId']) - super().__init__(self.address, self.page.tab_id, self.page.timeout) + self.doc_ele = ChromiumElement(self._target_page, backend_id=node['contentDocument']['backendNodeId']) + super().__init__(self.address, self._target_page.tab_id, self._target_page.timeout) self._debug = debug else: self._is_diff_domain = True self._tab_obj.stop() - super().__init__(self.address, self.frame_id, self.page.timeout) + super().__init__(self.address, self.frame_id, self._target_page.timeout) obj_id = super().run_js('document;', as_expr=True)['objectId'] self.doc_ele = ChromiumElement(self, obj_id=obj_id) self._debug = debug @@ -109,7 +116,7 @@ class ChromiumFrame(ChromiumBase): self._reload() try: - self.page.run_cdp('DOM.describeNode', nodeId=self.ids.node_id) + self._target_page.run_cdp('DOM.describeNode', nodeId=self.ids.node_id) except Exception: self._reload() # sleep(2) @@ -126,8 +133,9 @@ class ChromiumFrame(ChromiumBase): while self.is_alive and perf_counter() < end_time: try: if self._is_diff_domain is False: - node = self.page.run_cdp('DOM.describeNode', backendNodeId=self.ids.backend_id)['node'] - self.doc_ele = ChromiumElement(self.page, backend_id=node['contentDocument']['backendNodeId']) + node = self._target_page.run_cdp('DOM.describeNode', backendNodeId=self.ids.backend_id)['node'] + self.doc_ele = ChromiumElement(self._target_page, + backend_id=node['contentDocument']['backendNodeId']) else: b_id = self.run_cdp('DOM.getDocument')['root']['backendNodeId'] @@ -207,7 +215,8 @@ class ChromiumFrame(ChromiumBase): """返回元素outerHTML文本""" self._check_ok() tag = self.tag - out_html = self.page.run_cdp('DOM.getOuterHTML', backendNodeId=self.frame_ele.ids.backend_id)['outerHTML'] + out_html = self._target_page.run_cdp('DOM.getOuterHTML', backendNodeId=self.frame_ele.ids.backend_id)[ + 'outerHTML'] sign = search(rf'<{tag}.*?>', out_html).group(0) return f'{sign}{self.inner_html}' @@ -296,7 +305,7 @@ class ChromiumFrame(ChromiumBase): except ContextLossError: try: node = self.run_cdp('DOM.describeNode', backendNodeId=self.frame_ele.ids.backend_id)['node'] - doc = ChromiumElement(self.page, backend_id=node['contentDocument']['backendNodeId']) + doc = ChromiumElement(self._target_page, backend_id=node['contentDocument']['backendNodeId']) return doc.run_js('return this.readyState;') except: pass @@ -525,7 +534,7 @@ class ChromiumFrame(ChromiumBase): cx, cy = ele.locations.viewport_location w, h = ele.size img_data = f'data:image/{pic_type};base64,{self.frame_ele.get_screenshot(as_base64=True)}' - body = self.page('t:body') + body = self._target_page('t:body') first_child = body('c::first-child') if not isinstance(first_child, ChromiumElement): first_child = first_child.frame_ele @@ -540,9 +549,9 @@ class ChromiumFrame(ChromiumBase): new_ele.scroll.to_see(True) top = int(self.frame_ele.style('border-top').split('px')[0]) left = int(self.frame_ele.style('border-left').split('px')[0]) - r = self.page.get_screenshot(path=path, as_bytes=as_bytes, as_base64=as_base64, - left_top=(cx + left, cy + top), right_bottom=(cx + w + left, cy + h + top)) - self.page.remove_ele(new_ele) + r = self._target_page.get_screenshot(path=path, as_bytes=as_bytes, as_base64=as_base64, + left_top=(cx + left, cy + top), right_bottom=(cx + w + left, cy + h + top)) + self._target_page.remove_ele(new_ele) return r def _find_elements(self, loc_or_ele, timeout=None, single=True, relative=False, raise_err=None): @@ -610,7 +619,7 @@ class ChromiumFrame(ChromiumBase): def _is_inner_frame(self): """返回当前frame是否同域""" - return self.frame_id in str(self.page.run_cdp('Page.getFrameTree')['frameTree']) + return self.frame_id in str(self._target_page.run_cdp('Page.getFrameTree')['frameTree']) def _check_alive(self): """检测iframe是否有效线程方法""" diff --git a/DrissionPage/chromium_frame.pyi b/DrissionPage/chromium_frame.pyi index df14080..f4cb6ba 100644 --- a/DrissionPage/chromium_frame.pyi +++ b/DrissionPage/chromium_frame.pyi @@ -16,6 +16,9 @@ class ChromiumFrame(ChromiumBase): def __init__(self, page: ChromiumBase, ele: ChromiumElement): self.page: ChromiumBase = ... + self._target_page = ... + self.tab = ... + self._tab_id: str = ... self.frame_id: str = ... self._frame_ele: ChromiumElement = ... self._backend_id: str = ... diff --git a/DrissionPage/chromium_page.py b/DrissionPage/chromium_page.py index e6f3dff..6678cb7 100644 --- a/DrissionPage/chromium_page.py +++ b/DrissionPage/chromium_page.py @@ -343,6 +343,7 @@ class ChromiumPage(ChromiumBase): p = popen(txt) if f' {self.process_id} ' not in p.read(): break + sleep(.2) def _on_alert_close(self, **kwargs): """alert关闭时触发的方法""" @@ -438,8 +439,11 @@ class ChromiumTabRect(object): class BrowserDownloadManager(object): def __init__(self, page): - self._page = page + self.page = page self.frames = {} + self.pause = False + + # class BaseDownloadSetter(DownloadSetter): # """用于设置下载参数的类""" #