一、顯式等待
1、顯式等待:
就是明確的要等到某個元素的出現或者是某個元素的可點擊等條件,等不到,就一直等,除非在規定的時間之內都沒找到,那么就跳出Exception.
2、代碼:
new WebDriverWait(driver, 15).until(ExpectedConditions.presenceOfElementLocated(By.xpath(""))); //元素的xpath路徑
注:這里的15是指要等待的秒數.如果沒有滿足until()方法中的條件,就會始終在這里wait 15秒,依然找不到,就拋出異常.
3、如果想對加載JS的代碼做出判斷,可以用以下方法:
Wait wait=new Wait() { //selenium自帶
@Override
public boolean until() {
// TODO Auto-generated method stub
return webElement.isDisplayed();
}
};
二、隱式等待
1、隱式等待:
相當於設置全局的等待,在定位元素時,對所有元素設置超時時間。
隱式等待使得WebDriver在查找一個Element或者Element數組時,如果一直查找不到,每隔一段特定的時間就會輪詢一次DOM。
注:默認設置超時時間為0,一旦設置,這個隱式等待會在WebDriver對象實例的整個生命周期起作用。
2、代碼:
driver.manage().timeouts().implicitlyWait(1, TimeUnit.SECONDS); //1指等待1秒
三、線程休眠
Thread.sleep(1000); //1000指1000ms
四、實用的等待方法封裝代碼
1 public void waitForAllElementLoad(String type, String locator, int num,long timeout) { 2 try { 3 Thread.sleep(500);// 等待1秒,以便觀察 4 } catch (InterruptedException e1) { 5 // TODO Auto-generated catch block 6 System.out.println(e1.getMessage()); 7 } 8 for (int second = 0;; second++) { 9 try { 10 if (second >= timeout) { 11 break; 12 } 13 if (isElementPresent(type, locator, num)) { 14 break; 15 } 16 Thread.sleep(500); 17 } catch (InterruptedException e) { 18 19 } 20 } 21 }
1 public boolean isElementPresent(String elementType,String expression,int num) { 2 if(elementType.equals("className")){ 3 //驗證該元素是否在頁面上顯示 --isDisplayed() 4 try { if (getElementsBy(elementType,expression).get(num).isDisplayed()) { 5 return true; 6 } else { 7 return false; 8 } 9 } catch (Exception e) { 10 return false; 11 } 12 }else{ 13 try { if (getElementBy(elementType,expression).isDisplayed()) { 14 return true; 15 } else { 16 return false; 17 } 18 } catch (NoSuchElementException e) { 19 return false; 20 } 21 } 22 }
1 //定位UI元素 2 public WebElement getElementBy(String elementType,String expression){ 3 switch (elementType) { 4 case "xpath": 5 WebElement xpathelement = driver.findElement(By.xpath(expression)); 6 return xpathelement; 7 case "id": 8 WebElement idelement = driver.findElement(By.id(expression)); 9 return idelement; 10 case "className": 11 WebElement classNameelement = driver.findElement(By.className(expression)); 12 return classNameelement; 13 case "linktext": 14 WebElement linktextelement = driver.findElement(By.linkText(expression)); 15 return linktextelement; 16 case "name": 17 WebElement nameelement = driver.findElement(By.name(expression)); 18 return nameelement; 19 case "partialLinkText": 20 WebElement partialLinkTextelement = driver.findElement(By.partialLinkText(expression)); 21 return partialLinkTextelement; 22 case "cssSelector": 23 WebElement cssSelectorelement = driver.findElement(By.cssSelector(expression)); 24 return cssSelectorelement; 25 default: 26 WebElement element = driver.findElement(By.xpath(expression)); 27 return element; 28 29 } 30 }