💻 Примеры — Alert, вкладки, ActionChains, iframe, загрузка файлов

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

⚡ Главные примеры

# Минимальный тест с Alert
wait = WebDriverWait(browser, 10)
alert = wait.until(EC.alert_is_present())
assert "Congrats" in alert.text
alert.accept()

# Минимальный тест с новой вкладкой
original = browser.current_window_handle
browser.find_element(By.ID, "open-tab-btn").click()
new_tab = [h for h in browser.window_handles if h != original][0]
browser.switch_to.window(new_tab)

# Минимальный тест hover
ActionChains(browser).move_to_element(menu).perform()

# Минимальный тест drag and drop
ActionChains(browser).drag_and_drop(source, target).perform()

# Минимальный тест iframe
driver.switch_to.frame(driver.find_element(By.TAG_NAME, "iframe"))
text = driver.find_element(By.CSS_SELECTOR, "p").text
driver.switch_to.default_content()

Пример 1: Заполнение большой формы и проверка Alert

Страница suninjuly.github.io/huge_form.html: заполнить все поля и проверить Alert с подтверждением.

# test_huge_form.py
import pytest
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.alert import Alert
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC


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


def test_fill_form_and_check_alert(browser):
    url = "http://suninjuly.github.io/huge_form.html"
    browser.get(url)

    # Находим все input-поля и заполняем каждое значением "Hello"
    input_fields = browser.find_elements(By.TAG_NAME, "input")
    for field in input_fields:
        field.clear()
        field.send_keys("Hello")

    # Нажимаем кнопку Submit
    submit_button = browser.find_element(By.CLASS_NAME, "btn-default")
    submit_button.click()

    # Ждём появления Alert
    wait = WebDriverWait(browser, 10)
    alert = wait.until(EC.alert_is_present())

    # Получаем текст и проверяем
    alert_text = Alert(browser).text
    expected_substring = "Congrats, you've passed the task!"
    assert expected_substring in alert_text, (
        f"Ожидаемая строка '{expected_substring}' отсутствует в alert: '{alert_text}'"
    )

    alert.accept()

Пример 2: Математическое выражение, чекбокс, radio и Alert

Страница suninjuly.github.io/math.html: вычислить выражение, заполнить форму и проверить Alert.

# test_math_form.py
import pytest
import math
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.alert import Alert
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC


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


def calc(x):
    """Вычисляем ln(abs(12 * sin(x)))"""
    return str(math.log(abs(12 * math.sin(int(x)))))


def test_math_form(browser):
    url = "https://suninjuly.github.io/math.html"
    browser.get(url)

    # Считываем значение x и вычисляем результат
    x_value = browser.find_element(By.ID, "input_value").text
    result = calc(x_value)

    # Вводим результат
    answer_input = browser.find_element(By.ID, "answer")
    answer_input.send_keys(result)

    # Устанавливаем чекбокс "I'm the robot"
    robot_checkbox = browser.find_element(By.ID, "robotCheckbox")
    robot_checkbox.click()

    # Выбираем радиокнопку "Robots rule"
    robots_rule_radio = browser.find_element(By.ID, "robotsRule")
    robots_rule_radio.click()

    # Нажимаем Submit
    submit_button = browser.find_element(By.CLASS_NAME, "btn-default")
    submit_button.click()

    # Ждём Alert и проверяем
    wait = WebDriverWait(browser, 10)
    alert = wait.until(EC.alert_is_present())
    alert_text = Alert(browser).text

    expected_substring = "Congrats, you've passed the task!"
    assert expected_substring in alert_text, (
        f"Ожидаемая строка '{expected_substring}' отсутствует в alert: '{alert_text}'"
    )

    alert.accept()

Пример 3: Redirect на новую вкладку и Alert

Страница suninjuly.github.io/redirect_accept.html: кнопка открывает новую вкладку, в ней — форма с математикой и Alert.

# test_redirect_tab.py
import pytest
import math
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.alert import Alert
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC


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


def calc(x):
    return str(math.log(abs(12 * math.sin(int(x)))))


def test_redirect_and_math(browser):
    url = "http://suninjuly.github.io/redirect_accept.html"
    browser.get(url)

    # Запоминаем текущую вкладку
    original_tab = browser.current_window_handle

    # Кликаем по кнопке, открывающей новую вкладку
    button = browser.find_element(By.CLASS_NAME, "trollface")
    button.click()

    # Находим новую вкладку и переключаемся на неё
    new_tab = [h for h in browser.window_handles if h != original_tab][0]
    browser.switch_to.window(new_tab)

    # На новой вкладке: считываем x и вычисляем
    x_value = browser.find_element(By.ID, "input_value").text
    result = calc(x_value)

    # Вводим ответ
    answer_input = browser.find_element(By.ID, "answer")
    answer_input.send_keys(result)

    # Нажимаем Submit
    submit_button = browser.find_element(By.CLASS_NAME, "btn-primary")
    submit_button.click()

    # Ждём Alert и проверяем
    wait = WebDriverWait(browser, 10)
    alert = wait.until(EC.alert_is_present())
    alert_text = Alert(browser).text

    expected_substring = "Congrats, you've passed the task!"
    assert expected_substring in alert_text, (
        f"Ожидаемая строка '{expected_substring}' отсутствует в alert: '{alert_text}'"
    )

    alert.accept()

Пример 4: Hover-меню с ActionChains

Страница crossbrowsertesting.github.io/hover-menu.html: наведение курсора на вложенное меню и клик по скрытому пункту.

# test_hover_menu.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 browser():
    driver = webdriver.Chrome()
    driver.maximize_window()
    yield driver
    driver.quit()


def test_hover_menu(browser):
    url = "https://crossbrowsertesting.github.io/hover-menu.html"
    browser.get(url)

    actions = ActionChains(browser)

    # Наводим курсор на "Dropdown"
    dropdown = browser.find_element(By.LINK_TEXT, "Dropdown")
    actions.move_to_element(dropdown).perform()

    # Наводим курсор на "Secondary Menu"
    secondary_menu = browser.find_element(By.LINK_TEXT, "Secondary Menu")
    actions.move_to_element(secondary_menu).perform()

    # Кликаем на "Secondary Action"
    secondary_action = browser.find_element(By.LINK_TEXT, "Secondary Action")
    secondary_action.click()

    # Ожидаем заголовок
    wait = WebDriverWait(browser, 10)
    header = wait.until(EC.presence_of_element_located((By.TAG_NAME, "h1")))

    assert header.text == "Secondary Page", (
        f"Заголовок не совпадает, найдено: {header.text}"
    )

Пример 5: Drag and Drop с ActionChains

Страница crossbrowsertesting.github.io/drag-and-drop.html: перетащить элемент и проверить изменение текста.

# test_drag_drop.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 browser():
    driver = webdriver.Chrome()
    driver.maximize_window()
    yield driver
    driver.quit()


def test_drag_and_drop(browser):
    url = "https://crossbrowsertesting.github.io/drag-and-drop.html"
    browser.get(url)

    draggable = browser.find_element(By.ID, "draggable")
    droppable = browser.find_element(By.ID, "droppable")

    actions = ActionChains(browser)
    actions.drag_and_drop(draggable, droppable).perform()

    # Ждём изменения текста
    wait = WebDriverWait(browser, 5)
    dropped = wait.until(
        EC.text_to_be_present_in_element((By.ID, "droppable"), "Dropped!")
    )

    assert dropped, "Текст в droppable не изменился на 'Dropped!'"

Пример 6: Drag and Drop внутри iframe (jqueryui)

Пример из лекции: drag-and-drop на странице jqueryui.com находится внутри iframe — нужно сначала переключиться в него.

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

driver = webdriver.Chrome()
driver.get("https://jqueryui.com/droppable/")

# Переключаемся в iframe с демо-содержимым
iframe = driver.find_element(By.TAG_NAME, "iframe")
driver.switch_to.frame(iframe)

# Теперь находим элементы внутри 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()

# Возвращаемся в основной контекст
driver.switch_to.default_content()

Пример 7: Загрузка файла через input[type=file]

Страница suninjuly.github.io/file_input.html: заполнить форму, загрузить файл, проверить Alert.

# test_file_upload.py
import pytest
import os
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.alert import Alert
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC


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


def test_file_upload(browser):
    url = "http://suninjuly.github.io/file_input.html"
    browser.get(url)

    # Заполняем поля формы
    browser.find_element(By.NAME, "firstname").send_keys("John")
    browser.find_element(By.NAME, "lastname").send_keys("Doe")
    browser.find_element(By.NAME, "email").send_keys("test@example.com")

    # Создаём временный тестовый файл
    file_path = os.path.abspath("test_file.txt")
    with open(file_path, "w") as f:
        f.write("Hello, this is a test file.")

    # Передаём путь к файлу в input[type=file]
    file_input = browser.find_element(By.ID, "file")
    file_input.send_keys(file_path)

    # Нажимаем Submit
    browser.find_element(By.CLASS_NAME, "btn-primary").click()

    # Ждём Alert
    wait = WebDriverWait(browser, 10)
    alert = wait.until(EC.alert_is_present())

    # Проверяем текст
    alert_text = Alert(browser).text
    expected_text = "Congrats, you've passed the task!"
    assert expected_text in alert_text, (
        f"Ожидаемая строка '{expected_text}' отсутствует в alert: '{alert_text}'"
    )

    alert.accept()

    # Удаляем временный файл
    os.remove(file_path)