Selenium常用的三種等待方式
在做自動化測試,設計測試用例的時候,有時下一步的操作會依賴上一步的結果或者內容,上一步操作成功之後才能進行下一步操作等,這時候,我們就需要使用等待,來判斷上一步操作是否完成,什麽時候可以進行下一步操作。
如果說上一步操作如果花費的時間較長,還沒有完成,就去進行下一步操作,這時就會產生無法定位到對象,對象狀態不正確,數據校驗結果不正確等異常情況。
最後總結:等待可以提高UI自動化代碼的穩定性,讓代碼能夠
固定等待
固定等待是腳本中比較常見的一種等待方式,它是利用線程的原理將整個線程後面的代碼延遲執行。這種等待可以說比較的霸道,屬於強制性等待,目前它是使用最簡單的一種辦法,強制讓瀏覽器等待X秒,不管當前操作是否完成,是否可以進行下一步操作,都必須等X秒的時間。
優點:使用簡單,可以在調試時使用。
import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; public class sleep { public static void main(String[] args) throws InterruptedException { // TODO Auto-generated method stub String chromePath=System.getProperty("user.dir") +"\\driver\\chromedriver.exe"; System.setProperty("webdriver.chrome.driver", chromePath); WebDriver driver=new ChromeDriver(); driver.manage().window().maximize(); driver.get("https://www.baidu.com"); /* * 強制等待5秒 */ Thread.sleep(5000); driver.get("https://www.jd.com"); } }
註意:Thread.sleep(int);方法是以毫秒為計量單位的;
隱藏式等待
隱藏式等待是指設置了一個最長等待時間,如果在規定時間內網頁加載完成,則執行下一步,否則一直等到時間結束,然後執行下一步操作。
缺點:使用隱式等待,程序會一直等待整個頁面加載完成,才會執行下一步操作;但有時候頁面想要的對象早已經加載完成了,但是因為網頁上個別對象還沒有加載完成,仍要等到頁面全部完成才能執行下一步,使用也不是很靈活。
優點:隱性等待對整個driver的周期都起作用,所以只要設置一次即可。
方法:driver.manage().timeouts().implicitlyWait(int, TimeUnit.SECONDS);
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
public class hiedWait {
public static void main(String[] args) {
// TODO Auto-generated method stub
String chromePath=System.getProperty("user.dir")
+"\\driver\\chromedriver.exe";
System.setProperty("webdriver.chrome.driver", chromePath);
WebDriver driver=new ChromeDriver();
driver.manage().window().maximize();
driver.get("https://www.baidu.com");
/*
* 隱藏式等待5秒
*/
driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
}
}
顯式等待
配合until或者until_not方法,再輔助以一些判斷條件,就可以構成這樣一個場景:每經過多少秒就查看一次locator的對象是否可見,如果可見就停止等待,如果不可見就繼續等待直到超過規定的時間後,報超時異常;當然也可以判斷某對象是否在規定時間內不可見等等的各種場景吧,需要根據你自己實際的場景選擇判斷條件;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.ExpectedCondition;
import org.openqa.selenium.support.ui.WebDriverWait;
public class showWait {
public static void main(String[] args) {
// TODO Auto-generated method stub
String chromePath=System.getProperty("user.dir")
+"\\driver\\chromedriver.exe";
System.setProperty("webdriver.chrome.driver", chromePath);
WebDriver driver=new ChromeDriver();
driver.manage().window().maximize();
driver.get("https://www.baidu.com");
WebDriverWait wait=new WebDriverWait(driver, 10);
/*
* 通過WebDriverWait對象實現,每500毫秒掃描界面是否出現“新聞”對象,未發現的話等待10秒(計算從開始掃描到結束時間)
*/
WebElement wl = wait.until(new ExpectedCondition<WebElement>() {
public WebElement apply(WebDriver d) {
return d.findElement(By.linkText("新聞"));
}
});
}
}
Selenium常用的三種等待方式