💻 Примеры — 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)