diff --git a/DrissionPage/chromium_base.py b/DrissionPage/chromium_base.py
index 3da7fbf..0f1caaf 100644
--- a/DrissionPage/chromium_base.py
+++ b/DrissionPage/chromium_base.py
@@ -12,8 +12,7 @@ from requests import Session
 
 from .base import BasePage
 from .chromium_driver import ChromiumDriver
-from .chromium_element import ChromiumWaiter, ChromiumScroll, ChromiumElement, run_js, make_chromium_ele, \
-    ChromiumElementWaiter
+from .chromium_element import ChromiumScroll, ChromiumElement, run_js, make_chromium_ele, ChromiumElementWaiter
 from .commons.constants import HANDLE_ALERT_METHOD, ERROR, NoneElement
 from .commons.locator import get_loc
 from .commons.tools import get_usable_path
@@ -259,7 +258,7 @@ class ChromiumBase(BasePage):
         try:
             return loads(self('t:pre', timeout=.5).text)
         except JSONDecodeError:
-            raise RuntimeError('非json格式或格式不正确。')
+            return None
 
     @property
     def tab_id(self):
@@ -733,15 +732,6 @@ class ChromiumBase(BasePage):
         warn("wait_loading()方法即将弃用,请用wait.load_start()方法代替。", DeprecationWarning)
         return self.wait.load_start(timeout)
 
-    def wait_ele(self, loc_or_ele, timeout=None):
-        """返回用于等待元素到达某个状态的等待器对象
-        :param loc_or_ele: 可以是元素、查询字符串、loc元组
-        :param timeout: 等待超时时间
-        :return: 用于等待的ElementWaiter对象
-        """
-        warn("wait_ele()方法即将弃用,请用wait.ele_xxxx()方法代替。", DeprecationWarning)
-        return ChromiumElementWaiter(self, loc_or_ele, timeout)
-
     def scroll_to_see(self, loc_or_ele):
         """滚动页面直到元素可见
         :param loc_or_ele: 元素的定位信息,可以是loc元组,或查询字符串(详见ele函数注释)
@@ -901,27 +891,36 @@ class ChromiumBaseSetter(object):
         self._page.run_cdp('Network.setExtraHTTPHeaders', headers=headers)
 
 
-class ChromiumBaseWaiter(ChromiumWaiter):
-    def __init__(self, page):
+class ChromiumBaseWaiter(object):
+    def __init__(self, page_or_ele):
         """
-        :param page: 所属页面对象
+        :param page_or_ele: 页面对象或元素对象
         """
-        super().__init__(page)
+        self._driver = page_or_ele
 
-    def _loading(self, timeout=None, start=True):
-        """等待页面开始加载或加载完成
-        :param timeout: 超时时间,为None时使用页面timeout属性
-        :param start: 等待开始还是结束
+    def ele_delete(self, loc_or_ele, timeout=None):
+        """等待元素从DOM中删除
+        :param loc_or_ele: 要等待的元素,可以是已有元素、定位符
+        :param timeout: 超时时间,默认读取页面超时时间
         :return: 是否等待成功
         """
