В нашей небольшой, но очень динамично развивающейся компании каждый день тестируется больше сотни задач. Все они проверяются как в тестовом окружении, так и в окружениях, более приближенных к реальному. Подавляющее большинство задач, связанных с web, проверяется автотестами, которых у нас много. Примерно полгода назад тестов и задач стало столько, что наша маленькая ферма с Selenium в час пик стала буквально «захлебываться» от запросов на новую сессию Firefox или Chrome. Выглядело это примерно так: на Selenium grid образуется очередь из сессий, которые ждут свободный браузер. Пользователи продолжают запускать автотесты, и эта очередь продолжает расти, но браузеры заняты старыми задачами и сессии «отваливаются» с таймаутом.  На тот момент максимальное количество нод, разделенных между Firefox, Chrome, Internet Explorer и PhantomJS, было около 200. Один из вариантов решения проблемы, который мне пришел в голову — это отслеживать количество свободных нод перед запуском теста и «придерживать» тесты в методе setup(), пока свободных нод недостаточно. В описаниях изменений Selenium в свое время проскакивал функционал получения информации от grid с помощью HTTP-запросов. Доступные команды можно посмотреть прямо в коде сервлета HubStatusServlet.java. Их всего три: configuration (конфигурация), slotCounts (количество слотов) и newSessionRequestCount (количество сессий в очереди на получение браузера). Формат запроса достаточно хитрый: это GET request, но с телом. Для экспериментов воспользуемся cURL и проверим, что возвращают эти команды: У нас все тесты для Selenium написаны на PHP, в нем подобный запрос будет выглядеть так: В принципе, запрашивая в setUp()-методе тестов общее количество слотов и количество ждущих сессий, можно начинать ждать. Но это не очень удобно в том случае, если у вас неравномерно выделены ресурсы на разные браузеры. Например, у нас количество нод для Firefox примерно на треть больше, чем Google Chrome. А Internet Explorer и MS Edge занимают всего около 10 нод (и то они могут делиться по версиям). Получается, что свободных нод именно для Chrome может уже и не быть, хотя Selenium Grid говорит, что свободные ноды еще есть. Поэтому пришлось дописать функционал сервлета, чтобы понять, сколько же и каких браузеров нам доступно. Сам патч не очень большой, вот его код: До сих пор немного стыдно, что я его не оформил по всем правилам (с тестами и т.п.) и не отправил в SeleniumHQ. Обещаю, что сделаю это в ближайшее время, если читатели найдут функционал полезным :) Накладываем патч на локальную копию исходников Selenium, собираем собственную сборку Selenium-grid (тут есть подробная инструкция по сборке). Если нет желания возиться со сборкой, можете попробовать уже собранное мной: https://github.com/leipreachan/misc_scripts/tree/master/blob/selenium  Теперь перезапускаем selenium-grid и смотрим, какие значения он возвращает: и результат: Итак, теперь мы знаем, какие свободные браузеры и в каком количестве у нас представлены в Selenium Grid. Осталось немного поправить метод setup() (или аналогичный): Лично для нас это стало выглядеть так, что selenium-тесты в час пик идут немного медленнее, зато гораздо, гораздо стабильнее. Учитывая, что у нас несколько сотен тестов запускаются автоматически, это существенно упростило жизнь всем, кто с связан с тестированием. Артём Солдаткин
Lead QA Engineer, Badoo QA