Selenium webdriver Java 封裝與重用

微微微笑發表於2015-07-11

目的

1. 簡化呼叫

WebDriver對頁面的操作,需要找到一個WebElement,然後再對其進行操作,比較繁瑣:

WebElement element =driver.findElement(By.name("q")); 
element.sendKeys("Cheese!"); 

 我們可以考慮對這些基本的操作進行一個封裝,簡化操作。比如,封裝程式碼:

protected void sendKeys(By by, String value){ 
driver.findElement(by).sendKeys(value); 
} 

 那麼,在測試用例可以這樣呼叫:

sendKeys(By.name("q"),”Cheese!”);

2. 新增異常捕獲或等待

對於一些常用的操作,比如查詢元素,我們可以在查詢元素前面新增一個顯性等待,然後再是查詢元素。

protected void findEle(By by){ 
new WebDriverWait(driver,10).until(    ExpectedConditions.presenceOfElementLocated(by));
return driver.findElement(by); 
} 

樣例

封裝之後,我們可以把這些封裝函式放到公共模組,方便呼叫。

更普遍的方式是作為BasePage的方法,在POM方式中,其他所有Page都繼承自 BasePage,這樣所有的Page都可以直接呼叫這些方法。

比如下面的簡單的 BasePage :

import java.util.List;  
import java.util.NoSuchElementException;  
import java.util.concurrent.TimeUnit;  
import org.openqa.selenium.By;  
import org.openqa.selenium.WebElement;  
import org.openqa.selenium.remote.RemoteWebDriver;  
import org.openqa.selenium.support.ui.WebDriverWait;  
  
public class BasePage{  
   protected RemoteWebDriver driver;  
   protected WebDriverWait driverWait;  
   private int WAIT_ELEMENT_TO_LOAD=10;  
  
    protected boolean isWebElementExist(By selector) {   
       try {   
           driver.findElement(selector);  
           return true;   
       } catch(NoSuchElementException e) {   
           return false;   
       }   
    }  
      
    protected String getWebText(By by) {   
       try {   
       return driver.findElement(by).getText();  
       } catch (NoSuchElementException e) {   
           return "Text not existed!";   
       }   
    }  
      
    protected void clickElementContainingText(By by, String text){  
       List<WebElement>elementList = driver.findElements(by);  
       for(WebElement e:elementList){  
           if(e.getText().contains(text)){  
               e.click();  
               break;  
           }  
       }       
    }  
      
    protected String getLinkUrlContainingText(By by, String text){  
       List<WebElement>subscribeButton = driver.findElements(by);  
       String url = null;  
       for(WebElement e:subscribeButton){  
           if(e.getText().contains(text)){  
               url =e.getAttribute("href");  
               break;  
           }  
       }  
       return url;  
    }  
  
    protected void click(By by){  
       driver.findElement(by).click();  
       driver.manage().timeouts().implicitlyWait(WAIT_ELEMENT_TO_LOAD,TimeUnit.SECONDS);  
    }  
   
    protected String getLinkUrl(By by){  
       return driver.findElement(by).getAttribute("href");  
    }  
  
    protected void sendKeys(By by, String value){  
       driver.findElement(by).sendKeys(value);  
    }  
}

相關文章