Делюсь, как прошёл переезд. Было: Rails 7.2, 212 системных тестов на Selenium с headless Chrome, в CI около 9 минут и три-четыре флаки в неделю. Cuprite ходит в Chrome напрямую по протоколу DevTools, без chromedriver, из-за этого и решили попробовать. Подключение у нас такое:
# spec/support/cuprite.rb
require "capybara/cuprite"
Capybara.register_driver(:cuprite) do |app|
Capybara::Cuprite::Driver.new(
app,
window_size: [1400, 900],
process_timeout: 20,
timeout: 10,
browser_options: ENV["CI"] ? { "no-sandbox" => nil } : {}
)
end
RSpec.configure do |config|
config.before(:each, type: :system) { driven_by :cuprite }
end
Стало 5 минут 40 секунд. Грабли: 14 тестов использовали page.driver.browser.switch_to.alert, это чисто селениумный API. Переписали на accept_confirm { click_on "Удалить" }, он работает в обоих драйверах. Два теста проверяли скачивание файла через папку загрузок Selenium, их пока оставили на старом драйвере через отдельный тег. Флаки за первые три недели: один, и тот из-за анимации в модалке.
вышло примерно как у нас, минус 35-40% времени. и включите js_errors: true, тогда тест падает на исключении в консоли браузера
Selenium совсем бросить получается не всегда: если часть тестов надо гонять в Firefox, Cuprite не поможет, он только про Chrome. Но для основного набора идея правильная, и держать два драйвера через тег не так страшно, как кажется: в before смотришь на метаданные примера и выбираешь нужный driven_by.
Если CI в Docker, Chrome в контейнере любит память. no-sandbox у вас уже есть, поставьте ещё "disable-dev-shm-usage" => nil в browser_options или увеличьте shm_size, иначе на длинных тестах вкладка тихо падает, и это выглядит как флаки.
Ксения, это готовый доклад на 15 минут, с цифрами и граблями. Записываю на сентябрьскую встречу? Скорее всего опять Васильевский