Skip to content

Commit 2421d21

Browse files
authored
Merge pull request #1790 from seleniumbase/more-methods-for-saving-and-reading-file-data
More methods for saving and reading file data
2 parents 733607a + 9082067 commit 2421d21

File tree

10 files changed

+74
-17
lines changed

10 files changed

+74
-17
lines changed

help_docs/method_summary.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -434,6 +434,10 @@ self.save_file_as(file_url, new_file_name, destination_folder=None)
434434

435435
self.save_data_as(data, file_name, destination_folder=None)
436436

437+
self.append_data_to_file(data, file_name, destination_folder=None)
438+
439+
self.get_file_data(file_name, folder=None)
440+
437441
self.get_downloads_folder()
438442

439443
self.get_browser_downloads_folder()

mkdocs_build/requirements.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ Jinja2==3.1.2
1313
click==8.1.3
1414
ghp-import==2.1.0
1515
readme-renderer==37.3
16-
pymdown-extensions==9.9.2
16+
pymdown-extensions==9.10
1717
importlib-metadata==6.0.0
1818
pipdeptree==2.5.2
1919
bleach==6.0.0
@@ -27,7 +27,7 @@ cssselect2==0.7.0
2727
tinycss2==1.2.1
2828
defusedxml==0.7.1
2929
mkdocs==1.4.2
30-
mkdocs-material==9.1.0
30+
mkdocs-material==9.1.1
3131
mkdocs-exclude-search==0.6.5
3232
mkdocs-simple-hooks==0.1.5
3333
mkdocs-material-extensions==1.1.1

requirements.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ idna==3.4
3030
chardet==4.0.0;python_version<"3.7"
3131
chardet==5.1.0;python_version>="3.7"
3232
charset-normalizer==2.0.12;python_version<"3.7"
33-
charset-normalizer==3.0.1;python_version>="3.7"
33+
charset-normalizer==3.1.0;python_version>="3.7"
3434
urllib3==1.26.12;python_version<"3.7"
3535
urllib3==1.26.14;python_version>="3.7"
3636
requests==2.27.1;python_version<"3.7"

seleniumbase/__version__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
# seleniumbase package
2-
__version__ = "4.13.7"
2+
__version__ = "4.13.8"

seleniumbase/behave/behave_sb.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -813,8 +813,8 @@ def get_configured_sb(context):
813813
'(Linux uses "-D headless" by default. '
814814
'To override, use "-D headed" / "-D gui". '
815815
'For Xvfb mode instead, use "-D xvfb". '
816-
'Or hide this info with "-D headless",'
817-
'or by calling the new "-D headless2".)'
816+
"Or you can hide this info by using"
817+
'"-D headless" / "-D headless2".)'
818818
)
819819
sb.headless = True
820820
# Recorder Mode can still optimize scripts in --headless2 mode.

seleniumbase/fixtures/base_case.py

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6453,13 +6453,32 @@ def save_file_as(self, file_url, new_file_name, destination_folder=None):
64536453
)
64546454

64556455
def save_data_as(self, data, file_name, destination_folder=None):
6456-
"""Saves the data specified to a file of the name specified.
6456+
"""Saves the data specified to the file specified.
64576457
If no destination folder is specified, the default one is used.
6458-
(The default [Downloads Folder] = "./downloaded_files")"""
6458+
(The default folder = "./downloaded_files")
6459+
Use "." as the destination folder for the current directory."""
64596460
if not destination_folder:
64606461
destination_folder = constants.Files.DOWNLOADS_FOLDER
64616462
page_utils._save_data_as(data, destination_folder, file_name)
64626463

