Skip to content

Commit

Permalink
Fixes #36978 - Add possibility to use remote webdriver
Browse files Browse the repository at this point in the history
  • Loading branch information
dosas committed Jan 18, 2024
1 parent b793575 commit 59b757a
Show file tree
Hide file tree
Showing 2 changed files with 58 additions and 9 deletions.
61 changes: 53 additions & 8 deletions test/integration_test_helper.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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 get_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', nil)
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: get_chrome_options)
end
elsif javascript_driver == :selenium_chrome_headless
options = get_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: get_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
Expand Down Expand Up @@ -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? "chrome"
SSO.register_method(TestSSO)
set_request_user(:admin)
end
Expand Down
6 changes: 5 additions & 1 deletion test/test_helper.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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|
Expand Down

0 comments on commit 59b757a

Please sign in to comment.