Умные настройки Chrome для стабильной автоматизации тестов

Для тех кто хочет посмотреть видео-вариант статьи.

Группа в тележке — там я делюсь мыслями:)

Привет!
Как часто у вас возникают проблемы с браузером при запуске автоматических тестов?
Если тесты выполняются пару раз за спринт, то ошибки могут показаться незначительными. Но в моем случае, где скрипты работают постоянно в качестве мониторинга, ошибки браузера становятся настоящей проблемой. В этой статье я собрал некоторые опции для запуска Chrome, которые позволили сократить количество ошибок и улучшить качество мониторинга.

Создание простого теста

Для начала создадим новый проект в PyCharm.
Активируем виртуальное окружение:
.venv/Scripts/activate — windows
.venv/bin/actiavte — linux

Далее, откроем терминал PyCharm и установим все необходимые зависимости командной:
pip install pytest selenium webdriver-manager

Чтобы сохранить список установленных зависимостей, используем команду:
pip freeze > requirements.txt

Пока устанавливаются зависимости, создадим директорию tests и файл conftest.py внутри этой директории. Откроем файл conftest.py и сделаем необходимые импорты. Создадим фикстуру и зададим ей scope="function". Под этой фикстурой создадим функцию driver. Эта функция создаёт экземпляр WebDriver с настройками Chrome, а затем закрывает браузер после завершения теста.

import pytest
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager

@pytest.fixture(scope="function")
def driver():
    options = webdriver.ChromeOptions()
    driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=options)
    yield driver
    driver.quit()

Теперь создадим простой тест, который перейдёт на сайт example.com и проверит заголовок страницы.

class Test:
    def test_example_site(self, driver):
        driver.get("https://example.com")
        assert "Example Domain" in driver.title

Отлично! Мы настроили окружение, создали фикстуру для WebDriver и написали простой тест для проверки заголовка сайта.
Теперь давайте рассмотрим некоторые полезные опции Chrome, которые можно использовать для автоматизации тестирования.

  1. --headless=new
    Эта опция запускает браузер в безголовом режиме, то есть без графического интерфейса. Это особенно полезно для автоматизации и тестирования, так как позволяет запускать браузер на серверах и в контейнерах, где нет необходимости в графическом интерфейсе.
    Немного истории:
    До версии Chrome 112 использовался --headless для запуска безголового режима. Начиная с версии 112, эти режимы объединили, и значение new запускает обновленный безголовый режим. Тем не менее, все еще можно запускать тесты со старой версией headless Chrome, для этого нужно использовать значение old.
    Новая версия исправляет старые проблемы с рендерингом шрифтов, изображений и обеспечивает более стабильную работу.

    Ссылка на статью google

Поскольку Headless был отдельной реализацией, у него были свои ошибки и функции, которых не было в Headful Chrome.

Поскольку Headless был отдельной реализацией, у него были свои ошибки и функции, которых не было в Headful Chrome.

  1. --disable-dev-shm-usage
    Эта опция отключает использование разделяемой памяти (shared memory). По умолчанию в Docker-контейнерах объем разделяемой памяти ограничен (обычно до 64MB), что может быть недостаточно для некоторых операций браузера. Эта опция позволяет браузеру использовать файловую систему для межпроцессорного взаимодействия вместо разделяемой памяти.

  2. --ignore-certificate-errors
    Эта опция полезна при тестировании или разработке в средах, где возникают проблемы с сертификатами HTTPS. По умолчанию браузеры требуют валидного сертификата для HTTPS-сайтов. Если сертификат недействителен или устарел, браузер выдаст ошибку. Эта опция отключает проверку валидности сертификатов и позволяет продолжать загрузку страниц.

a67a65a2a1336c7543916ba3227d59fd.png

  1. Отключение загрузки изображений и JavaScript

    Использование опций для отключения загрузки изображений и выполнения JavaScript позволяет не загружать ненужные элементы на странице, если их проверка не требуется.

    Для отключения загрузки изображений и выполнения JavaScript используйте следующую настройку:

    options.add_experimental_option(
        "prefs",
        {
            'profile.managed_default_content_settings.images': 2,
            'profile.managed_default_content_settings.javascript': 2
        }
    )

Как это работает:

  • prefs — это словарь, в который можно передавать различные настройки браузера.

  • profile.managed_default_content_settings — это ключ, отвечающий за загрузку изображений / js.

  • Значение 2 для этого ключа означает, что загрузка изображений / js отключена
    (0 — включено, 1 — заблокировано по запросу, 2 — отключено).

Пример использования опций в конфигурации:

import pytest
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager

@pytest.fixture(scope="function")
def driver():
    options = webdriver.ChromeOptions()
    options.add_argument("--headless=new")
    options.add_argument("--disable-dev-shm-usage")
    options.add_argument("--ignore-certificate-errors")
        options.add_experimental_option(
        "prefs",
        {
            'profile.managed_default_content_settings.images': 2,
            'profile.managed_default_content_settings.javascript': 2
        }
    )
    driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=options)
    yield driver
    driver.quit()

Мои мысли:

В этой статье я описал основные опции и примеры, которые обычно использую на практике.
Этот пул, конечно же не ограничивается этими пятью опциями. Не устал упоминать различные базовые опции для работы с окном браузера и отключением бара 'Вашим браузером управляет автоматизированное тестовое ПО'.
Надеюсь, эти опции помогут вам сделать первый шаг в сторону стабильности ваших тестов.

Habrahabr.ru прочитано 2655 раз