Чуть больше про Selenium. Урок 3

План урока:

  1. Что такое опции Браузера?
  2. Как происходит загрузка страницы в браузере и зачем нужны ожидания?
  3. Что такое load strategy в Selenium?
  4. Виды ожиданий в Selenium: Явные ожидание Неявное ожидание
  5. Что такое 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 позволяет более гибко настроить среду выполнения тестов, что может быть особенно полезно при работе с различными средами тестирования и настройками браузера.

Список существующих опций можно найти тут:

  1. https://github.com/GoogleChrome/chrome-launcher/blob/main/docs/chrome-flags-for-tools.md
  2. https://peter.sh/experiments/chromium-command-line-switches/?

Чуть подробнее про опции можно почитать в документации Selenium: https://www.selenium.dev/documentation/webdriver/browsers/chrome/

Как происходит загрузка страницы?

Вопрос достаточно сложен для понимания и включает в себя большое количество тем: Я предлагаю очень сильно упростить схему для общего понимания происходящего.

Как же происходит загрузка нашей страницы?

  1. Запрос на Страницу Браузер отправляет HTTP-запрос на сервер, чтобы получить содержимое веб-страницы.
  2. Загрузка Содержимого Сервер отвечает на запрос, отправляя обратно HTML-код страницы. Браузер начинает загружать и обрабатывать код. Он также запрашивает и загружает внешние ресурсы, такие как стили, скрипты и изображения.
  3. Построение DOM Браузер строит DOM-дерево (Объектную Модель Документа) на основе HTML-кода. DOM представляет собой структуру, которая делает элементы страницы доступными для манипуляций с помощью JavaScript.
  4. Применение CSS и Рендеринг После построения DOM браузер применяет стили из CSS, вычисляет раскладку элементов на странице и отрисовывает ее на экране.
  5. Запуск 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:

  1. https://learn.javascript.ru/onload-ondomcontentloaded
  2. https://www.selenium.dev/documentation/webdriver/drivers/options/#pageloadstrategy

Для чего нужны ожидания в Selenium?

  1. Динамическая загрузка контента: Современные веб-приложения часто используют асинхронную загрузку данных через AJAX или другие технологии. Это означает, что после загрузки основной части страницы определенные элементы или данные могут появляться с задержкой. Если Selenium попытается взаимодействовать с элементом до его загрузки, это приведет к ошибке.
  2. Задержки при рендеринге: Некоторые элементы или анимации могут требовать времени на отображение на странице. Ожидание завершения скриптов: Некоторые действия на странице могут инициировать выполнение JavaScript-скриптов, которые требуют времени на выполнение.
  3. Ожидание переходов: После клика по ссылке или кнопке может потребоваться время для перехода на новую страницу или обновления текущей
  4. Синхронизация тестов: Ожидания могут помогать убедиться, что тест выполняется в правильной последовательности и что предыдущие действия были завершены перед началом следующих.

Какие виды ожиданий предоставляет Selenium?

Явное ожидание (explicit) Неявное ожидание (implicit)

Так же мы помним про не Selenium вид ожидания: time.sleep()

Предлагаю начать с неявного ожидания:

В Selenium есть встроенный способ автоматического ожидания элементов, называемый неявным ожиданием. Неявное значение ожидания можно установить либо с помощью возможности тайм-аутов в параметрах браузера, либо с помощью метода драйвера (как показано ниже).

Это глобальный параметр, который применяется к каждому вызову местоположения элемента на протяжении всего сеанса. Значение по умолчанию — 0, что означает, что если элемент не найден, он немедленно вернет ошибку. Если установлено неявное ожидание, драйвер будет ждать в течение предоставленного значения, прежде чем вернуть ошибку. Обратите внимание: как только элемент будет обнаружен, драйвер вернет ссылку на элемент, и код продолжит выполнение, поэтому большее значение неявного ожидания не обязательно приведет к увеличению продолжительности сеанса.

Сайт для тренировки в ожиданиях: https://demoqa.com/dynamic-properties

Явные ожидания

Явные ожидания в Selenium WebDriver используются для обеспечения лучшего способа ожидания элементов на веб-странице. В отличие от неявных ожиданий, которые просто задают максимальное время ожидания появления элемента на странице, явные ожидания позволяют задать условия, при которых выполнение теста будет продолжено.

Неявные ожидания (Implicit Waits):

  1. Время ожидания: Неявные ожидания задают фиксированный таймаут, который будет применяться ко всем попыткам найти элемент на странице.
  2. Применение: Применяются ко всем последующим командам в скрипте после установки таймаута.
  3. Гибкость: Менее гибкие, так как применяются ко всем командам одинаково и не позволяют задавать сложные условия ожидания для отдельных элементов.
  4. Ошибки: Если элемент не найден в течение заданного времени, выбрасывается исключение NoSuchElementException.
  5. Надежность: Могут быть менее надежными для динамических веб-страниц, где время загрузки элементов может сильно варьироваться.
  6. Простота использования: Просты в использовании и настройке.

Явные ожидания (Explicit Waits):

  1. Время ожидания: Позволяют задавать максимальное время ожидания для конкретного условия или элемента.
  2. Применение: Применяются только к конкретным элементам и условиям, которые вы определите.
  3. Гибкость: Более гибкие, так как позволяют задавать различные условия ожидания для разных элементов.
  4. Ошибки: Возможны различные исключения в зависимости от условия ожидания. Например, TimeoutException, если элемент не удовлетворяет условию в течение заданного времени.
  5. Надежность: Более надежны для динамических веб-страниц, так как позволяют явно указывать условия, при которых следует продолжать выполнение теста.
  6. Простота использования: Могут потребовать больше кода и времени на настройку по сравнению неявными ожиданиями.

Оба вида ожиданий имеют свое место в автоматизированном тестировании веб-приложений, и выбор между ними зависит от конкретной ситуации и требований к тестам.

Пример явного ожидания:

# Импортируем класс для работы с браузером 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