Умные настройки 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-сайтов. Если сертификат недействителен или устарел, браузер выдаст ошибку. Эта опция отключает проверку валидности сертификатов и позволяет продолжать загрузку страниц.

  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()

Мои мысли:

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


ссылка на оригинал статьи https://habr.com/ru/articles/817205/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *