Skip to content

Commit fc45295

Browse files
committed
[py] download file do not return a string
1 parent d1038c1 commit fc45295

File tree

3 files changed

+30
-24
lines changed

3 files changed

+30
-24
lines changed

py/selenium/webdriver/remote/remote_connection.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,6 @@
5959
Command.CLEAR_ELEMENT: ("POST", "/session/$sessionId/element/$id/clear"),
6060
Command.GET_ELEMENT_TEXT: ("GET", "/session/$sessionId/element/$id/text"),
6161
Command.SEND_KEYS_TO_ELEMENT: ("POST", "/session/$sessionId/element/$id/value"),
62-
Command.UPLOAD_FILE: ("POST", "/session/$sessionId/se/file"),
6362
Command.GET_ELEMENT_TAG_NAME: ("GET", "/session/$sessionId/element/$id/name"),
6463
Command.IS_ELEMENT_SELECTED: ("GET", "/session/$sessionId/element/$id/selected"),
6564
Command.IS_ELEMENT_ENABLED: ("GET", "/session/$sessionId/element/$id/enabled"),
@@ -122,6 +121,7 @@
122121
"/session/$sessionId/webauthn/authenticator/$authenticatorId/credentials",
123122
),
124123
Command.SET_USER_VERIFIED: ("POST", "/session/$sessionId/webauthn/authenticator/$authenticatorId/uv"),
124+
Command.UPLOAD_FILE: ("POST", "/session/$sessionId/se/file"),
125125
Command.GET_DOWNLOADABLE_FILES: ("GET", "/session/$sessionId/se/files"),
126126
Command.DOWNLOAD_FILE: ("POST", "/session/$sessionId/se/files"),
127127
Command.DELETE_DOWNLOADABLE_FILES: ("DELETE", "/session/$sessionId/se/files"),

py/selenium/webdriver/remote/webdriver.py

+14-4
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,10 @@
1515
# specific language governing permissions and limitations
1616
# under the License.
1717
"""The WebDriver implementation."""
18+
import base64
1819
import contextlib
1920
import copy
21+
import os
2022
import pkgutil
2123
import types
2224
import typing
@@ -1136,14 +1138,22 @@ def set_user_verified(self, verified: bool) -> None:
11361138
def get_downloadable_files(self) -> dict:
11371139
"""Retrieves the downloadable files as a map of file names and their
11381140
corresponding URLs."""
1139-
return self.execute(Command.GET_DOWNLOADABLE_FILES)["value"]
1141+
return self.execute(Command.GET_DOWNLOADABLE_FILES)["value"]["names"]
11401142

1141-
def download_file(self, file_name: str) -> str:
1142-
"""Downloads a file with the specified file name.
1143+
def download_file(self, file_name: str, target_directory: str) -> None:
1144+
"""Downloads a file with the specified file name to the target directory
11431145
11441146
file_name: The name of the file to download.
1147+
target_directory: The path to the directory to save the downloaded file.
11451148
"""
1146-
return self.execute(Command.DOWNLOAD_FILE, {"name": file_name})["value"]
1149+
if not os.path.exists(target_directory):
1150+
os.makedirs(target_directory)
1151+
1152+
contents = self.execute(Command.DOWNLOAD_FILE, {"name": file_name})["value"]["contents"]
1153+
1154+
target_file = os.path.join(target_directory, file_name)
1155+
with open(target_file, "wb") as file:
1156+
file.write(base64.b64decode(contents))
11471157

11481158
def delete_downloadable_files(self) -> None:
11491159
"""Deletes all downloadable files."""

py/test/selenium/webdriver/remote/remote_downloads_tests.py

+15-19
Original file line numberDiff line numberDiff line change
@@ -14,47 +14,43 @@
1414
# KIND, either express or implied. See the License for the
1515
# specific language governing permissions and limitations
1616
# under the License.
17-
import base64
18-
import io
19-
import zipfile
20-
from time import sleep
21-
22-
import pytest
17+
import os
18+
import tempfile
2319

2420
from selenium.webdriver.common.by import By
21+
from selenium.webdriver.support.wait import WebDriverWait
2522

2623

2724
def test_get_downloadable_files(driver, pages):
2825
pages.load("downloads/download.html")
2926
driver.find_element(By.ID, "file-1").click()
3027
driver.find_element(By.ID, "file-2").click()
31-
sleep(3)
28+
WebDriverWait(driver, 3).until(lambda d: len(d.get_downloadable_files()) == 2)
29+
30+
file_names = driver.get_downloadable_files()
3231

33-
file_names = driver.get_downloadable_files()["names"]
3432
assert "file_1.txt" in file_names
3533
assert "file_2.jpg" in file_names
3634

3735

3836
def test_download_file(driver, pages):
3937
pages.load("downloads/download.html")
4038
driver.find_element(By.ID, "file-1").click()
41-
sleep(3)
39+
WebDriverWait(driver, 3).until(lambda d: d.get_downloadable_files())
4240

43-
file_contents = driver.download_file("file_1.txt")["contents"]
44-
file_byte_data = base64.b64decode(file_contents)
45-
zip_memory = io.BytesIO(file_byte_data)
41+
file_name = driver.get_downloadable_files()[0]
42+
with tempfile.TemporaryDirectory() as target_directory:
43+
driver.download_file(file_name, target_directory)
4644

47-
with zipfile.ZipFile(zip_memory, "r") as zip_ref:
48-
for name in zip_ref.namelist():
49-
with zip_ref.open(name) as file:
50-
file_content = file.read()
51-
assert "Hello, World!" in file_content.decode("utf-8")
45+
target_file = os.path.join(target_directory, file_name)
46+
with open(target_file, "r") as file:
47+
assert "Hello, World!" in file.read()
5248

5349

5450
def test_delete_downloadable_files(driver, pages):
5551
pages.load("downloads/download.html")
5652
driver.find_element(By.ID, "file-1").click()
57-
sleep(3)
53+
WebDriverWait(driver, 3).until(lambda d: d.get_downloadable_files())
5854

5955
driver.delete_downloadable_files()
60-
assert not driver.get_downloadable_files()["names"]
56+
assert not driver.get_downloadable_files()

0 commit comments

Comments
 (0)