目的
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);
}
}