和我一起学 Selenium WebDriver(2)——入门篇

【1. 加入 jUnit】 


Selenium 环境搞定,接下来就要想办法让我们的测试步入正轨了,对于 java 来说,用上 jUnit 是很方便的,maven 项目加入 jUnit 也是轻而易举,稍微修改一下 pom.xml 就可以了 


Xml代码   收藏代码
  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  2.     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">  
  3.     <modelVersion>4.0.0</modelVersion>  
  4.     <groupId>Selenium2Test</groupId>  
  5.     <artifactId>Selenium2Test</artifactId>  
  6.     <version>1.0</version>  
  7.     <dependencies>  
  8.         <dependency>  
  9.             <groupId>org.seleniumhq.selenium</groupId>  
  10.             <artifactId>selenium-java</artifactId>  
  11.             <version>2.25.0</version>  
  12.         </dependency>  
  13.         <dependency>  
  14.             <groupId>com.opera</groupId>  
  15.             <artifactId>operadriver</artifactId>  
  16.         </dependency>  
  17.         <dependency>  
  18.             <groupId>junit</groupId>  
  19.             <artifactId>junit</artifactId>  
  20.             <version>4.8.2</version>  
  21.             <scope>test</scope>  
  22.         </dependency>  
  23.     </dependencies>  
  24.     <dependencyManagement>  
  25.         <dependencies>  
  26.             <dependency>  
  27.                 <groupId>com.opera</groupId>  
  28.                 <artifactId>operadriver</artifactId>  
  29.                 <version>0.16</version>  
  30.                 <exclusions>  
  31.                     <exclusion>  
  32.                         <groupId>org.seleniumhq.selenium</groupId>  
  33.                         <artifactId>selenium-remote-driver</artifactId>  
  34.                     </exclusion>  
  35.                 </exclusions>  
  36.             </dependency>  
  37.         </dependencies>  
  38.     </dependencyManagement>  
  39. </project>  
 

把上一篇中测试 FireFox 的代码拿来按照 jUnit 的结构适当修改一下,就可以直接利用 jUnit 进行测试了 


Java代码   收藏代码
  1. package lesson2;  
  2.   
  3. import java.util.List;  
  4.   
  5. import org.junit.AfterClass;  
  6. import org.junit.BeforeClass;  
  7. import org.junit.Test;  
  8. import org.openqa.selenium.By;  
  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 ExampleJunit  {  
  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/standardData.html");  
  32.           
  33.         // 等待 zTree 初始化完毕,Timeout 设置10秒  
  34.         (new WebDriverWait(driver, 10)).until(new ExpectedCondition<Boolean>() {  
  35.             public Boolean apply(WebDriver d) {  
  36.                 WebElement element = driver.findElement(By.id("treeDemo"));  
  37.                 return element.findElement(By.tagName("a")) != null;  
  38.             }  
  39.         });  
  40.           
  41.         WebElement element = driver.findElement(By.id("treeDemo"));  
  42.         List<WebElement> elements = element.findElements(By.tagName("li"));  
  43.         // 显示生成的节点DOM 数量  
  44.         System.out.println("treeNode DOM length = " + elements.size());  
  45.     }  
  46.       
  47.     @AfterClass  
  48.     public static void destory() {  
  49.         System.out.println("destory...");  
  50.         //关闭浏览器  
  51.         driver.quit();  
  52.     }  
  53. }  
 

注意: 

如果在一个 java 文件中的 @Test 比较多,那么需要注意 @Before / @After 和 @BeforeClass / @AfterClass 是不一样的,前者是每一个 @Test 执行前后都会运行;后者只执行一次(详细请参考 jUnit 的文档)。 


【2. 执行 js】 


想测试 zTree ,那么大量的测试工作都是要依靠 js 的,所以让 Selenium 与 js 通信是至关重要的,查一下文档,建立起来简单的通信是不难的。 


Java代码   收藏代码
  1. ((JavascriptExecutor)driver).executeScript("var a = 0;");  
 

只要在这里面把需要执行的 js 写好就可以了,不过问题也就来了:


1、executeScript 执行 js 时应该是一个闭包的环境,所以这里面 var 定义的变量是局部变量,不可能是全局对象,使用此变量的方法都要在这一个 executeScript 里面写好全部代码。

 

2、一个 executeScript 只能 返回一个Object,如果你要做同一个测试,返回一个 JSON 对象中的多个值,难道要同一段代码复制好几遍吗? 这样当然不是个好的解决方案,所以我们可以利用 window 实现全局变量,这样可以将一个复杂的 executeScript 分解为多个简单的 executeScript 了。 

 

