Java+selenium之WebDriver的常用方法封装(八)

时间:2022-06-18 06:12:24

总结:WEB UI自动化测试一般采用 POP(面向页面编程),自动化测试框架分三层,有时如果页面如果太多,不好管理,可以面向控件编程,即把控件当作页面,毕竟控件是有限的,所以封装页面的代码量会少很多,两种方式各有优劣。如果页面比较少的,建议可以全部封装为页面对象;如果页面比较多,而且跳转复杂,建议使用两者结合的方式,一级页面,二级页面封装,三级以上页面,就不需要封装,使用控件对象完成页面操作。利用封装好的页面对象/控件对象,再进一步完成业务关键字封装,比如登录,注册,添加商品,支付等等操作,这样有个好处就是需求变动,业务流程调整,或者添加流程等,只需要封装新的流程,重组用例,维护工作量会减少很多。这样的三层结构非常清晰,第一层页面对象封装层只需要关注维护页面元素对象,第二层业务封装层只需要关注产品的业务流程拆分,第三层用例层只需要关注用例的流程组合以及测试数据,具体架构参考下图:

Java+selenium之WebDriver的常用方法封装(八)

下面附上部分代码,有不对的地方请指正。

接口,定义基类页面的方法,可能不全,需要的可以继续补充

 import org.openqa.selenium.WebElement;

 interface BasePage {
WebElement findElement(String loc); void sendKeys(String loc, String var1); void click(String loc); void submit(String loc); void switchToFrame(String loc); void switchToParentFrame(); void closeAlert(); void acceptAlert(); String getAlertText(); void moveToElement(String loc); void doubleClick(String loc); void contextClick(String loc); void dragAndDrop(String source, String target); void closeBrowser(); String getTitle(); String getUrl(); void maxBrowser();
}

基类实现的抽象类,其他的页面继承该类再个性化实现即可:

 import com.uitest.control.by.LocationUtil;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.interactions.Actions; import java.util.concurrent.TimeUnit; public abstract class BasePageImpl implements BasePage {
protected final WebDriver driver;
private static final long timeOutInSeconds = 10; BasePageImpl(WebDriver driver, String url) {
this.driver = driver;
this.driver.manage().timeouts().implicitlyWait(timeOutInSeconds, TimeUnit.SECONDS);
this.driver.get(url);
} BasePageImpl(WebDriver driver) {
this.driver = driver;
this.driver.manage().timeouts().implicitlyWait(timeOutInSeconds, TimeUnit.SECONDS);
} public WebElement findElement(String loc) {
return driver.findElement(LocationUtil.getLocation(loc));
} public void sendKeys(String loc, String var1) {
findElement(loc).sendKeys(var1);
} public void click(String loc) {
findElement(loc).click();
} public void submit(String loc) {
findElement(loc).submit();
} public void switchToFrame(String loc) {
driver.switchTo().frame(findElement(loc));
} public void switchToParentFrame() {
driver.switchTo().parentFrame();
} public void closeAlert() {
driver.switchTo().alert().dismiss();
} public void acceptAlert() {
driver.switchTo().alert().accept();
} public String getAlertText() {
return driver.switchTo().alert().getText();
} public void moveToElement(String loc) {
new Actions(driver).moveToElement(findElement(loc)).perform();
} public void doubleClick(String loc) {
new Actions(driver).doubleClick(findElement(loc)).perform();
} public void contextClick(String loc) {
new Actions(driver).contextClick(findElement(loc)).perform();
} public void dragAndDrop(String source, String target) {
new Actions(driver).dragAndDrop(findElement(source), findElement(target)).perform();
} public void closeBrowser() {
driver.close();
} public String getTitle() {
return driver.getTitle();
} public String getUrl() {
return driver.getCurrentUrl();
} public void maxBrowser() {
driver.manage().window().maximize();
}
}

工具类:

 import org.openqa.selenium.By;

 import java.util.Arrays;
import java.util.List; public class LocationUtil {
/**
* 定位信息,比如id=kw
* @param var 格式xpath=//*[@id="kw"]
* @return org.openqa.selenium.By
*/
public static By getLocation (String var) {
List list = Arrays.asList(var.split("=", 2));
if (list.size() < 2 || "".equals(list.get(1))) {
return null;
}
String loc = String.valueOf(list.get(1));
switch (ByType.valueOf(list.get(0).toString().toUpperCase())) {
case ID:
return By.id(loc);
case NAME:
return By.name(loc);
case XPATH:
return By.xpath(loc);
case CSS:
return By.cssSelector(loc);
case TAG:
return By.tagName(loc);
case CLASS:
return By.className(loc);
case LINKTEXT:
return By.linkText(loc);
case PARTIALLINKTEXT:
return By.partialLinkText(loc);
default:
return null;
}
}
}