সেলেনিয়াম ওয়েবড্রাইভার ব্যবহার করে কীভাবে এইচটিটিপি রেসপন্স কোড পাবেন


109

আমি সেলেনিয়াম 2 / ওয়েবড্রাইভারের সাথে পরীক্ষাগুলি লিখেছি এবং এইচটিটিপি রিকোয়েস্ট কোনও HTTP 403 নিষিদ্ধ প্রত্যাবর্তন করে কিনা তা পরীক্ষা করতে চাই।

সেলেনিয়াম ওয়েবড্রাইভারের সাথে কি এইচটিটিপি প্রতিক্রিয়া স্থিতি কোড পাওয়া সম্ভব?



এটি কোনও সদৃশ নয়, কারণ পাইথনের উপর অন্য প্রশ্নটি ফোকাস করে, তবে এটি একটি জাভাতে রয়েছে
রাল্ফ

1
ধন্যবাদ আমি পেয়েছি তবে অবশেষে প্রশ্নটির webdriverসীমাবদ্ধতায় প্রশ্নটি শেষ হয়ে গেল , এবং পাইথন এবং জাভা উভয়ের ক্ষেত্রেই এই সীমাবদ্ধতা একই;)
ম্যাককোরিউকভ

2
@ ম্যাক্সকরিউকোভ: তবে ভাষা নির্ভরশীল কাজের ক্ষেত্র রয়েছে,
রাল্ফ

উত্তর:


66

এক কথায়, না। সেলেনিয়াম ওয়েবড্রাইভার এপিআই ব্যবহার করা সম্ভব নয়। প্রকল্পের ইস্যু ট্র্যাকারটিতে এটি বিজ্ঞাপনের উদাসীনতার বিষয়ে আলোচনা করা হয়েছে , এবং বৈশিষ্ট্যটি API এ যুক্ত করা হবে না।


42

সেলেনিয়াম এবং ক্রোম বা ফায়ারফক্স ব্যবহার করে কোনও http অনুরোধের প্রতিক্রিয়া কোড পাওয়া সম্ভব। আপনাকে যা করতে হবে তা হ'ল লগিং মোডে ক্রোম বা ফায়ারফক্স start আমি নীচে কিছু উদাহরণ দেখাব।

জাভা + সেলেনিয়াম + ক্রোম এখানে উদাহরণ রয়েছে, তবে আমার ধারণা এটি কোনও ভাষায় করা যেতে পারে (পাইথন, সি #, ...)।

আপনাকে কেবল ক্রোমড্রাইভারকে "নেটওয়ার্ক.ইনবেল" করতে বলার দরকার রয়েছে। পারফরম্যান্স লগিং সক্ষম করে এটি করা যেতে পারে।

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

অনুরোধটি সম্পন্ন হওয়ার পরে, আপনাকে যা করতে হবে তা হ'ল পারফ্লোমেন্স লগগুলি পুনরুক্ত করা এবং অনুরোধ করা ইউআরএলটির জন্য "নেটওয়ার্ক.অগ্রহগ্রহীত" পাওয়া:

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

কোডটি এখানে:

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 = "http://www.york.ac.uk/teaching/cws/wws/webpage1.html";

        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(
                                    "---------- bingo !!!!!!!!!!!!!! returned response for "
                                            + messageUrl + ": " + status);

                            System.out.println(
                                    "---------- bingo !!!!!!!!!!!!!! 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();
            }
        }
    }
}

