一、 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());