背景:接到一個需求,想檢測頁面是否能檢測js報錯,何為js報錯,如下圖所示,在控制台中,使用console,如果有js報錯,就會出現錯誤

如何檢測,簡單版操作,打開一個url,使用manage獲取瀏覽器的日志,這樣會打印出這個頁面獲取的內容
@Test
public void test2(){
op.loopGet("https://www.rosewholesale.com/cheapest/chic-embossing-braid-5-pieces-3027854.html", 50, 3, 60); //這個就是打開頁面的方法,只是自己進行了封裝
LogEntries logEntries = driver.manage().logs().get(LogType.BROWSER);
for (LogEntry entry : logEntries) {
Log.logInfo(" "+entry.getLevel()+ " "+entry.getMessage());
}
在日志中會打印出內容包含sever和waring,server就是js報錯

自己理解的原理:實際使用的driver中日志信息,然后進行過濾,可以在源碼中看到LogType.BROWSER不止這一種,還有獲取客戶端,等其他,如下圖 你會發現其實在啟動driver,每次都會記錄他的日志,我們原理實際也就是利用他的日志,對我們需要的數據進行篩選

但是真實場景,往往不可能是對一個url進行檢測,需要打開很多url進行檢測,查看某個url中包含哪些js有問題,這里就會有一個坑,因為driver每次會一直記錄頁面的錯誤,所以當打開網頁后,輸入多個url,進行篩選時,會重復把以前的數據在進行過濾,那每次拿到對應的url的日志,目前自己想到的2種解決辦法:
1.每次都實例driver,讓他做為一個新對象,我們拿到的數據也是某個url對應的日志,但是這樣耗時太長,性能差
2.糾結了很久,換了個思路,拿到一個url的日志對象,取出內容,在get其他新url時,判斷日志是否有值,有值進行刪除,這樣每次打開url都會拿到最新的url
/**
*
* @測試點: 檢查 js是否有報錯
* @驗證點: 如果傳入的url中有報錯,返回報錯信息
@param urllist 傳入的url
@param timeout 頁面超時時間
@param loopTimes 重試次數
@param timeoutDefault 默認加載頁面的時間
@return 報錯的url和報錯的信息
* @備注: HashMap<String,List<String>>
* @author zhangjun
* @date 2018年5月24日
@修改說明
*/
public HashMap<String, List<String>> checkJsSEVERE(List<String> urllist, int timeout, int loopTimes, int timeoutDefault){
List<String> levelList;
HashMap<String, List<String>> severeLevel = new HashMap<String, List<String>>();
LogEntries logEntries = driver.manage().logs().get(LogType.BROWSER);
for (int i = 0; i < urllist.size(); i++) {
try {
if (logEntries.getAll().isEmpty() == false) { //判斷是否有內容
logEntries.iterator().remove(); //有內容進行刪除
}
} catch (Exception e) {
}
String get_url = urllist.get(i); //在重新進行刪除
loopGet(get_url, timeout, loopTimes, timeoutDefault);
levelList = new ArrayList<String>();
logEntries = driver.manage().logs().get(LogType.BROWSER);
for (LogEntry entry : logEntries) {
Object level = entry.getLevel();
String getLevel = String.valueOf(level);
if (getLevel.equals("SEVERE")) {
levelList.add(entry.getMessage());
}
}
severeLevel.put(get_url, levelList);
}
return severeLevel;
}