-        if timeout != 0:
-            timeout = self._driver.timeout if timeout in (None, True) else timeout
-            end_time = perf_counter() + timeout
-            while perf_counter() < end_time:
-                if self._driver.is_loading == start:
-                    return True
-                sleep(.01)
-            return False
+        return ChromiumElementWaiter(self._driver, loc_or_ele).delete(timeout)
+
+    def ele_display(self, loc_or_ele, timeout=None):
+        """等待元素变成显示状态
+        :param loc_or_ele: 要等待的元素,可以是已有元素、定位符
+        :param timeout: 超时时间,默认读取页面超时时间
+        :return: 是否等待成功
+        """
+        return ChromiumElementWaiter(self._driver, loc_or_ele).display(timeout)
+
+    def ele_hidden(self, loc_or_ele, timeout=None):
+        """等待元素变成隐藏状态
+        :param loc_or_ele: 要等待的元素,可以是已有元素、定位符
+        :param timeout: 超时时间,默认读取页面超时时间
+        :return: 是否等待成功
+        """
+        return ChromiumElementWaiter(self._driver, loc_or_ele).hidden(timeout)
 
     def load_start(self, timeout=None):
         """等待页面开始加载
@@ -942,6 +941,21 @@ class ChromiumBaseWaiter(ChromiumWaiter):
         while self._driver._upload_list:
             sleep(.01)
 
+    def _loading(self, timeout=None, start=True):
+        """等待页面开始加载或加载完成
+        :param timeout: 超时时间,为None时使用页面timeout属性
+        :param start: 等待开始还是结束
+        :return: 是否等待成功
+        """
+        if timeout != 0:
+            timeout = self._driver.timeout if timeout in (None, True) else timeout
+            end_time = perf_counter() + timeout
+            while perf_counter() < end_time:
+                if self._driver.is_loading == start:
+                    return True
+                sleep(.01)
+            return False
+
 
 class ChromiumPageScroll(ChromiumScroll):
     def __init__(self, page):
diff --git a/DrissionPage/chromium_base.pyi b/DrissionPage/chromium_base.pyi
index 36db3cf..41585ac 100644
--- a/DrissionPage/chromium_base.pyi
+++ b/DrissionPage/chromium_base.pyi
@@ -197,6 +197,12 @@ class ChromiumBaseWaiter(ChromiumWaiter):
     def __init__(self, page: ChromiumBase):
         self._driver: ChromiumBase = ...
 
+    def ele_delete(self, loc_or_ele: Union[str, tuple, ChromiumElement], timeout: Union[int, float]=None)->bool:...
+
+    def ele_display(self, loc_or_ele: Union[str, tuple, ChromiumElement], timeout: Union[int, float]=None)->bool:...
+
+    def ele_hidden(self, loc_or_ele: Union[str, tuple, ChromiumElement], timeout: Union[int, float]=None)->bool:...
+
     def _loading(self, timeout: Union[int, float] = None, start: bool = True) -> bool: ...
 
     def load_start(self, timeout: Union[int, float] = None) -> bool: ...
diff --git a/DrissionPage/chromium_element.py b/DrissionPage/chromium_element.py
index 2d35b48..08c3628 100644
--- a/DrissionPage/chromium_element.py
+++ b/DrissionPage/chromium_element.py
@@ -186,7 +186,7 @@ class ChromiumElement(DrissionElement):
     def wait(self):
         """返回用于等待的对象"""
         if self._wait is None:
-            self._wait = ChromiumWaiter(self)
+            self._wait = ChromiumElementWaiter(self.page, self)
         return self._wait
 
     @property
@@ -653,14 +653,6 @@ class ChromiumElement(DrissionElement):
         self.page.run_cdp('DOM.setFileInputFiles', files=files, backendNodeId=self._backend_id)
 
     # ---------------准备废弃-----------------
-    def wait_ele(self, loc_or_ele, timeout=None):
-        """返回用于等待子元素到达某个状态的等待器对象
-        :param loc_or_ele: 可以是元素、查询字符串、loc元组
-        :param timeout: 等待超时时间
-        :return: 用于等待的ElementWaiter对象
-        """
-        warn("wait_ele()方法即将弃用,请用wait.ele_xxxx()方法代替。", DeprecationWarning)
-        return ChromiumElementWaiter(self, loc_or_ele, timeout)
 
     def click_at(self, offset_x=None, offset_y=None, button='left'):
         """带偏移量点击本元素,相对于左上角坐标。不传入x或y值时点击元素左上角可接受点击的点
@@ -1687,22 +1679,6 @@ class Click(object):
         x, y = self._ele.locations.viewport_click_point
         self._click(x, y, 'middle')
 
