From 8577c35ac076bcd0f053ec39bcab50f28ee7f2b5 Mon Sep 17 00:00:00 2001 From: dosas Date: Thu, 18 Jan 2024 13:53:48 +0100 Subject: [PATCH] Fixes #36978 - Add possibility to use remote webdriver --- test/integration/compute_profile_js_test.rb | 1 + test/integration/search_bar_js_test.rb | 1 + test/integration_test_helper.rb | 61 ++++++++++++++++++--- test/test_helper.rb | 6 +- 4 files changed, 60 insertions(+), 9 deletions(-) diff --git a/test/integration/compute_profile_js_test.rb b/test/integration/compute_profile_js_test.rb index 41233fa6d60..c9eced8450b 100644 --- a/test/integration/compute_profile_js_test.rb +++ b/test/integration/compute_profile_js_test.rb @@ -51,6 +51,7 @@ class ComputeProfileJSTest < IntegrationTestWithJavascript test "create compute profile" do visit compute_profiles_path() click_on("Create Compute Profile") + page.driver.browser.file_detector = nil if page.driver.browser.respond_to?(:file_detector=) fill_in('compute_profile_name', :with => 'test') click_on("Submit") assert click_link(compute_resources(:ovirt).to_s) diff --git a/test/integration/search_bar_js_test.rb b/test/integration/search_bar_js_test.rb index 8db665f16b1..6a80aea8222 100644 --- a/test/integration/search_bar_js_test.rb +++ b/test/integration/search_bar_js_test.rb @@ -3,6 +3,7 @@ class SearchBarTest < IntegrationTestWithJavascript test "backslash key clicked should opens the search" do visit bookmarks_path + page.driver.browser.file_detector = nil if page.driver.browser.respond_to?(:file_detector=) # needs to be interactive element find('table thead').find('a', text: 'Name').send_keys("/") assert_includes(page.evaluate_script("document.activeElement.classList"), "pf-c-text-input-group__text-input") diff --git a/test/integration_test_helper.rb b/test/integration_test_helper.rb index fd3c0ee6888..60e1ac38fe9 100644 --- a/test/integration_test_helper.rb +++ b/test/integration_test_helper.rb @@ -20,18 +20,63 @@ end Selenium::WebDriver::Chrome::Service.driver_path = ENV['TESTDRIVER_PATH'] || Foreman::Util.which('chromedriver', Rails.root.join('node_modules', '.bin')) -Capybara.register_driver :selenium_chrome do |app| + +javascript_driver = ENV.fetch("JS_TEST_DRIVER") { ENV['DEBUG_JS_TEST'] ? :selenium_chrome : :selenium_chrome_headless }.to_sym + +def chrome_options options = Selenium::WebDriver::Chrome::Options.new - options.args << '--disable-gpu' - options.args << '--no-sandbox' options.args << '--window-size=1024,768' - options.args << '--headless' unless ENV['DEBUG_JS_TEST'] == '1' - Capybara::Selenium::Driver.new(app, browser: :chrome, options: options) + options.args += ENV.fetch('ADDITIONAL_CHROME_OPTIONS', '').split(';') + options +end + +if javascript_driver == :selenium_chrome_remote + ShowMeTheCookies.register_adapter(:selenium_chrome_remote, ShowMeTheCookies::SeleniumChrome) + + Capybara.register_driver :selenium_chrome_remote do |app| + selenium_remote_host = ENV.fetch('SELENIUM_REMOTE_HOST') + selenium_remote_port = ENV.fetch('SELENIUM_REMOTE_PORT', 4444) + Capybara::Selenium::Driver.new( + app, + browser: :remote, + url: "http://#{selenium_remote_host}:#{selenium_remote_port}/wd/hub", + options: chrome_options) + end +elsif javascript_driver == :selenium_chrome_headless + options = chrome_options + options.args << '--headless' + Capybara.register_driver :selenium_chrome_headless do |app| + Capybara::Selenium::Driver.new( + app, + browser: :chrome, + options: options) + end +else + Capybara.register_driver javascript_driver do |app| + Capybara::Selenium::Driver.new( + app, + browser: :chrome, + options: chrome_options) + end end + Capybara.configure do |config| - config.javascript_driver = ENV["JS_TEST_DRIVER"]&.to_sym || :selenium_chrome - config.default_max_wait_time = 20 + config.javascript_driver = javascript_driver + config.default_max_wait_time = 20 config.enable_aria_label = true + if ENV.fetch("JS_TEST_DRIVER", nil) == 'selenium_chrome_remote' + app_host = ENV.fetch('APP_SERVER_HOST') do + Socket.ip_address_list + .find(&:ipv4_private?) + .ip_address + end + app_port = ENV.fetch('APP_SERVER_PORT', "8080") + config.server_port = app_port + # application server + config.server_host = "0.0.0.0" + # address used by selenium host to connect to application server + config.app_host = "http://#{app_host}:#{app_port}" + end end class ActionDispatch::IntegrationTest @@ -299,7 +344,7 @@ def database_cleaner_strategy end def login_admin - visit('/users/login') if Capybara.current_driver == :selenium_chrome + visit('/users/login') if Capybara.current_driver.to_s.include? "selenium" SSO.register_method(TestSSO) set_request_user(:admin) end diff --git a/test/test_helper.rb b/test/test_helper.rb index 44a195efe80..379dfc73c9d 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -20,7 +20,11 @@ FactoryBot.use_parent_strategy = false # Do not allow network connections and external processes -WebMock.disable_net_connect!(allow_localhost: true) +if ENV.fetch('SELENIUM_REMOTE_HOST', nil) + WebMock.disable_net_connect!(allow_localhost: true, allow: ENV['SELENIUM_REMOTE_HOST']) +else + WebMock.disable_net_connect!(allow_localhost: true) +end # Configure shoulda Shoulda::Matchers.configure do |config|