Skip to content

Commit cb6d115

Browse files
committed
Add new methods related to file downloads
1 parent 68c544f commit cb6d115

File tree

2 files changed

+66
-17
lines changed

2 files changed

+66
-17
lines changed

help_docs/method_summary.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -467,8 +467,12 @@ self.get_downloads_folder()
467467

468468
self.get_browser_downloads_folder()
469469

470+
self.get_downloaded_files(regex=None, browser=False)
471+
470472
self.get_path_of_downloaded_file(file, browser=False)
471473

474+
self.get_data_from_downloaded_file(file, timeout=None, browser=False)
475+
472476
self.is_downloaded_file_present(file, browser=False)
473477

474478
self.is_downloaded_file_regex_present(regex, browser=False)
@@ -480,6 +484,8 @@ self.assert_downloaded_file(file, timeout=None, browser=False)
480484

481485
self.assert_downloaded_file_regex(regex, timeout=None, browser=False)
482486

487+
self.assert_data_in_downloaded_file(data, file, timeout=None, browser=False)
488+
483489
self.assert_true(expr, msg=None)
484490

485491
self.assert_false(expr, msg=None)

seleniumbase/fixtures/base_case.py

Lines changed: 60 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -6822,13 +6822,40 @@ def get_browser_downloads_folder(self):
68226822
return download_helper.get_downloads_folder()
68236823
return os.path.join(os.path.expanduser("~"), "downloads")
68246824

6825+
def get_downloaded_files(self, regex=None, browser=False):
6826+
"""Returns a list of files in the [Downloads Folder].
6827+
Depending on settings, that dir may have other files.
6828+
If regex is provided, uses that to filter results."""
6829+
df = self.get_downloads_folder()
6830+
if browser:
6831+
df = self.get_browser_downloads_folder()
6832+
if not os.path.exists(df):
6833+
return []
6834+
elif regex:
6835+
return [fn for fn in os.listdir(df) if re.match(regex, fn)]
6836+
else:
6837+
return os.listdir(df)
6838+
68256839
def get_path_of_downloaded_file(self, file, browser=False):
6826-
"""Returns the OS path of the downloaded file."""
6840+
"""Returns the full OS path of the downloaded file."""
6841+
self.__check_scope()
68276842
if browser:
68286843
return os.path.join(self.get_browser_downloads_folder(), file)
68296844
else:
68306845
return os.path.join(self.get_downloads_folder(), file)
68316846