-    def left_at(self, offset_x=None, offset_y=None):
-        """带偏移量点击本元素,相对于左上角坐标。不传入x或y值时点击元素左上角可接受点击的点
-        :param offset_x: 相对元素左上角坐标的x轴偏移量
-        :param offset_y: 相对元素左上角坐标的y轴偏移量
-        :return: None
-        """
-        self.at(offset_x, offset_y, button='left')
-
-    def right_at(self, offset_x=None, offset_y=None):
-        """带偏移量右键单击本元素,相对于左上角坐标。不传入x或y值时点击元素中点
-        :param offset_x: 相对元素左上角坐标的x轴偏移量
-        :param offset_y: 相对元素左上角坐标的y轴偏移量
-        :return: None
-        """
-        self.at(offset_x, offset_y, button='right')
-
     def at(self, offset_x=None, offset_y=None, button='left'):
         """带偏移量点击本元素,相对于左上角坐标。不传入x或y值时点击元素click_point
         :param offset_x: 相对元素左上角坐标的x轴偏移量
@@ -1989,94 +1965,73 @@ class ChromiumSelect(object):
         return success
 
 
-class ChromiumWaiter(object):
-    def __init__(self, page_or_ele):
-        """
-        :param page_or_ele: 页面对象或元素对象
-        """
-        self._driver = page_or_ele
-
-    def ele_delete(self, loc_or_ele, timeout=None):
-        """等待元素从DOM中删除
-        :param loc_or_ele: 要等待的元素,可以是已有元素、定位符
-        :param timeout: 超时时间,默认读取页面超时时间
-        :return: 是否等待成功
-        """
-        return ChromiumElementWaiter(self._driver, loc_or_ele, timeout).delete()
-
-    def ele_display(self, loc_or_ele, timeout=None):
-        """等待元素变成显示状态
-        :param loc_or_ele: 要等待的元素,可以是已有元素、定位符
-        :param timeout: 超时时间,默认读取页面超时时间
-        :return: 是否等待成功
-        """
-        return ChromiumElementWaiter(self._driver, loc_or_ele, timeout).display()
-
-    def ele_hidden(self, loc_or_ele, timeout=None):
-        """等待元素变成隐藏状态
-        :param loc_or_ele: 要等待的元素,可以是已有元素、定位符
-        :param timeout: 超时时间,默认读取页面超时时间
-        :return: 是否等待成功
-        """
-        return ChromiumElementWaiter(self._driver, loc_or_ele, timeout).hidden()
-
-
 class ChromiumElementWaiter(object):
     """等待元素在dom中某种状态,如删除、显示、隐藏"""
 
-    def __init__(self, page_or_ele, loc_or_ele, timeout=None):
+    def __init__(self, page_or_ele, loc_or_ele):
         """等待元素在dom中某种状态,如删除、显示、隐藏
         :param page_or_ele: 页面或父元素
         :param loc_or_ele: 要等待的元素,可以是已有元素、定位符
