背景:接到一個需求,想檢測頁面是否能檢測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; }