使用 selenium webdriver java 4.0v 捕获网络流量
Capture network traffic using selenium webdriver java 4.0v
我想捕获 Chromedriver window 中生成的网络流量。
我发现它可以使用 selenium 4.0 DevTools 实用程序来完成,但我找不到如何或好的文档。
https://www.selenium.dev/selenium/docs/api/java/org/openqa/selenium/devtools/DevTools.html
有没有最简单的方法?谢谢
您可以使用 LoggingPreferences
和 ChromeOptions
完成此操作
进口
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\"")) {
}
}
这是一个使用 Selenium 4 提供的新 DevTools 协议 (CDP) 的简单示例
(此代码使用 Beta-4 版本和 CDP for Chrome 91 )
:
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 ...
使用 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>
使用此代码段,您将获得所有请求和响应。
@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);
}
尽情享受吧。
我想捕获 Chromedriver window 中生成的网络流量。 我发现它可以使用 selenium 4.0 DevTools 实用程序来完成,但我找不到如何或好的文档。
https://www.selenium.dev/selenium/docs/api/java/org/openqa/selenium/devtools/DevTools.html
有没有最简单的方法?谢谢
您可以使用 LoggingPreferences
和 ChromeOptions
进口
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\"")) {
}
}
这是一个使用 Selenium 4 提供的新 DevTools 协议 (CDP) 的简单示例 (此代码使用 Beta-4 版本和 CDP for Chrome 91 )
:
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 ...
使用 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>
使用此代码段,您将获得所有请求和响应。
@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);
}
尽情享受吧。