💻 Примеры: продвинутый Selenium

← К оглавлению урока

⚡ Мини-примеры

# Alert accept
alert = driver.switch_to.alert; alert.accept()

# Переключение вкладки
tabs = driver.window_handles
driver.switch_to.window(tabs[1])

# Hover
ActionChains(driver).move_to_element(menu).perform()

# Drag and drop
ActionChains(driver).drag_and_drop(source, target).perform()

# iframe
driver.switch_to.frame(driver.find_element(By.TAG_NAME, "iframe"))
driver.switch_to.default_content()

# File upload
driver.find_element(By.ID, "file-input").send_keys(os.path.abspath("file.txt"))

Пример 1: Alert — получить текст и принять

# test_alert_accept.py
import pytest
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

@pytest.fixture
def driver():
    driver = webdriver.Chrome()
    driver.maximize_window()
    yield driver
    driver.quit()

def test_alert_accept(driver):
    driver.get("https://bonigarcia.dev/selenium-webdriver-java/dialog-boxes.html")
    wait = WebDriverWait(driver, 10)

    # Нажать кнопку, вызывающую alert
    driver.find_element(By.ID, "my-alert").click()

    # Дождаться появления alert
    alert = wait.until(EC.alert_is_present())

    # Прочитать текст и принять
    text = alert.text
    print(f"Alert text: {text}")
    alert.accept()

    assert driver.find_element(By.ID, "my-alert").is_displayed()

Пример 2: Confirm — отмена диалога

# test_confirm_dismiss.py
def test_confirm_dismiss(driver):
    driver.get("https://bonigarcia.dev/selenium-webdriver-java/dialog-boxes.html")
    wait = WebDriverWait(driver, 10)

    # Нажать кнопку confirm
    driver.find_element(By.ID, "my-confirm").click()

    # Нажать "Отмена"
    alert = wait.until(EC.alert_is_present())
    alert.dismiss()

    # Проверить результат
    result = driver.find_element(By.ID, "confirm-text").text
    assert "false" in result.lower() or "cancel" in result.lower()

Пример 3: Переключение между вкладками

# test_tabs.py
import pytest
from selenium import webdriver
from selenium.webdriver.common.by import By

@pytest.fixture
def driver():
    driver = webdriver.Chrome()
    driver.maximize_window()
    yield driver
    driver.quit()

def test_switch_tabs(driver):
    driver.get("https://example.com")

    # Открыть новую вкладку через JavaScript
    driver.execute_script("window.open('https://google.com', '_blank');")

    # Получить список всех вкладок
    tabs = driver.window_handles
    assert len(tabs) == 2

    # Переключиться на вторую вкладку (Google)
    driver.switch_to.window(tabs[1])
    assert "google" in driver.current_url.lower()

    # Закрыть вторую вкладку и вернуться на первую
    driver.close()
    driver.switch_to.window(tabs[0])
    assert "example.com" in driver.current_url

Пример 4: Hover (наведение курсора)

# test_hover.py
import pytest
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

@pytest.fixture
def driver():
    driver = webdriver.Chrome()
    driver.maximize_window()
    yield driver
    driver.quit()

def test_hover_menu(driver):
    driver.get("https://bonigarcia.dev/selenium-webdriver-java/mouse-over.html")
    wait = WebDriverWait(driver, 10)

    # Найти элемент, на который нужно навести курсор
    element = driver.find_element(By.ID, "menu")

    # Создать цепочку действий и выполнить hover
    actions = ActionChains(driver)
    actions.move_to_element(element).perform()

    # Дождаться появления подменю
    submenu = wait.until(
        EC.visibility_of_element_located((By.ID, "submenu"))
    )
    assert submenu.is_displayed()

Пример 5: Drag and Drop

# test_drag_and_drop.py
import pytest
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains

@pytest.fixture
def driver():
    driver = webdriver.Chrome()
    driver.maximize_window()
    yield driver
    driver.quit()

def test_drag_and_drop(driver):
    driver.get("https://jqueryui.com/droppable/")

    # Переключиться в iframe, где находится drag-and-drop виджет
    driver.switch_to.frame(driver.find_element(By.TAG_NAME, "iframe"))

    source = driver.find_element(By.ID, "draggable")
    target = driver.find_element(By.ID, "droppable")

    # Выполнить перетаскивание
    actions = ActionChains(driver)
    actions.drag_and_drop(source, target).perform()

    # Проверить текст в зоне drop
    result_text = target.find_element(By.TAG_NAME, "p").text
    assert "Dropped" in result_text

Пример 6: iframe — поиск текста внутри фрейма

# test_iframe.py
import pytest
from selenium import webdriver
from selenium.webdriver.common.by import By

@pytest.fixture
def driver():
    driver = webdriver.Chrome()
    driver.maximize_window()
    yield driver
    driver.quit()

def test_iframe_text(driver):
    driver.get("https://bonigarcia.dev/selenium-webdriver-java/iframes.html")

    # Найти iframe и переключиться в него
    iframe = driver.find_element(By.ID, "my-iframe")
    driver.switch_to.frame(iframe)

    # Найти параграфы внутри iframe
    paragraphs = driver.find_elements(By.TAG_NAME, "p")

    # Проверить наличие нужного текста
    expected_text = "semper posuere integer et senectus justo curabitur."
    found = any(expected_text in p.text for p in paragraphs)
    assert found, f"Текст '{expected_text}' не найден в iframe"

    # Вернуться в основной контекст
    driver.switch_to.default_content()

Пример 7: Загрузка файла

# test_file_upload.py
import pytest
import os
from selenium import webdriver
from selenium.webdriver.common.by import By

@pytest.fixture
def driver():
    driver = webdriver.Chrome()
    driver.maximize_window()
    yield driver
    driver.quit()

def test_file_upload(driver):
    driver.get("https://the-internet.herokuapp.com/upload")

    # Найти input[type=file]
    file_input = driver.find_element(By.ID, "file-upload")

    # Передать абсолютный путь к файлу
    file_path = os.path.abspath("test_data/sample.txt")
    file_input.send_keys(file_path)

    # Нажать кнопку Upload
    driver.find_element(By.ID, "file-submit").click()

    # Проверить успешную загрузку
    header = driver.find_element(By.TAG_NAME, "h3")
    assert "File Uploaded!" in header.text