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

【慎用 findElement】 

 

今天本打算研究一下 异步加载的延迟测试,结果一不留神发现了 findElement 的问题。

不敢说这是个Bug,不排除是自己学艺不精,暂且把问题抛出来,希望大家能给些意见。

 

1、问题描述:

使用 FireFoxDriver ,用 findElement 去查找页面上不存在的元素时,会导致程序死在 findElement 上,停滞不前,不会继续执行后面的代码

即使在 WebDriverWait 的 until 内使用也会导致锁死,而且 until 内的代码只会执行一次, timeout 完全失效

此问题在 IE、Chrome 上不会出现,会正常报错

换成 findElements 后可以正常工作

换成 用 js 方法获取对象 可以正常工作

 

2、问题跟踪

经过对源码的跟踪,发现是在 org.openqa.selenium.remote.HttpCommandExecutor 的 private HttpResponse fallBackExecute 方法内 执行 return client.execute(targetHost, httpMethod, context); 后就停滞了...

无任何异常抛出

 

3、测试代码

 

 

Java代码   收藏代码
  1. package lesson3;  
  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.JavascriptExecutor;  
  10. import org.openqa.selenium.WebDriver;  
  11. import org.openqa.selenium.WebElement;  
  12. import org.openqa.selenium.firefox.FirefoxDriver;  
  13. import org.openqa.selenium.support.ui.ExpectedCondition;  
  14. import org.openqa.selenium.support.ui.WebDriverWait;  
  15.   
  16. public class ExampleForAjax  {  
  17.       
  18.     static WebDriver driver;  
  19.       
  20.     @BeforeClass  
  21.     public static void init() {  
  22.         System.out.println("init...");  
  23.         // 如果你的 FireFox 没有安装在默认目录,那么必须在程序中设置  
  24.         System.setProperty("webdriver.firefox.bin""D:\\Program Files\\Mozilla Firefox\\firefox.exe");  
  25.         // 创建一个 FireFox 的浏览器实例  
  26.         driver = new FirefoxDriver();  
  27.     }  
  28.       
  29.     @Test  
  30.     public void test() {  
  31.         // 让浏览器访问 zTree Demo  
  32.         driver.get("http://www.ztree.me/v3/demo/cn/core/standardData.html");  
  33.           
  34.         // 等待 zTree 初始化完毕,Timeout 设置10秒  
  35.         try {  
  36.             (new WebDriverWait(driver, 5500)).until(new ExpectedCondition() {  
  37.                 public Boolean apply(WebDriver d) {  
  38.                     //findElement 会导致程序锁死  
  39. //                  WebElement element = driver.findElement(By.id("treeDemo111"));  
  40. //                  return element != null;  
  41.                       
  42.                     WebElement element = (WebElement) ((JavascriptExecutor)driver).executeScript("return $('#treeDemo111');");  
  43.                     return element != null;  
  44.                 }  
  45.             });  
  46.               
  47.         } catch(Exception e) {  
  48.             e.printStackTrace();  
  49.         }  
  50.           
  51.         try {  
  52.             //findElement 会导致程序锁死  
  53. //          WebElement element = driver.findElement(By.id("treeDemo111"));  
  54.               
  55.             List elementList =(List) driver.findElements(By.id("treeDemo111"));  
  56.             System.out.println(elementList.size());  
  57.               
  58.         } catch(Exception e) {  
  59.             e.printStackTrace();  
  60.         }  
  61.           
  62.         try {  
  63.             //findElement 会导致程序锁死  
  64. //          WebElement element = driver.findElement(By.id("treeDemo111"));  
  65.               
  66.             WebElement element = (WebElement) ((JavascriptExecutor)driver).executeScript("return $('#treeDemo111');");  
  67.               
  68.         } catch(Exception e) {  
  69.             e.printStackTrace();  
  70.         }             
  71.           
  72.     }  
  73.       
  74.     @AfterClass  
  75.     public static void destory() {  
  76.         System.out.println("destory...");  
  77.         //关闭浏览器  
  78.         driver.quit();  
  79.     }  
  80. }  
 

 

 

总之,目前感觉尽量慎用 findElement 这个方法;利用 findElements 或 js 方法来替换,以避免异常出现。

 

希望有这方面经验的朋友多交流一下。

你可能感兴趣的:(Java_Selenium,WebDriver_Tools)