Урок 22. Работа с загрузкой и скачиванием файлов с Selenium

Автоматизация загрузки и скачивания файлов — частая задача при работе с веб-сайтами. Selenium позволяет управлять элементами формы для загрузки файлов и контролировать скачивание.

Загрузка файлов на сайт

Для загрузки файлов на веб-странице используется элемент <input type="file">. С помощью метода send_keys() можно указать путь к файлу на вашем компьютере.

from selenium import webdriver
from selenium.webdriver.common.by import By
import os
import time

# Указываем путь к файлу, который будем загружать
file_path = os.path.abspath("test_file.txt")

# Создаём файл для примера, если его нет
if not os.path.exists(file_path):
    with open(file_path, "w", encoding="utf-8") as f:
        f.write("Файл для загрузки через Selenium")

# Настройка браузера
driver = webdriver.Chrome()
driver.maximize_window()
driver.get("https://the-internet.herokuapp.com/upload")

# Находим элемент загрузки файла и передаём путь
file_input = driver.find_element(By.ID, "file-upload")
file_input.send_keys(file_path)
time.sleep(5)
# Нажимаем кнопку загрузки
submit_button = driver.find_element(By.ID, "file-submit")
submit_button.click()
time.sleep(5)
# Проверяем результат
result = driver.find_element(By.TAG_NAME, "h3").text
print("Результат:", result)  # Должно быть "File Uploaded!"

time.sleep(5)
driver.quit()

Этот пример:

  • открывает сайт
  • создаёт тестовый файл
  • загружает его через форму
  • проверяет, что появилось сообщение File Uploaded!
  • Скачивание файлов с сайта

    Для скачивания файлов часто требуется кликнуть на ссылку или кнопку. Важно настроить директорию скачивания в опциях браузера, чтобы файлы сохранялись автоматически.

    Приведу полный код примера: сначала загрузка файла, потом скачивание. Для скачивания используем https://the-internet.herokuapp.com/download

    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    import os
    import time
    from datetime import datetime
    
    # === Настройка имени файла с датой и временем ===
    now = datetime.now()
    timestamp = now.strftime("%Y-%m-%d_%H-%M")
    FILE = f"ParserTools_{timestamp}.txt"
    file_path = os.path.abspath(FILE)
    
    # Создаём файл для примера
    with open(file_path, "w", encoding="utf-8") as f:
        f.write("ParserTools — обучение и инструменты для парсинга.")
    
    # === Настройка папки для скачивания ===
    download_dir = os.path.abspath("downloads")
    os.makedirs(download_dir, exist_ok=True)
    
    options = webdriver.ChromeOptions()
    prefs = {
        "download.default_directory": download_dir,
        "download.prompt_for_download": False,
        "safebrowsing.enabled": True
    }
    options.add_experimental_option("prefs", prefs)
    
    driver = webdriver.Chrome(options=options)
    driver.maximize_window()
    wait = WebDriverWait(driver, 10)  # Явное ожидание
    
    # === Часть 1: Загрузка файла ===
    driver.get("https://the-internet.herokuapp.com/upload")
    time.sleep(1)  # пауза для полной загрузки страницы
    
    driver.find_element(By.ID, "file-upload").send_keys(file_path)
    time.sleep(0.5)  # пауза после выбора файла
    
    driver.find_element(By.ID, "file-submit").click()
    time.sleep(1)  # пауза после нажатия кнопки
    
    # Ждём появления имени загруженного файла
    uploaded_file_element = wait.until(
        EC.presence_of_element_located((By.ID, "uploaded-files"))
    )
    uploaded_file_name = uploaded_file_element.text
    print("Загруженный файл:", uploaded_file_name)
    time.sleep(1)  # пауза перед скачиванием
    
    # === Часть 2: Скачивание файла ===
    file_url = f"https://the-internet.herokuapp.com/download/{uploaded_file_name}"
    driver.get(file_url)
    time.sleep(2)  # пауза, чтобы браузер успел инициировать скачивание
    
    # Ждём, пока файл появится в папке downloads
    downloaded_file = os.path.join(download_dir, uploaded_file_name)
    for i in range(20):
        if os.path.exists(downloaded_file):
            print("✅ Файл скачан:", downloaded_file)
            break
        time.sleep(1)
    else:
        print("⚠ Файл не был скачан.")
    
    driver.quit()
    

    Этот пример:

  • открывает сайт the-internet.herokuapp.com
  • создаёт тестовый файл с именем ParserTools_дата_время.txt
  • загружает его через форму на странице Upload
  • ждёт появления имени загруженного файла
  • скачивает загруженный файл через прямую ссылку
  • проверяет, что файл появился в папке downloads
  • Советы по работе с файлами

    • Для загрузки файлов используйте абсолютный путь к файлу.
    • При скачивании настраивайте директорию по умолчанию, чтобы избежать ручного подтверждения.
    • Можно комбинировать Selenium с Python для проверки успешной загрузки/скачивания файлов.

    Знание работы с загрузкой и скачиванием файлов полезно для автоматизации тестирования веб-приложений и массовой обработки документов на сайтах.

    Больше уроков по парсингу на parsertools.ru/lessons.