和我一起学 Selenium WebDriver(4)——基础篇

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


对于异步加载的捕获,其实就是一个等待的过程,这在之前的例子中早已看过,只不过需要特别说明一下 WebDriverWait,当超时后就会抛出异常,所以如果你的测试中对于这个部分不需要抛出异常的话,那么最好用 try catch 包起来。


这次利用 zTree 异步加载的Demo做测试,同时分别利用 WebElement 的 click 方法 和 zTree 的 expandNode 方法展开节点,进行异步加载。使用起来并不困难,直接看代码即可。


Java代码   收藏代码
  1. package lesson4;  
  2.   
  3. import static org.junit.Assert.*;  
  4.   
  5. import org.junit.AfterClass;  
  6. import org.junit.BeforeClass;  
  7. import org.junit.Test;  
  8. import org.openqa.selenium.JavascriptExecutor;  
  9. import org.openqa.selenium.WebDriver;  
  10. import org.openqa.selenium.WebElement;  
  11. import org.openqa.selenium.firefox.FirefoxDriver;  
  12. import org.openqa.selenium.support.ui.ExpectedCondition;  
  13. import org.openqa.selenium.support.ui.WebDriverWait;  
  14.   
  15. public class ExampleForAjax  {  
  16.       
  17.     static WebDriver driver;  
  18.       
  19.     @BeforeClass  
  20.     public static void init() {  
  21.         System.out.println("init...");  
  22.         // 如果你的 FireFox 没有安装在默认目录,那么必须在程序中设置  
  23.         System.setProperty("webdriver.firefox.bin""D:\\Program Files\\Mozilla Firefox\\firefox.exe");  
  24.         // 创建一个 FireFox 的浏览器实例  
  25.         driver = new FirefoxDriver();  
  26.     }  
  27.       
  28.     @Test  
  29.     public void test() {  
  30.         // 让浏览器访问 zTree Demo  
  31.         driver.get("http://www.ztree.me/v3/demo/cn/core/async.html");  
  32.           
  33.         // 等待 zTree 初始化完毕,Timeout 设置10秒  
  34.         try {  
  35.             (new WebDriverWait(driver, 10500)).until(new ExpectedCondition<Boolean>() {  
  36.                 public Boolean apply(WebDriver d) {  
  37.                     WebElement element = (WebElement) ((JavascriptExecutor)driver).executeScript("return $('#treeDemo li').get(0);");  
  38.                     return element != null;  
  39.                 }  
  40.             });  
  41.               
  42.         } catch(Exception e) {  
  43.             e.printStackTrace();  
  44.         }  
  45.           
  46.         ((JavascriptExecutor)driver).executeScript("window.zTreeObj = $.fn.zTree.getZTreeObj('treeDemo');");  
  47.           
  48.         //判断节点总数  
  49.         Long count =(Long) ((JavascriptExecutor)driver).executeScript("return window.zTreeObj.transformToArray(window.zTreeObj.getNodes()).length;");  
  50.         assertTrue(count == 4);  
  51.           
  52.         //利用 expandNode 方法展开第一个父节点  
  53.         ((JavascriptExecutor)driver).executeScript("window.zTreeNode = window.zTreeObj.getNodeByParam('isParent', true); window.zTreeObj.expandNode(window.zTreeNode, true);");  
  54.         try {  
  55.             (new WebDriverWait(driver, 10500)).until(new ExpectedCondition<Boolean>() {  
  56.                 public Boolean apply(WebDriver d) {  
  57.                     Boolean isAjaxing = (Boolean) ((JavascriptExecutor)driver).executeScript("return !!window.zTreeNode.isAjaxing;");  
  58.                     return !isAjaxing;  
  59.                 }  
  60.             });  
  61.               
  62.         } catch(Exception e) {  
  63.             e.printStackTrace();  
  64.         }  
  65.         //判断节点总数  
  66.         count =(Long) ((JavascriptExecutor)driver).executeScript("return window.zTreeObj.transformToArray(window.zTreeObj.getNodes()).length;");  
  67.         assertTrue(count == 8);  
  68.           
  69.         //模拟 click 事件 单击节点 +/- 号展开  
  70.         WebElement element = (WebElement) ((JavascriptExecutor)driver).executeScript("window.zTreeNode = window.zTreeNode.children[0]; return $('#' + window.zTreeNode.tId + '_switch').get(0);");  
  71.         element.click();  
  72.           
  73.         // 展开第一个子节点  
  74.         ((JavascriptExecutor)driver).executeScript("window.zTreeObj.expandNode(window.zTreeNode, true);");  
  75.         try {  
  76.             (new WebDriverWait(driver, 10500)).until(new ExpectedCondition<Boolean>() {  
  77.                 public Boolean apply(WebDriver d) {  
  78.                     Boolean isAjaxing = (Boolean) ((JavascriptExecutor)driver).executeScript("return !!window.zTreeNode.isAjaxing;");  
  79.                     return !isAjaxing;  
  80.                 }  
  81.             });  
  82.               
  83.         } catch(Exception e) {  
  84.             e.printStackTrace();  
  85.         }  
  86.         //判断节点总数  
  87.         count =(Long) ((JavascriptExecutor)driver).executeScript("return window.zTreeObj.transformToArray(window.zTreeObj.getNodes()).length;");  
  88.         assertTrue(count == 12);  
  89.           
  90.     }  
  91.       
  92.     @AfterClass  
  93.     public static void destory() {  
  94.         System.out.println("destory...");  
  95.         //关闭浏览器  
  96.         driver.quit();  
  97.     }  
  98. }  
 

【2、如何监控 iframe】

 

