如何使用Holmos处理页面等待ajax加载

</pre><span style="font-family:Microsoft YaHei; font-weight:normal">页面等待的情况多为等待<span lang="EN-US">AJAX</span>异步加载</span></h1><p style="margin:3pt 0cm"><span style="font-size:14px"><span style="font-family:微软雅黑,sans-serif">处理等待<span lang="EN-US">ajax</span>加载通常有以下几种方式:</span><span lang="EN-US" style="font-family:Arial,sans-serif"></span></span></p><p style="margin:3pt 0cm"><span style="font-size:14px"><span lang="EN-US" style="font-family:微软雅黑,sans-serif">1.sleep(5000);</span><span style="font-family:微软雅黑,sans-serif">最省事的方法,给定固定的睡眠时间,在时间过后继续执行</span><span lang="EN-US" style="font-family:Arial,sans-serif"></span></span></p><p style="margin:3pt 0cm"><span style="font-size:14px"><span lang="EN-US" style="font-family:微软雅黑,sans-serif">2.</span><span style="font-family:微软雅黑,sans-serif">类似<span lang="EN-US">WaitforCondition()</span>的方法,在方法内加个判断条件,判断一个元素在新页面展现出来后继续执行</span><span lang="EN-US" style="font-family:Arial,sans-serif"></span></span></p><p style="margin:3pt 0cm"><span style="font-size:14px"><span lang="EN-US" style="font-family:微软雅黑,sans-serif">3.</span><span style="font-family:微软雅黑,sans-serif">直接判断页面<span lang="EN-US">ajax</span>加载完成后继续执行</span><span lang="EN-US" style="font-family:Arial,sans-serif"></span></span></p><p style="margin:3pt 0cm"><span lang="EN-US" style="font-family:Arial,sans-serif"><span style="font-size:14px"> </span></span></p><p style="margin:3pt 0cm"><span style="font-family:微软雅黑,sans-serif"><span style="font-size:14px">由于前两种方法存在各种弊端,以下将着重讲解第三种方法:</span></span></p><p style="margin:3pt 0cm"><span style="font-size:14px"><span style="font-family:'Microsoft YaHei'">直接上代码</span><span style="font-family:Arial,sans-serif">:</span></span></p><p style="margin:3pt 0cm"></p><pre name="code" class="java">	public static void waitForAjaxToComplete() {		
		BrowserWindow currentWindow=Allocator.getInstance().currentWindow;
		WebDriver webDriver = (WebDriver) currentWindow.getDriver().getEngine();
		JavascriptExecutor js = (JavascriptExecutor) webDriver; 
		int count=0;	
		//循环等待10次,一次等一秒
		while(count++<10){
			try {
				//jQuery.active用来判断jQuery类库的AJAX活动状态,当AJAX加载完成时,值为0
				//Ajax.activeRequestCount用来判断prototype类库的AJAX活动状态,原理同上,想支持更多JS类库,请自行添加
				Object AjaxActive = js.executeScript("if(typeof window.jQuery != 'undefined'){return jQuery.active;}else if(typeof window.Ajax!= 'undefined'){return Ajax.activeRequestCount;}");				
				if (AjaxActive.toString().equalsIgnoreCase("0")) {
					break;
				}else{
					//有AJAX正在活动,就等待一秒后再次尝试
					HolmosBaseTools.sleep(1000);
					System.out.println("=====================等待"+count+"次");
				}
			} catch (Exception e) {
				System.out.println("等待加载异常");
				break;
			}
		}				
	}

相信大家看过代码就能明白,这是在HolmosWindow.java中定义的一个静态方法,需要在执行步骤中单独调用:

<span style="white-space:pre">		</span>testAJAXPage.step1.click();       	
        	testAJAXPage.step2.setText("渤海");
        	testAJAXPage.step3.click();
        	HolmosWindow.waitForAjaxToComplete();
        	testAJAXPage.step4.click();
        	HolmosWindow.closeAllWindows();

这种情况是提前知道这个操作步骤会触发ajax,我们需要一个通用的解决方案,在执行时自动判断是否需要等待ajax。

