From ac3a8ec27c5641ae40eac738eb06b265b0b56493 Mon Sep 17 00:00:00 2001
From: g1879 <g1879@qq.com>
Date: Fri, 28 Jun 2024 17:41:16 +0800
Subject: [PATCH] =?UTF-8?q?SessionPage=E5=88=A0=E9=99=A4timeout=E5=8F=82?=
 =?UTF-8?q?=E6=95=B0=EF=BC=8C=E6=9C=AA=E5=AE=8C=E6=88=90?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 DrissionPage/_base/browser.py          |  4 ++--
 DrissionPage/_pages/chromium_base.py   | 25 +++++++++++++------------
 DrissionPage/_pages/chromium_base.pyi  |  6 ++----
 DrissionPage/_pages/chromium_frame.py  | 21 ++++++++++-----------
 DrissionPage/_pages/chromium_frame.pyi |  3 +--
 DrissionPage/_pages/chromium_tab.py    |  2 +-
 DrissionPage/_pages/session_page.py    |  5 +----
 DrissionPage/_pages/session_page.pyi   |  3 +--
 8 files changed, 31 insertions(+), 38 deletions(-)

diff --git a/DrissionPage/_base/browser.py b/DrissionPage/_base/browser.py
index 1ae5c87..efd965d 100644
--- a/DrissionPage/_base/browser.py
+++ b/DrissionPage/_base/browser.py
@@ -317,9 +317,9 @@ class Browser(object):
                 elif Settings.singleton_tab_obj:
                     return id_or_num
                 else:
-                    return self._get_tab(id_or_num.tab_id)  # todo: 循环调用
+                    return self._get_tab(id_or_num.tab_id)  # fixme: 这里会出现循环调用
 
-        elif title == url == tab_type is None:
+        elif title == url is None and tab_type == 'page':
             id_or_num = self.tab_ids[0]
 
         else:
diff --git a/DrissionPage/_pages/chromium_base.py b/DrissionPage/_pages/chromium_base.py
index 08ec207..a775124 100644
--- a/DrissionPage/_pages/chromium_base.py
+++ b/DrissionPage/_pages/chromium_base.py
@@ -38,12 +38,13 @@ __ERROR__ = 'error'
 class ChromiumBase(BasePage):
     """标签页、frame、页面基类"""
 
-    def __init__(self, address, tab_id=None):
+    def __init__(self, browser, tab_id=None):
         """
-        :param address: 浏览器 ip:port
+        :param browser: Browser
         :param tab_id: 要控制的标签页id,不指定默认为激活的
         """
         super().__init__()
+        self._browser = browser
         self._is_loading = None
         self._root_id = None  # object id
         self._set = None
@@ -64,19 +65,19 @@ class ChromiumBase(BasePage):
         if not hasattr(self, '_listener'):
             self._listener = None
 
-        if isinstance(address, int) or (isinstance(address, str) and address.isdigit()):
-            address = f'127.0.0.1:{address}'
+        # if isinstance(address, int) or (isinstance(address, str) and address.isdigit()):
+        #     address = f'127.0.0.1:{address}'
 
-        self._d_set_start_options(address)
+        # self._d_set_start_options(address)
         self._d_set_runtime_settings()
         self._connect_browser(tab_id)
 
-    def _d_set_start_options(self, address):
-        """设置浏览器启动属性
-        :param address: 'ip:port'
-        :return: None
-        """
-        self.address = address.replace('localhost', '127.0.0.1').lstrip('http://').lstrip('https://')
+    # def _d_set_start_options(self, address):
+    #     """设置浏览器启动属性
+    #     :param address: 'ip:port'
+    #     :return: None
+    #     """
+    #     self.address = address.replace('localhost', '127.0.0.1').lstrip('http://').lstrip('https://')
 
     def _d_set_runtime_settings(self):
         self._timeouts = Timeout(self)
@@ -90,7 +91,7 @@ class ChromiumBase(BasePage):
         self._is_reading = False
 
         if not tab_id:
-            tabs = self.browser._driver.get(f'http://{self.address}/json').json()
+            tabs = self.browser._driver.get(f'http://{self.browser.address}/json').json()
             tabs = [(i['id'], i['url']) for i in tabs
                     if i['type'] in ('page', 'webview') and not i['url'].startswith('devtools://')]
             dialog = None
diff --git a/DrissionPage/_pages/chromium_base.pyi b/DrissionPage/_pages/chromium_base.pyi
index beaadad..8b9039b 100644
--- a/DrissionPage/_pages/chromium_base.pyi
+++ b/DrissionPage/_pages/chromium_base.pyi
@@ -31,12 +31,10 @@ PIC_TYPE = Literal['jpg', 'jpeg', 'png', 'webp', True]
 
 class ChromiumBase(BasePage):
     def __init__(self,
-                 address: Union[str, int],
+                 browser: Browser,
                  tab_id: str = None):
         self._browser: Browser = ...
-        self._page: ChromiumPage = ...
         self.tab: Union[ChromiumPage, ChromiumTab] = ...
-        self.address: str = ...
         self._driver: Driver = ...
         self._frame_id: str = ...
         self._is_reading: bool = ...
@@ -90,7 +88,7 @@ class ChromiumBase(BasePage):
 
     def _wait_to_stop(self): ...
 
-    def _d_set_start_options(self, address) -> None: ...
+    # def _d_set_start_options(self, address) -> None: ...
 
     def _d_set_runtime_settings(self) -> None: ...
 
