From 66de3a6db1c6e1cf78c32043a609eedf024bbe27 Mon Sep 17 00:00:00 2001
From: g1879 <g1879@qq.com>
Date: Wed, 15 Nov 2023 19:51:16 +0800
Subject: [PATCH] =?UTF-8?q?TabClosedError=E6=94=B9=E4=B8=BAPageClosedError?=
 =?UTF-8?q?=EF=BC=9B=E4=BF=AE=E5=A4=8Diframe=E4=B8=80=E4=B8=AA=E9=97=AE?=
 =?UTF-8?q?=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 DrissionPage/_pages/chromium_base.py  | 14 ++++++++------
 DrissionPage/_pages/chromium_frame.py | 25 ++++++++++++-------------
 DrissionPage/errors.py                |  4 ++--
 3 files changed, 22 insertions(+), 21 deletions(-)

diff --git a/DrissionPage/_pages/chromium_base.py b/DrissionPage/_pages/chromium_base.py
index 91c2e06..ba10874 100644
--- a/DrissionPage/_pages/chromium_base.py
+++ b/DrissionPage/_pages/chromium_base.py
@@ -23,7 +23,7 @@ from .._units.network_listener import NetworkListener
 from .._units.screencast import Screencast
 from .._units.setter import ChromiumBaseSetter
 from .._units.waiter import BaseWaiter
-from ..errors import (ContextLossError, ElementLossError, CDPError, TabClosedError, NoRectError, AlertExistsError,
+from ..errors import (ContextLossError, ElementLossError, CDPError, PageClosedError, NoRectError, AlertExistsError,
                       GetDocumentError)
 
 
@@ -46,8 +46,6 @@ class ChromiumBase(BasePage):
         self._listener = None
         self._has_alert = False
         self._ready_state = None
-        if self._debug:
-            print('在__init__变成None')
         self._doc_got = False  # 用于在LoadEventFired和FrameStoppedLoading间标记是否已获取doc
 
         self._download_path = str(Path('.').absolute())
@@ -130,6 +128,8 @@ class ChromiumBase(BasePage):
         self._driver.set_callback('Page.frameDetached', self._onFrameDetached)
 
     def _get_document(self):
+        if self._debug:
+            print('获取文档开始')
         if self._is_reading:
             return
         self._is_reading = True
@@ -150,6 +150,8 @@ class ChromiumBase(BasePage):
 
         self._is_loading = False
         self._is_reading = False
+        if self._debug:
+            print('获取文档结束')
 
     def _onFrameDetached(self, **kwargs):
         self.browser._frames.pop(kwargs['frameId'], None)
@@ -285,7 +287,7 @@ class ChromiumBase(BasePage):
         try:
             self.run_cdp('Page.getLayoutMetrics')
             return True
-        except TabClosedError:
+        except PageClosedError:
             return False
 
     @property
@@ -435,7 +437,7 @@ class ChromiumBase(BasePage):
                        'No node found for given backend id'):
             raise ElementLossError
         elif error == 'tab closed':
-            raise TabClosedError
+            raise PageClosedError
         elif error == 'timeout':
             raise TimeoutError
         elif error == 'alert exists.':
@@ -680,7 +682,7 @@ class ChromiumBase(BasePage):
             print('停止页面加载')
         try:
             self.run_cdp('Page.stopLoading')
-        except TabClosedError:
+        except PageClosedError:
             pass
         end_time = perf_counter() + self.timeouts.page_load
         while self._ready_state != 'complete' and perf_counter() < end_time:
diff --git a/DrissionPage/_pages/chromium_frame.py b/DrissionPage/_pages/chromium_frame.py
index ba0871f..5e21623 100644
--- a/DrissionPage/_pages/chromium_frame.py
+++ b/DrissionPage/_pages/chromium_frame.py
@@ -14,7 +14,7 @@ from .._units.rect import FrameRect
 from .._units.scroller import FrameScroller
 from .._units.setter import ChromiumFrameSetter
 from .._units.waiter import FrameWaiter
-from ..errors import ContextLossError, ElementLossError, GetDocumentError, TabClosedError
+from ..errors import ContextLossError, ElementLossError, GetDocumentError, PageClosedError
 
 
 class ChromiumFrame(ChromiumBase):
@@ -103,14 +103,21 @@ class ChromiumFrame(ChromiumBase):
         if debug:
             print(f'{self._frame_id} reload 开始')
 
+        self._driver.stop()
         try:
             self._frame_ele = ChromiumElement(self._target_page, backend_id=self._backend_id)
-        except ElementLossError:
+        except (ElementLossError, PageClosedError):
             return
-        node = self._target_page.run_cdp('DOM.describeNode',
-                                         backendNodeId=self._frame_ele.ids.backend_id)['node']
 
-        self._driver.stop()
+        end_time = perf_counter() + 2
+        while perf_counter() < end_time:
+            node = self._target_page.run_cdp('DOM.describeNode',
+                                             backendNodeId=self._frame_ele.ids.backend_id)['node']
+            if 'frameId' in node:
+                break
+
+        else:
+            return
 
         if self._is_inner_frame():
             self._is_diff_domain = False
@@ -237,10 +244,6 @@ class ChromiumFrame(ChromiumBase):
         if self._debug:
             print(f'{self._frame_id}触发InspectorDetached')
 
-        try:
-            self._frame_ele.attrs
-        except (ElementLossError, TabClosedError):
-            self._driver.stop()
         self._reload()
 
         if self._debug:
@@ -253,10 +256,6 @@ class ChromiumFrame(ChromiumBase):
             if self._debug:
                 print(f'{self._frame_id}触发FrameDetached')
 
-            try:
-                self._frame_ele.attrs
-            except (ElementLossError, TabClosedError):
-                self._driver.stop()
             self._reload()
 
             if self._debug:
diff --git a/DrissionPage/errors.py b/DrissionPage/errors.py
index 589fb95..ba515cb 100644
--- a/DrissionPage/errors.py
+++ b/DrissionPage/errors.py
@@ -32,8 +32,8 @@ class CDPError(BaseError):
     _info = '方法调用错误。'
 
 
-class TabClosedError(BaseError):
-    _info = '标签页已关闭。'
+class PageClosedError(BaseError):
+    _info = '页面已关闭。'
 
 
 class ElementNotFoundError(BaseError):