Ask a Question

Sync call with Oauth2 needed in Testcomplete

SOLVED
Sundaytwins
Occasional Contributor

Sync call with Oauth2 needed in Testcomplete

We are currently struggling to make a synchronuous call with an OAuth2 authentication in Testcomplete.

Previously we had a similar call using Basic Authentication to do the same, but recently we had to comply with security rules and this endpoint has been changed to have a OAuth2 authentication.

 

Does anyone has a relevant experience with this? We use Testcomplete with JS scripting to have everything done. 

But this call is baffling us a bit.

 

In particular, we need to have this kind of conversation : {'content-type': 'application/x-www-form-urlencoded' }


Thanks in advance for any help.

1 ACCEPTED SOLUTION

Accepted Solutions
Sundaytwins
Occasional Contributor

Re: Sync call with Oauth2 needed in Testcomplete

Hi Alex,

 

Thanks for your response. Eventually we found a solution. I'll include my code in this ticket for others to use.

It was not an easy journey to find this. 
To respond to your question: we use Testcomplete to do web UI testing, but occasionally we need to do some API calls to make our live a bit easier.

(mostly to do 'shorter steps' where if scripted to do it by UI, too heavy or not relevant for the running test).

function httpPostRequestBearer()
{
  var username = "<username>";
  var password = "<password>";  
  var keycloakurl = "https://<authentication client URL>";
  const params = {
    username: username,
    password: password,
    client_id: '<cliend-id>',
    client_secret: '<client-secret>',
    grant_type: 'password'
   };

   const data = Object.keys(params)
    .map((key) => `${key}=${encodeURIComponent(params[key])}`)
    .join('&');

    var tempBody = data
     // Define the request body JSON string
    var requestBody = tempBody;
  
     // Create the aqHttpRequest object
    var aqHttpRequest = aqHttp.CreatePostRequest(keycloakurl);

    // Specify the Content-Type header value
    aqHttpRequest.SetHeader("Content-Type","application/x-www-form-urlencoded");

    // Send the request, create the aqHttpResponse object
    var aqHttpResponse = aqHttpRequest.Send(requestBody)
    var token = JSON.parse(aqHttpResponse.Text).access_token
       
    return token;
}

function httpPostRequest(param,bearertoken)
{
  var address = "https://<url for service needing a token>";
  var tempBody = '{  <your body possibly inserting your param from argumentlist> }'
 
  // Define the request body JSON string
  var requestBody = tempBody;
  
   // Create the aqHttpRequest object
  var aqHttpRequest = aqHttp.CreatePostRequest(address);

  // Specify the Content-Type header value
  aqHttpRequest.SetHeader("Content-Type", "application/json");
  aqHttpRequest.SetHeader("Authorization", "bearer "+bearertoken);
  
  // Send the request, create the aqHttpResponse object
  var aqHttpResponse = aqHttpRequest.Send(requestBody)
  
  if (aqHttpResponse != null)
    {
      // Read the response data
      Log.Message(aqHttpResponse.AllHeaders); // All headers
      Log.Message(aqHttpResponse.GetHeader("Content-Type")); // A specific header
      Log.Message(aqHttpResponse.StatusCode); // A status code
      Log.Message(aqHttpResponse.StatusText); // A status text
      Log.Message(aqHttpResponse.Text); // A response body
      
      var JSONobj = JSON.parse(aqHttpResponse.Text);
      }           
    return JSONobj
}

 

The code may not be the 'cleanest' but it does the job. The first function will get the bearer token and the second function is a POST call using the bearer token from the first passed by as an argument. The code has been cleaned to not have my exact calls of course, but it will provide an idea how we tackled it. 

Hope someone can enjoy it later too. 😊 

View solution in original post

2 REPLIES 2
AlexKaras
Community Hero

Re: Sync call with Oauth2 needed in Testcomplete

Hi,

 

Are you doing API or web UI testing ?

For API calls TestComplete does not provide any special support for Oauth2 thus you will need to search for some code that implements this.

For UI actions, TestComplete should be able to interact with the dialogs that request your login information and you shouldn't have problems here.

More details with screenshots might help to better understand your problem in case I got it in a wrong way.

 

Regards,
  /Alex [Community Hero]
____
[Community Heroes] are not employed by SmartBear Software but
are just volunteers who have some experience with the tools by SmartBear Software
and a desire to help others. Posts made by [Community Heroes]
may differ from the official policies of SmartBear Software and should be treated
as the own private opinion of their authors and under no circumstances as an
official answer from SmartBear Software.
The [Community Hero] signature is used with permission by SmartBear Software.
https://community.smartbear.com/t5/custom/page/page-id/hall-of-fame
================================
Sundaytwins
Occasional Contributor

Re: Sync call with Oauth2 needed in Testcomplete

Hi Alex,

 

Thanks for your response. Eventually we found a solution. I'll include my code in this ticket for others to use.

It was not an easy journey to find this. 
To respond to your question: we use Testcomplete to do web UI testing, but occasionally we need to do some API calls to make our live a bit easier.

(mostly to do 'shorter steps' where if scripted to do it by UI, too heavy or not relevant for the running test).

function httpPostRequestBearer()
{
  var username = "<username>";
  var password = "<password>";  
  var keycloakurl = "https://<authentication client URL>";
  const params = {
    username: username,
    password: password,
    client_id: '<cliend-id>',
    client_secret: '<client-secret>',
    grant_type: 'password'
   };

   const data = Object.keys(params)
    .map((key) => `${key}=${encodeURIComponent(params[key])}`)
    .join('&');

    var tempBody = data
     // Define the request body JSON string
    var requestBody = tempBody;
  
     // Create the aqHttpRequest object
    var aqHttpRequest = aqHttp.CreatePostRequest(keycloakurl);

    // Specify the Content-Type header value
    aqHttpRequest.SetHeader("Content-Type","application/x-www-form-urlencoded");

    // Send the request, create the aqHttpResponse object
    var aqHttpResponse = aqHttpRequest.Send(requestBody)
    var token = JSON.parse(aqHttpResponse.Text).access_token
       
    return token;
}

function httpPostRequest(param,bearertoken)
{
  var address = "https://<url for service needing a token>";
  var tempBody = '{  <your body possibly inserting your param from argumentlist> }'
 
  // Define the request body JSON string
  var requestBody = tempBody;
  
   // Create the aqHttpRequest object
  var aqHttpRequest = aqHttp.CreatePostRequest(address);

  // Specify the Content-Type header value
  aqHttpRequest.SetHeader("Content-Type", "application/json");
  aqHttpRequest.SetHeader("Authorization", "bearer "+bearertoken);
  
  // Send the request, create the aqHttpResponse object
  var aqHttpResponse = aqHttpRequest.Send(requestBody)
  
  if (aqHttpResponse != null)
    {
      // Read the response data
      Log.Message(aqHttpResponse.AllHeaders); // All headers
      Log.Message(aqHttpResponse.GetHeader("Content-Type")); // A specific header
      Log.Message(aqHttpResponse.StatusCode); // A status code
      Log.Message(aqHttpResponse.StatusText); // A status text
      Log.Message(aqHttpResponse.Text); // A response body
      
      var JSONobj = JSON.parse(aqHttpResponse.Text);
      }           
    return JSONobj
}

 

The code may not be the 'cleanest' but it does the job. The first function will get the bearer token and the second function is a POST call using the bearer token from the first passed by as an argument. The code has been cleaned to not have my exact calls of course, but it will provide an idea how we tackled it. 

Hope someone can enjoy it later too. 😊 

View solution in original post

cancel
Showing results for 
Search instead for 
Did you mean: