zoukankan      html  css  js  c++  java
  • 使用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;
    	}
    

      

  • 相关阅读:
    算法训练 P1103
    算法训练 表达式计算
    算法训练 表达式计算
    基础练习 时间转换
    基础练习 字符串对比
    Codeforces 527D Clique Problem
    Codeforces 527C Glass Carving
    Codeforces 527B Error Correct System
    Codeforces 527A Glass Carving
    Topcoder SRM 655 DIV1 250 CountryGroupHard
  • 原文地址:https://www.cnblogs.com/chongyou/p/9094055.html
Copyright © 2011-2022 走看看