+5 votes
1 view
in Devops and Agile by (19.8k points)

I have written tests with Selenium2/WebDriver and want to test if HTTP Request returns an HTTP 403 Forbidden.

Is it possible to get the HTTP response status code with Selenium WebDriver?

4 Answers

+3 votes
by (63.4k points)
selected by
 
Best answer

It is doable to get the response code of a HTTP protocol request using Selenium and Chrome or Firefox.
All you've got to try is begin either Chrome or Firefox in work mode.
I will show you some examples below.
java + Se + Chrome Here is AN example of java + Se + Chrome, but I guess that it can be done in any language (python, c#, ...).

All you need to do is tell ChromeDriver to do "Network.enable". This can be done by enabling Performance logging.

LoggingPreferences logPrefs = new LoggingPreferences();
logPrefs.enable(LogType.PERFORMANCE, Level.ALL);
cap.setCapability(CapabilityType.LOGGING_PREFS, logPrefs);

After the request is done, all you have to do is get and iterate the perfomance logs and find "Network.responseReceived" for the requested URL:

LogEntries logs = driver.manage().logs().get("performance");

Here is the code: 

import java.util.Iterator;
import java.util.logging.Level;

import org.json.JSONException;
import org.json.JSONObject;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.logging.LogEntries;
import org.openqa.selenium.logging.LogEntry;
import org.openqa.selenium.logging.LogType;
import org.openqa.selenium.logging.LoggingPreferences;
import org.openqa.selenium.remote.CapabilityType;
import org.openqa.selenium.remote.DesiredCapabilities;

public class TestResponseCode
{
    public static void main(String[] args)
    {
        // simple page (without many resources so that the output is
        // easy to understand
        String url = "https://intellipaat.com/";

        DownloadPage(url);
    }

    private static void DownloadPage(String url)
    {
        ChromeDriver driver = null;

        try
        {
            ChromeOptions options = new ChromeOptions();
            // add whatever extensions you need
            // for example I needed one of adding proxy, and one for blocking
            // images
            // options.addExtensions(new File(file, "proxy.zip"));
            // options.addExtensions(new File("extensions",
            // "Block-image_v1.1.crx"));

            DesiredCapabilities cap = DesiredCapabilities.chrome();
            cap.setCapability(ChromeOptions.CAPABILITY, options);

            // set performance logger
            // this sends Network.enable to chromedriver
            LoggingPreferences logPrefs = new LoggingPreferences();
            logPrefs.enable(LogType.PERFORMANCE, Level.ALL);
            cap.setCapability(CapabilityType.LOGGING_PREFS, logPrefs);

            driver = new ChromeDriver(cap);

            // navigate to the page
            System.out.println("Navigate to " + url);
            driver.navigate().to(url);

            // and capture the last recorded url (it may be a redirect, or the
            // original url)
            String currentURL = driver.getCurrentUrl();

            // then ask for all the performance logs from this request
            // one of them will contain the Network.responseReceived method
            // and we shall find the "last recorded url" response
            LogEntries logs = driver.manage().logs().get("performance");

            int status = -1;

            System.out.println("\nList of log entries:\n");

            for (Iterator<LogEntry> it = logs.iterator(); it.hasNext();)
            {
                LogEntry entry = it.next();

                try
                {
                    JSONObject json = new JSONObject(entry.getMessage());

                    System.out.println(json.toString());

                    JSONObject message = json.getJSONObject("message");
                    String method = message.getString("method");

                    if (method != null
                            && "Network.responseReceived".equals(method))
                    {
                        JSONObject params = message.getJSONObject("params");

                        JSONObject response = params.getJSONObject("response");
                        String messageUrl = response.getString("url");

                        if (currentURL.equals(messageUrl))
                        {
                            status = response.getInt("status");

                            System.out.println(
                                    "---------- returned response for "
                                            + messageUrl + ": " + status);

                            System.out.println(
                                    "---------- headers: "
                                            + response.get("headers"));
                        }
                    }
                } catch (JSONException e)
                {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }

            System.out.println("\nstatus code: " + status);
        } finally
        {
            if (driver != null)
            {
                driver.quit();
            }
        }
    }

Hope this helps!

Also, you can refer to our Selenium tutorial page for other related queries

by (19.8k points)
Yes, it helped me resolve the error. Thanks!
by (33.2k points)
Thanks for your answer!
It really helped me.
by (29.8k points)
Hi! this worked for me thanks
by (47.2k points)
You can even use driver.getPageSource( ), but you need to be careful because usually there are several side javascript requests that can alter the Dom. You can wait for some element of your page to be present in the dom and then get the page source.
+3 votes
by (44.6k points)

Use this for getting the HTTP response, and for this, the output should be 200 which means OK. So, change the URL and then check it out.

import io.restassured.RestAssured;

public class HttpResponseCode {

    public int httpResponseCodeViaGet(String url) {

            return RestAssured.get(url).statusCode();

    }

    public int httpResponseCodeViaPost(String url) {

        return RestAssured.post(url).statusCode();

    }

    public static void main(String args[]) {

        new HttpResponseCode().httpResponseCodeViaGet("http://www.google.com");

    }

}

by (17k points)
This worked for me. Thanks.
by (29.1k points)
This should be accepted as a correct answer.
+2 votes
by (96.2k points)

It is certainly possible to get http request's response code when using Selenium with either Chrome or Firefox. But the difficulty is, you have to start them in logging mode.  

You have to tell a chrome driver to make "Network.enable". This can be done by enabling Performance logging. Let me give you an example.

LoggingPreferences logPrefs = new LoggingPreferences();

logPrefs.enable(LogType.PERFORMANCE, Level.ALL);

cap.setCapability(CapabilityType.LOGGING_PREFS, logPrefs);

Once the request is posted, you have to just iterate the Performance logs and look for "Network.responseReceived" for the requested URL:

LogEntries logs = driver.manage().logs().get("performance");
by (31.8k points)
Yes, true. It is possible to get the HTTP request's response code when using Selenium with either Chrome or Firefox.
0 votes
by (107k points)

You can not get HTTP Response Code using Selenium WebDriver it's not possible using the Selenium WebDriver API.  Because the further features will not be added to the API.

Welcome to Intellipaat Community. Get your technical queries answered by top developers !


Categories

...