自動化測試中,等待時間的運用佔據了舉足輕重的地位,日常咱們須要處理不少和時間息息相關的場景,例如:java
打開新頁面,只要特定元素出現而不用等待頁面所有加載完成就對其進行操做web
設置等待某元素出現的時間,超時則拋出異常chrome
設置頁面加載的時間app
…..異步
webdriver類中有三個和時間相關的方法:
1.pageLoadTimeout 設置頁面徹底加載async
2.setScriptTimeout 設置異步腳本的超時時間
測試
3.implicitlyWait 識別對象的超時時間網站
咱們就從這裏開始,慢慢揭開他神祕的面紗。ui
pageLoadTimeout方法用來設置頁面徹底加載的超時時間,徹底加載即頁面所有渲染,異步同步腳本都執行完成。前面的文章都是使用get 方法登陸安居客網站,你們應該能感受到每次打開網頁後要等很長一段時間纔會進行下一步的操做,那是由於沒有設置超時時間而get方法默認是等待頁面所有加 載完成纔會進入下一步驟,加入將超時時間設置爲3S就會中斷操做拋出異常。spa
import java.util.concurrent.TimeUnit; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.WebElement; public class NewTest{ public static void main(String[] args) throws InterruptedException { System.setProperty ( "webdriver.chrome.driver" , "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chromedriver.exe" ); WebDriver driver = new ChromeDriver(); try{ //設置超時時間爲3S driver.manage().timeouts().pageLoadTimeout(3, TimeUnit.SECONDS); driver.get("http://shanghai.anjuke.com"); WebElement input=driver.findElement(By.xpath("//input[@id='glb_search0']")); input.sendKeys("selenium"); }catch(Exception e){ e.printStackTrace(); }finally{ Thread.sleep(3000); driver.quit(); } }
ps:若是時間參數爲負數,效果沒有使用這個方法是同樣的,接口註釋中有相關說明:」If the timeout is negative, page loads can be indefinite」.
若是想在拋出異常後並不中斷而是繼續執行下面的操做那該怎麼辦呢?可使用try,catch的組合來實現這個功能
import java.util.concurrent.TimeUnit; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.WebElement; public class NewTest{ public static void main(String[] args) throws InterruptedException { System.setProperty ( "webdriver.chrome.driver" , "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chromedriver.exe" ); WebDriver driver = new ChromeDriver(); try{ //設置超時時間爲3S driver.manage().timeouts().pageLoadTimeout(3, TimeUnit.SECONDS); driver.get("http://shanghai.anjuke.com"); }catch(Exception e){ }finally{ WebElement input=driver.findElement(By.xpath("//input[@id='glb_search0']")); if(input.isDisplayed()) input.sendKeys("selenium"); } }
這樣,當頁面加載3S後就會執行下面的操做了。
設置異步腳本的超時時間,用法同pageLoadTimeout同樣就再也不寫了,異步腳本也就是有async屬性的JS腳本,能夠在頁面解析的同時執行。
識別對象的超時時間,若是在設置的時間類沒有找到就拋出一個NoSuchElement異常,用法參數也是和pageLoadTimeout同樣,你們能夠本身試驗試驗。
上文中介紹瞭如何才能在使用pageLoadTimeout拋出異常的同時繼續執行,可是現有的方法仍是不完美,若是輸入框在3S後沒有出現仍是會 報錯,怎麼辦呢?機智的同窗能夠想到用sleep方法來實現,爲了方便演示換個更明顯的需求來講明。安居客的首頁上有個切換城市的連接,當點擊城市的時候 就會顯示所有的城市以供選擇這時display屬性就會變化
import java.util.concurrent.TimeUnit; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.interactions.Actions; public class NewTest{ public static void main(String[] args) throws InterruptedException { System.setProperty ( "webdriver.chrome.driver" ,"C:\\Program Files(x86)\\Google\\Chrome\\Application\\chromedriver.exe" ); WebDriver driver = new ChromeDriver(); try{ //設置超時時間爲3S driver.manage().timeouts().pageLoadTimeout(3,TimeUnit.SECONDS); driver.get("http://shanghai.anjuke.com"); }catch(Exception e){ }finally{ WebElement city=driver.findElement(By.xpath("//a[@id='switch_apf_id_8']")); WebElement citys=driver.findElement(By.xpath("//div[@id='city-panel']")); Actions actions=new Actions(driver); actions.clickAndHold(city).perform(); while(citys.isDisplayed()){ System.out.println("sleep"); Thread.sleep(3000); } Thread.sleep(3000); driver.quit(); } }
import java.util.concurrent.TimeUnit; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.interactions.Actions; public class NewTest{ public static void main(String[] args) throws InterruptedException { System.setProperty ( "webdriver.chrome.driver" , "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chromedriver.exe" ); WebDriver driver = new ChromeDriver(); try{ //設置超時時間爲3S driver.manage().timeouts().pageLoadTimeout(3, TimeUnit.SECONDS); driver.get("http://shanghai.anjuke.com"); }catch(Exception e){ }finally{ WebElement city=driver.findElement(By.xpath("//a[@id='switch_apf_id_8']")); WebElement citys=driver.findElement(By.xpath("//div[@id='city-panel']")); Actions actions=new Actions(driver); actions.clickAndHold(city).perform(); while(citys.isDisplayed()){ System.out.println("sleep"); Thread.sleep(3000); } Thread.sleep(3000); driver.quit(); } }
執行後會每過3S就會輸出一次sleep,可是這樣的代碼顯然不夠高大上,並且沒有限制會一直無限的等待下去,下面介紹一種高大上的方法,就是until,先看代碼
import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.interactions.Actions; import org.openqa.selenium.support.ui.WebDriverWait; import org.openqa.selenium.support.ui.ExpectedCondition; public class NewTest{ public static void main(String[] args) throws InterruptedException { System.setProperty ( "webdriver.chrome.driver" , "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chromedriver.exe" ); WebDriver driver = new ChromeDriver(); try{ //設置超時時間爲3S driver.manage().timeouts().pageLoadTimeout(3, TimeUnit.SECONDS); driver.get("http://shanghai.anjuke.com"); }catch(Exception e){ }finally{ WebElement city=driver.findElement(By.xpath("//a[@id='switch_apf_id_8']")); Actions actions=new Actions(driver); actions.clickAndHold(city).perform(); //最多等待10S,每2S檢查一次 WebDriverWait wait=new WebDriverWait(driver,10,2000); wait.until(new ExpectedCondition<Boolean>() { public Boolean apply(WebDriver driver) { System.out.println("sleep"); return !driver.findElement(By.xpath("//div[@id='city-panel']")).isDisplayed(); } }); Thread.sleep(3000); driver.quit(); } }