diff --git a/DrissionPage/_pages/chromium_frame.py b/DrissionPage/_pages/chromium_frame.py
index aa537c8..4bc5eb5 100644
--- a/DrissionPage/_pages/chromium_frame.py
+++ b/DrissionPage/_pages/chromium_frame.py
@@ -28,7 +28,6 @@ class ChromiumFrame(ChromiumBase):
         :param info: frame所在元素信息
         """
         self.tab = owner.tab
-        self._browser = owner.browser
         self._target_page = owner
         # if owner._type in ('ChromiumPage', 'WebPage'):
         #     self._target_page = self.tab = owner
@@ -39,8 +38,8 @@ class ChromiumFrame(ChromiumBase):
         #     self._target_page = owner
         #     self.tab = owner.tab if owner._type == 'ChromiumFrame' else owner
 
-        self.address = owner.address
-        self._tab_id = owner.tab_id
+        # self.address = owner.address
+        # self._tab_id = owner.tab_id
         self._backend_id = ele._backend_id
         self._frame_ele = ele
         self._states = None
@@ -51,11 +50,11 @@ class ChromiumFrame(ChromiumBase):
         if self._is_inner_frame():
             self._is_diff_domain = False
             self.doc_ele = ChromiumElement(self._target_page, backend_id=node['contentDocument']['backendNodeId'])
-            super().__init__(owner.address, owner.tab_id, owner.timeout)
+            super().__init__(owner.browser, owner.tab_id)
         else:
             self._is_diff_domain = True
             delattr(self, '_frame_id')
-            super().__init__(owner.address, node['frameId'], owner.timeout)
+            super().__init__(owner.browser, node['frameId'])
             obj_id = super().run_js('document;', as_expr=True)['objectId']
             self.doc_ele = ChromiumElement(self, obj_id=obj_id)
 
@@ -101,7 +100,7 @@ class ChromiumFrame(ChromiumBase):
         try:
             super()._driver_init(tab_id)
         except:
-            self.browser.driver.get(f'http://{self.address}/json')
+            self.browser._driver.get(f'http://{self._browser.address}/json')
             super()._driver_init(tab_id)
         self._driver.set_callback('Inspector.detached', self._onInspectorDetached, immediate=True)
         self._driver.set_callback('Page.frameDetached', None)
@@ -135,16 +134,16 @@ class ChromiumFrame(ChromiumBase):
             self.doc_ele = ChromiumElement(self._target_page, backend_id=node['contentDocument']['backendNodeId'])
             self._frame_id = node['frameId']
             if self._listener:
-                self._listener._to_target(self._target_page.tab_id, self.address, self)
-            super().__init__(self.address, self._target_page.tab_id, self._target_page.timeout)
+                self._listener._to_target(self._target_page.tab_id, self._browser.address, self)
+            super().__init__(self._browser, self._target_page.tab_id)
             # self.driver._debug = d_debug
 
         else:
             self._is_diff_domain = True
             if self._listener:
-                self._listener._to_target(node['frameId'], self.address, self)
+                self._listener._to_target(node['frameId'], self._browser.address, self)
             end_time = perf_counter() + self.timeouts.page_load
-            super().__init__(self.address, node['frameId'], self._target_page.timeout)
+            super().__init__(self._browser, node['frameId'])
             timeout = end_time - perf_counter()
             if timeout <= 0:
                 timeout = .5
@@ -323,7 +322,7 @@ class ChromiumFrame(ChromiumBase):
     @property
     def tab_id(self):
         """返回frame所在tab的id"""
-        return self._tab_id
+        return self.tab.tab_id
 
     @property
     def download_path(self):
diff --git a/DrissionPage/_pages/chromium_frame.pyi b/DrissionPage/_pages/chromium_frame.pyi
index 9e55d22..3e44b41 100644
--- a/DrissionPage/_pages/chromium_frame.pyi
+++ b/DrissionPage/_pages/chromium_frame.pyi
@@ -28,9 +28,8 @@ class ChromiumFrame(ChromiumBase):
                  owner: Union[ChromiumTab, ChromiumFrame],
                  ele: ChromiumElement,
                  info: dict = None):
-        self._target_page: ChromiumBase = ...
+        self._target_page: Union[ChromiumTab, ChromiumFrame] = ...
         self.tab: ChromiumTab = ...
-        # self._tab_id: str = ...
         self._set: ChromiumFrameSetter = ...
         self._frame_ele: ChromiumElement = ...
         self._backend_id: int = ...
diff --git a/DrissionPage/_pages/chromium_tab.py b/DrissionPage/_pages/chromium_tab.py
index d4084bb..f99fe21 100644
--- a/DrissionPage/_pages/chromium_tab.py
+++ b/DrissionPage/_pages/chromium_tab.py
@@ -47,7 +47,7 @@ class ChromiumTab(ChromiumBase):
 
         self.tab = self
         self._browser = browser
-        super().__init__(browser.address, tab_id, browser.timeout)
+        super().__init__(browser, tab_id)
         self._rect = None
         self._type = 'ChromiumTab'
 
diff --git a/DrissionPage/_pages/session_page.py b/DrissionPage/_pages/session_page.py
index 94a7d07..c2bb376 100644
--- a/DrissionPage/_pages/session_page.py
+++ b/DrissionPage/_pages/session_page.py
@@ -25,10 +25,9 @@ from .._units.setter import SessionPageSetter
 class SessionPage(BasePage):
     """SessionPage封装了页面操作的常用功能,使用requests来获取、解析网页"""
 
-    def __init__(self, session_or_options=None, timeout=None):
+    def __init__(self, session_or_options=None):
         """
         :param session_or_options: Session对象或SessionOptions对象
-        :param timeout: 连接超时时间(秒),为None时从ini文件读取或默认10
         """
         super(SessionPage, SessionPage).__init__(self)
         self._headers = None
@@ -41,8 +40,6 @@ class SessionPage(BasePage):
         self._s_set_start_options(session_or_options)
         self._s_set_runtime_settings()
         self._create_session()
-        if timeout is not None:
-            self.timeout = timeout
 
     def _s_set_start_options(self, session_or_options):
         """启动配置
diff --git a/DrissionPage/_pages/session_page.pyi b/DrissionPage/_pages/session_page.pyi
index 16f95be..4527827 100644
--- a/DrissionPage/_pages/session_page.pyi
+++ b/DrissionPage/_pages/session_page.pyi
@@ -20,8 +20,7 @@ from .._units.setter import SessionPageSetter
 
 class SessionPage(BasePage):
     def __init__(self,
-                 session_or_options: Union[Session, SessionOptions] = None,
-                 timeout: float = None):
+                 session_or_options: Union[Session, SessionOptions] = None):
         self._headers: Optional[CaseInsensitiveDict] = ...
         self._session: Session = ...
         self._session_options: SessionOptions = ...