Selenium三种等待元素的方式及代码,需要特别注意implicitlyWait的用法

一、显式等待

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     }
只要路是对的,就不怕路远
原文地址:https://www.cnblogs.com/klmei/p/7065592.html