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 43
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 58
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 62
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