-        :param timeout: 超时时间,默认读取页面超时时间
         """
         if not isinstance(loc_or_ele, (str, tuple, ChromiumElement)):
             raise TypeError('loc_or_ele只能接收定位符或元素对象。')
 
-        self.driver = page_or_ele
-        self.loc_or_ele = loc_or_ele
-        if timeout is not None:
-            self.timeout = timeout
-        else:
-            self.timeout = page_or_ele.page.timeout if isinstance(page_or_ele, ChromiumElement) else page_or_ele.timeout
+        self._driver = page_or_ele
+        self._loc_or_ele = loc_or_ele
 
-    def delete(self):
-        """等待元素从dom删除"""
-        if isinstance(self.loc_or_ele, ChromiumElement):
-            end_time = perf_counter() + self.timeout
+    def delete(self, timeout=None):
+        """等待元素从dom删除
+        :param timeout: 超时时间
+        :return: 是否等待成功
+        """
+        if timeout is None:
+            timeout = self._driver.page.timeout if isinstance(self._driver, ChromiumElement) else self._driver.timeout
+
+        if isinstance(self._loc_or_ele, ChromiumElement):
+            end_time = perf_counter() + timeout
             while perf_counter() < end_time:
-                if not self.loc_or_ele.states.is_alive:
+                if not self._loc_or_ele.states.is_alive:
                     return True
 
-        ele = self.driver._ele(self.loc_or_ele, timeout=.5, raise_err=False)
+        ele = self._driver._ele(self._loc_or_ele, timeout=.5, raise_err=False)
         if not ele:
             return True
 
-        end_time = perf_counter() + self.timeout
+        end_time = perf_counter() + timeout
         while perf_counter() < end_time:
             if not ele.states.is_alive:
                 return True
 
         return False
 
-    def display(self):
-        """等待元素从dom显示"""
-        return self._wait_ele('display')
-
-    def hidden(self):
-        """等待元素从dom隐藏"""
-        return self._wait_ele('hidden')
-
-    def _wait_ele(self, mode):
-        """执行等待
-        :param mode: 等待模式
+    def display(self, timeout=None):
+        """等待元素从dom显示
+        :param timeout: 超时时间
         :return: 是否等待成功
         """
-        target = self.driver._ele(self.loc_or_ele, raise_err=False)
+        return self._wait_ele('display', timeout)
+
+    def hidden(self, timeout=None):
+        """等待元素从dom隐藏
+        :param timeout: 超时时间
+        :return: 是否等待成功
+        """
+        return self._wait_ele('hidden', timeout)
+
+    def _wait_ele(self, mode, timeout=None):
+        """执行等待
+        :param mode: 等待模式
+        :param timeout: 超时时间
+        :return: 是否等待成功
+        """
+        if timeout is None:
+            timeout = self._driver.page.timeout if isinstance(self._driver, ChromiumElement) else self._driver.timeout
+
+        target = self._driver._ele(self._loc_or_ele, raise_err=False)
         if not target:
             return None
 
-        end_time = perf_counter() + self.timeout
+        end_time = perf_counter() + timeout
         while perf_counter() < end_time:
             if mode == 'display' and target.states.is_displayed:
                 return True
diff --git a/DrissionPage/chromium_element.pyi b/DrissionPage/chromium_element.pyi
index 4641bc8..d828dde 100644
--- a/DrissionPage/chromium_element.pyi
+++ b/DrissionPage/chromium_element.pyi
@@ -133,7 +133,7 @@ class ChromiumElement(DrissionElement):
                timeout: float = None) -> List[Union[ChromiumElement, str]]: ...
 
     @property
-    def wait(self) -> ChromiumWaiter: ...
+    def wait(self) -> ChromiumElementWaiter: ...
 
     @property
     def select(self) -> ChromiumSelect: ...
@@ -161,7 +161,7 @@ class ChromiumElement(DrissionElement):
     def s_eles(self, loc_or_str: Union[Tuple[str, str], str] = None) -> List[Union[SessionElement, str]]: ...
 
     def _find_elements(self, loc_or_str: Union[Tuple[str, str], str], timeout: float = None,
-             single: bool = True, relative: bool = False, raise_err: bool = False) \
+                       single: bool = True, relative: bool = False, raise_err: bool = False) \
             -> Union[ChromiumElement, ChromiumFrame, str, NoneElement,
                      List[Union[ChromiumElement, ChromiumFrame, str]]]: ...
 
@@ -288,7 +288,7 @@ class ChromiumShadowRoot(BaseElement):
     def s_eles(self, loc_or_str: Union[Tuple[str, str], str]) -> List[Union[SessionElement, str]]: ...
 
     def _find_elements(self, loc_or_str: Union[Tuple[str, str], str], timeout: float = None,
-             single: bool = True, relative: bool = False, raise_err: bool = None) \
+                       single: bool = True, relative: bool = False, raise_err: bool = None) \
             -> Union[
                 ChromiumElement, ChromiumFrame, NoneElement, str, List[Union[ChromiumElement, ChromiumFrame, str]]]: ...
 
