一、 Maven工程引入Jar包
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>4.1.0</version>
</dependency>
二、监控浏览器日志
ChromeDriver browserDriver = new ChromeDriver(options);
DevTools devTools = browserDriver.getDevTools();
devTools.createSession();
devTools.send(Log.enable());
//添加监听器用于处理浏览器日志
devTools.addListener(Log.entryAdded(),
logEntry -> {
BrowserLogParse.parseBrowseLog(logEntry,browserDriver);
});
devTools.send(Performance.enable(Optional.empty()));
//回调方法用于处理浏览器日志,打印错误日志
public static void parseBrowseLog(LogEntry logEntry, ChromeDriver driver) {
if (logEntry.getLevel().equals(org.openqa.selenium.devtools.v96.log.model.LogEntry.Level.ERROR)) {
System.out.println(logEntry.getText());
}
}
三、监控网络请求响应
NetworkInterceptor interceptor = new NetworkInterceptor(
browserDriver,
(Filter)next->req->{
HttpResponse res;
try {
long startTime=System.currentTimeMillis(); //获取开始时间
res = next.execute(req);
long endTime = System.currentTimeMillis(); //获取结束时间
System.out.println(logEntry.getText());
//对网络请求、响应进行处理
BrowserLogParse.parseNetwork(NetWorkRecord.builder()
.startTime(startTime)
.endTime(endTime)
.request(req)
.response(res)
.build(),browserDriver);
return res;
}catch (Exception e){
log.info("无响应异常"+e.getMessage());
BrowserLogParse.addTimeOutRequest(req.getUri());
}
return new HttpResponse();
});
//对网络请求、响应进行处理
public static void parseNetwork(NetWorkRecord record,ChromeDriver driver){
long cost = record.getEndTime()-record.getStartTime();
if(cost >3000){
log.info("网络监控-慢响应:" +record.getRequest().toString());
}
if(!record.getResponse().isSuccessful()){
log.info("网络监控-失败响应:" +record.toString());
return;
}
//判断是否restfull响应
if(Objects.isNull(record.getResponse().getHeader("Content-Type")))
return;
if(record.getResponse().getHeader("Content-Type").contains("application/json") && record.getResponse().getStatus() == 200){
String code = "";
String bodyStr = "";
try {
//解析响应体
bodyStr = Contents.string(record.getResponse());
code = JSONObject.parseObject(bodyStr).getString("code");
}catch (Exception e){
return;
}
if(StringUtils.isNotBlank(code) && !(code.equals("200") || code.equals("0"))){
log.info("页面:"+driver.getCurrentUrl()+"<br>"+"请求:"+Contents.string(record.getRequest())+"<br>"+"响应:"+bodyStr);
}
}
}
四、监控JS异常
Consumer<JavascriptException> addEntry = BrowserLogParse.jsExceptionsList::add;
devTools.getDomains().events().addJavascriptExceptionListener(addEntry);
五、获取页面性能数据
HashMap<String,Object> map = Maps.newHashMap();
map.put("timeDomain","timeTicks");
browserDriver.executeCdpCommand("Performance.enable",map);
//获取页面性能数据
List<Metric> metricList = driver.getDevTools().send(Performance.getMetrics());