আউটপুটটি এর মতো দেখাচ্ছে:

    Navigate to http://www.york.ac.uk/teaching/cws/wws/webpage1.html

    List of log entries:

    {"webview":"3b8eaedb-bd0f-4baa-938d-4aee4039abfe","message":{"method":"Page.frameAttached","params":{"parentFrameId":"172.1","frameId":"172.2"}}}
    {"webview":"3b8eaedb-bd0f-4baa-938d-4aee4039abfe","message":{"method":"Page.frameStartedLoading","params":{"frameId":"172.2"}}}
    {"webview":"3b8eaedb-bd0f-4baa-938d-4aee4039abfe","message":{"method":"Page.frameNavigated","params":{"frame":{"securityOrigin":"://","loaderId":"172.1","name":"chromedriver dummy frame","id":"172.2","mimeType":"text/html","parentId":"172.1","url":"about:blank"}}}}
    {"webview":"3b8eaedb-bd0f-4baa-938d-4aee4039abfe","message":{"method":"Page.frameStoppedLoading","params":{"frameId":"172.2"}}}
    {"webview":"3b8eaedb-bd0f-4baa-938d-4aee4039abfe","message":{"method":"Page.frameStartedLoading","params":{"frameId":"3928.1"}}}
    {"webview":"3b8eaedb-bd0f-4baa-938d-4aee4039abfe","message":{"method":"Network.requestWillBeSent","params":{"request":{"headers":{"Upgrade-Insecure-Requests":"1","User-Agent":"Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36"},"initialPriority":"VeryHigh","method":"GET","mixedContentType":"none","url":"http://www.york.ac.uk/teaching/cws/wws/webpage1.html"},"frameId":"3928.1","requestId":"3928.1","documentURL":"http://www.york.ac.uk/teaching/cws/wws/webpage1.html","initiator":{"type":"other"},"loaderId":"3928.1","wallTime":1.47619492749007E9,"type":"Document","timestamp":20226.652971}}}
    {"webview":"3b8eaedb-bd0f-4baa-938d-4aee4039abfe","message":{"method":"Network.responseReceived","params":{"frameId":"3928.1","requestId":"3928.1","response":{"headers":{"Accept-Ranges":"bytes","Keep-Alive":"timeout=4, max=100","Cache-Control":"max-age=300","Server":"Apache/2.2.22 (Ubuntu)","Connection":"Keep-Alive","Content-Encoding":"gzip","Vary":"Accept-Encoding","Expires":"Tue, 11 Oct 2016 14:13:47 GMT","Content-Length":"1957","Date":"Tue, 11 Oct 2016 14:08:47 GMT","Content-Type":"text/html"},"connectionReused":false,"timing":{"pushEnd":0,"workerStart":-1,"proxyEnd":-1,"workerReady":-1,"sslEnd":-1,"pushStart":0,"requestTime":20226.65335,"sslStart":-1,"dnsStart":0,"sendEnd":31.6569999995409,"connectEnd":31.4990000006219,"connectStart":0,"sendStart":31.5860000009707,"dnsEnd":0,"receiveHeadersEnd":115.645999998378,"proxyStart":-1},"encodedDataLength":-1,"remotePort":80,"mimeType":"text/html","headersText":"HTTP/1.1 200 OK\r\nDate: Tue, 11 Oct 2016 14:08:47 GMT\r\nServer: Apache/2.2.22 (Ubuntu)\r\nAccept-Ranges: bytes\r\nCache-Control: max-age=300\r\nExpires: Tue, 11 Oct 2016 14:13:47 GMT\r\nVary: Accept-Encoding\r\nContent-Encoding: gzip\r\nContent-Length: 1957\r\nKeep-Alive: timeout=4, max=100\r\nConnection: Keep-Alive\r\nContent-Type: text/html\r\n\r\n","securityState":"neutral","requestHeadersText":"GET /teaching/cws/wws/webpage1.html HTTP/1.1\r\nHost: www.york.ac.uk\r\nConnection: keep-alive\r\nUpgrade-Insecure-Requests: 1\r\nUser-Agent: Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8\r\nAccept-Encoding: gzip, deflate, sdch\r\nAccept-Language: en-GB,en-US;q=0.8,en;q=0.6\r\n\r\n","url":"http://www.york.ac.uk/teaching/cws/wws/webpage1.html","protocol":"http/1.1","fromDiskCache":false,"fromServiceWorker":false,"requestHeaders":{"Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8","Upgrade-Insecure-Requests":"1","Connection":"keep-alive","User-Agent":"Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36","Host":"www.york.ac.uk","Accept-Encoding":"gzip, deflate, sdch","Accept-Language":"en-GB,en-US;q=0.8,en;q=0.6"},"remoteIPAddress":"144.32.128.84","statusText":"OK","connectionId":11,"status":200},"loaderId":"3928.1","type":"Document","timestamp":20226.770012}}}
    ---------- bingo !!!!!!!!!!!!!! returned response for http://www.york.ac.uk/teaching/cws/wws/webpage1.html: 200
    ---------- bingo !!!!!!!!!!!!!! headers: {"Accept-Ranges":"bytes","Keep-Alive":"timeout=4, max=100","Cache-Control":"max-age=300","Server":"Apache/2.2.22 (Ubuntu)","Connection":"Keep-Alive","Content-Encoding":"gzip","Vary":"Accept-Encoding","Expires":"Tue, 11 Oct 2016 14:13:47 GMT","Content-Length":"1957","Date":"Tue, 11 Oct 2016 14:08:47 GMT","Content-Type":"text/html"}
    {"webview":"3b8eaedb-bd0f-4baa-938d-4aee4039abfe","message":{"method":"Network.dataReceived","params":{"dataLength":2111,"requestId":"3928.1","encodedDataLength":1460,"timestamp":20226.770425}}}
    {"webview":"3b8eaedb-bd0f-4baa-938d-4aee4039abfe","message":{"method":"Page.frameNavigated","params":{"frame":{"securityOrigin":"http://www.york.ac.uk","loaderId":"3928.1","id":"3928.1","mimeType":"text/html","url":"http://www.york.ac.uk/teaching/cws/wws/webpage1.html"}}}}
    {"webview":"3b8eaedb-bd0f-4baa-938d-4aee4039abfe","message":{"method":"Network.dataReceived","params":{"dataLength":1943,"requestId":"3928.1","encodedDataLength":825,"timestamp":20226.782673}}}
    {"webview":"3b8eaedb-bd0f-4baa-938d-4aee4039abfe","message":{"method":"Network.loadingFinished","params":{"requestId":"3928.1","encodedDataLength":2285,"timestamp":20226.770199}}}
    {"webview":"3b8eaedb-bd0f-4baa-938d-4aee4039abfe","message":{"method":"Page.loadEventFired","params":{"timestamp":20226.799391}}}
    {"webview":"3b8eaedb-bd0f-4baa-938d-4aee4039abfe","message":{"method":"Page.frameStoppedLoading","params":{"frameId":"3928.1"}}}
    {"webview":"3b8eaedb-bd0f-4baa-938d-4aee4039abfe","message":{"method":"Page.domContentEventFired","params":{"timestamp":20226.845769}}}
    {"webview":"3b8eaedb-bd0f-4baa-938d-4aee4039abfe","message":{"method":"Network.requestWillBeSent","params":{"request":{"headers":{"Referer":"http://www.york.ac.uk/teaching/cws/wws/webpage1.html","User-Agent":"Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36"},"initialPriority":"High","method":"GET","mixedContentType":"none","url":"http://www.york.ac.uk/favicon.ico"},"frameId":"3928.1","requestId":"3928.2","documentURL":"http://www.york.ac.uk/teaching/cws/wws/webpage1.html","initiator":{"type":"other"},"loaderId":"3928.1","wallTime":1.47619492768527E9,"type":"Other","timestamp":20226.848174}}}

    status code: 200