6464+
def append_data_to_file(self, data, file_name, destination_folder=None):
6465+
"""Appends the data specified to the file specified.
6466+
If no destination folder is specified, the default one is used.
6467+
(The default folder = "./downloaded_files")
6468+
Use "." as the folder for the current directory."""
6469+
if not destination_folder:
6470+
destination_folder = constants.Files.DOWNLOADS_FOLDER
6471+
page_utils._append_data_to_file(data, destination_folder, file_name)
6472+
6473+
def get_file_data(self, file_name, folder=None):
6474+
"""Gets the data from the file specified.
6475+
If no folder is specified, the default one is used.
6476+
(The default folder = "./downloaded_files")
6477+
Use "." as the folder for the current directory."""
6478+
if not folder:
6479+
folder = constants.Files.DOWNLOADS_FOLDER
6480+
return page_utils._get_file_data(folder, file_name)
6481+
64636482
def get_downloads_folder(self):
64646483
"""Returns the path of the SeleniumBase "downloaded_files/" folder.
64656484
Calling self.download_file(file_url) will put that file in here.

seleniumbase/fixtures/page_utils.py

Lines changed: 38 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -253,11 +253,45 @@ def _download_file_to(file_url, destination_folder, new_file_name=None):
253253

254254

255255
def _save_data_as(data, destination_folder, file_name):
256-
out_file = codecs.open(
257-
destination_folder + "/" + file_name, "w+", encoding="utf-8"
256+
download_file_lock = fasteners.InterProcessLock(
257+
constants.MultiBrowser.DOWNLOAD_FILE_LOCK
258+
)
259+
with download_file_lock:
260+
out_file = codecs.open(
261+
os.path.join(destination_folder, file_name), "w+", encoding="utf-8"
262+
)
263+
out_file.writelines(data)
264+
out_file.close()
265+
266+
267+
def _append_data_to_file(data, destination_folder, file_name):
268+
download_file_lock = fasteners.InterProcessLock(
269+
constants.MultiBrowser.DOWNLOAD_FILE_LOCK
258270
)
259-
out_file.writelines(data)
260-
out_file.close()
271+
with download_file_lock:
272+
existing_data = ""
273+
if os.path.exists(os.path.join(destination_folder, file_name)):
274+
with open(os.path.join(destination_folder, file_name), "r") as f:
275+
existing_data = f.read()
276+
if not existing_data.split("\n")[-1] == "":
277+
existing_data += "\n"
278+
out_file = codecs.open(
279+
os.path.join(destination_folder, file_name), "w+", encoding="utf-8"
280+
)
281+
out_file.writelines("%s%s" % (existing_data, data))
282+
out_file.close()
283+
284+
285+
def _get_file_data(folder, file_name):
286+
download_file_lock = fasteners.InterProcessLock(
287+
constants.MultiBrowser.DOWNLOAD_FILE_LOCK
288+
)
289+
with download_file_lock:
290+
if not os.path.exists(os.path.join(folder, file_name)):
291+
raise Exception("File not found!")
292+
with open(os.path.join(folder, file_name), "r") as f:
293+
data = f.read()
294+
return data
261295

262296

263297
def make_css_match_first_element_only(selector):

seleniumbase/plugins/pytest_plugin.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1587,8 +1587,8 @@ def pytest_configure(config):
15871587
"(Linux uses --headless by default. "
15881588
"To override, use --headed / --gui. "
15891589
"For Xvfb mode instead, use --xvfb. "
1590-
"Or hide this info with --headless, "
1591-
"or by calling the new --headless2.)"
1590+
"Or you can hide this info by using "
1591+
"--headless / --headless2.)"
15921592
)
15931593
sb_config.headless = True
15941594

seleniumbase/plugins/selenium_plugin.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1138,8 +1138,8 @@ def beforeTest(self, test):
11381138
"(Linux uses --headless by default. "
11391139
"To override, use --headed / --gui. "
11401140
"For Xvfb mode instead, use --xvfb. "
1141-
"Or hide this info with --headless, "
1142-
"or by calling the new --headless2.)"
1141+
"Or you can hide this info by using "
1142+
"--headless / --headless2.)"
11431143
)
11441144
self.options.headless = True
11451145
test.test.headless = True

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@
154154
'chardet==4.0.0;python_version<"3.7"',
155155
'chardet==5.1.0;python_version>="3.7"', # Stay in sync with "requests"
156156
'charset-normalizer==2.0.12;python_version<"3.7"',
157-
'charset-normalizer==3.0.1;python_version>="3.7"', # Sync "requests"
157+
'charset-normalizer==3.1.0;python_version>="3.7"', # Sync "requests"
158158
'urllib3==1.26.12;python_version<"3.7"',
159159
'urllib3==1.26.14;python_version>="3.7"',
160160
'requests==2.27.1;python_version<"3.7"',

0 commit comments

Comments
 (0)