From dba82c0bdabdff2d1c155942013a9e6e2ab5f61e Mon Sep 17 00:00:00 2001 From: Michael Mintz Date: Thu, 10 Apr 2025 18:53:26 -0400 Subject: [PATCH 1/3] Add `sb.cdp.gui_click_and_hold(selector, timeframe)` --- examples/cdp_mode/ReadMe.md | 1 + seleniumbase/core/browser_launcher.py | 1 + seleniumbase/core/sb_cdp.py | 30 ++++++++++++++++++++------- 3 files changed, 25 insertions(+), 7 deletions(-) diff --git a/examples/cdp_mode/ReadMe.md b/examples/cdp_mode/ReadMe.md index 052008ee721..54f8e2f0f40 100644 --- a/examples/cdp_mode/ReadMe.md +++ b/examples/cdp_mode/ReadMe.md @@ -467,6 +467,7 @@ sb.cdp.gui_click_x_y(x, y) sb.cdp.gui_click_element(selector) sb.cdp.gui_drag_drop_points(x1, y1, x2, y2, timeframe=0.35) sb.cdp.gui_drag_and_drop(drag_selector, drop_selector, timeframe=0.35) +sb.cdp.gui_click_and_hold(selector, timeframe=0.35) sb.cdp.gui_hover_x_y(x, y) sb.cdp.gui_hover_element(selector) sb.cdp.gui_hover_and_click(hover_selector, click_selector) diff --git a/seleniumbase/core/browser_launcher.py b/seleniumbase/core/browser_launcher.py index a066b5ad75e..1483fcafd3f 100644 --- a/seleniumbase/core/browser_launcher.py +++ b/seleniumbase/core/browser_launcher.py @@ -682,6 +682,7 @@ def uc_open_with_cdp_mode(driver, url=None): cdp.gui_click_element = CDPM.gui_click_element cdp.gui_drag_drop_points = CDPM.gui_drag_drop_points cdp.gui_drag_and_drop = CDPM.gui_drag_and_drop + cdp.gui_click_and_hold = CDPM.gui_click_and_hold cdp.gui_hover_x_y = CDPM.gui_hover_x_y cdp.gui_hover_element = CDPM.gui_hover_element cdp.gui_hover_and_click = CDPM.gui_hover_and_click diff --git a/seleniumbase/core/sb_cdp.py b/seleniumbase/core/sb_cdp.py index c72987dcde9..9a3a9941456 100644 --- a/seleniumbase/core/sb_cdp.py +++ b/seleniumbase/core/sb_cdp.py @@ -1227,15 +1227,23 @@ def get_element_rect(self, selector, timeout=None): if not timeout: timeout = settings.SMALL_TIMEOUT selector = self.__convert_to_css_if_xpath(selector) - self.select(selector, timeout=timeout) + element = self.select(selector, timeout=timeout) self.__add_light_pause() - coordinates = self.loop.run_until_complete( - self.page.js_dumps( - """document.querySelector""" - """('%s').getBoundingClientRect()""" - % js_utils.escape_quotes_if_needed(re.escape(selector)) + coordinates = None + if ":contains(" in selector: + position = element.get_position() + x = position.x + y = position.y + width = position.width + height = position.height + coordinates = {"x": x, "y": y, "width": width, "height": height} + else: + coordinates = self.loop.run_until_complete( + self.page.js_dumps( + """document.querySelector('%s').getBoundingClientRect()""" + % js_utils.escape_quotes_if_needed(re.escape(selector)) + ) ) - ) return coordinates def get_element_size(self, selector, timeout=None): @@ -1665,6 +1673,14 @@ def gui_drag_and_drop(self, drag_selector, drop_selector, timeframe=0.35): self.__add_light_pause() self.gui_drag_drop_points(x1, y1, x2, y2, timeframe=timeframe) + def gui_click_and_hold(self, selector, timeframe=0.35): + """Use PyAutoGUI to click-and-hold a selector.""" + self.__slow_mode_pause_if_set() + self.bring_active_window_to_front() + x, y = self.get_gui_element_center(selector) + self.__add_light_pause() + self.gui_drag_drop_points(x, y, x, y, timeframe=timeframe) + def __gui_hover_x_y(self, x, y, timeframe=0.25, uc_lock=False): self.__install_pyautogui_if_missing() import pyautogui From c80b256e3456e9cc75bc560e2e1a0c2a89028817 Mon Sep 17 00:00:00 2001 From: Michael Mintz Date: Thu, 10 Apr 2025 18:53:59 -0400 Subject: [PATCH 2/3] Refresh Python dependencies --- requirements.txt | 4 ++-- setup.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/requirements.txt b/requirements.txt index 35a4573f0f7..1bb76e8f39b 100755 --- a/requirements.txt +++ b/requirements.txt @@ -15,7 +15,7 @@ mycdp>=1.1.1 pynose>=1.5.4 platformdirs>=4.3.6;python_version<"3.9" platformdirs>=4.3.7;python_version>="3.9" -typing-extensions>=4.13.1 +typing-extensions>=4.13.2 sbvirtualdisplay>=1.4.0 MarkupSafe==2.1.5;python_version<"3.9" MarkupSafe>=3.0.2;python_version>="3.9" @@ -33,7 +33,7 @@ idna==3.10 chardet==5.2.0 charset-normalizer==3.4.1 urllib3>=1.26.20,<2;python_version<"3.10" -urllib3>=1.26.20,<2.4.0;python_version>="3.10" +urllib3>=1.26.20,<2.5.0;python_version>="3.10" requests==2.32.3 sniffio==1.3.1 h11==0.14.0 diff --git a/setup.py b/setup.py index c8f8d34915e..b03518ad7b7 100755 --- a/setup.py +++ b/setup.py @@ -164,7 +164,7 @@ "pynose>=1.5.4", 'platformdirs>=4.3.6;python_version<"3.9"', 'platformdirs>=4.3.7;python_version>="3.9"', - 'typing-extensions>=4.13.1', + 'typing-extensions>=4.13.2', "sbvirtualdisplay>=1.4.0", 'MarkupSafe==2.1.5;python_version<"3.9"', 'MarkupSafe>=3.0.2;python_version>="3.9"', @@ -182,7 +182,7 @@ 'chardet==5.2.0', 'charset-normalizer==3.4.1', 'urllib3>=1.26.20,<2;python_version<"3.10"', - 'urllib3>=1.26.20,<2.4.0;python_version>="3.10"', + 'urllib3>=1.26.20,<2.5.0;python_version>="3.10"', 'requests==2.32.3', 'sniffio==1.3.1', 'h11==0.14.0', From 4fa959b7189c9b49eaf24233ed06b98650267d15 Mon Sep 17 00:00:00 2001 From: Michael Mintz Date: Thu, 10 Apr 2025 18:54:10 -0400 Subject: [PATCH 3/3] Version 4.37.2 --- seleniumbase/__version__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/seleniumbase/__version__.py b/seleniumbase/__version__.py index 9bf6f1fb4b3..192e56ca704 100755 --- a/seleniumbase/__version__.py +++ b/seleniumbase/__version__.py @@ -1,2 +1,2 @@ # seleniumbase package -__version__ = "4.37.1" +__version__ = "4.37.2"