Problem:
My task is to implement acceptance tests for an application.
Starting simple, I want to test the following:
Scenario: Authenticated employee see its own profile
Given Employee is Authenticated
When Employee navigate to his profile page
Then Employee should see the page title as "EmployeeProfile"
I am stuck trying to use selenium wed-driver to navigate to an Employee profile URL in the application because it is not recognizing the authentication.
The tests will be implemented using Cucumber and Selenium.
The steps in Cucumber are being implemented in Ruby using selenium-cucumber.
My application uses Keyclock for identity and access management.
What I doing:
This is the way I am instantiating the web-driver
ENV['HTTP_PROXY'] = ENV['http_proxy'] = '127.0.0.1:8080'
proxy = Selenium::WebDriver::Proxy.new(http: '127.0.0.1:8080')
capabilities = Selenium::WebDriver::Remote::Capabilities.chrome(proxy: proxy)
capabilities['acceptSslCerts'] = true
capabilities['ignore-certificate-errors'] = true
$driver = Selenium::WebDriver.for(:chrome, desired_capabilities: capabilities)
In order to navigate to a specific application URL I am trying to authenticate the user first by calling:
def authenticate()
connection = Faraday.new
response = connection.post do |request|
request.url 'http://localhost:8443/auth/realms/REALM/protocol/openid-connect/token'
request.headers['Content-Type'] = 'application/x-www-form-urlencoded'
request.headers['Connection'] = 'keep-alive'
request.body = "client_id=CLIENT_ID&client_secret=CLIENT_SECRET&grant_type=password&username=USER_NAME&password=PASSWORD"
end
end
The response to the POST above succeeds and returns an access token that I am using to rewrite the headers of requests sent for example to navigate to the profile URL.
I am rewriting the requests using RITM proxy, which intercept requests and add the header as following:
def intercept_request()
interceptor.on_request = proc do |req|
req.header['Authorization'] = 'Bearer ' + $access_token
req.header['Connection'] = 'keep-alive'
end
end
The RITM.start is called when creating the web-driver instance.
The authentication request succeeds and I can print the response and see the access token.
However, when I use $driver.get URL to navigate to an Employee profile URL the authentication form is shown again, instead of navigating to the desired URL.
What I tested so far
I split the problem into parts:
- The interception of request using the proxy is working, I print requests and responses in the console as they happen in the test.
- I can use HTTP client API to programmatically access an endpoint end and get an Employee profile. First I use postman as a start point, later I automated it with HTTP client API. In this test the proxy was working too.
What is not working is to use the Web-driver to navigate to my application URL after authentication, which looks like is not getting the authorization for its next requests. Have someone suggestion on what I could try?