使用selenium 檢測js報錯


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

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM