Что вызывает периодическую ошибку Selenium::WebDriver::Error::WebDriverError в моих тестах Capybara?

Вопрос или проблема

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

Проблема не воспроизводится при запуске тестов локально (на наших разработческих машинах). Мы предприняли ряд шагов для решения проблемы (или, по крайней мере, для ее локализации):

  1. Указание пользовательского HTTP-клиента и увеличение таймаута.
  2. Уменьшение скорости и повторная попытка в случае этих ошибок.
  3. Обновление гемы selenium-webdriver до самой последней версии (4.25.0).
  4. Обновление до Chrome 124 с 117.
  5. Подключение к работающему CI-агенту и проверка. Ничего не показалось подозрительным. Использование ЦП, памяти – все в норме.
  6. Увеличение выделения памяти shm до 8GiB с 2GiB на контейнерах.
  7. Скачивание системных логов с CI-агентов во время работы, чтобы проверить наличие OOM-убийств.
  8. Отключение CI-экземпляра от Buildkite и вручную запуск тестов там. Периодические ошибки сессии сохранялись.
  9. Удвоение размера CI-агентов с c7g.8xlarge до c7g.16xlarge, на случай ограничений ресурсов.
  10. Переход с Chrome на Firefox (я был особенно удивлен, что это не решило проблему).
  11. Явное закрытие сессии в конце каждого теста.
  12. Удаление всех сбросов сессий из тестов и вспомогательных функций.
  13. Попытка использовать x86 вместо ARM-билдов.
  14. Запуск только одной группы тестов вручную. Это также вызвало те же ошибки сессий, исключая большое количество тестов или количество параллельных контейнеров Docker.
  15. Понижение версии selenium-webdriver до версии 2023 года.
  16. Установка Chromium и Chromedriver локально на тестовом контейнере, вместо использования удаленной конфигурации браузера между контейнерами. Это вызвало те же ошибки сессий, но с локальным сообщением об ошибке.
  17. Установка стратегии загрузки страницы на 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, может иметь несколько причин. Вот некоторые аспекты, которые следует учитывать при диагностике и устранении данной проблемы:

Возможные причины и решения

  1. Сетевые проблемы: Поскольку вы получаете ошибки таймаута, первое, что следует проверить — это стабильность сетевого соединения между вашим CI-сервером и сервером, на котором выполняются тесты. Убедитесь, что нет временных разрывов или потерь пакетов.

  2. Пересмотрите конфигурацию CI/CD: Убедитесь, что ресурсы CI (например, CPU, RAM) действительно достаточно. Возможно, стоит увеличить выделенные ресурсы или оптимизировать нагрузку на сервер.

  3. Состояние ChromeDriver: Ошибки могут возникать из-за переполнения сообщений или блокировок в ChromeDriver. Убедитесь, что вы используете совместимую версию ChromeDriver и самого Chrome. Обновляйте их до последних стабильных версий.

  4. Все ли сессии завершаются корректно?: Как вы уже пробовали, убедитесь, что каждая сессия браузера корректно закрывается после теста. Если сессии остаются открытыми, это может вызвать исчерпание ресурсов и привести к таймаутам.

  5. Увеличьте таймауты: Попробуйте поставить более длительные таймауты в конфигурации вашего Selenium-клиента. Это может быть временной мерой, пока не будет найдено основное решение.

  6. Логи и диагностика: Продолжайте собирать логи из CI-сервера и тестов. Анализируйте их на предмет аномалий в ресурсах и выполнения запросов. Можно также добавить дополнительный уровень логирования в ваших тестах.

  7. Проблемы с многопоточностью: Проверьте, как ваши тесты управляют сессиями браузеров при параллельном выполнении. Иногда версии драйверов или конфигурации тестов могут конфликтовать при параллельном запуске.

  8. Опция "page load strategy": Попробуйте использовать "none" или "normal" вместо "eager". Это может помочь, если сайт загружается медленно или есть сложности с ресурсами.

  9. Пользовательские запросы HTTP: Если вы используете настраиваемый HTTP-клиент, убедитесь, что он сконфигурирован правильно и не создает задержек при выполнении запросов.

  10. Альтернативные библиотеки: Вы также упомянули, что при переходе на Cuprite ошибки исчезли. Это может указывать на возможные проблемы внутри Selenium или его зависимостей. Подумайте о зависимости от других решений для запуска тестов.

Заключение

Ваша проблема с Selenium::WebDriver::Error::WebDriverError может быть сочетанием нескольких факторов. Поскольку ошибка intermittent, важным является тщательный анализ и изоляция влияний окружения CI на выполнение тестов. Необходимо продолжать собирать логи и данные, чтобы наиболее точно определить корень проблемы. Тщательная настройка и диалог с сообществом, таких как сообщества Selenium, действительно могут помочь найти оптимальное решение.

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

Капча загружается...