Playwright Python — справочник На главный сайт

Основные методы работы с загрузками

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() перед вызовом.