selenium 执行 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 

你可能感兴趣的:(selenium)