通过对业务的梳理,发现触发ajax的绝大部分为Click()方法,将ajax判断注入最底层的Element.java的Click()方法:

public void click(){
		StringBuilder message=new StringBuilder();
		BrowserWindow currentWindow=Allocator.getInstance().currentWindow;
		if(isExist()){
			message.append(this.wholeComment+":");
			if(currentWindow instanceof SeleniumBrowserWindow){
				((Selenium)currentWindow.getDriver().getEngine()).click(locator.getSeleniumCurrentLocator());
			}else if(currentWindow instanceof WebDriverBrowserWindow){
				element.click();
			}
			message.append("click鼠标左键单击成功!");			
			logger.info(message);
			//开始判断是否有活动的ajax
			int count=0;	
			//循环等待10次,一次等一秒
			while(count++<10){
				try {								
					if (HolmosWindow.waitForAjaxToComplete()) {
						break;
					}else{
						//有AJAX正在活动,就等待一秒后再次尝试
						HolmosBaseTools.sleep(1000);
						System.out.println("=====================等待"+count+"次");
					}
				} catch (Exception e) {
					System.out.println("等待加载异常");
					break;
				}
			}	
		}else{
			message.append(this.wholeComment+":");
			message.append("click鼠标左键单击失败!找不到元素!");
			logger.error(message);
		}
	}


同时重写waitForAjaxToComplete()方法,只用来返回布尔型变量:

	public static Boolean waitForAjaxToComplete() {		
		BrowserWindow currentWindow=Allocator.getInstance().currentWindow;
		WebDriver webDriver = (WebDriver) currentWindow.getDriver().getEngine();
		JavascriptExecutor js = (JavascriptExecutor) webDriver; 
		Boolean isAJAXComplete=false;		
		//jQuery.active用来判断jQuery类库的AJAX活动状态,当AJAX加载完成时,值为0
		//Ajax.activeRequestCount用来判断prototype类库的AJAX活动状态,原理同上
		Object AjaxActive = js.executeScript("if(typeof window.jQuery != 'undefined'){return jQuery.active;}else if(typeof window.Ajax!= 'undefined'){return Ajax.activeRequestCount;}");				
		if (AjaxActive.toString().equalsIgnoreCase("0")) {
			isAJAXComplete=true;			
			}
		return isAJAXComplete;
		}		


附赠我用来调试的测试代码,可供大家进行验证和继续深入探索:

Page类:

public class testAJAXPage extends Page { 
        public testAJAXPage() { 
               super(); 
               this.comment =""; 
               this.init(); 
       } 
        public Element step1 = new Element( "" ); 
        { 
        	step1.addXpathLocator("/html/body/div/section/nav/ul/li[2]/a");        	
        }     
        public TextField step2 = new TextField( "" ); 
        { 
        	step2.addCSSLocator("#search");
        }    
        public Element step3 = new Element( "" ); 
        { 
        	step3.addIDLocator("//*[@id='search-btn']");
        	step3.addCSSLocator("#search-btn");
        }    
        public Element step4 = new Element( "" ); 
        { 
        	step4.addIDLocator("//*[@id='oUl']/li/section/a");
        	step4.addCSSLocator("#oUl > li > section > a");
        }        
}

测试用例类:

public class testAJAX { 
        
		public testAJAXPage testAJAXPage = new testAJAXPage(); 
        
    	protected static WebDriver webDriver;
    	protected static InternetExplorerDriverService service;
        @Test 
        public void attchtest() { 
        	
        	HolmosWindow.openNewWindow(EngineType.WebDriverChrome, "http://10.16.57.66:8081/20141027Bank/index.html" );
        	testAJAXPage.step1.click();       	
        	testAJAXPage.step2.setText("渤海");
        	testAJAXPage.step3.click();
        	//HolmosWindow.waitForAjaxToComplete();
        	testAJAXPage.step4.click();
        	HolmosWindow.closeAllWindows();
        	}
        }



你可能感兴趣的:(Ajax,selenium,自动化测试,webdriver,Holmos)