6847+
def get_data_from_downloaded_file(self, file, timeout=None, browser=False):
6848+
"""Returns the contents of the downloaded file specified."""
6849+
self.assert_downloaded_file(file, timeout=timeout, browser=browser)
6850+
fpath = self.get_path_of_downloaded_file(file, browser=browser)
6851+
file_io_lock = fasteners.InterProcessLock(
6852+
constants.MultiBrowser.FILE_IO_LOCK
6853+
)
6854+
with file_io_lock:
6855+
with open(fpath, "r") as f:
6856+
data = f.read().strip()
6857+
return data
6858+
68326859
def is_downloaded_file_present(self, file, browser=False):
68336860
"""Returns True if the file exists in the pre-set [Downloads Folder].
68346861
For browser click-initiated downloads, SeleniumBase will override
@@ -6840,8 +6867,7 @@ def is_downloaded_file_present(self, file, browser=False):
68406867
file - The filename of the downloaded file.
68416868
browser - If True, uses the path set by click-initiated downloads.
68426869
If False, uses the self.download_file(file_url) path.
6843-
Those paths are often the same. (browser-dependent)
6844-
(Default: False)."""
6870+
Those paths are usually the same. (browser-dependent)."""
68456871
return os.path.exists(
68466872
self.get_path_of_downloaded_file(file, browser=browser)
68476873
)
@@ -6853,9 +6879,10 @@ def is_downloaded_file_regex_present(self, regex, browser=False):
68536879
regex - The filename regex of the downloaded file.
68546880
browser - If True, uses the path set by click-initiated downloads.
68556881
If False, uses the self.download_file(file_url) path.
6856-
Those paths are often the same. (browser-dependent)
6857-
(Default: False)."""
6882+
Those paths are usually the same. (browser-dependent)."""
68586883
df = self.get_downloads_folder()
6884+
if browser:
6885+
df = self.get_browser_downloads_folder()
68596886
matches = [fn for fn in os.listdir(df) if re.match(regex, fn)]
68606887
return len(matches) >= 1
68616888

@@ -6870,8 +6897,7 @@ def delete_downloaded_file_if_present(self, file, browser=False):
68706897
file - The filename to be deleted from the [Downloads Folder].
68716898
browser - If True, uses the path set by click-initiated downloads.
68726899
If False, uses the self.download_file(file_url) path.
6873-
Those paths are usually the same. (browser-dependent)
6874-
(Default: False)."""
6900+
Those paths are usually the same. (browser-dependent)."""
68756901
if self.is_downloaded_file_present(file, browser=browser):
68766902
file_path = self.get_path_of_downloaded_file(file, browser=browser)
68776903
try:
@@ -6891,8 +6917,7 @@ def delete_downloaded_file(self, file, browser=False):
68916917
file - The filename to be deleted from the [Downloads Folder].
68926918
browser - If True, uses the path set by click-initiated downloads.
68936919
If False, uses the self.download_file(file_url) path.
6894-
Those paths are usually the same. (browser-dependent)
6895-
(Default: False)."""
6920+
Those paths are usually the same. (browser-dependent)."""
68966921
if self.is_downloaded_file_present(file, browser=browser):
68976922
file_path = self.get_path_of_downloaded_file(file, browser=browser)
68986923
try:
@@ -6912,9 +6937,11 @@ def assert_downloaded_file(self, file, timeout=None, browser=False):
69126937
timeout - The time (seconds) to wait for the download to complete.
69136938
browser - If True, uses the path set by click-initiated downloads.
69146939
If False, uses the self.download_file(file_url) path.
6915-
Those paths are often the same. (browser-dependent)
6916-
(Default: False)."""
6940+
Those paths are usually the same. (browser-dependent)."""
69176941
self.__check_scope()
6942+
df = self.get_downloads_folder()
6943+
if browser:
6944+
df = self.get_browser_downloads_folder()
69186945
if not timeout:
69196946
timeout = settings.LARGE_TIMEOUT
69206947
if self.timeout_multiplier and timeout == settings.LARGE_TIMEOUT:
@@ -6929,7 +6956,7 @@ def assert_downloaded_file(self, file, timeout=None, browser=False):
69296956
self.assertTrue(
69306957
os.path.exists(downloaded_file_path),
69316958
"File [%s] was not found in the downloads folder [%s]!"
6932-
% (file, self.get_downloads_folder()),
6959+
% (file, df),
69336960
)
69346961
found = True
69356962
break
@@ -6942,7 +6969,7 @@ def assert_downloaded_file(self, file, timeout=None, browser=False):
69426969
message = (
69436970
"File {%s} was not found in the downloads folder {%s} "
69446971
"after %s seconds! (Or the download didn't complete!)"
6945-
% (file, self.get_downloads_folder(), timeout)
6972+
% (file, df, timeout)
69466973
)
69476974
page_actions.timeout_exception("NoSuchFileException", message)
69486975
if self.recorder_mode and self.__current_url_is_recordable():
@@ -6969,8 +6996,7 @@ def assert_downloaded_file_regex(self, regex, timeout=None, browser=False):
69696996
timeout - The time (seconds) to wait for the download to complete.
69706997
browser - If True, uses the path set by click-initiated downloads.
69716998
If False, uses the self.download_file(file_url) path.
6972-
Those paths are often the same. (browser-dependent)
6973-
(Default: False)."""
6999+
Those paths are usually the same. (browser-dependent)."""
69747000
self.__check_scope()
69757001
if not timeout:
69767002
timeout = settings.LARGE_TIMEOUT
@@ -6980,14 +7006,16 @@ def assert_downloaded_file_regex(self, regex, timeout=None, browser=False):
69807006
stop_ms = start_ms + (timeout * 1000.0)
69817007
found = False
69827008
df = self.get_downloads_folder()
7009+
if browser:
7010+
df = self.get_browser_downloads_folder()
69837011
for x in range(int(timeout)):
69847012
shared_utils.check_if_time_limit_exceeded()
69857013
try:
69867014
matches = [fn for fn in os.listdir(df) if re.match(regex, fn)]
69877015
self.assertTrue(
69887016
len(matches) >= 1,
69897017
"Regex [%s] was not found in the downloads folder [%s]!"
6990-
% (regex, self.get_downloads_folder()),
7018+
% (regex, df),
69917019
)
69927020
found = True
69937021
break
@@ -7000,7 +7028,7 @@ def assert_downloaded_file_regex(self, regex, timeout=None, browser=False):
70007028
message = (
70017029
"Regex {%s} was not found in the downloads folder {%s} "
70027030
"after %s seconds! (Or the download didn't complete!)"
7003-
% (regex, self.get_downloads_folder(), timeout)
7031+
% (regex, df, timeout)
70047032
)
70057033
page_actions.timeout_exception("NoSuchFileException", message)
70067034
if self.demo_mode:
@@ -7015,6 +7043,21 @@ def assert_downloaded_file_regex(self, regex, timeout=None, browser=False):
70157043
except Exception:
70167044
pass
70177045

7046+
def assert_data_in_downloaded_file(
7047+
self, data, file, timeout=None, browser=False
7048+
):
7049+
"""Assert that the expected data exists in the downloaded file."""
7050+
self.assert_downloaded_file(file, timeout=timeout, browser=browser)
7051+
expected = data.strip()
7052+
actual = self.get_data_from_downloaded_file(file, browser=browser)
7053+
if expected not in actual:
7054+
message = (
7055+
"Expected data [%s] is not in downloaded file [%s]!"
7056+
% (expected, file)
7057+
)
7058+
raise Exception(message)
7059+
return True
7060+
70187061
def assert_true(self, expr, msg=None):
70197062
"""Asserts that the expression is True.
70207063
Will raise an exception if the statement if False."""

0 commit comments

Comments
 (0)