@@ -521,34 +521,20 @@ class ChromiumSelect(object):
                       deselect: bool = False) -> bool: ...
 
 
-class ChromiumWaiter(object):
-    def __init__(self, page_or_ele):
-        self._driver: Union[ChromiumBase, ChromiumElement] = ...
-
-    def ele_delete(self, loc_or_ele: Union[str, tuple, ChromiumElement], timeout: Union[int, float] = None) -> bool: ...
-
-    def ele_display(self, loc_or_ele: Union[str, tuple, ChromiumElement],
-                    timeout: Union[int, float] = None) -> bool: ...
-
-    def ele_hidden(self, loc_or_ele: Union[str, tuple, ChromiumElement], timeout: Union[int, float] = None) -> bool: ...
-
-
 class ChromiumElementWaiter(object):
     def __init__(self,
                  page_or_ele: Union[ChromiumBase, ChromiumElement],
-                 loc_or_ele: Union[str, tuple, ChromiumElement],
-                 timeout: Union[int, float] = None):
-        self.loc_or_ele: Union[str, tuple, ChromiumElement] = ...
-        self.timeout: float = ...
-        self.driver: Union[ChromiumPage, ChromiumPage] = ...
+                 loc_or_ele: Union[str, tuple, ChromiumElement]):
+        self._loc_or_ele: Union[str, tuple, ChromiumElement] = ...
+        self._driver: Union[ChromiumPage, ChromiumPage] = ...
 
-    def delete(self) -> bool: ...
+    def delete(self, timeout: Union[int, float] = None) -> bool: ...
 
-    def display(self) -> bool: ...
+    def display(self, timeout: Union[int, float] = None) -> bool: ...
 
-    def hidden(self) -> bool: ...
+    def hidden(self, timeout: Union[int, float] = None) -> bool: ...
 
-    def _wait_ele(self, mode: str) -> Union[None, bool]: ...
+    def _wait_ele(self, mode: str, timeout: Union[int, float] = None) -> Union[None, bool]: ...
 
 
 class Pseudo(object):
diff --git a/DrissionPage/configs/configs.ini b/DrissionPage/configs/configs.ini
index b6803d0..3c5e32f 100644
--- a/DrissionPage/configs/configs.ini
+++ b/DrissionPage/configs/configs.ini
@@ -5,9 +5,9 @@ download_path =
 [chrome_options]
 debugger_address = 127.0.0.1:9222
 binary_location = chrome
-arguments = ['--no-first-run', '--disable-gpu', '--ignore-certificate-errors', '--disable-infobars', '--disable-popup-blocking']
+arguments = ['--no-first-run', '--disable-gpu', '--disable-infobars', '--disable-popup-blocking']
 extensions = []
-experimental_options = {'prefs': {'profile.default_content_settings.popups': 0, 'profile.default_content_setting_values': {'notifications': 2}, 'plugins.plugins_list': [{'enabled': False, 'name': 'Chrome PDF Viewer'}]}, 'useAutomationExtension': False, 'excludeSwitches': ['enable-automation']}
+experimental_options = {'prefs': {'profile.default_content_settings.popups': 0, 'profile.default_content_setting_values': {'notifications': 2}}}
 page_load_strategy = normal
 user = Default
 auto_port = False
diff --git a/setup.py b/setup.py
index 9b3a54b..8ccacd1 100644
--- a/setup.py
+++ b/setup.py
@@ -6,7 +6,7 @@ with open("README.md", "r", encoding='utf-8') as fh:
 
 setup(
     name="DrissionPage",
-    version="3.2.2",
+    version="3.2.3",
     author="g1879",
     author_email="g1879@qq.com",
     description="Python based web automation tool. It can control the browser and send and receive data packets.",