一、框架目录结构

二、代码

  2.1page层代码

 package com.mianshui.page;

 import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy; public class LoginPage { //用户名输入框
@FindBy(className="dlemail")
private WebElement uName;
//密码输入框
@FindBy(className="dlpwd")
private WebElement pwd;
//登录按钮
@FindBy(id="dologin")
private WebElement loginButton;
//继续登录按钮
@FindBy(className="u-btn")
private WebElement continueLogin; //输入用户名
public void inputUsername(String userName){
System.out.println(userName);
uName.clear();
uName.sendKeys(userName); }
//输入密码
public void inputPwd(String passWord){
pwd.clear();
pwd.sendKeys(passWord);
}
//单击登录
public void clickLoginButton(String string){
loginButton.click();
}
//单击继续登录
public void continueLogin(String string){
continueLogin.click();
}
}

  2.2 case层

 package com.mianshui.testScript;

 import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.support.PageFactory;
import org.testng.Assert;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import com.mianshui.page.LoginPage;
import com.mianshui.page.MainPage;
import com.mianshui.util.ExcelUtil;
/*
* 定位语句和测试代码分离:封装在page类中
* 测试数据与测试代码分离:读取excel文件
*/
public class Login126Mail_PO {
public static WebDriver driver;
@Test
public static void login126Mail() throws Exception {
//定义用例路径
String excelPath= "D://MyJavaWorkSpace//TestProject//src//com//mianshui//data//126MailLoginCase.xlsx";
//读取用例sheet页
ExcelUtil.setExcelFile(excelPath, "login");
//打开浏览器
String BrowserName=ExcelUtil.getCellData(1, 4);
if (BrowserName.equalsIgnoreCase("firefox")) {
driver=new FirefoxDriver();
}else if (BrowserName.equalsIgnoreCase("chrome")) {
driver=new ChromeDriver();
} //输入网址
driver.get(ExcelUtil.getCellData(2, 4));
//切换frame
driver.switchTo().frame("x-URS-iframe"); //初始化page页面(注意:要放在打开浏览器之后)
LoginPage loginPage=PageFactory.initElements(driver, LoginPage.class);
MainPage mainPage=PageFactory.initElements(driver, MainPage.class);
//输入账户
loginPage.inputUsername(ExcelUtil.getCellData(3, 4));
//输入密码
loginPage.inputPwd(ExcelUtil.getCellData(4, 4));
//单击登录
loginPage.clickLoginButton(null);
//单击继续登录
Thread.sleep(3000);
loginPage.continueLogin(null);
//断言登录是否成功
Thread.sleep(2000);
Assert.assertEquals(mainPage.getEmailAdd(), ExcelUtil.getCellData(3, 4)+"@126.com");
} @BeforeMethod
public static void beforeMethod(){ } @AfterMethod
public static void afterMethod(){ }
}

  2.3 工具类(excel操作、截图、等待方法.....)

 package com.mianshui.util;

 import java.io.FileInputStream;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;; //此类事实现操作指定的excel文件中的指定sheet页、读取指定的单元格内容、获取sheet中最后一行的行号的功能
public class ExcelUtil { private static XSSFSheet ExcelWSheet;
private static XSSFWorkbook ExcelWBook;
private static XSSFCell Cell;
// 设定要操作的excel的文件路径和sheet名称
// 在读、写excel文件时,均需先调用此方法,设定要操作的excel文件路径和要操作的sheet名称
public static void setExcelFile(String Path,String SheetName){ FileInputStream ExcelFile; try {
//实例化excel文件的FileInputStream 对象
ExcelFile = new FileInputStream(Path); //实例化excel文件的 XSSFWorkbook 对象
ExcelWBook = new XSSFWorkbook(ExcelFile); //实例化 XSSFCell 对象,指定excel文件中的sheet名称,后续用于sheet中行、列和单元格的操作
ExcelWSheet = ExcelWBook.getSheet(SheetName); } catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//读取excel文件中指定的单元格的函数,此函数只支持扩展名为 .xlsx 的excel文件
public static String getCellData (int RowNum, int ColNum) throws Exception { try {
//通过函数参数指定的单元格的行号和列号,获取指定的单元格对象
Cell = ExcelWSheet.getRow(RowNum).getCell(ColNum);
//如果单元格的内容为字符串类型,则使用getStringCellValue方法来获取单元格内容
//如果单元格的内容为数字类型, 则使用getNumericCellValue方法来获取单元格内容 String CellData = Cell.getCellType() == XSSFCell.CELL_TYPE_STRING ? Cell.getStringCellValue() + "" : String.valueOf(Math.round(Cell.getNumericCellValue())); return CellData; }catch (Exception e){
e.printStackTrace();
//读取遇到异常,则返回空字符串
return "错了";
}
}
//获取excel文件的最后一行的行号
public static int getLastRowNum(){
//函数返回sheet的最后一行的行号
return ExcelWSheet.getLastRowNum();
} }

Excel操作

  2.4 data层

seleniumPO模式的更多相关文章

  1. 【原】谈谈对Objective-C中代理模式的误解

    [原]谈谈对Objective-C中代理模式的误解 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这篇文章主要是对代理模式和委托模式进行了对比,个人认为Objective ...

  2. 彻底理解AC多模式匹配算法

    (本文尤其适合遍览网上的讲解而仍百思不得姐的同学) 一.原理 AC自动机首先将模式组记录为Trie字典树的形式,以节点表示不同状态,边上标以字母表中的字符,表示状态的转移.根节点状态记为0状态,表示起 ...

  3. 制作类似ThinkPHP框架中的PATHINFO模式功能

    一.PATHINFO功能简述 搞PHP的都知道ThinkPHP是一个免费开源的轻量级PHP框架,虽说轻量但它的功能却很强大.这也是我接触学习的第一个框架.TP框架中的URL默认模式即是PathInfo ...

  4. MVVM模式解析和在WPF中的实现(六) 用依赖注入的方式配置ViewModel并注册消息

    MVVM模式解析和在WPF中的实现(六) 用依赖注入的方式配置ViewModel并注册消息 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二 ...

  5. MVVM模式解析和在WPF中的实现(五)View和ViewModel的通信

    MVVM模式解析和在WPF中的实现(五) View和ViewModel的通信 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 M ...

  6. MVVM模式解析和在WPF中的实现(三)命令绑定

    MVVM模式解析和在WPF中的实现(三) 命令绑定 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在WPF中 ...

  7. MVVM模式和在WPF中的实现(二)数据绑定

    MVVM模式解析和在WPF中的实现(二) 数据绑定 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在WPF中 ...

  8. MVVM模式和在WPF中的实现(一)MVVM模式简介

    MVVM模式解析和在WPF中的实现(一) MVVM模式简介 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在 ...

  9. Microservice架构模式简介

    在2014年,Sam Newman,Martin Fowler在ThoughtWorks的一位同事,出版了一本新书<Building Microservices>.该书描述了如何按照Mic ...

随机推荐

  1. Elasticsearch6.0及其head插件安装

    Elasticsearch6.0及其head插件安装 1.下载并解压elasticsearch 2.修改elasticsearch.yml文件 # 集群的名字 cluster.name: my-app ...

  2. Java多线程之线程池详解

    前言 在认识线程池之前,我们需要使用线程就去创建一个线程,但是我们会发现有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因 ...

  3. C++ UTF8和GB2312相互转换

    #include <Windows.h> #include <string> using std::string; void UTF8_to_GB2312(const char ...

  4. HTML 使用jQuery选中复选框 简易版

    <html><head>   <meta charset="utf-8">   <script src="jquery-1.7. ...

  5. 晓莲说-何不原创:java 实现二维数组冒泡排序

    新手从业路-为自己回顾知识的同时,也希望和大家分享经验: 话不多说,上代码 public class 冒泡排序 { /**     * @param admin     * @2017.12.4   ...

  6. strlen 与 sizeof

    #include<stdio.h>#include<string.h>#include<string>#include<iostream>using n ...

  7. ACM个人零散知识点整理

    ACM个人零散知识点整理 杂项: 1.输入输出外挂 //读入优化 int 整数 inline int read(){ int x=0,f=1; char ch=getchar(); while(ch& ...

  8. js 深拷贝和浅拷贝

    js 深拷贝和浅拷贝 先举一下项目中遇到的两个例子: 例子1: var json = $.parseJSON(data.data);//data.data是接口返回的值var a = json.cha ...

  9. js作用域与执行环境(前端基础系列)

    一.作用域(what?) 官方解释是:"一段程序代码中所用到的名字并不总是有效/可用的,而限定这个名字的可用性的代码范围就是这个名字的作用域." 单从文字理解比较难懂,举个栗子: ...

  10. 异步编程Async/await关键字

    异步编程Async \await 关键字在各编程语言中的发展(出现)纪实. 时间 语言版本 2012.08.15 C#5.0(VS2012) 2015.09.13 Python 3.5 2016.03 ...