之前写的QQ邮箱登录或者发送邮件都属于线性编程,就是在一个主文件中,把对元素的定位,对元素的操作,还有测试步骤都放到了一个文件中,这样看着太乱了。所以我们可以分层编写,比如:对定位的元素放到一个文件中,对元素的各种操作放到一个文件中,下面就用QQ邮箱登录为例看一下如何分层:
1.将元素放到数据层。我新建了一个包叫data,在他下面新建了一个java文件叫login.java,这里存放所有的元素定位
package data;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
public class login {
/*
* 切入到login_frame里
*/
public static void frame(WebDriver driver){
driver.switchTo().frame(driver.findElement(By.id("login_frame")));
}
/*
* 账号登录
*/
public static WebElement usernameBtn(WebDriver driver){
return driver.findElement(By.id("switcher_plogin"));
}
/*
* 用户名
*/
public static WebElement username(WebDriver driver){
return driver.findElement(By.id("u"));
}
/*
* 密码
*/
public static WebElement password(WebDriver driver){
return driver.findElement(By.id("p"));
}
/*
* 登录
*/
public static WebElement loginBtn(WebDriver driver){
return driver.findElement(By.id("login_button"));
}
}
2.将对元素的操作放在业务层。我新建了一个包service,在他下面新建了一个java文件叫function.java,然后将登录的时候对元素的操作放进去
package service;
import java.io.IOException;
import org.openqa.selenium.WebDriver;
import data.sendmail;
import data.login;
public class function {
/*
* 登录
*/
public static void logintest(WebDriver driver,String username,String password){
//进入frame
login.frame(driver);
//点击账号密码登录按钮
login.usernameBtn(driver).click();
//输入用户名
login.username(driver).sendKeys(username);
//输入密码
login.password(driver).sendKeys(password);
//点击登录按钮
login.loginBtn(driver).click();
}
}
3.还有一个包叫com,里面有个类叫Common,这个主要放一些通用的功能,比如我把对Excel的读取放到了Common里面:
public class Common {
/*
* 用map的方式取Excel行数据
*/
public static Map<Integer,ArrayList<String>> ExcelRow(String file,int sheetid) throws BiffException, IOException{
Map<Integer,ArrayList<String>> map = new HashMap<Integer,ArrayList<String>>();
ArrayList list = null;
Workbook book = Workbook.getWorkbook(new File(file));
Sheet sheet = book.getSheet(sheetid);
int rows = sheet.getRows();
int columns = sheet.getColumns();
for(int i=0;i<rows;i++){
list = new ArrayList();
for(int j=0;j<columns;j++){
list.add(sheet.getCell(j, i).getContents());
}
map.put(i, list);
}
return map;
}
/*
* 用map的方式取Excel列数据
*/
public static Map<Integer,ArrayList<String>> ExcelColumn(String file,int sheetid) throws BiffException, IOException{
Map<Integer,ArrayList<String>> map = new HashMap<Integer,ArrayList<String>>();
ArrayList list = null;
Workbook book = Workbook.getWorkbook(new File(file));
Sheet sheet = book.getSheet(sheetid);
int rows = sheet.getRows();
int columns = sheet.getColumns();
for(int i=0;i<columns;i++){
list = new ArrayList();
for(int j=0;j<rows;j++){
list.add(sheet.getCell(i, j).getContents());
}
map.put(i, list);
}
return map;
}
}
4.在主函数中执行对浏览器的操作和登录功能,并将登录的用户名密码数据放在Excel中,直接读取Excel的数据,这样做到代码里面不出现数据,类似参数化
public class test006 {
public static void main(String[] args) throws InterruptedException, IOException, BiffException {
// TODO Auto-generated method stub
String f = "D:\\1.xls";
Map<Integer,ArrayList<String>> loginmap = new HashMap<Integer,ArrayList<String>>();
loginmap = Common.ExcelColumn(f,0);
Map<Integer,ArrayList<String>> sendmap = new HashMap<Integer,ArrayList<String>>();
sendmap = Common.ExcelColumn(f,1);
System.setProperty("webdriver.chrome.driver","C:\\Program Files (x86)\\Google\\Chrome\\Application\\chromedriver.exe");
WebDriver driver = new ChromeDriver();
driver.get("https://mail.qq.com/cgi-bin/loginpage");
Thread.sleep(3000);
function.logintest(driver, loginmap.get(1).get(0), loginmap.get(1).get(1));
}
}