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

       279

       0


    【慎用 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、测试代码 
    package lesson3;
    
    import java.util.List;
    
    import org.junit.AfterClass;
    import org.junit.BeforeClass;
    import org.junit.Test;
    import org.openqa.selenium.By;
    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/standardData.html");
        
        	// 等待 zTree 初始化完毕,Timeout 设置10秒
        	try {
        		(new WebDriverWait(driver, 5, 500)).until(new ExpectedCondition<Boolean>() {
        			public Boolean apply(WebDriver d) {
        				//findElement 会导致程序锁死
    //    				WebElement element = driver.findElement(By.id("treeDemo111"));
    //    				return element != null;
        
        				WebElement element = (WebElement) ((JavascriptExecutor)driver).executeScript("return $('#treeDemo111');");
        				return element != null;
        			}
        		});
        
        	} catch(Exception e) {
        		e.printStackTrace();
        	}
        
        	try {
        		//findElement 会导致程序锁死
    //    		WebElement element = driver.findElement(By.id("treeDemo111"));
        
        		List<WebElement> elementList =(List<WebElement>) driver.findElements(By.id("treeDemo111"));
        		System.out.println(elementList.size());
        
        	} catch(Exception e) {
        		e.printStackTrace();
        	}
        
        	try {
        		//findElement 会导致程序锁死
    //    		WebElement element = driver.findElement(By.id("treeDemo111"));
        
        		WebElement element = (WebElement) ((JavascriptExecutor)driver).executeScript("return $('#treeDemo111');");
        
        	} catch(Exception e) {
        		e.printStackTrace();
        	}
        
        }
        
        @AfterClass
        public static void destory() {
        	System.out.println("destory...");
        	//关闭浏览器
        	driver.quit();
        }
    }
    
    

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

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

    Selenium
    历史版本

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

    睿恒知识库-V3.2.0