module Selenium::WebDriver::DriverExtensions::HasAuthentication

Public Instance Methods

register(username:, password:, uri: //) click to toggle source

Registers basic authentication handler which is automatically used whenever browser gets an authentication required response. This currently relies on DevTools so is only supported in Chromium browsers.

@example Authenticate any request

driver.register(username: 'admin', password: '123456')

@example Authenticate based on URL

driver.register(username: 'admin1', password: '123456', uri: /mysite1\.com/)
driver.register(username: 'admin2', password: '123456', uri: /mysite2\.com/)

@param [String] username @param [String] password @param [Regexp] uri to associate the credentials with

# File lib/selenium/webdriver/common/driver_extensions/has_authentication.rb, line 42
def register(username:, password:, uri: //)
  auth_handlers << {username: username, password: password, uri: uri}

  devtools.network.set_cache_disabled(cache_disabled: true)
  devtools.fetch.on(:auth_required) do |params|
    authenticate(params['requestId'], params.dig('request', 'url'))
  end
  devtools.fetch.on(:request_paused) do |params|
    devtools.fetch.continue_request(request_id: params['requestId'])
  end
  devtools.fetch.enable(handle_auth_requests: true)
end

Private Instance Methods

auth_handlers() click to toggle source
# File lib/selenium/webdriver/common/driver_extensions/has_authentication.rb, line 57
def auth_handlers
  @auth_handlers ||= []
end
authenticate(request_id, url) click to toggle source
# File lib/selenium/webdriver/common/driver_extensions/has_authentication.rb, line 61
def authenticate(request_id, url)
  credentials = auth_handlers.find do |handler|
    url.match?(handler[:uri])
  end

  if credentials
    devtools.fetch.continue_with_auth(
      request_id: request_id,
      auth_challenge_response: {
        response: 'ProvideCredentials',
        username: credentials[:username],
        password: credentials[:password]
      }
    )
  else
    devtools.fetch.continue_with_auth(
      request_id: request_id,
      auth_challenge_response: {
        response: 'CancelAuth'
      }
    )
  end
end