জাভা + সেলেনিয়াম + ফায়ারফক্স আমি শেষ পর্যন্ত ফায়ারফক্সের জন্যও কৌশলটি পেয়েছি। আপনাকে ফায়ারফক্স শুরু করতে হবে MOZ_LOGএবং MOZ_LOG_FILEপরিবেশের ভেরিয়েবলগুলি ব্যবহার করতে হবে , এবং ডিবাগ স্তরে HTTP অনুরোধগুলি লগ করতে হবে (4 = PR_LOG_DEBUG) - map.put("MOZ_LOG", "timestamp,sync,nsHttp:4")। অস্থায়ী ফাইলে লগ সংরক্ষণ করুন। এর পরে, সংরক্ষিত লগ ফাইলের সামগ্রী পান এবং প্রতিক্রিয়া কোডের জন্য পার্স করুন (কিছু সাধারণ নিয়মিত এক্সপ্রেশন ব্যবহার করে)। প্রথমে অনুরোধের শুরুটি সনাক্ত করুন, তার আইডি সনাক্ত করুন এবং (nsHttpChannel::BeginConnect [this=000000CED8094000])তারপরে দ্বিতীয় ধাপে request অনুরোধ আইডির জন্য প্রতিক্রিয়া কোডটি সন্ধান করুন (nsHttpChannel::ProcessResponse [this=000000CED8094000 httpStatus=200])

import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.commons.io.FileUtils;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.firefox.GeckoDriverService;

public class TestFirefoxResponse
{
  public static void main(String[] args)
      throws InterruptedException, IOException
  {
    GeckoDriverService service = null;

    // tell firefox to log http requests
    // at level 4 = PR_LOG_DEBUG: debug messages, notices
    // you could log everything at level 5, but the log file will 
    // be larger. 
    // create a temporary log file that will be parsed for
    // response code
    Map<String, String> map = new HashMap<String, String>();
    map.put("MOZ_LOG", "timestamp,sync,nsHttp:4");
    File tempFile = File.createTempFile("mozLog", ".txt");    
    map.put("MOZ_LOG_FILE", tempFile.getAbsolutePath());      

    GeckoDriverService.Builder builder = new GeckoDriverService.Builder();
    service = builder.usingAnyFreePort()
      .withEnvironment(map)
      .build();

    service.start();      

    WebDriver driver = new FirefoxDriver(service);

    // test 200
     String url = "https://api.ipify.org/?format=text";
    // test 404
    // String url = "https://www.advancedwebranking.com/lsdkjflksdjfldksfj";
    driver.get(url);

    driver.quit();

    String logContent = FileUtils.readFileToString(tempFile);

    ParseLog(logContent, url);
  }