能够正常监控 异步加载后,对于 iframe 就只剩下一个问题了,如何用 在父窗口执行iframe 窗口内的 js 了。

对于这个问题其实很简单, iframe 的 name 就是iframe 这个window 的对象,所以,你只需要注意把之前的window 换成 iframe 的name 就可以了;同时调用全局变量时也一定要加上这个iframe 的name

 

Java代码   收藏代码
  1. package lesson4;  
  2.   
  3. import org.junit.AfterClass;  
  4. import org.junit.BeforeClass;  
  5. import org.junit.Test;  
  6. import org.openqa.selenium.JavascriptExecutor;  
  7. import org.openqa.selenium.WebDriver;  
  8. import org.openqa.selenium.firefox.FirefoxDriver;  
  9. import org.openqa.selenium.support.ui.ExpectedCondition;  
  10. import org.openqa.selenium.support.ui.WebDriverWait;  
  11.   
  12. public class ExampleForIframe  {  
  13.       
  14.     static WebDriver driver;  
  15.       
  16.     @BeforeClass  
  17.     public static void init() {  
  18.         System.out.println("init...");  
  19.         // 如果你的 FireFox 没有安装在默认目录,那么必须在程序中设置  
  20.         System.setProperty("webdriver.firefox.bin""D:\\Program Files\\Mozilla Firefox\\firefox.exe");  
  21.         // 创建一个 FireFox 的浏览器实例  
  22.         driver = new FirefoxDriver();  
  23.     }  
  24.       
  25.     @Test  
  26.     public void test() {  
  27.         // 让浏览器访问 zTree Demo  
  28.         driver.get("http://www.ztree.me/v3/demo.php#_102");  
  29.           
  30.         // 等待 iframe 加载完毕,Timeout 设置10秒  
  31.         try {  
  32.             (new WebDriverWait(driver, 10500)).until(new ExpectedCondition<Boolean>() {  
  33.                 public Boolean apply(WebDriver d) {  
  34.                     Boolean loaded = (Boolean) ((JavascriptExecutor)driver).executeScript("return !!demoIframe.$.fn.zTree.getZTreeObj('treeDemo');");  
  35.                     return loaded;  
  36.                 }  
  37.             });  
  38.               
  39.         } catch(Exception e) {  
  40.             e.printStackTrace();  
  41.         }  
  42.           
  43.         ((JavascriptExecutor)driver).executeScript("demoIframe.zTreeObj = demoIframe.$.fn.zTree.getZTreeObj('treeDemo');");  
  44.           
  45.         //利用 expandNode 方法展开第2个根节点  
  46.         ((JavascriptExecutor)driver).executeScript("demoIframe.zTreeNode = demoIframe.zTreeObj.getNodes()[1]; demoIframe.zTreeObj.expandNode(demoIframe.zTreeNode, true);");  
  47.           
  48.         // 等待 5 秒  
  49.         try {  
  50.             (new WebDriverWait(driver, 51000)).until(new ExpectedCondition<Boolean>() {  
  51.                 public Boolean apply(WebDriver d) {  
  52.                     return false;  
  53.                 }  
  54.             });  
  55.               
  56.         } catch(Exception e) {}  
  57.           
  58.     }  
  59.       
  60.     @AfterClass  
  61.     public static void destory() {  
  62.         System.out.println("destory...");  
  63.         //关闭浏览器  
  64.         driver.quit();  
  65.     }  
  66. }  
 
分享到:   
评论
1 楼  LucyLing 2014-06-27  
【Ajax的操作】
后面应更改为:
Java代码   收藏代码
  1. //模拟 click 事件 单击节点 +/- 号展开  
  2.         WebElement element = (WebElement) ((JavascriptExecutor)driver).executeScript("window.zTreeNode = window.zTreeNode.children[0]; " +  
  3.                 "return $('#' + window.zTreeNode.tId + '_switch').get(0);");  
  4.         element.click();  
  5.         try {  
  6.             (new WebDriverWait(driver, 10500)).until(new ExpectedCondition<Boolean>() {  
  7.                 public Boolean apply(WebDriver d) {  
  8.                     Boolean isAjaxing = (Boolean) ((JavascriptExecutor)driver).executeScript("return !!window.zTreeNode.isAjaxing;");  
  9.                     return !isAjaxing;  
  10.                 }  
  11.             });  
  12.               
  13.         } catch(Exception e) {  
  14.             e.printStackTrace();  
  15.         }  
  16.         //判断节点总数  
  17.         count =(Long) ((JavascriptExecutor)driver).executeScript("return window.zTreeObj.transformToArray(window.zTreeObj.getNodes()).length;");  
  18.         System.out.println(count);  
  19.         assertTrue(count == 12);  
  20.           
  21.         // 展开第一个子节点 ,作用等同于上面一句 element.click();  
  22.         ((JavascriptExecutor)driver).executeScript("window.zTreeObj.expandNode(window.zTreeNode.children[0], true);");  
  23.         try {  
  24.             (new WebDriverWait(driver, 10500)).until(new ExpectedCondition<Boolean>() {  
  25.                 public Boolean apply(WebDriver d) {  
  26.                     Boolean isAjaxing = (Boolean) ((JavascriptExecutor)driver).executeScript("return !!window.zTreeNode.isAjaxing;");  
  27.                     return !isAjaxing;  
  28.                 }  
  29.             });  
  30.               
  31.         } catch(Exception e) {  
  32.             e.printStackTrace();  
  33.         }  
  34.         //判断节点总数  
  35.         count =(Long) ((JavascriptExecutor)driver).executeScript("return window.zTreeObj.transformToArray(window.zTreeObj.getNodes()).length;");  
  36.         System.out.println(count);  
  37.         assertTrue(count == 16);  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值