Вопрос или проблема
В последнее время мы наблюдали периодические ошибки таймаута сессии в тестах, которые выполнялись (в некоторых случаях на протяжении нескольких лет) без проблем. Эти ошибки возникают на разных этапах жизненного цикла теста, от before(:each) до after(:suite).
Ошибки принимают следующую форму:
[2024-10-04T05:14:52Z] Selenium::WebDriver::Error::UnknownError:
[2024-10-04T05:14:52Z] Не удалось выполнить запрос для существующей сессии: java.util.concurrent.TimeoutException
[2024-10-04T05:14:52Z] Информация о сборке: версия: '4.20.0', ревизия: '866c76ca80'
[2024-10-04T05:14:52Z] Информация о системе: os.name: 'Linux', os.arch: 'aarch64', os.version: '6.1.106-116.188.amzn2023.aarch64', java.version: '17.0.11'
[2024-10-04T05:14:52Z] Информация о драйвере: driver.version: unknown
[2024-10-04T05:14:52Z] # ./spec/support/helpers/test_helpers/capybara_helpers.rb:7:in `visit'
[2024-10-04T05:14:52Z] # ./spec/features/fullscreen/playlist_spec.rb:33:in `block (2 levels) in <top (required)>'
[2024-10-04T05:14:52Z] # ./spec/rails_helper.rb:135:in `block (3 levels) in <top (required)>'
[2024-10-04T05:14:52Z] # ./spec/rails_helper.rb:134:in `block (2 levels) in <top (required)>'
[2024-10-04T05:14:52Z] # ./spec/support/good_job.rb:7:in `block (2 levels) in <top (required)>'
[2024-10-04T05:14:52Z] # ./spec/support/database_cleaner.rb:19:in `block (2 levels) in <top (required)>'
[2024-10-04T05:14:52Z] # ./spec/spec_helper.rb:177:in `block (4 levels) in <top (required)>'
[2024-10-04T05:14:52Z] # ./app/lib/tiny_otel.rb:86:in `in_span'
[2024-10-04T05:14:52Z] # ./spec/spec_helper.rb:176:in `block (3 levels) in <top (required)>'
[2024-10-04T05:14:52Z] # ./spec/spec_helper.rb:163:in `block (2 levels) in <top (required)>'
[2024-10-04T05:14:52Z] # ------------------
[2024-10-04T05:14:52Z] # --- Причина: ---
[2024-10-04T05:14:52Z] # Selenium::WebDriver::Error::WebDriverError:
[2024-10-04T05:14:52Z] # java.lang.RuntimeException: Не удалось выполнить запрос для существующей сессии: java.util.concurrent.TimeoutException
Проблема не воспроизводится при запуске тестов локально (на наших разработческих машинах). Мы предприняли ряд шагов для решения проблемы (или, по крайней мере, для ее локализации):
- Указание пользовательского HTTP-клиента и увеличение таймаута.
- Уменьшение скорости и повторная попытка в случае этих ошибок.
- Обновление гемы selenium-webdriver до самой последней версии (4.25.0).
- Обновление до Chrome 124 с 117.
- Подключение к работающему CI-агенту и проверка. Ничего не показалось подозрительным. Использование ЦП, памяти – все в норме.
- Увеличение выделения памяти shm до 8GiB с 2GiB на контейнерах.
- Скачивание системных логов с CI-агентов во время работы, чтобы проверить наличие OOM-убийств.
- Отключение CI-экземпляра от Buildkite и вручную запуск тестов там. Периодические ошибки сессии сохранялись.
- Удвоение размера CI-агентов с c7g.8xlarge до c7g.16xlarge, на случай ограничений ресурсов.
- Переход с Chrome на Firefox (я был особенно удивлен, что это не решило проблему).
- Явное закрытие сессии в конце каждого теста.
- Удаление всех сбросов сессий из тестов и вспомогательных функций.
- Попытка использовать x86 вместо ARM-билдов.
- Запуск только одной группы тестов вручную. Это также вызвало те же ошибки сессий, исключая большое количество тестов или количество параллельных контейнеров Docker.
- Понижение версии selenium-webdriver до версии 2023 года.
- Установка Chromium и Chromedriver локально на тестовом контейнере, вместо использования удаленной конфигурации браузера между контейнерами. Это вызвало те же ошибки сессий, но с локальным сообщением об ошибке.
- Установка стратегии загрузки страницы на eager.
Мы также пробовали переключить тесты с Selenium на Cuprite, после чего таймауты исчезли.
Мы также подали баг в Selenium, так как эта проблема по-видимому не связана с нашим кодом.
Когда мы запускаем тесты с Chromium в том же контейнере, что и тестовый раннер, мы получаем те же периодические сбои, но с другой ошибкой:
1.1) Ошибка/Ошибка: page.driver.resize_window_to(page.driver.current_window_handle, 1920, 1080)
Selenium::WebDriver::Error::WebDriverError:
невозможно подключиться к /root/.cache/selenium/chromedriver/linux64/129.0.6668.89/chromedriver
127.0.0.1:9515
# ./spec/support/selenium.rb:31:in `block (2 levels) in <top (required)>'
# ./spec/rails_helper.rb:135:in `block (3 levels) in <top (required)>'
# ./spec/rails_helper.rb:134:in `block (2 levels) in <top (required)>'
# ./spec/support/good_job.rb:7:in `block (2 levels) in <top (required)>'
# ./spec/support/database_cleaner.rb:19:in `block (2 levels) in <top (required)>'
# ./spec/spec_helper.rb:177:in `block (4 levels) in <top (required)>'
# ./app/lib/tiny_otel.rb:86:in `in_span'
# ./spec/spec_helper.rb:176:in `block (3 levels) in <top (required)>'
# ./spec/spec_helper.rb:163:in `block (2 levels) in <top (required)>'
Кто-то еще сталкивался с этой проблемой и может пролить свет на ее причину? Прямо сейчас мы обходим это, повторяя группы тестов, которые завершаются с этой ошибкой ;(
Ответ или решение
Проблема, с которой вы сталкиваетесь в своих тестах Capybara, связанные с ошибкой Selenium::WebDriver::Error::WebDriverError
, может иметь несколько причин. Вот некоторые аспекты, которые следует учитывать при диагностике и устранении данной проблемы:
Возможные причины и решения
-
Сетевые проблемы: Поскольку вы получаете ошибки таймаута, первое, что следует проверить — это стабильность сетевого соединения между вашим CI-сервером и сервером, на котором выполняются тесты. Убедитесь, что нет временных разрывов или потерь пакетов.
-
Пересмотрите конфигурацию CI/CD: Убедитесь, что ресурсы CI (например, CPU, RAM) действительно достаточно. Возможно, стоит увеличить выделенные ресурсы или оптимизировать нагрузку на сервер.
-
Состояние ChromeDriver: Ошибки могут возникать из-за переполнения сообщений или блокировок в ChromeDriver. Убедитесь, что вы используете совместимую версию ChromeDriver и самого Chrome. Обновляйте их до последних стабильных версий.
-
Все ли сессии завершаются корректно?: Как вы уже пробовали, убедитесь, что каждая сессия браузера корректно закрывается после теста. Если сессии остаются открытыми, это может вызвать исчерпание ресурсов и привести к таймаутам.
-
Увеличьте таймауты: Попробуйте поставить более длительные таймауты в конфигурации вашего Selenium-клиента. Это может быть временной мерой, пока не будет найдено основное решение.
-
Логи и диагностика: Продолжайте собирать логи из CI-сервера и тестов. Анализируйте их на предмет аномалий в ресурсах и выполнения запросов. Можно также добавить дополнительный уровень логирования в ваших тестах.
-
Проблемы с многопоточностью: Проверьте, как ваши тесты управляют сессиями браузеров при параллельном выполнении. Иногда версии драйверов или конфигурации тестов могут конфликтовать при параллельном запуске.
-
Опция "page load strategy": Попробуйте использовать "none" или "normal" вместо "eager". Это может помочь, если сайт загружается медленно или есть сложности с ресурсами.
-
Пользовательские запросы HTTP: Если вы используете настраиваемый HTTP-клиент, убедитесь, что он сконфигурирован правильно и не создает задержек при выполнении запросов.
-
Альтернативные библиотеки: Вы также упомянули, что при переходе на Cuprite ошибки исчезли. Это может указывать на возможные проблемы внутри Selenium или его зависимостей. Подумайте о зависимости от других решений для запуска тестов.
Заключение
Ваша проблема с Selenium::WebDriver::Error::WebDriverError
может быть сочетанием нескольких факторов. Поскольку ошибка intermittent, важным является тщательный анализ и изоляция влияний окружения CI на выполнение тестов. Необходимо продолжать собирать логи и данные, чтобы наиболее точно определить корень проблемы. Тщательная настройка и диалог с сообществом, таких как сообщества Selenium, действительно могут помочь найти оптимальное решение.