From 39aaaef95a050231e1beb6f28dae1adbdfafc57b Mon Sep 17 00:00:00 2001 From: Michael Mintz Date: Fri, 18 Aug 2023 18:48:44 -0400 Subject: [PATCH 1/7] Remove empty logging folders --- seleniumbase/behave/behave_sb.py | 9 ++++----- seleniumbase/core/log_helper.py | 15 +++++++++++++++ seleniumbase/plugins/base_plugin.py | 1 + seleniumbase/plugins/pytest_plugin.py | 9 ++++----- seleniumbase/plugins/sb_manager.py | 5 +++-- 5 files changed, 27 insertions(+), 12 deletions(-) diff --git a/seleniumbase/behave/behave_sb.py b/seleniumbase/behave/behave_sb.py index c633deaaf7b..c9b950e9e13 100644 --- a/seleniumbase/behave/behave_sb.py +++ b/seleniumbase/behave/behave_sb.py @@ -940,7 +940,7 @@ def get_configured_sb(context): if sb_config.dash_title: constants.Dashboard.TITLE = sb_config.dash_title.replace("_", " ") - log_helper.log_folder_setup(sb.log_path, sb.archive_logs) + log_helper.log_folder_setup("latest_logs/", sb.archive_logs) download_helper.reset_downloads_folder() proxy_helper.remove_proxy_zip_if_present() return sb @@ -1152,10 +1152,9 @@ def _perform_behave_unconfigure_(): except Exception: pass sb_config.shared_driver = None - if hasattr(sb_config, "log_path"): - log_helper.archive_logs_if_set( - sb_config.log_path, sb_config.archive_logs - ) + if hasattr(sb_config, "archive_logs"): + log_helper.archive_logs_if_set("latest_logs/", sb_config.archive_logs) + log_helper.clear_empty_logs() # Dashboard post-processing: Disable time-based refresh and stamp complete if not hasattr(sb_config, "dashboard") or not sb_config.dashboard: # Done with "behave_unconfigure" unless using the Dashboard diff --git a/seleniumbase/core/log_helper.py b/seleniumbase/core/log_helper.py index ed810a7a31b..fd425ded981 100644 --- a/seleniumbase/core/log_helper.py +++ b/seleniumbase/core/log_helper.py @@ -563,3 +563,18 @@ def log_folder_setup(log_path, archive_logs=False): pass else: shutil.rmtree(archived_logs) # (Archive test run later) + + +def clear_empty_logs(): + latest_logs_dir = os.path.join(os.getcwd(), "latest_logs") + os.sep + archived_folder = os.path.join(os.getcwd(), "archived_logs") + os.sep + if os.path.exists(latest_logs_dir) and not os.listdir(latest_logs_dir): + try: + os.rmdir(latest_logs_dir) + except OSError: + pass + if os.path.exists(archived_folder) and not os.listdir(archived_folder): + try: + os.rmdir(archived_folder) + except OSError: + pass diff --git a/seleniumbase/plugins/base_plugin.py b/seleniumbase/plugins/base_plugin.py index 5021522af24..343193ffc6c 100644 --- a/seleniumbase/plugins/base_plugin.py +++ b/seleniumbase/plugins/base_plugin.py @@ -244,6 +244,7 @@ def finalize(self, result): log_helper.archive_logs_if_set( self.options.log_path, self.options.archive_logs ) + log_helper.clear_empty_logs() if self.report_on: if not self.import_error: report_helper.add_bad_page_log_file(self.page_results_list) diff --git a/seleniumbase/plugins/pytest_plugin.py b/seleniumbase/plugins/pytest_plugin.py index fed35fe632a..f443d5e472f 100644 --- a/seleniumbase/plugins/pytest_plugin.py +++ b/seleniumbase/plugins/pytest_plugin.py @@ -1708,7 +1708,7 @@ def pytest_configure(config): from seleniumbase.core import download_helper from seleniumbase.core import proxy_helper - log_helper.log_folder_setup(sb_config.log_path, sb_config.archive_logs) + log_helper.log_folder_setup("latest_logs/", sb_config.archive_logs) download_helper.reset_downloads_folder() proxy_helper.remove_proxy_zip_if_present() @@ -1810,7 +1810,7 @@ def pytest_collection_finish(session): from seleniumbase.core import download_helper from seleniumbase.core import proxy_helper - log_helper.log_folder_setup(sb_config.log_path, sb_config.archive_logs) + log_helper.log_folder_setup("latest_logs/", sb_config.archive_logs) download_helper.reset_downloads_folder() proxy_helper.remove_proxy_zip_if_present() if sb_config.dashboard and len(session.items) > 0: @@ -2016,9 +2016,8 @@ def _perform_pytest_unconfigure_(): pass sb_config.shared_driver = None if hasattr(sb_config, "log_path") and sb_config.item_count > 0: - log_helper.archive_logs_if_set( - sb_config.log_path, sb_config.archive_logs - ) + log_helper.archive_logs_if_set("latest_logs/", sb_config.archive_logs) + log_helper.clear_empty_logs() # Dashboard post-processing: Disable time-based refresh and stamp complete if not hasattr(sb_config, "dashboard") or not sb_config.dashboard: # Done with "pytest_unconfigure" unless using the Dashboard diff --git a/seleniumbase/plugins/sb_manager.py b/seleniumbase/plugins/sb_manager.py index e67821ddfb1..5c0f9e03372 100644 --- a/seleniumbase/plugins/sb_manager.py +++ b/seleniumbase/plugins/sb_manager.py @@ -115,6 +115,7 @@ def SB( interval=None, # SECONDS (Autoplay interval for SB Slides & Tour steps.) time_limit=None, # SECONDS (Safely fail tests that exceed the time limit.) ): + import os import sys import time import traceback @@ -809,7 +810,6 @@ def SB( terminal_width = shared_utils.get_terminal_width() if test: import colorama - import os colorama.init(autoreset=True) c1 = colorama.Fore.GREEN @@ -834,7 +834,8 @@ def SB( from seleniumbase.core import download_helper from seleniumbase.core import proxy_helper - log_helper.log_folder_setup(sb_config.log_path) + log_helper.log_folder_setup("latest_logs/") + log_helper.clear_empty_logs() download_helper.reset_downloads_folder() if not sb_config.multi_proxy: proxy_helper.remove_proxy_zip_if_present() From 7c3e34b3fea4ee84e27413dc57810c25a16d6965 Mon Sep 17 00:00:00 2001 From: Michael Mintz Date: Fri, 18 Aug 2023 18:50:01 -0400 Subject: [PATCH 2/7] Refactor downloading --- seleniumbase/core/download_helper.py | 17 ++++++++++++++--- seleniumbase/fixtures/constants.py | 3 ++- seleniumbase/fixtures/page_utils.py | 18 +++++++++--------- 3 files changed, 25 insertions(+), 13 deletions(-) diff --git a/seleniumbase/core/download_helper.py b/seleniumbase/core/download_helper.py index f34eed43eff..11347a632ab 100644 --- a/seleniumbase/core/download_helper.py +++ b/seleniumbase/core/download_helper.py @@ -24,11 +24,22 @@ def get_downloads_folder(): def reset_downloads_folder(): """Clears the downloads folder. If settings.ARCHIVE_EXISTING_DOWNLOADS is set to True, archives it.""" + archived_downloads_folder = os.path.join(os.getcwd(), ARCHIVE_DIR) + os.sep if os.path.exists(downloads_path) and not os.listdir(downloads_path) == []: - archived_downloads_folder = os.path.join( - downloads_path, "..", ARCHIVE_DIR - ) reset_downloads_folder_assistant(archived_downloads_folder) + if os.path.exists(downloads_path) and os.listdir(downloads_path) == []: + try: + os.rmdir(downloads_path) + except OSError: + pass + if ( + os.path.exists(archived_downloads_folder) + and os.listdir(archived_downloads_folder) == [] + ): + try: + os.rmdir(archived_downloads_folder) + except OSError: + pass def reset_downloads_folder_assistant(archived_downloads_folder): diff --git a/seleniumbase/fixtures/constants.py b/seleniumbase/fixtures/constants.py index 4eb3881c9c9..e61198735ea 100644 --- a/seleniumbase/fixtures/constants.py +++ b/seleniumbase/fixtures/constants.py @@ -147,7 +147,8 @@ class MultiBrowser: DRIVER_FIXING_LOCK = Files.DOWNLOADS_FOLDER + "/driver_fixing.lock" DRIVER_REPAIRED = Files.DOWNLOADS_FOLDER + "/driver_fixed.lock" CERT_FIXING_LOCK = Files.DOWNLOADS_FOLDER + "/cert_fixing.lock" - DOWNLOAD_FILE_LOCK = Files.DOWNLOADS_FOLDER + "/download_file.lock" + DOWNLOAD_FILE_LOCK = Files.DOWNLOADS_FOLDER + "/downloading.lock" + FILE_IO_LOCK = Files.DOWNLOADS_FOLDER + "/file_io.lock" class SavedCookies: diff --git a/seleniumbase/fixtures/page_utils.py b/seleniumbase/fixtures/page_utils.py index 80febfb1719..03a1e46f7d4 100644 --- a/seleniumbase/fixtures/page_utils.py +++ b/seleniumbase/fixtures/page_utils.py @@ -256,10 +256,10 @@ def _download_file_to(file_url, destination_folder, new_file_name=None): def _save_data_as(data, destination_folder, file_name): - download_file_lock = fasteners.InterProcessLock( - constants.MultiBrowser.DOWNLOAD_FILE_LOCK + file_io_lock = fasteners.InterProcessLock( + constants.MultiBrowser.FILE_IO_LOCK ) - with download_file_lock: + with file_io_lock: out_file = codecs.open( os.path.join(destination_folder, file_name), "w+", encoding="utf-8" ) @@ -268,10 +268,10 @@ def _save_data_as(data, destination_folder, file_name): def _append_data_to_file(data, destination_folder, file_name): - download_file_lock = fasteners.InterProcessLock( - constants.MultiBrowser.DOWNLOAD_FILE_LOCK + file_io_lock = fasteners.InterProcessLock( + constants.MultiBrowser.FILE_IO_LOCK ) - with download_file_lock: + with file_io_lock: existing_data = "" if os.path.exists(os.path.join(destination_folder, file_name)): with open(os.path.join(destination_folder, file_name), "r") as f: @@ -286,10 +286,10 @@ def _append_data_to_file(data, destination_folder, file_name): def _get_file_data(folder, file_name): - download_file_lock = fasteners.InterProcessLock( - constants.MultiBrowser.DOWNLOAD_FILE_LOCK + file_io_lock = fasteners.InterProcessLock( + constants.MultiBrowser.FILE_IO_LOCK ) - with download_file_lock: + with file_io_lock: if not os.path.exists(os.path.join(folder, file_name)): raise Exception("File not found!") with open(os.path.join(folder, file_name), "r") as f: From 0bd4674dc65de2e46a36c753afd876b52f4d9f96 Mon Sep 17 00:00:00 2001 From: Michael Mintz Date: Fri, 18 Aug 2023 18:50:25 -0400 Subject: [PATCH 3/7] Update timing --- seleniumbase/fixtures/base_case.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/seleniumbase/fixtures/base_case.py b/seleniumbase/fixtures/base_case.py index b555f153002..fadc4e9a917 100644 --- a/seleniumbase/fixtures/base_case.py +++ b/seleniumbase/fixtures/base_case.py @@ -395,7 +395,7 @@ def click( self.__shadow_click(selector, timeout) return if self.__needs_minimum_wait() or self.browser == "safari": - time.sleep(0.022) + time.sleep(0.03) element = page_actions.wait_for_element_visible( self.driver, selector, @@ -628,20 +628,20 @@ def click( except Exception: pass if self.__needs_minimum_wait() or self.browser == "safari": - time.sleep(0.026) + time.sleep(0.03) try: if self.driver.current_url != pre_action_url: self.__ad_block_as_needed() self.__disable_beforeunload_as_needed() if self.__needs_minimum_wait(): - time.sleep(0.026) + time.sleep(0.03) except Exception: try: self.wait_for_ready_state_complete() except Exception: pass if self.__needs_minimum_wait(): - time.sleep(0.026) + time.sleep(0.03) else: time.sleep(0.08) if self.demo_mode: @@ -12595,7 +12595,7 @@ def __click_with_offset( self.__scroll_to_element(element, selector, by) self.wait_for_ready_state_complete() if self.__needs_minimum_wait(): - time.sleep(0.025) + time.sleep(0.03) if self.demo_mode and mark is None: mark = True if mark: From c8a972a49fc45f11f4623ef2aa9ce7c0a9c1b4ca Mon Sep 17 00:00:00 2001 From: Michael Mintz Date: Fri, 18 Aug 2023 18:51:14 -0400 Subject: [PATCH 4/7] Refresh mkdocs dependencies --- mkdocs_build/requirements.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mkdocs_build/requirements.txt b/mkdocs_build/requirements.txt index b8286c286f1..6db8238c846 100644 --- a/mkdocs_build/requirements.txt +++ b/mkdocs_build/requirements.txt @@ -4,7 +4,7 @@ regex>=2023.8.8 pkginfo>=1.9.6 PyYAML>=6.0.1 -readme-renderer>=40.0 +readme-renderer>=41.0 pymdown-extensions>=10.1 importlib-metadata>=6.8.0 pipdeptree>=2.13.0 @@ -18,9 +18,9 @@ livereload==2.6.3 Markdown==3.4.4 MarkupSafe==2.1.3 Jinja2==3.1.2 -click==8.1.6 +click==8.1.7 ghp-import==2.1.0 -lunr==0.6.2 +lunr==0.7.0.post1 tornado==6.3.3 watchdog==3.0.0 cairocffi==1.6.1 From 815c02d0fe802072e362844b3e2c0a77e73851d8 Mon Sep 17 00:00:00 2001 From: Michael Mintz Date: Fri, 18 Aug 2023 18:51:40 -0400 Subject: [PATCH 5/7] Update the ReadMe --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3d958f82367..32d2dbfc54e 100755 --- a/README.md +++ b/README.md @@ -1338,7 +1338,7 @@ pytest --reruns=1 --reruns-delay=1

Gitter chat
Tested with SeleniumBase
SeleniumBase Docs
-
SeleniumBase PyPI downloads
+
SeleniumBase PyPI downloads
-------- From e31dcb754ee8d7cf52ab266a2e1523f28b346103 Mon Sep 17 00:00:00 2001 From: Michael Mintz Date: Fri, 18 Aug 2023 18:52:00 -0400 Subject: [PATCH 6/7] Refresh Python dependencies --- requirements.txt | 2 +- setup.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/requirements.txt b/requirements.txt index d0bc14091c8..60a4bfa1d45 100755 --- a/requirements.txt +++ b/requirements.txt @@ -4,7 +4,7 @@ packaging>=21.3;python_version<"3.7" packaging>=23.1;python_version>="3.7" setuptools>=59.6.0;python_version<"3.7" setuptools>=68.0.0;python_version>="3.7" and python_version<"3.8" -setuptools>=68.1.0;python_version>="3.8" +setuptools>=68.1.2;python_version>="3.8" wheel>=0.37.1;python_version<"3.7" wheel>=0.41.1;python_version>="3.7" attrs==22.1.0;python_version<"3.7" diff --git a/setup.py b/setup.py index 7da629deb05..4bd7e9c4286 100755 --- a/setup.py +++ b/setup.py @@ -138,7 +138,7 @@ 'packaging>=23.1;python_version>="3.7"', 'setuptools>=59.6.0;python_version<"3.7"', 'setuptools>=68.0.0;python_version>="3.7" and python_version<"3.8"', - 'setuptools>=68.1.0;python_version>="3.8"', + 'setuptools>=68.1.2;python_version>="3.8"', 'wheel>=0.37.1;python_version<"3.7"', 'wheel>=0.41.1;python_version>="3.7"', 'attrs==22.1.0;python_version<"3.7"', From 591f86f4d52c2d0c7350f77b1d96a90811630ff9 Mon Sep 17 00:00:00 2001 From: Michael Mintz Date: Fri, 18 Aug 2023 18:52:21 -0400 Subject: [PATCH 7/7] Version 4.17.8 --- seleniumbase/__version__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/seleniumbase/__version__.py b/seleniumbase/__version__.py index 1c79946e828..e275d328a29 100755 --- a/seleniumbase/__version__.py +++ b/seleniumbase/__version__.py @@ -1,2 +1,2 @@ # seleniumbase package -__version__ = "4.17.7" +__version__ = "4.17.8"