Для тех кто хочет посмотреть видео-вариант статьи.
Группа в тележке - там я делюсь мыслями:)
Привет!
Как часто у вас возникают проблемы с браузером при запуске автоматических тестов?
Если тесты выполняются пару раз за спринт, то ошибки могут показаться незначительными. Но в моем случае, где скрипты работают постоянно в качестве мониторинга, ошибки браузера становятся настоящей проблемой. В этой статье я собрал некоторые опции для запуска 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, которые можно использовать для автоматизации тестирования.
-
--headless=new
Эта опция запускает браузер в безголовом режиме, то есть без графического интерфейса. Это особенно полезно для автоматизации и тестирования, так как позволяет запускать браузер на серверах и в контейнерах, где нет необходимости в графическом интерфейсе.
Немного истории:
До версии Chrome 112 использовался--headless
для запуска безголового режима. Начиная с версии 112, эти режимы объединили, и значениеnew
запускает обновленный безголовый режим. Тем не менее, все еще можно запускать тесты со старой версией headless Chrome, для этого нужно использовать значениеold
.
Новая версия исправляет старые проблемы с рендерингом шрифтов, изображений и обеспечивает более стабильную работу.
--disable-dev-shm-usage
Эта опция отключает использование разделяемой памяти (shared memory). По умолчанию в Docker-контейнерах объем разделяемой памяти ограничен (обычно до 64MB), что может быть недостаточно для некоторых операций браузера. Эта опция позволяет браузеру использовать файловую систему для межпроцессорного взаимодействия вместо разделяемой памяти.--ignore-certificate-errors
Эта опция полезна при тестировании или разработке в средах, где возникают проблемы с сертификатами HTTPS. По умолчанию браузеры требуют валидного сертификата для HTTPS-сайтов. Если сертификат недействителен или устарел, браузер выдаст ошибку. Эта опция отключает проверку валидности сертификатов и позволяет продолжать загрузку страниц.
-
Отключение загрузки изображений и 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()
Мои мысли:
В этой статье я описал основные опции и примеры, которые обычно использую на практике.
Этот пул, конечно же не ограничивается этими пятью опциями. Не стал упоминать различные базовые опции для работы с окном браузера и отключением бара 'Вашим браузером управляет автоматизированное тестовое ПО'.
Надеюсь, эти опции помогут вам сделать первый шаг в сторону стабильности ваших тестов.
Wersys3000
Ну а все же, как в 120х версиях напоминалка про "браузером управляет" отключается?
luffity Автор
Можно отключить этот бар с помощью опции:
Опция работает с версии Chrome 76.0.**
Вообще, у этой опции есть свои интересные значения, которые могут пригодиться: