【慎用 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 方法來替換,以免異常出現。 但願有這方面經驗的朋友多交流一下。