【问题标题】:Capture network traffic using selenium webdriver java 4.0v使用 selenium webdriver java 4.0v 捕获网络流量
【发布时间】:2021-02-28 14:03:22
【问题描述】:

我想捕获 Chromedriver 窗口中生成的网络流量。 我发现它可以使用 selenium 4.0 DevTools 实用程序来完成,但我找不到如何操作或一个好的文档。

https://www.selenium.dev/selenium/docs/api/java/org/openqa/selenium/devtools/DevTools.html

有没有最简单的方法?谢谢

【问题讨论】:

    标签: java selenium selenium-webdriver network-programming selenium-chromedriver


    【解决方案1】:

    使用 Selenium 4,您可以获得请求 URL 和响应 URL 等等。

    <dependency>
        <groupId>org.seleniumhq.selenium</groupId>
        <artifactId>selenium-java</artifactId>
        <version>4.0.0</version>
    </dependency>
    
    <dependency>
        <groupId>io.github.bonigarcia</groupId>
        <artifactId>webdrivermanager</artifactId>
        <version>4.3.1</version>
    </dependency>
    

    使用这个 sn-p 你会得到所有的请求和响应。

    
        @BeforeEach
        public void setUp() {
            WebDriverManager.chromedriver().setup();
            this.chromeDriver = new ChromeDriver();
            devTools = chromeDriver.getDevTools();
            devTools.createSession();
        }
    
        @Test
        public void getRequestsAndResponseUrls() throws InterruptedException {
            devTools.send(new Command<>("Network.enable", ImmutableMap.of()));
    ;
            devTools.addListener(Network.responseReceived(), l -> {
                System.out.print("Response URL: ");
                System.out.println(l.getResponse().getUrl());
            });
            devTools.addListener(Network.requestWillBeSent(), l -> {
                System.out.print("Request URL: ");
                System.out.println(l.getRequest().getUrl());
            });
    
            chromeDriver.get("https://edition.cnn.com/");
    
            // While Thread.sleep you you will see requests and responses appearing in console. 
            Thread.sleep(10000);
        }
    

    享受吧。

    【讨论】:

      【解决方案2】:

      这是一个使用 Selenium 4 提供的新 DevTools 协议 (CDP) 的简单示例 (此代码使用 Beta-4 版本和 Chrome 91 的 CDP)

                  :
      import org.openqa.selenium.devtools.DevTools;
      import org.openqa.selenium.devtools.v91.network.*;
                  :
                  
          DevTools devTools = ((ChromiumDriver) driver).getDevTools();
          devTools.createSession();
          devTools.send(Network.enable(Optional.empty(), Optional.empty(), Optional.empty()));
          
          devTools.addListener(Network.requestWillBeSent(), entry -> {
                      System.out.println("Request (id) URL      : (" + entry.getRequestId() + ") " 
                              + entry.getRequest().getUrl()
                              + " (" + entry.getRequest().getMethod() + ")");
                  });
          
          devTools.addListener(Network.responseReceived(), entry -> {
                      System.out.println("Response (Req id) URL : (" + entry.getRequestId() + ") " 
                              + entry.getResponse().getUrl()
                              + " (" + entry.getResponse().getStatus() + ")");
                  }); 
          
          driver.get("someurl");  // on so on ... 
      
          
      

      【讨论】:

        【解决方案3】:

        您可以使用LoggingPreferencesChromeOptions 完成此操作

        进口

        import org.json.simple.JSONObject;
        import org.json.simple.parser.JSONParser;
        import org.json.simple.parser.ParseException;
        import org.openqa.selenium.WebDriver;
        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;
        

        这里我们得到 Json 字符串,其中包含有关日志记录的数据。我使用json-simple库将接收到的json字符串转换为JSONObject。

        LoggingPreferences preferences = new LoggingPreferences();
        preferences.enable(LogType.PERFORMANCE, Level.ALL);
        
        ChromeOptions option = new ChromeOptions();
        option.setCapability(CapabilityType.LOGGING_PREFS, preferences);
        option.setCapability("goog:loggingPrefs", preferences);
        option.addArguments();
        
        System.setProperty("webdriver.chrome.driver", "chrome_driver_path");
        
        ChromeDriver chromeDriver = new ChromeDriver(option);
        chromeDriver.manage().window().maximize();
        this.driver = chromeDriver;
        
        
        driver.get("website_url");
        
        LogEntries logs = driver.manage().logs().get(LogType.PERFORMANCE);
        for (LogEntry entry : logs) {
            JSONParser parser = new JSONParser();
            JSONObject jsonObject = null;
            try {
                jsonObject = (JSONObject) parser.parse(entry.getMessage());
            } catch (ParseException e) {
                e.printStackTrace();
            }
            JSONObject messageObject = (JSONObject) jsonObject.get("message");
            System.out.println(messageObject.toJSONString());
            // You can do the required processing to messageObject
        }
        

        您可以使用 json 字符串中的type(XHR、脚本、样式表)从日志中过滤网络调用的类型。

        for (LogEntry entry : logs) {
           if(entry.toString().contains("\"type\":\"XHR\"")) {
           }
        }
        

        【讨论】:

        • 谢谢!我已经用你的信息解决了我的问题。 :)
        猜你喜欢
        • 2019-11-04
        • 2015-03-25
        • 2014-01-20
        • 2018-12-18
        • 1970-01-01
        • 2022-10-16
        • 2018-01-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多