3、executeScript 的返回值是 Object,在 API 中有详细的描述 Object 与 js 值的对应关系,但注意可是不能直接返回 JSON 对象的。


js 返回 HTML element, Object 可以转换为一个 WebElement 

js 返回 decimal,Object 可以转换为一个 Double 

js 返回 non-decimal number, Object 可以转换为一个 Long 

js 返回 boolean, Object 可以转换为一个 Boolean 

js 返回 其他对象, Object 可以转换为一个 String 

js 返回 array, Object 可以转换为一个 List<Object>. 

js 没有返回值 或 返回 null, executeScript 的返回值就是 null 


详细情况建议大家直接参阅 API 文档 


Java代码   收藏代码
  1. package lesson2;  
  2.   
  3. import org.junit.AfterClass;  
  4. import org.junit.BeforeClass;  
  5. import org.junit.Test;  
  6. import org.openqa.selenium.By;  
  7. import org.openqa.selenium.JavascriptExecutor;  
  8. import org.openqa.selenium.WebDriver;  
  9. import org.openqa.selenium.WebElement;  
  10. import org.openqa.selenium.firefox.FirefoxDriver;  
  11. import org.openqa.selenium.support.ui.ExpectedCondition;  
  12. import org.openqa.selenium.support.ui.WebDriverWait;  
  13.   
  14. public class ExampleJs  {  
  15.       
  16.     static WebDriver driver;  
  17.       
  18.     @BeforeClass  
  19.     public static void init() {  
  20.         System.out.println("init...");  
  21.         // 如果你的 FireFox 没有安装在默认目录,那么必须在程序中设置  
  22.         System.setProperty("webdriver.firefox.bin""D:\\Program Files\\Mozilla Firefox\\firefox.exe");  
  23.         // 创建一个 FireFox 的浏览器实例  
  24.         driver = new FirefoxDriver();  
  25.     }  
  26.       
  27.     @Test  
  28.     public void test() {  
  29.         // 让浏览器访问 zTree Demo  
  30.         driver.get("http://www.ztree.me/v3/demo/cn/core/standardData.html");  
  31.           
  32.         // 等待 zTree 初始化完毕,Timeout 设置10秒  
  33.         (new WebDriverWait(driver, 10)).until(new ExpectedCondition<Boolean>() {  
  34.             public Boolean apply(WebDriver d) {  
  35.                 WebElement element = driver.findElement(By.id("treeDemo"));  
  36.                 return element.findElement(By.tagName("a")) != null;  
  37.             }  
  38.         });  
  39.           
  40.         System.out.println("start...javascript");  
  41.   
  42. //      String name =(String) ((JavascriptExecutor)driver).executeScript("return $.fn.zTree.getZTreeObj('treeDemo').getNodes()[0].name;");  
  43. //      Long rootCount = (Long) ((JavascriptExecutor)driver).executeScript("return $.fn.zTree.getZTreeObj('treeDemo').getNodes().length;");  
  44.           
  45.         //直接 var 定义得到的对象并不是全局对象,这么执行会出错的  
  46. //      ((JavascriptExecutor)driver).executeScript("var zTreeObj = $.fn.zTree.getZTreeObj('treeDemo');");  
  47. //      String name =(String) ((JavascriptExecutor)driver).executeScript("return zTreeObj.getNodes()[0].name;");  
  48. //      Long rootCount = (Long) ((JavascriptExecutor)driver).executeScript("return zTreeObj.getNodes().length;");  
  49.   
  50.         //利用 window 实现全局对象  
  51.         ((JavascriptExecutor)driver).executeScript("window.zTreeObj = $.fn.zTree.getZTreeObj('treeDemo');");  
  52.         String name =(String) ((JavascriptExecutor)driver).executeScript("return window.zTreeObj.getNodes()[0].name;");  
  53.         Long rootCount = (Long) ((JavascriptExecutor)driver).executeScript("return window.zTreeObj.getNodes().length;");  
  54.           
  55.         // 显示js 的结果  
  56.         System.out.println("treeObj[0].name = " + name);  
  57.         System.out.println("root nodes count = " + rootCount);  
  58.     }  
  59.       
  60.     @AfterClass  
  61.     public static void destory() {  
  62.         System.out.println("destory...");  
  63.         //关闭浏览器  
  64.         driver.quit();  
  65.     }  
  66. }  
 

附录: 

Selenium 的 java API文档: http://selenium.googlecode.com/svn/trunk/docs/api/java/index.html?index-all.html 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值