和我一塊兒學 Selenium WebDriver(3)——基礎篇

【慎用 findElement】 

今天本打算研究一下 異步加載的延遲測試,結果一不留神發現了 findElement 的問題。
不敢說這是個Bug,不排除是本身學藝不精,暫且把問題拋出來,但願你們能給些意見。

一、問題描述:
使用 FireFoxDriver ,用 findElement 去查找頁面上不存在的元素時,會致使程序死在 findElement 上,停滯不前,不會繼續執行後面的代碼
即便在 WebDriverWait 的 until 內使用也會致使鎖死,並且 until 內的代碼只會執行一次, timeout 徹底失效
此問題在 IE、Chrome 上不會出現,會正常報錯
換成 findElements 後能夠正常工做
換成 用 js 方法獲取對象 能夠正常工做

二、問題跟蹤
通過對源碼的跟蹤,發現是在 org.openqa.selenium.remote.HttpCommandExecutor 的 private HttpResponse fallBackExecute 方法內 執行 return client.execute(targetHost, httpMethod, context); 後就停滯了...
無任何異常拋出

三、測試代碼
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 方法來替換,以免異常出現。 但願有這方面經驗的朋友多交流一下。
相關文章
相關標籤/搜索