作者:高元_G·Marshal于 2017年06月22日 发布在分类 / 开发技术 / Test / Selenium 下,并于 2017年06月22日 编辑
    Selenium WebDriver(4)——基础篇

       347

       0


    【1、如何处理异步加载】  

    对于异步加载的捕获,其实就是一个等待的过程,这在之前的例子中早已看过,只不过需要特别说明一下 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();
        }
    }
    
    

    【2、如何监控 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();
        }
    }  
    访问权限

    创建人 高元_G·Marshal
    文档编辑权限 创建者私有
    文档阅读权限 来自分类
    分类阅读权限 所有人
    分类编辑权限 所有人
    分类审核权限
    标签

    Selenium
    历史版本

    修改日期 修改人 备注
    2017-06-22 15:46:20[当前版本] 高元_G·Marshal CREAT
    同类知识
    相关知识

    睿恒知识库-V3.2.0