一、显式等待
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 }