Загрузки
Перехват, мониторинг и сохранение загружаемых файлов в Playwright.
Основные методы работы с загрузками
page.on("download", handler)
Событие download срабатывает при начале загрузки файла. Обработчик получает объект Download.
from playwright.sync_api import sync_playwright def handle_download(download): print(f"Файл: {download.suggested_filename}") download.save_as("downloaded_file.pdf") with sync_playwright() as p: browser = p.chromium.launch() page = browser.new_page() page.on("download", handle_download) page.get_by_text("Скачать PDF").click() page.wait_for_timeout(5000) browser.close()
download.path() — путь к временному файлу
Возвращает путь к временному файлу на диске. Доступен только после завершения загрузки.
def on_download(download): # Ждём завершения загрузки file_path = download.path() print(f"Временный файл: {file_path}") page.on("download", on_download)
Примечание: Временный файл существует только во время сессии. Используйте download.save_as() для постоянного сохранения.
download.save_as(path) — сохранение
Копирует загруженный файл в указанное место. Можно вызывать только после завершения загрузки.
def save_report(download): download.save_as("reports/report.pdf") page.on("download", save_report)
download.failure() — ошибка загрузки
Возвращает текст ошибки или None, если загрузка прошла успешно.
def check_download(download): error = download.failure() if error: print(f"Ошибка загрузки: {error}") else: print("Загрузка успешна") page.on("download", check_download)
download.url и download.suggested_filename
Свойства Download:
- download.url — URL, с которого загружается файл
- download.suggested_filename — имя файла, предложенное сервером
def log_download_info(download): print(f"URL: {download.url}") print(f"Имя: {download.suggested_filename}") page.on("download", log_download_info)
download.cancel() — отмена
Отменяет активную загрузку (до её завершения).
def cancel_large_file(download): if "large" in download.suggested_filename: download.cancel() page.on("download", cancel_large_file)
download.delete() — удаление временного файла
Удаляет временный файл с диска.
download.delete()
Ожидание загрузки
expect(download).to_be_resolved()
Используется с Playwright Pytest для ожидания завершения загрузки.
from playwright.sync_api import expect def test_download(page): with page.expect_event("download") as dl_info: page.get_by_text("Скачать").click() download = dl_info.value expect(download).to_be_resolved() download.save_as("test.pdf")
context.expect_event("download")
Контекстный менеджер для ожидания загрузки на уровне контекста.
with context.expect_event("download") as dl_info: page.get_by_role("link", name="Скачать архив").click() download = dl_info.value print(download.suggested_filename)
Время загрузки и прогресс
Можно отслеживать прогресс загрузки через события объекта Download.
import time def monitor_download(download): start = time.time() while not download.failure() and download.url: elapsed = time.time() - start if download.path(): print(f"Загрузка завершена за {elapsed:.2f} сек") break time.sleep(0.1) page.on("download", monitor_download)
Совет: Используйте page.expect_event("download") или context.expect_event("download") для надёжного ожидания загрузки. Это гарантирует перехват события, даже если загрузка началась до вызова основной операции.
Важно: Метод download.path() выбрасывает исключение, если загрузка ещё не завершилась или произошла ошибка. Всегда проверяйте download.failure() перед вызовом.