Чуть больше про Selenium. Урок 3
План урока:
- Что такое опции Браузера?
- Как происходит загрузка страницы в браузере и зачем нужны ожидания?
- Что такое load strategy в Selenium?
- Виды ожиданий в Selenium: Явные ожидание Неявное ожидание
- Что такое Expected Conditions
Что такое Опции Браузера?
Опции браузера в контексте Selenium позволяют настроить поведение браузера перед началом сессии тестирования. Эти опции могут включать в себя различные настройки, такие как отключение попапов, запуск браузера в полноэкранном режиме, добавление расширений, управление cookie и многие другие параметры. Они используются для того, чтобы настроить среду тестирования под конкретные нужды и требования.
Как использовать Опции Браузера в Selenium?
Для использования опций браузера в Selenium, вы должны создать объект опций для конкретного браузера, который вы используете (например, ChromeOptions для Google Chrome, FirefoxOptions для Mozilla Firefox), настроить необходимые параметры и передать этот объект при создании экземпляра веб-драйвера.
Пример:
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import pytest
@pytest.fixture
def chrome_options():
options = Options()
options.add_argument('--headless')
return options
@pytest.fixture
def driver(chrome_options):
driver = webdriver.Chrome(options=chrome_options)
yield driver
driver.quit()
def test_example(driver):
driver.get('https://www.saucedemo.com/')
assert driver.current_url == 'https://www.saucedemo.com/'
driver.quit()
Аналогичным образом можно настроить и другие браузеры, создавая соответствующие объекты опций и передавая их при создании веб-драйвера. Использование опций браузера в Selenium позволяет более гибко настроить среду выполнения тестов, что может быть особенно полезно при работе с различными средами тестирования и настройками браузера.
Список существующих опций можно найти тут:
- https://github.com/GoogleChrome/chrome-launcher/blob/main/docs/chrome-flags-for-tools.md
- https://peter.sh/experiments/chromium-command-line-switches/?
Чуть подробнее про опции можно почитать в документации Selenium: https://www.selenium.dev/documentation/webdriver/browsers/chrome/
Как происходит загрузка страницы?
Вопрос достаточно сложен для понимания и включает в себя большое количество тем: Я предлагаю очень сильно упростить схему для общего понимания происходящего.
Как же происходит загрузка нашей страницы?
- Запрос на Страницу Браузер отправляет HTTP-запрос на сервер, чтобы получить содержимое веб-страницы.
- Загрузка Содержимого Сервер отвечает на запрос, отправляя обратно HTML-код страницы. Браузер начинает загружать и обрабатывать код. Он также запрашивает и загружает внешние ресурсы, такие как стили, скрипты и изображения.
- Построение DOM Браузер строит DOM-дерево (Объектную Модель Документа) на основе HTML-кода. DOM представляет собой структуру, которая делает элементы страницы доступными для манипуляций с помощью JavaScript.
- Применение CSS и Рендеринг После построения DOM браузер применяет стили из CSS, вычисляет раскладку элементов на странице и отрисовывает ее на экране.
- Запуск JavaScript Если на странице есть JavaScript, браузер запускает его. JavaScript может изменять содержимое страницы, стили и поведение, а также взаимодействовать с сервером.
Материалы для более подробного ознакомления
Что такое DOM? https://doka.guide/js/dom/
Как браузер рисует страницу? https://doka.guide/js/how-the-browser-creates-pages/
Как работает браузер? https://developer.mozilla.org/ru/docs/Web/Performance/How_browsers_work
Супер! Думаю некоторые из вас задавались интересным вопросом. Как же Selenium понимает когда ему необходимо начинать искать элементы и выполнять с ними определенные действия?
Load strategy:
- https://learn.javascript.ru/onload-ondomcontentloaded
- https://www.selenium.dev/documentation/webdriver/drivers/options/#pageloadstrategy
Для чего нужны ожидания в Selenium?
- Динамическая загрузка контента: Современные веб-приложения часто используют асинхронную загрузку данных через AJAX или другие технологии. Это означает, что после загрузки основной части страницы определенные элементы или данные могут появляться с задержкой. Если Selenium попытается взаимодействовать с элементом до его загрузки, это приведет к ошибке.
- Задержки при рендеринге: Некоторые элементы или анимации могут требовать времени на отображение на странице. Ожидание завершения скриптов: Некоторые действия на странице могут инициировать выполнение JavaScript-скриптов, которые требуют времени на выполнение.
- Ожидание переходов: После клика по ссылке или кнопке может потребоваться время для перехода на новую страницу или обновления текущей
- Синхронизация тестов: Ожидания могут помогать убедиться, что тест выполняется в правильной последовательности и что предыдущие действия были завершены перед началом следующих.
Какие виды ожиданий предоставляет Selenium?
Явное ожидание (explicit) Неявное ожидание (implicit)
Так же мы помним про не Selenium вид ожидания: time.sleep()
Предлагаю начать с неявного ожидания:
В Selenium есть встроенный способ автоматического ожидания элементов, называемый неявным ожиданием. Неявное значение ожидания можно установить либо с помощью возможности тайм-аутов в параметрах браузера, либо с помощью метода драйвера (как показано ниже).
Это глобальный параметр, который применяется к каждому вызову местоположения элемента на протяжении всего сеанса. Значение по умолчанию — 0, что означает, что если элемент не найден, он немедленно вернет ошибку. Если установлено неявное ожидание, драйвер будет ждать в течение предоставленного значения, прежде чем вернуть ошибку. Обратите внимание: как только элемент будет обнаружен, драйвер вернет ссылку на элемент, и код продолжит выполнение, поэтому большее значение неявного ожидания не обязательно приведет к увеличению продолжительности сеанса.
Сайт для тренировки в ожиданиях: https://demoqa.com/dynamic-properties
Явные ожидания
Явные ожидания в Selenium WebDriver используются для обеспечения лучшего способа ожидания элементов на веб-странице. В отличие от неявных ожиданий, которые просто задают максимальное время ожидания появления элемента на странице, явные ожидания позволяют задать условия, при которых выполнение теста будет продолжено.
Неявные ожидания (Implicit Waits):
- Время ожидания: Неявные ожидания задают фиксированный таймаут, который будет применяться ко всем попыткам найти элемент на странице.
- Применение: Применяются ко всем последующим командам в скрипте после установки таймаута.
- Гибкость: Менее гибкие, так как применяются ко всем командам одинаково и не позволяют задавать сложные условия ожидания для отдельных элементов.
- Ошибки: Если элемент не найден в течение заданного времени, выбрасывается исключение NoSuchElementException.
- Надежность: Могут быть менее надежными для динамических веб-страниц, где время загрузки элементов может сильно варьироваться.
- Простота использования: Просты в использовании и настройке.
Явные ожидания (Explicit Waits):
- Время ожидания: Позволяют задавать максимальное время ожидания для конкретного условия или элемента.
- Применение: Применяются только к конкретным элементам и условиям, которые вы определите.
- Гибкость: Более гибкие, так как позволяют задавать различные условия ожидания для разных элементов.
- Ошибки: Возможны различные исключения в зависимости от условия ожидания. Например, TimeoutException, если элемент не удовлетворяет условию в течение заданного времени.
- Надежность: Более надежны для динамических веб-страниц, так как позволяют явно указывать условия, при которых следует продолжать выполнение теста.
- Простота использования: Могут потребовать больше кода и времени на настройку по сравнению неявными ожиданиями.
Оба вида ожиданий имеют свое место в автоматизированном тестировании веб-приложений, и выбор между ними зависит от конкретной ситуации и требований к тестам.
Пример явного ожидания:
# Импортируем класс для работы с браузером Chrome
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
# Импортируем класс для работы с элементами веб-страницы
from selenium.webdriver.remote.webelement import WebElement
# Создаем экземпляр драйвера для браузера Chrome
driver = webdriver.Chrome()
# Устанавливаем явное ожидание с таймаутом в 10 секунд
wait = WebDriverWait(driver, timeout=10)
def test_visible_after_with_explicit_waits():
# Открываем страницу по указанному URL
driver.get('https://demoqa.com/dynamic-properties')
# Ожидаем, пока кнопка с текстом 'Visible After 5 Seconds' не станет кликабельной
# Максимальное время ожидания задано ранее в 10 секунд
visible_after_button = wait.until(
EC.element_to_be_clickable((By.XPATH, "//button[text()='Visible After 5 Seconds']"))
)
# Проверяем, что текст на кнопке соответствует ожидаемому
assert visible_after_button.text == 'Visible After 5 Seconds'
Список Expected Сonditions для любого случая: https://www.selenium.dev/selenium/docs/api/py/webdriver_support/selenium.webdriver.support.expected_conditions.html