自動化測試中經(jīng)常出現(xiàn)"找不到頁面元素"的問題墓赴。主要原因有三:
1.沒有switch到元素所在的iframe中
2.頁面加載未完成屯断,等待時間不夠
3.locate語句錯誤
本文章主要探討顯式等待和隱式等待:
一. 顯式等待
/** 顯式等待:針對某個特定元素設(shè)置等待時間解孙, 在規(guī)定時間內(nèi)沒有找到該元素回还,會拋出異常拼窥。如果在規(guī)定時間內(nèi)找到元素戏蔑,直接執(zhí)行相關(guān)操作
* 1. 等待的方法多,都是ExpectedConditions類中的自帶方法闯团,可以進(jìn)行不同的等待判斷辛臊;
* 2.等待靈活,等設(shè)置顯示等待10秒房交,而在第5秒元素出現(xiàn)了彻舰,那么就會立即向下執(zhí)行,而不會繼續(xù)等待;只有超過了10秒刃唤,才拋出NoSuchElementException異常隔心;可以節(jié)約測試執(zhí)行的時間
* ExpectedConditions類自帶的等待方法(判斷元素在頁面中是否存在:presenceOfElementLocated(By locator))
*/
代碼:
// 每隔1秒去調(diào)用一下until中的函數(shù),默認(rèn)是0.5秒尚胞,如果等待10秒還沒有找到元素 硬霍。則拋出異常。WebDriverWait wait = new WebDriverWait(driver, 10, 1);
// 1.顯示等待:標(biāo)題是否出現(xiàn):
try {
wait.until(ExpectedConditions.titleContains("百度一下笼裳,你就知道"));
System.out.println("百度首頁的標(biāo)題出現(xiàn)了:百度一下唯卖,你就知道");
} catch (NoSuchElementException e) {
e.printStackTrace();System.out.println("百度首頁的標(biāo)題沒有找到");
}
// 2.顯示等待:搜索框是否出現(xiàn)-------最常用的顯示等待;
try {
wait.until(ExpectedConditions.presenceOfElementLocated(By.id("su")));
System.out.println("百度首頁的搜索輸入框出現(xiàn)了");
} catch (NoSuchElementException e) {?
// 如果標(biāo)題沒有找到躬柬,則拋出NoSuchElementException異常拜轨。e.printStackTrace();System.out.println("百度首頁的輸入框沒有找到");
}
// 3.顯示等待:頁面搜索按鈕是否可以被點(diǎn)擊;
try {
wait.until(ExpectedConditions.elementToBeClickable(By.id("kw")));
System.out.println("百度首頁的搜索按鈕可以被點(diǎn)擊");
} catch (NoSuchElementException e) {?
// 如果標(biāo)題沒有找到允青,則拋出NoSuchElementException異常橄碾。e.printStackTrace();System.out.println("百度首頁的搜索按鈕找不到");
}
/* * 4.自定義顯示等待,在等待代碼中找到某個元素颠锉; */
WebElement textInputBox = (new WebDriverWait(driver, 10)).until(new ExpectedCondition() {
@Overridepublic WebElement apply(WebDriver driver){
return driver.findElement(By.xpath("http://*[@type='text']"));
}});textInputBox.sendKeys("自定義顯式等待1");
/* * 5.自定義顯示等待法牲,獲取頁面元素//a[text()='關(guān)于搜狗']的文本值 */
String text = (new WebDriverWait(driver, 10)).until(new ExpectedCondition() {
@Override
public String apply(WebDriver driver){
return driver.findElement(By.xpath("http://a[text()='關(guān)于搜狗']")).getText();
}
});
System.out.println(text); //打印文本值
二. 隱式等待
/**隱式等待是設(shè)置的全局等待,分為1琼掠、頁面加載超時等待 拒垃;2、頁面元素加載超時眉枕;3恶复、異步腳本超時
* 如果是頁面元素超時,設(shè)置等待時間速挑,是對頁面中的所有元素設(shè)置加載時間谤牡。隱式等待是其實(shí)可以理解成在規(guī)定的時間范圍內(nèi),瀏覽器在不停的刷新頁面姥宝,直到找到相關(guān)元素或者時間結(jié)束翅萤。
* 缺點(diǎn):如果我們在代碼中設(shè)定了隱式等待時間,當(dāng)使用driver.findElement(By.*)
* 方法去查找頁面元素的時候腊满,如果沒有第一時間找到元素套么,程序會等待下去。例如設(shè)置了隱式等待時間為10秒碳蛋,某個元素沒有一開始就出現(xiàn)胚泌,
* 而是在第5秒的時候 出現(xiàn)了,程序依然會等待10秒肃弟,然后才向下執(zhí)行玷室; 所以零蓉,推薦使用顯示等待。
**/
代碼:
try {
// 頁面加載超時時間設(shè)置為5s
driver.manage().timeouts().pageLoadTimeout(5, TimeUnit.SECONDS);
driver.get("https://www.baidu.com/");
// 定位對象時給10s 的時間, 如果10s 內(nèi)還定位不到則拋出異常
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);// 使用implicitlyWait方法,設(shè)定查找元素的等待時間穷缤;
driver.findElement(By.id("kw")).sendKeys("隱式等待");
// 異步腳本的超時時間設(shè)置成3s
driver.manage().timeouts().setScriptTimeout(3, TimeUnit.SECONDS);
} catch (Exception e) {
}
三敌蜂、強(qiáng)制線程等待
/**
* 線程等待是java語言中的線程類Thread類中的sleep()方法。此等待是很死板的津肛,需要等待時間結(jié)束才會執(zhí)行相關(guān)代碼章喉。
* 該方法需要拋出InterruptedException 異常。一般不建議使用身坐,但是在彈窗處理秸脱,可以優(yōu)先選擇線程等待
*/
代碼:
Thread.sleep(2000);//強(qiáng)制線程等待2s
//整理自其他博客