From f3e3ddd7f208b01ca1eefe90171b65d3d3dff79e Mon Sep 17 00:00:00 2001 From: Michael Mintz Date: Sat, 24 May 2025 02:39:57 -0400 Subject: [PATCH 1/5] 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 f104aedf4e8..ab5a00ba0ee 100755 --- a/requirements.txt +++ b/requirements.txt @@ -45,7 +45,7 @@ trio-websocket==0.12.2 wsproto==1.2.0 websocket-client==1.8.0 selenium==4.27.1;python_version<"3.9" -selenium==4.32.0;python_version>="3.9" +selenium==4.33.0;python_version>="3.9" cssselect==1.2.0;python_version<"3.9" cssselect==1.3.0;python_version>="3.9" sortedcontainers==2.4.0 @@ -74,7 +74,7 @@ rich>=14.0.0,<15 # ("pip install -r requirements.txt" also installs this, but "pip install -e ." won't.) coverage>=7.6.1;python_version<"3.9" -coverage>=7.8.1;python_version>="3.9" +coverage>=7.8.2;python_version>="3.9" pytest-cov>=5.0.0;python_version<"3.9" pytest-cov>=6.1.1;python_version>="3.9" flake8==5.0.4;python_version<"3.9" diff --git a/setup.py b/setup.py index ffa6e4ced1a..a904536374b 100755 --- a/setup.py +++ b/setup.py @@ -194,7 +194,7 @@ 'wsproto==1.2.0', 'websocket-client==1.8.0', 'selenium==4.27.1;python_version<"3.9"', - 'selenium==4.32.0;python_version>="3.9"', + 'selenium==4.33.0;python_version>="3.9"', 'cssselect==1.2.0;python_version<"3.9"', 'cssselect==1.3.0;python_version>="3.9"', "sortedcontainers==2.4.0", @@ -232,7 +232,7 @@ # Usage: coverage run -m pytest; coverage html; coverage report "coverage": [ 'coverage>=7.6.1;python_version<"3.9"', - 'coverage>=7.8.1;python_version>="3.9"', + 'coverage>=7.8.2;python_version>="3.9"', 'pytest-cov>=5.0.0;python_version<"3.9"', 'pytest-cov>=6.1.1;python_version>="3.9"', ], From 0f74cb55587b0acc8b8b9af99ab9dc1b7150fcd9 Mon Sep 17 00:00:00 2001 From: Michael Mintz Date: Sat, 24 May 2025 02:42:08 -0400 Subject: [PATCH 2/5] Update UC Mode / CDP Mode --- seleniumbase/fixtures/base_case.py | 6 ++++-- seleniumbase/undetected/cdp_driver/browser.py | 3 +++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/seleniumbase/fixtures/base_case.py b/seleniumbase/fixtures/base_case.py index 8ddb9ab5f3a..7d2f28de125 100644 --- a/seleniumbase/fixtures/base_case.py +++ b/seleniumbase/fixtures/base_case.py @@ -10044,12 +10044,14 @@ def assert_text( elif self.__is_cdp_swap_needed(): self.cdp.assert_text(text, selector, timeout=timeout) return True - elif not self.is_connected(): - self.connect() elif self.__is_shadow_selector(selector): + if hasattr(self, "connect") and not self.is_connected(): + self.connect() self.__assert_shadow_text_visible(text, selector, timeout) return True else: + if hasattr(self, "connect") and not self.is_connected(): + self.connect() self.wait_for_text_visible(text, selector, by=by, timeout=timeout) if self.demo_mode: a_t = "ASSERT TEXT" diff --git a/seleniumbase/undetected/cdp_driver/browser.py b/seleniumbase/undetected/cdp_driver/browser.py index 72256be76cc..1a991f84f57 100644 --- a/seleniumbase/undetected/cdp_driver/browser.py +++ b/seleniumbase/undetected/cdp_driver/browser.py @@ -680,6 +680,9 @@ def stop(self): self._process = None self._process_pid = None + def quit(self): + self.stop() + def __await__(self): # return ( asyncio.sleep(0)).__await__() return self.update_targets().__await__() From e72052137e76343fcccd2ea3c033b9b70aaafa6a Mon Sep 17 00:00:00 2001 From: Michael Mintz Date: Sat, 24 May 2025 02:45:46 -0400 Subject: [PATCH 3/5] Refactor the code --- seleniumbase/behave/behave_sb.py | 12 ++------ seleniumbase/console_scripts/run.py | 30 ------------------- seleniumbase/console_scripts/sb_behave_gui.py | 7 ----- seleniumbase/console_scripts/sb_caseplans.py | 7 ----- seleniumbase/console_scripts/sb_commander.py | 7 ----- seleniumbase/console_scripts/sb_recorder.py | 6 ---- seleniumbase/core/mysql.py | 4 +-- seleniumbase/core/style_sheet.py | 11 ++----- seleniumbase/core/visual_helper.py | 10 ++----- setup.py | 6 ++-- 10 files changed, 13 insertions(+), 87 deletions(-) diff --git a/seleniumbase/behave/behave_sb.py b/seleniumbase/behave/behave_sb.py index ac7bd6001d3..71931e81701 100644 --- a/seleniumbase/behave/behave_sb.py +++ b/seleniumbase/behave/behave_sb.py @@ -1280,15 +1280,9 @@ def _perform_behave_unconfigure_(): ) find_it_3 = 'Untested' swap_with_3 = 'Unreported' - if sys.version_info[0] >= 3: - # These use caching to prevent extra method calls - DASH_PIE_PNG_1 = constants.Dashboard.get_dash_pie_1() - DASH_PIE_PNG_2 = constants.Dashboard.get_dash_pie_2() - else: - from seleniumbase.core import encoded_images - - DASH_PIE_PNG_1 = encoded_images.get_dash_pie_png1() - DASH_PIE_PNG_2 = encoded_images.get_dash_pie_png2() + # These use caching to prevent extra method calls + DASH_PIE_PNG_1 = constants.Dashboard.get_dash_pie_1() + DASH_PIE_PNG_2 = constants.Dashboard.get_dash_pie_2() find_it_4 = 'href="%s"' % DASH_PIE_PNG_1 swap_with_4 = 'href="%s"' % DASH_PIE_PNG_2 try: diff --git a/seleniumbase/console_scripts/run.py b/seleniumbase/console_scripts/run.py index 962a7ad5c03..b11305d9846 100644 --- a/seleniumbase/console_scripts/run.py +++ b/seleniumbase/console_scripts/run.py @@ -1001,7 +1001,6 @@ def main(): retry_msg_2 = "** Unable to download driver! Retrying in 5s..." if " --proxy=" in " ".join(sys.argv): from seleniumbase.core import proxy_helper - for arg in sys.argv: if arg.startswith("--proxy="): proxy_string = arg.split("--proxy=")[1] @@ -1036,11 +1035,9 @@ def main(): show_install_usage() elif command == "commander" or command == "gui": from seleniumbase.console_scripts import sb_commander - sb_commander.main() elif command == "behave-gui" or command == "gui-behave": from seleniumbase.console_scripts import sb_behave_gui - sb_behave_gui.main() elif ( command == "caseplans" @@ -1048,14 +1045,12 @@ def main(): or command == "case_plans" ): from seleniumbase.console_scripts import sb_caseplans - sb_caseplans.main() elif ( command == "recorder" or (command == "record" and len(command_args) == 0) ): from seleniumbase.console_scripts import sb_recorder - sb_recorder.main() elif ( command == "mkrec" @@ -1064,7 +1059,6 @@ def main(): ): if len(command_args) >= 1: from seleniumbase.console_scripts import sb_mkrec - sb_mkrec.main() else: show_basic_usage() @@ -1075,7 +1069,6 @@ def main(): elif command == "mkdir": if len(command_args) >= 1: from seleniumbase.console_scripts import sb_mkdir - sb_mkdir.main() else: show_basic_usage() @@ -1083,7 +1076,6 @@ def main(): elif command == "mkfile": if len(command_args) >= 1: from seleniumbase.console_scripts import sb_mkfile - sb_mkfile.main() else: show_basic_usage() @@ -1091,7 +1083,6 @@ def main(): elif command == "mkpres": if len(command_args) >= 1: from seleniumbase.console_scripts import sb_mkpres - sb_mkpres.main() else: show_basic_usage() @@ -1099,7 +1090,6 @@ def main(): elif command == "mkchart": if len(command_args) >= 1: from seleniumbase.console_scripts import sb_mkchart - sb_mkchart.main() else: show_basic_usage() @@ -1107,7 +1097,6 @@ def main(): elif command == "convert": if len(command_args) == 1: from seleniumbase.utilities.selenium_ide import convert_ide - convert_ide.main() else: show_basic_usage() @@ -1115,22 +1104,13 @@ def main(): elif command == "print": if len(command_args) >= 1: from seleniumbase.console_scripts import sb_print - sb_print.main() else: show_basic_usage() show_print_usage() elif command == "translate": if len(command_args) >= 1: - if sys.version_info[0] == 2: - c5 = colorama.Fore.RED + colorama.Back.LIGHTYELLOW_EX - cr = colorama.Style.RESET_ALL - msg = "The SeleniumBase Translator does NOT support Python 2!" - message = "\n" + c5 + msg + cr + "\n" - print("") - raise Exception(message) from seleniumbase.translate import translator - translator.main() else: show_basic_usage() @@ -1138,7 +1118,6 @@ def main(): elif command == "extract-objects" or command == "extract_objects": if len(command_args) >= 1: from seleniumbase.console_scripts import sb_objectify - sb_objectify.extract_objects() else: show_basic_usage() @@ -1154,7 +1133,6 @@ def main(): elif command == "objectify": if len(command_args) >= 1: from seleniumbase.console_scripts import sb_objectify - sb_objectify.objectify() else: show_basic_usage() @@ -1162,7 +1140,6 @@ def main(): elif command == "revert-objects" or command == "revert_objects": if len(command_args) >= 1: from seleniumbase.console_scripts import sb_objectify - sb_objectify.revert_objects() else: show_basic_usage() @@ -1170,7 +1147,6 @@ def main(): elif command == "encrypt" or command == "obfuscate": if len(command_args) >= 0: from seleniumbase.common import obfuscate - obfuscate.main() else: show_basic_usage() @@ -1178,7 +1154,6 @@ def main(): elif command == "decrypt" or command == "unobfuscate": if len(command_args) >= 0: from seleniumbase.common import unobfuscate - unobfuscate.main() else: show_basic_usage() @@ -1188,7 +1163,6 @@ def main(): from seleniumbase.utilities.selenium_grid import ( download_selenium_server, ) - download_selenium_server.main(force_download=True) else: show_basic_usage() @@ -1196,7 +1170,6 @@ def main(): elif command == "grid-hub" or command == "grid_hub": if len(command_args) >= 1: from seleniumbase.utilities.selenium_grid import grid_hub - grid_hub.main() else: show_basic_usage() @@ -1204,7 +1177,6 @@ def main(): elif command == "grid-node" or command == "grid_node": if len(command_args) >= 1: from seleniumbase.utilities.selenium_grid import grid_node - grid_node.main() else: show_basic_usage() @@ -1212,7 +1184,6 @@ def main(): elif command == "version" or command == "--version" or command == "-v": if len(command_args) == 0: from seleniumbase.console_scripts import logo_helper - seleniumbase_logo = logo_helper.get_seleniumbase_logo() print(seleniumbase_logo) print("") @@ -1231,7 +1202,6 @@ def main(): import fasteners import os import warnings - with warnings.catch_warnings(): warnings.simplefilter("ignore", category=UserWarning) pip_find_lock = fasteners.InterProcessLock( diff --git a/seleniumbase/console_scripts/sb_behave_gui.py b/seleniumbase/console_scripts/sb_behave_gui.py index 66c14caf04b..fbdbfd0e993 100644 --- a/seleniumbase/console_scripts/sb_behave_gui.py +++ b/seleniumbase/console_scripts/sb_behave_gui.py @@ -20,13 +20,6 @@ from seleniumbase.fixtures import shared_utils from tkinter.scrolledtext import ScrolledText -if sys.version_info <= (3, 8): - current_version = ".".join(str(ver) for ver in sys.version_info[:3]) - raise Exception( - "\n* SBase Commander requires Python 3.8 or newer!" - "\n** You are currently using Python %s" % current_version - ) - def set_colors(use_colors): c0 = "" diff --git a/seleniumbase/console_scripts/sb_caseplans.py b/seleniumbase/console_scripts/sb_caseplans.py index 9cc8a62a95e..f3b6229ab88 100644 --- a/seleniumbase/console_scripts/sb_caseplans.py +++ b/seleniumbase/console_scripts/sb_caseplans.py @@ -25,13 +25,6 @@ from tkinter import messagebox from tkinter.scrolledtext import ScrolledText -if sys.version_info <= (3, 8): - current_version = ".".join(str(ver) for ver in sys.version_info[:3]) - raise Exception( - "\n* SBase Case Plans Generator requires Python 3.8 or newer!" - "\n** You are currently using Python %s" % current_version - ) - def set_colors(use_colors): c0 = "" diff --git a/seleniumbase/console_scripts/sb_commander.py b/seleniumbase/console_scripts/sb_commander.py index 0ea306327b1..b0cd67978c6 100644 --- a/seleniumbase/console_scripts/sb_commander.py +++ b/seleniumbase/console_scripts/sb_commander.py @@ -25,13 +25,6 @@ from seleniumbase.fixtures import shared_utils from tkinter.scrolledtext import ScrolledText -if sys.version_info <= (3, 8): - current_version = ".".join(str(ver) for ver in sys.version_info[:3]) - raise Exception( - "\n* SBase Commander requires Python 3.8 or newer!" - "\n** You are currently using Python %s" % current_version - ) - def set_colors(use_colors): c0 = "" diff --git a/seleniumbase/console_scripts/sb_recorder.py b/seleniumbase/console_scripts/sb_recorder.py index a4507daaf98..d6a326913ab 100644 --- a/seleniumbase/console_scripts/sb_recorder.py +++ b/seleniumbase/console_scripts/sb_recorder.py @@ -30,12 +30,6 @@ sys_executable = sys.executable if " " in sys_executable: sys_executable = "python" -if sys.version_info <= (3, 8): - current_version = ".".join(str(ver) for ver in sys.version_info[:3]) - raise Exception( - "\n* Recorder Desktop requires Python 3.8 or newer!" - "\n*** You are currently using Python %s" % current_version - ) def set_colors(use_colors): diff --git a/seleniumbase/core/mysql.py b/seleniumbase/core/mysql.py index a1bf47ddc84..88d91f65f0f 100644 --- a/seleniumbase/core/mysql.py +++ b/seleniumbase/core/mysql.py @@ -19,8 +19,8 @@ def __init__(self, database_env="test", conf_creds=None): constants.PipInstall.FINDLOCK ) with pip_find_lock: - if sys.version_info >= (3, 7) and sys.version_info < (3, 9): - # Fix bug in newer cryptography for Python 3.7 and 3.8: + if sys.version_info < (3, 9): + # Fix bug with newer cryptography on Python 3.8: # "pyo3_runtime.PanicException: Python API call failed" # (Match the version needed for pdfminer.six functions) try: diff --git a/seleniumbase/core/style_sheet.py b/seleniumbase/core/style_sheet.py index 8414ae62f8a..ca8d78e314f 100644 --- a/seleniumbase/core/style_sheet.py +++ b/seleniumbase/core/style_sheet.py @@ -1,4 +1,3 @@ -import sys import textwrap from seleniumbase.fixtures import constants @@ -11,18 +10,12 @@ class Saved: def get_report_style(): if hasattr(Saved, "report_style"): return Saved.report_style - if sys.version_info[0] >= 3: - # Uses caching to prevent extra method calls - REPORT_FAVICON = constants.Report.get_favicon() - else: - from seleniumbase.core import encoded_images - - REPORT_FAVICON = encoded_images.get_report_favicon() + # Uses caching to prevent extra method calls + REPORT_FAVICON = constants.Report.get_favicon() title = """ Test Report """ % REPORT_FAVICON - style = ( title + """