背景:接到一個需求,想檢測頁面是否能檢測js報錯,何爲js報錯,以下圖所示,在控制檯中,使用console,若是有js報錯,就會出現錯誤html
如何檢測,簡單版操做,打開一個url,使用manage獲取瀏覽器的日誌,這樣會打印出這個頁面獲取的內容java
@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,每次都會記錄他的日誌,咱們原理實際也就是利用他的日誌,對咱們須要的數據進行篩選oop
可是真實場景,每每不多是對一個url進行檢測,須要打開不少url進行檢測,查看某個url中包含哪些js有問題,這裏就會有一個坑,由於driver每次會一直記錄頁面的錯誤,因此當打開網頁後,輸入多個url,進行篩選時,會重複把之前的數據在進行過濾,那每次拿到對應的url的日誌,目前本身想到的2種解決辦法:性能
1.每次都實例driver,讓他作爲一個新對象,咱們拿到的數據也是某個url對應的日誌,可是這樣耗時太長,性能差測試
2.糾結了好久,換了個思路,拿到一個url的日誌對象,取出內容,在get其餘新url時,判斷日誌是否有值,有值進行刪除,這樣每次打開url都會拿到最新的urlurl
/** * * @測試點: 檢查 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; }