和我一塊兒學 Selenium WebDriver(4)——基礎篇

【一、如何處理異步加載】 

對於異步加載的捕獲,其實就是一個等待的過程,這在以前的例子中早已看過,只不過須要特別說明一下 WebDriverWait,當超時後就會拋出異常,因此若是你的測試中對於這個部分不須要拋出異常的話,那麼最好用 try catch 包起來。

此次利用 zTree 異步加載的Demo作測試,同時分別利用 WebElement 的 click 方法 和 zTree 的 expandNode 方法展開節點,進行異步加載。使用起來並不困難,直接看代碼便可。

package lesson4;

import static org.junit.Assert.*;

import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.support.ui.ExpectedCondition;
import org.openqa.selenium.support.ui.WebDriverWait;

public class ExampleForAjax  {
	
    static WebDriver driver;
    
    @BeforeClass
    public static void init() {
    	System.out.println("init...");
    	// 若是你的 FireFox 沒有安裝在默認目錄,那麼必須在程序中設置
    	System.setProperty("webdriver.firefox.bin", "D:\\Program Files\\Mozilla Firefox\\firefox.exe");
    	// 建立一個 FireFox 的瀏覽器實例
    	driver = new FirefoxDriver();
    }
	
    @Test
    public void test() {
    	// 讓瀏覽器訪問 zTree Demo
    	driver.get("http://www.ztree.me/v3/demo/cn/core/async.html");
    	
    	// 等待 zTree 初始化完畢,Timeout 設置10秒
    	try {
    		(new WebDriverWait(driver, 10, 500)).until(new ExpectedCondition<Boolean>() {
    			public Boolean apply(WebDriver d) {
    				WebElement element = (WebElement) ((JavascriptExecutor)driver).executeScript("return $('#treeDemo li').get(0);");
    				return element != null;
    			}
    		});
    		
    	} catch(Exception e) {
    		e.printStackTrace();
    	}
    	
    	((JavascriptExecutor)driver).executeScript("window.zTreeObj = $.fn.zTree.getZTreeObj('treeDemo');");
    	
    	//判斷節點總數
    	Long count =(Long) ((JavascriptExecutor)driver).executeScript("return window.zTreeObj.transformToArray(window.zTreeObj.getNodes()).length;");
    	assertTrue(count == 4);
    	
    	//利用 expandNode 方法展開第一個父節點
    	((JavascriptExecutor)driver).executeScript("window.zTreeNode = window.zTreeObj.getNodeByParam('isParent', true); window.zTreeObj.expandNode(window.zTreeNode, true);");
    	try {
    		(new WebDriverWait(driver, 10, 500)).until(new ExpectedCondition<Boolean>() {
    			public Boolean apply(WebDriver d) {
    				Boolean isAjaxing = (Boolean) ((JavascriptExecutor)driver).executeScript("return !!window.zTreeNode.isAjaxing;");
    				return !isAjaxing;
    			}
    		});
    		
    	} catch(Exception e) {
    		e.printStackTrace();
    	}
    	//判斷節點總數
    	count =(Long) ((JavascriptExecutor)driver).executeScript("return window.zTreeObj.transformToArray(window.zTreeObj.getNodes()).length;");
    	assertTrue(count == 8);
    	
    	//模擬 click 事件 單擊節點 +/- 號展開
    	WebElement element = (WebElement) ((JavascriptExecutor)driver).executeScript("window.zTreeNode = window.zTreeNode.children[0]; return $('#' + window.zTreeNode.tId + '_switch').get(0);");
    	element.click();
    	
    	// 展開第一個子節點
    	((JavascriptExecutor)driver).executeScript("window.zTreeObj.expandNode(window.zTreeNode, true);");
    	try {
    		(new WebDriverWait(driver, 10, 500)).until(new ExpectedCondition<Boolean>() {
    			public Boolean apply(WebDriver d) {
    				Boolean isAjaxing = (Boolean) ((JavascriptExecutor)driver).executeScript("return !!window.zTreeNode.isAjaxing;");
    				return !isAjaxing;
    			}
    		});
    		
    	} catch(Exception e) {
    		e.printStackTrace();
    	}
    	//判斷節點總數
    	count =(Long) ((JavascriptExecutor)driver).executeScript("return window.zTreeObj.transformToArray(window.zTreeObj.getNodes()).length;");
    	assertTrue(count == 12);
    	
    }
    
    @AfterClass
    public static void destory() {
    	System.out.println("destory...");
    	//關閉瀏覽器
    	driver.quit();
    }
}

【二、如何監控 iframe】

可以正常監控 異步加載後,對於 iframe 就只剩下一個問題了,如何用 在父窗口執行iframe 窗口內的 js 了。


對於這個問題其實很簡單, iframe 的 name 就是iframe 這個window 的對象,因此,你只須要注意把以前的window 換成 iframe 的name 就能夠了;同時調用全局變量時也必定要加上這個iframe 的name

package lesson4;

import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.support.ui.ExpectedCondition;
import org.openqa.selenium.support.ui.WebDriverWait;

public class ExampleForIframe  {
	
    static WebDriver driver;
    
    @BeforeClass
    public static void init() {
    	System.out.println("init...");
    	// 若是你的 FireFox 沒有安裝在默認目錄,那麼必須在程序中設置
    	System.setProperty("webdriver.firefox.bin", "D:\\Program Files\\Mozilla Firefox\\firefox.exe");
    	// 建立一個 FireFox 的瀏覽器實例
    	driver = new FirefoxDriver();
    }
	
    @Test
    public void test() {
    	// 讓瀏覽器訪問 zTree Demo
    	driver.get("http://www.ztree.me/v3/demo.php#_102");
    	
    	// 等待 iframe 加載完畢,Timeout 設置10秒
    	try {
    		(new WebDriverWait(driver, 10, 500)).until(new ExpectedCondition<Boolean>() {
    			public Boolean apply(WebDriver d) {
    				Boolean loaded = (Boolean) ((JavascriptExecutor)driver).executeScript("return !!demoIframe.$.fn.zTree.getZTreeObj('treeDemo');");
    				return loaded;
    			}
    		});
    		
    	} catch(Exception e) {
    		e.printStackTrace();
    	}
    	
    	((JavascriptExecutor)driver).executeScript("demoIframe.zTreeObj = demoIframe.$.fn.zTree.getZTreeObj('treeDemo');");
    	
    	//利用 expandNode 方法展開第2個根節點
    	((JavascriptExecutor)driver).executeScript("demoIframe.zTreeNode = demoIframe.zTreeObj.getNodes()[1]; demoIframe.zTreeObj.expandNode(demoIframe.zTreeNode, true);");
    	
    	// 等待 5 秒
    	try {
    		(new WebDriverWait(driver, 5, 1000)).until(new ExpectedCondition<Boolean>() {
    			public Boolean apply(WebDriver d) {
    				return false;
    			}
    		});
    		
    	} catch(Exception e) {}
    	
    }
    
    @AfterClass
    public static void destory() {
    	System.out.println("destory...");
    	//關閉瀏覽器
    	driver.quit();
    }
}
相關文章
相關標籤/搜索