Web UI自動化時们颜,很多地方需要判斷當(dāng)前頁面中元素是否存在吕朵,如果存在就返回true猎醇,不存在就返回false.
public boolean isElementExist(String xpath){
int i = driver.findElements(By.xpath(xpath)).size();
return i==0?false:true;
}
當(dāng)測試用例比較多時,上述方法被頻繁調(diào)用努溃,當(dāng)當(dāng)前頁面中不存在要查找的元素時硫嘶,Webdriver會默認(rèn)等待20s,頻繁出現(xiàn)元素找不到的情況梧税,自動化執(zhí)行時長就會不斷不拉長沦疾,本來可以5個小時執(zhí)行完的用例,結(jié)果需要20多小時第队,如果網(wǎng)速不快時哮塞,甚至需要更長的時間。這并不是UI自動化想要的結(jié)果凳谦。那么如何解決這個問題呢忆畅?
上述提到Webdriver找不到元素時,會默認(rèn)等待20s尸执,這里的20s在哪里設(shè)置的呢家凯?
熟悉 Webdriver源碼的都知道,在啟動瀏覽器之前如失,需要加載對應(yīng)瀏覽器的driver绊诲。
public class LoadChrome {
public static void main(String[] args) {
// 設(shè)置谷歌瀏覽器引擎位置
System.setProperty("webdriver.chrome.driver", "./Tools/chromedriver.exe");
// 初始化一個谷歌瀏覽器驅(qū)動
WebDriver driver = new ChromeDriver();
driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);
// 使用get方法打開一個網(wǎng)站
driver.get("https://www.baidu.com");
// 獲取當(dāng)前網(wǎng)頁的title
System.out.println("當(dāng)前網(wǎng)頁的title:" + driver.getTitle());
System.out.println(driver.getCurrentUrl());
// 關(guān)閉瀏覽器
driver.quit();
}
}
其中 driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS); 設(shè)置了全局的等待時間,即:所有WebDriver執(zhí)行所有命令的超時時間都為20s褪贵。所以當(dāng)上面isElementExist方法找不到元素時掂之,就會繼續(xù)等待20s確定后才拋出異常。這樣就大大拉長了整個自動化測試執(zhí)行的時間脆丁。這個設(shè)置是全局的世舰,為隱式等待。
隱式等待比強(qiáng)制等待智能偎快,因為在整個自動化測試的腳本中看不到隱式等待的語句冯乘。但它會在每個頁面加載的時候自動等待;隱式等待只需要聲明一次晒夹,一般在打開瀏覽器后進(jìn)行聲明裆馒。聲明之后對整個WebDriver的實例的生命周期都有效,后續(xù)無需重復(fù)聲明丐怯。如果不設(shè)置全局元素超時時間喷好,默認(rèn)超時時間為0 。
隱式等待使用implicitlyWait方法读跷,來等待頁面加載完成梗搅,implicitlyWait(10),超時時間10s,10秒內(nèi)一旦加載完成无切,就執(zhí)行下一條語句荡短;如果10秒內(nèi)頁面都沒有加載完,就超時拋出異常哆键。
那么掘托,當(dāng)隱式等待設(shè)置為20s,自動化測試中想要快速判斷頁面中是否存在某個元素籍嘹,又要整個自動化測試執(zhí)行時間正常時闪盔,該如何處理呢?
這里只需要在isElementExist方法中重新設(shè)置一下隱式等待的超時時間辱士,待獲取頁面中是否存在要判斷的元素后泪掀,再恢復(fù)隱式等待的超時時間設(shè)置即可。
public boolean isElementExist(String xpath){
driver.manage().timeouts().implicitlyWait(2,TimeUnit.SECONDS);
int i = driver.findElements(By.xpath(xpath)).size();
driver.manage().timeouts().implicitlyWait(20,TimeUnit.SECONDS);
return i==0?false:true;
}