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

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

Привет!
Как часто у вас возникают проблемы с браузером при запуске автоматических тестов?
Если тесты выполняются пару раз за спринт, то ошибки могут показаться незначительными. Но в моем случае, где скрипты работают постоянно в качестве мониторинга, ошибки браузера становятся настоящей проблемой. В этой статье я собрал некоторые опции для запуска 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()

Мои мысли:

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

Комментарии (2)


  1. Wersys3000
    27.05.2024 21:46
    +2

    Ну а все же, как в 120х версиях напоминалка про "браузером управляет" отключается?


    1. luffity Автор
      27.05.2024 21:46
      +1

      Можно отключить этот бар с помощью опции:

      options.add_experimental_option("excludeSwitches", ["enable-automation"])

      Опция работает с версии Chrome 76.0.**
      Вообще, у этой опции есть свои интересные значения, которые могут пригодиться:

      enable-automation - Отключает бар "Вашим браузером управляет автоматизированное ПО".
      disable-component-update - Отключает обновление компонентов.
      disable-popup-blocking - Отключает блокировку всплывающих окон.
      disable-prompt-on-repost - Отключает предупреждение при повторной отправке форм.