  private static void ParseLog(String logContent, String url) throws MalformedURLException
  {
    // this is how the log looks like when the request starts
    // I have to get the id of the request using a regular expression
    // and use that id later to get the response
    //
    //    2017-11-02 14:14:01.170000 UTC - [Main Thread]: D/nsHttp nsHttpChannel::BeginConnect [this=000000BFF27A5000]
    //    2017-11-02 14:14:01.170000 UTC - [Main Thread]: D/nsHttp host=api.ipify.org port=-1
    //    2017-11-02 14:14:01.170000 UTC - [Main Thread]: D/nsHttp uri=https://api.ipify.org/?format=text
    String pattern = "BeginConnect \\[this=(.*?)\\](?:.*?)uri=(.*?)\\s";

    Pattern p = Pattern.compile(pattern, Pattern.CASE_INSENSITIVE | Pattern.DOTALL);
    Matcher m = p.matcher(logContent);

    String urlID = null;
    while (m.find())
    {
      String id = m.group(1);
      String uri = m.group(2);

      if (uri.equals(url))
      {
        urlID = id;
        break;
      }      
    }

    System.out.println("request id = " + urlID);

    // this is how the response looks like in the log file
    // ProcessResponse [this=000000CED8094000 httpStatus=200]
    // I will use another regular espression to get the httpStatus
    //
    //    2017-11-02 14:45:39.296000 UTC - [Main Thread]: D/nsHttp nsHttpChannel::OnStartRequest [this=000000CED8094000 request=000000CED8014BB0 status=0]
    //    2017-11-02 14:45:39.296000 UTC - [Main Thread]: D/nsHttp nsHttpChannel::ProcessResponse [this=000000CED8094000 httpStatus=200]    

    pattern = "ProcessResponse \\[this=" + urlID + " httpStatus=(.*?)\\]";

    p = Pattern.compile(pattern, Pattern.CASE_INSENSITIVE | Pattern.DOTALL);
    m = p.matcher(logContent);

    if (m.find())
    {
      String responseCode = m.group(1);
      System.out.println("response code found " + responseCode);
    }
    else
    {
      System.out.println("response code not found");
    }
  }
}

এর জন্য আউটপুট হবে

অনুরোধ আইডি = 0000007653D67000 প্রতিক্রিয়া কোড পাওয়া গেছে 200

প্রতিক্রিয়া শিরোনামগুলি লগ ফাইলেও পাওয়া যাবে। আপনি চাইলে এগুলি পেতে পারেন।

    2017-11-02 14:54:36.775000 UTC - [Socket Thread]: I/nsHttp http response [
    2017-11-02 14:54:36.775000 UTC - [Socket Thread]: I/nsHttp   HTTP/1.1 404 Not Found
    2017-11-02 14:54:36.775000 UTC - [Socket Thread]: I/nsHttp   Accept-Ranges: bytes
    2017-11-02 14:54:36.775000 UTC - [Socket Thread]: I/nsHttp   Cache-control: no-cache="set-cookie"
    2017-11-02 14:54:36.775000 UTC - [Socket Thread]: I/nsHttp   Content-Type: text/html; charset=utf-8
    2017-11-02 14:54:36.775000 UTC - [Socket Thread]: I/nsHttp   Date: Thu, 02 Nov 2017 14:54:36 GMT
    2017-11-02 14:54:36.775000 UTC - [Socket Thread]: I/nsHttp   ETag: "7969-55bc076a61e80"
    2017-11-02 14:54:36.775000 UTC - [Socket Thread]: I/nsHttp   Last-Modified: Tue, 17 Oct 2017 16:17:46 GMT
    2017-11-02 14:54:36.775000 UTC - [Socket Thread]: I/nsHttp   Server: Apache/2.4.23 (Amazon) PHP/5.6.24
    2017-11-02 14:54:36.775000 UTC - [Socket Thread]: I/nsHttp   Set-Cookie: AWSELB=5F256FFA816C8E72E13AE0B12A17A3D540582F804C87C5FEE323AF3C9B638FD6260FF473FF64E44926DD26221AAD2E9727FD739483E7E4C31784C7A495796B416146EE83;PATH=/
    2017-11-02 14:54:36.775000 UTC - [Socket Thread]: I/nsHttp   Content-Length: 31081
    2017-11-02 14:54:36.775000 UTC - [Socket Thread]: I/nsHttp   Connection: keep-alive
    2017-11-02 14:54:36.775000 UTC - [Socket Thread]: I/nsHttp     OriginalHeaders
    2017-11-02 14:54:36.775000 UTC - [Socket Thread]: I/nsHttp   Accept-Ranges: bytes
    2017-11-02 14:54:36.775000 UTC - [Socket Thread]: I/nsHttp   Cache-control: no-cache="set-cookie"
    2017-11-02 14:54:36.775000 UTC - [Socket Thread]: I/nsHttp   Content-Type: text/html; charset=utf-8
    2017-11-02 14:54:36.775000 UTC - [Socket Thread]: I/nsHttp   Date: Thu, 02 Nov 2017 14:54:36 GMT
    2017-11-02 14:54:36.775000 UTC - [Socket Thread]: I/nsHttp   ETag: "7969-55bc076a61e80"
    2017-11-02 14:54:36.775000 UTC - [Socket Thread]: I/nsHttp   Last-Modified: Tue, 17 Oct 2017 16:17:46 GMT
    2017-11-02 14:54:36.775000 UTC - [Socket Thread]: I/nsHttp   Server: Apache/2.4.23 (Amazon) PHP/5.6.24
    2017-11-02 14:54:36.775000 UTC - [Socket Thread]: I/nsHttp   Set-Cookie: AWSELB=5F256FFA816C8E72E13AE0B12A17A3D540582F804C87C5FEE323AF3C9B638FD6260FF473FF64E44926DD26221AAD2E9727FD739483E7E4C31784C7A495796B416146EE83;PATH=/
    2017-11-02 14:54:36.775000 UTC - [Socket Thread]: I/nsHttp   Content-Length: 31081
    2017-11-02 14:54:36.775000 UTC - [Socket Thread]: I/nsHttp   Connection: keep-alive
    2017-11-02 14:54:36.775000 UTC - [Socket Thread]: I/nsHttp ]
    2017-11-02 14:54:36.775000 UTC - [Main Thread]: D/nsHttp nsHttpChannel::OnStartRequest [this=0000008A65D85000 request=0000008A65D1F900 status=0]
    2017-11-02 14:54:36.775000 UTC - [Main Thread]: D/nsHttp nsHttpChannel::ProcessResponse [this=0000008A65D85000 httpStatus=404]

2
এটি দেখার জন্য লোকেদের জন্য, সচেতন থাকুন যে ক্রোমিয়ামের নেটওয়ার্কটি সক্ষম করার সময় করা প্রতিটি HTTP অনুরোধে একটি অতিরিক্ত শিরোনাম সন্নিবেশ করে।
ভুয়া নাম

2
হাই, আমি প্রতিক্রিয়া কোড পেতে সক্ষম, কিন্তু আমি কীভাবে প্রতিক্রিয়া বডি পেতে পারি? আমি JSONObject প্রতিক্রিয়াতে এটি দেখতে পাচ্ছি না।
লিঙ্গস

@LINGS আপনি ড্রাইভার.গেটপেজসোর্স () ব্যবহার করতে পারেন তবে সাবধানতার সাথে থাকবেন কারণ সাধারণত বেশ কয়েকটি সাইড জাভাস্ক্রিপ্ট অনুরোধ রয়েছে যা ডোমকে পরিবর্তন করতে পারে। আপনার পৃষ্ঠার কোনও উপাদানটি ডোমে উপস্থিত থাকার জন্য অপেক্ষা করতে পারেন এবং তারপরে পৃষ্ঠার উত্স পান। আরেকটি দৃশ্য ফ্রেম নিয়ে। আপনার যদি ফ্রেম থাকে তবে আপনাকে ফ্রেমে স্যুইচ করতে হবে, তারপরে সেই ফ্রেমের উত্স কোডটি পাবেন - ড্রাইভার.সুইচটো ()। ফ্রেম ();
স্টিফান মাতেই

আমি আপনার কোডটি রিমোট ওয়েবড্রাইভারের সাথে প্রয়োগ করার চেষ্টা করেছি , যেহেতু আমার পদ্ধতিগুলি রিমোট ওয়েবেড্রাইভার দিয়ে লেখা রয়েছে। এটি কীভাবে রিমোটওয়েবড্রাইভার দিয়ে ব্যবহার করবেন সে সম্পর্কে আপনার কোনও ধারণা আছে ?
M3trix

2
@ আইভায়লোস্লাভ ক্রোম স্ক্রিপ্টটি আমার জন্য .0.০.০-আলফা -4 নিয়ে কাজ করে, দয়া করে এই উদাহরণটি দেখুন github.com/smatei/SeleniumChromeHTTPResponse
স্টিফান

16

আপনি এর সাথে অনুরোধ এবং প্রতিক্রিয়াগুলি ক্যাপচার করতে ব্রাউজারমব প্রক্সি ব্যবহার করতে পারেন HttpRequestInterceptor। জাভাতে এখানে একটি উদাহরণ দেওয়া হল:

// Start the BrowserMob proxy
ProxyServer server = new ProxyServer(9978);
server.start();

server.addResponseInterceptor(new HttpResponseInterceptor()
{
    @Override
    public void process(HttpResponse response, HttpContext context)
        throws HttpException, IOException
    {
        System.out.println(response.getStatusLine());
    }
});

// Get selenium proxy
Proxy proxy = server.seleniumProxy();

// Configure desired capability for using proxy server with WebDriver
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability(CapabilityType.PROXY, proxy);

// Set up driver
WebDriver driver = new FirefoxDriver(capabilities);

driver.get("http://stackoverflow.com/questions/6509628/webdriver-get-http-response-code");

// Close the browser
driver.quit();

আমি আপনার সমাধানটি ব্যবহার করছি তবে প্রক্সি সহ পৃষ্ঠাটির বোঝা খুব ধীর। এটা কিভাবে আসে কোন ধারণা? আমার প্রশ্নটিও দেখুন: স্ট্যাকওভারফ্লো.com
চার্লি

1
মূল ব্রাউজারমব প্রক্সি এখন অসমর্থিত এবং বিট পচা। আমাদের কাছে ব্রাউজারমব প্রক্সিটির একটি ওপেন সোর্স কাঁটা রয়েছে যাতে বিল্ট-ইন পারফরম্যান্স, পৃষ্ঠা এবং নেটওয়ার্ক জোর রয়েছে। github.com/browserup/browserup-proxy
'27

13

পাইথন ব্যবহার করা লোকদের জন্য, আপনি সেলেনিয়াম ওয়্যার বিবেচনা করতে পারেন , আমি একটি পরীক্ষার সময় ব্রাউজারের দ্বারা অনুরোধগুলি পরিদর্শন করার জন্য তৈরি একটি গ্রন্থাগার।

আপনি driver.requestsবৈশিষ্ট্যের মাধ্যমে অনুরোধগুলিতে অ্যাক্সেস পান :

from seleniumwire import webdriver  # Import from seleniumwire

# Create a new instance of the Firefox driver
driver = webdriver.Firefox()

# Go to the Google home page
driver.get('https://www.google.com')

# Access requests via the `requests` attribute
for request in driver.requests:
    if request.response:
        print(
            request.url,
            request.response.status_code,
            request.response.headers['Content-Type']
        )

ছাপে:

https://www.google.com/ 200 text/html; charset=UTF-8
https://www.google.com/images/branding/googlelogo/2x/googlelogo_color_120x44dp.png 200 image/png
https://consent.google.com/status?continue=https://www.google.com&pc=s&timestamp=1531511954&gl=GB 204 text/html; charset=utf-8
https://www.google.com/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png 200 image/png
https://ssl.gstatic.com/gb/images/i2_2ec824b0.png 200 image/png
https://www.google.com/gen_204?s=webaft&t=aft&atyp=csi&ei=kgRJW7DBONKTlwTK77wQ&rt=wsrt.366,aft.58,prt.58 204 text/html; charset=UTF-8
...

লাইব্রেরি আপনাকে শিরোনাম, স্থিতি কোড, দেহের সামগ্রী, পাশাপাশি শিরোনাম সংশোধন করার এবং ইউআরএলগুলি পুনরায় লেখার ক্ষমতা দেয়।


আমি ওয়েবড্রাইভারের সাথে এটি ব্যবহার করার চেষ্টা করছি emআমি পুনরুদ্ধার করুন তবে আমি পেয়েছি "অ্যাট্রিবিউটআরার: 'ওয়েবড্রাইভার' অবজেক্টটির কোনও বৈশিষ্ট্য নেই 'অনুরোধ'" এটি কি কারণ রিমোট ড্রাইভারটি সেলেনিয়াম-ওয়্যার দ্বারা সমর্থিত নয়? আনুষ্ঠানিকভাবে অফিসিয়াল ডকুমেন্টেশনের অভাব রয়েছে। ধন্যবাদ!
লেনার্ট রোল্যান্ড

@ লেনার্টরোল্যান্ড সেলেনিয়াম ওয়্যারের অন্যতম সীমাবদ্ধতা হ'ল এটি ব্রাউজারটি চালানো একই মেশিনে কাজ করবে। রিমোট সেটআপ ব্যবহার করা বর্তমানে সমর্থিত নয়।
উইল কিলিং

1
@ মোহাম্মদ ইমরান যদি আপনি একটি নির্দিষ্ট প্রতিক্রিয়াতে আগ্রহী হন তবে আপনি driver.wait_for_request()সেই অনুরোধটি সন্ধান করতে পদ্ধতিটি ব্যবহার করতে পারেন যার প্রতিক্রিয়া আপনার আগ্রহী more আরও তথ্যের জন্য ডকগুলি দেখুন ।
উইল কেইলিং

1
@ মোহামেদ ইমরান পদ্ধতিটি একটি রেজেক্স নেয়, যাতে আপনি ইউআরএলটির কেবলমাত্র অংশটি পাস করতে পারেন যা অনন্যতার সাথে মেলে। উদাহরণস্বরূপ আপনি মেলাতে http://myserver.com/some/path/12345/পারবেনdriver.wait_for_request(‘.*/12345/‘)
উইল কিলিং

1
@ মোহাম্মদ ইমরান আপনার লুপের দরকার নেই
উইল কিলিং করবে

10

আমারও একই সমস্যা ছিল এবং কিছু দিন আটকে ছিলাম, তবে কিছু গবেষণার পরে আমি বুঝতে পেরেছিলাম যে আমরা সেলেনিয়াম ওয়েব ড্রাইভারের সাথে একযোগে অনুরোধগুলিতে বাধা দেওয়ার জন্য ক্রোমের "--রেট-ডিবাগিং-পোর্ট" ব্যবহার করতে পারি। রেফারেন্স হিসাবে নিম্নলিখিত সিউডোকোড ব্যবহার করুন: -

রিমোট ডিবাগিং সহ ক্রোম ড্রাইভারের উদাহরণ তৈরি করুন

int freePort = findFreePort();

chromeOptions.addArguments("--remote-debugging-port=" + freePort);

ChromeDriver driver = new ChromeDriver(chromeOptions);`

http://127.0.0.1: ফ্রিপোর্টে একটি কল করুন

String response = makeGetCall( "http://127.0.0.1" + freePort  + "/json" );

শোনার জন্য ক্রোমের ওয়েবস্কট ইউরালটি বের করুন, আপনি প্রতিক্রিয়া দেখতে পারেন এবং কীভাবে নিষ্কাশন করবেন তা নির্ধারণ করতে পারেন

String webSocketUrl = response.substring(response.indexOf("ws://127.0.0.1"), response.length() - 4);

এই সকেটে সংযুক্ত করুন, আপনি asyncHttp ব্যবহার করতে পারেন

socket = maketSocketConnection( webSocketUrl );

নেটওয়ার্ক ক্যাপচার সক্ষম করুন

socket.send( { "id" : 1, "method" : "Network.enable" } );

এখন ক্রোম সমস্ত নেটওয়ার্ক সম্পর্কিত ইভেন্ট প্রেরণ করবে এবং নীচে সেগুলি ক্যাপচার করবে

socket.onMessageReceived( String message ){

    Json responseJson = toJson(message);
    if( responseJson.method == "Network.responseReceived" ){
       //extract status code
    }
}

driver.get("http://stackoverflow.com");

আপনি দেব সরঞ্জাম সাইটে উল্লিখিত সমস্ত কিছু করতে পারেন। দেখতে https://chromedevtools.github.io/devtools-protocol/ নোট: - ব্যবহারের chromedriver 2.39 অথবা উপরে।

আমি আশা করি এটি কাউকে সাহায্য করবে

তথ্যসূত্র: গুগল ক্রোম রিমোট ডিবাগিং প্রোটোকল ব্যবহার করা


দুর্দান্ত, আমি আনন্দিত এটি করার একটি উপায় আছে! আমি শুধু ইচ্ছুক (রুবি জন্য একটি লাইব্রেরি ছিল selenium-webdriverআমার ক্ষেত্রে,) যা স্বয়ংক্রিয়ভাবে সক্রিয় Network.enableএবং গত প্রতিক্রিয়া চেক করতে ... মত একটি সহজ উপায় উদ্ভাসিত driver.response.status_code। হয়তো কোনও দিন আমি এটিকে যোগ করতে পারি ... :)
টাইলার রিক

অন্য কোনও রুবি প্রোগ্রামার যদি এটির সামনে আসে, আমি একটি রত্ন তৈরি করেছি, github.com/TylerRick/capybara-chrome_response_headers , এটি আপনাকে সহজেই কল করে একটি কেপিবাড়া / আরএসপেক পরীক্ষা থেকে এইচটিটিপি স্থিতির কোডটি পেতে দেয় status_code। এটি উদাহরণের মতো ক্রোম রিমোট ডিবাগিং প্রোটোকল ব্যবহার করে।
টাইলার রিক

ধন্যবাদ ইউ দোস্ত! আমার জন্য ক্রোম 76 + সেলেনিয়াম 3.141
জেসেজ

9

যে কোনও ভাষায় প্রতিক্রিয়া কোড পান (জাভাস্ক্রিপ্ট ব্যবহার করে):

যদি আপনার সেলেনিয়াম পরীক্ষাগুলি একটি আধুনিক ব্রাউজারে চলে, তবে প্রতিক্রিয়া কোড পাওয়ার একটি সহজ উপায় হল একটি সিঙ্ক্রোনাস XMLHttpRequest* প্রেরণ করা এবং statusপ্রতিক্রিয়াটির চেক করা :

var xhr = new XMLHttpRequest();
xhr.open('GET', 'http://exampleurl.ex', false);
xhr.send(null);

assert(200, xhr.status);

সেলেনিয়াম স্ক্রিপ্টটি সম্পাদন করার অনুরোধ করে আপনি যে কোনও প্রোগ্রামিং ভাষার সাথে এই কৌশলটি ব্যবহার করতে পারেন। উদাহরণস্বরূপ, জাভাতে আপনি এইগুলি JavascriptExecutor.executeScript()প্রেরণ করতে ব্যবহার করতে পারেন XMLHttpRequest:

final String GET_RESPONSE_CODE_SCRIPT =
    "var xhr = new XMLHttpRequest();" +
    "xhr.open('GET', arguments[0], false);" +
    "xhr.send(null);" +
    "return xhr.status";
JavascriptExecutor javascriptExecutor = (JavascriptExecutor) webDriver;
Assert.assertEquals(200,
    javascriptExecutor.executeScript(GET_RESPONSE_CODE_SCRIPT, "http://exampleurl.ex"));

* আপনি একটি অ্যাসিক্রোনাস পাঠাতে পারেন XMLHttpRequest পরিবর্তে , তবে আপনার পরীক্ষা চালিয়ে যাওয়ার আগে আপনার এটি শেষ হওয়ার জন্য অপেক্ষা করতে হবে।

জাভাতে রেসপন্স কোডটি পান:

আপনি জাভাতে প্রতিক্রিয়া কোডটি ব্যবহার করে URL.openConnection()এবং এটির মাধ্যমে পেতে পারেন HttpURLConnection.getResponseCode():

URL url = new URL("http://exampleurl.ex");
HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
httpURLConnection.setRequestMethod("GET");

// You may need to copy over the cookies that Selenium has in order
// to imitate the Selenium user (for example if you are testing a
// website that requires a sign-in).
Set<Cookie> cookies = webDriver.manage().getCookies();
String cookieString = "";

for (Cookie cookie : cookies) {
    cookieString += cookie.getName() + "=" + cookie.getValue() + ";";
}

httpURLConnection.addRequestProperty("Cookie", cookieString);
Assert.assertEquals(200, httpURLConnection.getResponseCode());

এই পদ্ধতিটি সম্ভবত অন্যান্য ভাষায়ও সাধারণীকরণ করা যেতে পারে তবে ভাষার (বা গ্রন্থাগারের) এপিআই ফিট করার জন্য এটি পরিবর্তন করতে হবে।


8

নিশ্চিত যে আপনি এটি যা খুঁজছেন তা নয়, তবে আমার কাছে অন্যরকম লক্ষ্য ছিল দূরবর্তী চিত্রের উপস্থিতি রয়েছে কিনা তা পরীক্ষা করা এবং আমার 403 ত্রুটি থাকবে না, তাই আপনি নীচের মতো কিছু ব্যবহার করতে পারেন:

public static boolean linkExists(String URLName){
    try {
        HttpURLConnection.setFollowRedirects(false);
        HttpURLConnection con = (HttpURLConnection) new URL(URLName).openConnection();
        con.setRequestMethod("HEAD");
        return (con.getResponseCode() == HttpURLConnection.HTTP_OK);
    }
    catch (Exception e) {
        e.printStackTrace();
        return false;
    }
}

4
সাধারণ ক্ষেত্রে কার্যকর, তবে আপনার এই পদ্ধতিটি ব্যবহার করে কোনও ব্রাউজারের অবস্থা নেই (যেমন ব্যবহারকারী লগইন)।
রজার কীগুলি

আমি বিশ্বাস করি আপনি শিরোনাম অনুরোধের অংশ হিসাবে শংসাপত্রগুলি প্রেরণ করতে পারেন, আপনি যদি এটি চেষ্টা করতে পারেন তবে আমি প্রশংসা করব।
ভোলোডাইমার প্রাইসিয়াজনিয়ুক

4

সরাসরি সেলেনিয়াম ওয়েবড্রাইভার ব্যবহার করে এইচটিটিপি রেসপন্স কোড পাওয়া সম্ভব নয়। জাভা কোড ব্যবহার করে কোডটি পাওয়া যাবে এবং সেটি সেলেনিয়াম ওয়েবড্রাইভারে ব্যবহার করা যেতে পারে।

জাভা দ্বারা এইচটিটিপি রেসপন্স কোড পেতে:

public static int getResponseCode(String urlString) throws MalformedURLException, IOException{
    URL url = new URL(urlString);
    HttpURLConnection huc = (HttpURLConnection)url.openConnection();
    huc.setRequestMethod("GET");
    huc.connect();
    return huc.getResponseCode();
}

এখন আপনি নীচে হিসাবে আপনার সেলেনিয়াম ওয়েবড্রাইভার কোড লিখতে পারেন:

private static int statusCode;
public static void main(String... args) throws IOException{
    WebDriver driver = new FirefoxDriver();
    driver.manage().window().maximize();
    driver.get("https://www.google.com/");
    driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

    List<WebElement> links = driver.findElements(By.tagName("a"));
    for(int i = 0; i < links.size(); i++){
        if(!(links.get(i).getAttribute("href") == null) && !(links.get(i).getAttribute("href").equals(""))){
            if(links.get(i).getAttribute("href").contains("http")){
                statusCode= getResponseCode(links.get(i).getAttribute("href").trim());
                if(statusCode == 403){
                    System.out.println("HTTP 403 Forbidden # " + i + " " + links.get(i).getAttribute("href"));
                }
            }
        }   
    }   
}

1
যদি এটি একটি পোস্টের ফর্ম জমা ছিল? কুকিজ থাকলে কী হবে?
nafg

1
এটি সেলেনিয়ামের বাইরে এইচটিটিপি অনুরোধ প্রেরণ করছে।
ম্যাথিয়াস উইঙ্কেলম্যান

2

আপনি মোবাইলনিয়াম ( https://github.com/rafpyprog/Mobilenium ) চেষ্টা করতে পারেন , একটি অজগর প্যাকেজ যা ব্রাউজারমব প্রক্সি এবং সেলেনিয়ামকে আবদ্ধ করে।

একটি ব্যবহারের উদাহরণ:

>>> from mobilenium import mobidriver
>>>
>>> browsermob_path = 'path/to/browsermob-proxy'
>>> mob = mobidriver.Firefox(browsermob_binary=browsermob_path)
>>> mob.get('http://python-requests.org')
301
>>> mob.response['redirectURL']
'http://docs.python-requests.org'
>>> mob.headers['Content-Type']
'application/json; charset=utf8'
>>> mob.title
'Requests: HTTP for Humans \u2014 Requests 2.13.0 documentation'
>>> mob.find_elements_by_tag_name('strong')[1].text
'Behold, the power of Requests'
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.