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




-
+

--------
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"