selenium + java po模式

简介:

po模式大概介绍,大家也可以自己百度看看
Page Object模式主要是将每个页面设计为一个类class,这个类包含页面中需要测试的元素(按钮、输入框、URL、标题等)和实际操作方法,这样在写测试用例时可以通过调用页面类的方法和属性来获取页面元素和操作元素,这样优点是避免当页面元素的ID或位置改变时需要更改测试用例代码的情况。当页面元组定位发生改变时只要通过更改页面类的属性即可。

框架目录结构
selenium + java po模式
loginPage.java

package com.lilysilk.page;

import org.apache.poi.util.SuppressForbidden;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
/**
 * 定位语句与测试代码封装
 * */
public class loginPage {

        //登录页面
        @FindBy(className="touXiang")
        private WebElement uloginPage;
        //用户名输入框
        @FindBy(xpath="//div[@class='userLogin']/div[1]/input[@id='email']")
        private WebElement uName;
        //密码输入框
        @FindBy(xpath="//div[@class='userLogin']/div[2]/input[@id='password']")
        private WebElement uPwd;
        //登录按钮
        @FindBy(id="loginButton")
        private WebElement loginBtn;

        //点击跳转登录页面
        public void goLoginPage() {
            uloginPage.click();
        }
        //输入用户名
        public void loginName(String username) {
            System.out.println(username);
            uName.clear();
            uName.sendKeys(username);
        }
        //输入密码
        public void loginPwd(String password) {
            System.out.println(password);
            uPwd.clear();
            uPwd.sendKeys(password);
        }
        //点击登录
        public void loginBtn() {
            loginBtn.click();
        }
}

case层即处理层
loginLilysilk_Po.java

package com.lilysilk.testcase;

import java.util.concurrent.TimeUnit;

import org.junit.*;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.support.PageFactory;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;

import com.lilysilk.page.loginPage;
import com.lilysilk.util.ExcelUtil;

public class loginLilysilk_Po {
    public static WebDriver driver;
    @Test
    public void loginlily() throws Exception{
        //定义测试用例路径
        String excelPath="E:\\javaDemo\\testProjectPo\\src\\com\\lilysilk\\data\\lilysilk.xlsx";
        //读取测试用例sheet页
        ExcelUtil.setExcelFile(excelPath,"login");
        //打开浏览器
        String BrowserName=ExcelUtil.getCellData(1,4);
        //修改浏览器语言
          ChromeOptions op=new ChromeOptions();
          op.addArguments("--lang=en-US");
        //equals比较时,要比较大小写是否相同,equalsIgnoreCase,忽略了大小写,ignore就是忽略的意思
        if(BrowserName.equalsIgnoreCase("chrome")){
            //初始化浏览器实例
            driver=new ChromeDriver(op);
        }else {
            driver=new FirefoxDriver(op);
        }
        //浏览器最大化
        driver.manage().window().maximize();
        //打开网址
        driver.get(ExcelUtil.getCellData(2, 4));
        //初始化page页面(注意:要放在打开浏览器之后)
        loginPage loginPage=PageFactory.initElements(driver, loginPage.class);

        loginPage.goLoginPage();
        loginPage.loginName("112233@qq.com");
        loginPage.loginPwd("112233@qq.com");
        loginPage.loginBtn();
    }
        @BeforeMethod
        public static void  beforeMethod(){
        }

         @AfterMethod
        public static void  afterMethod(){
           driver.close();
      }

}

工具类
ExcelUtil.java

package com.lilysilk.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;

/**
 * 
 *@Comments   : 导入导出Excel工具类 
 *此类事实现操作指定的excel文件中的指定sheet页、
 *读取指定的单元格内容、获取sheet中最后一行的行号的功能
 *
 *
 **/
public class ExcelUtil {
    private static XSSFSheet ExcelWSheet;
    private static XSSFWorkbook ExcelWBook;//excel文件对象
    private static XSSFCell ExcelCell;//单元格对象

    //舍得需要操作的excel的文件路径和sheet名称
    //在读,写excel文件时,均需先调用此方法,设定要操作的excel的路径和sheet名称
    public static void setExcelFile(String Path,String SheetName) {
        FileInputStream ExcelFile;

        try {
            //实例化excel文件的FileInputStream对象
            ExcelFile=new FileInputStream(Path);
            //实例化EXCEL文件的execlWXSSFWorkbook对象
            ExcelWBook =new XSSFWorkbook(ExcelFile);
            //实例化 XSSFCell 对象,指定excel文件中的sheet名称,后续用于sheet中行、列和单元格的操作
            ExcelWSheet=ExcelWBook.getSheet(SheetName);

        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    /**
     * @param rowNum行 colNum列 
     **/
    //读取excel文件中指定的单元格的函数,此函数只支持扩展名为.xlsx的excel文件
    public static String getCellData(int rowNum,int colNum)throws Exception {
        try {
        //通过函数参数知道单元格的行号与列号,获取指定的单元格对象
        ExcelCell=ExcelWSheet.getRow(rowNum).getCell(colNum);
        //如果单元格的内容为字符串类型,则使用getStringCellValue方法来获取单元格内容
        //如果单元格的内容为数字类型,   则使用getNumericCellValue方法来获取单元格内容
        String CellData =ExcelCell.getCellType()==XSSFCell.CELL_TYPE_STRING?ExcelCell.getStringCellValue()+"":String.valueOf(Math.round(ExcelCell.getNumericCellValue()));

        return CellData;
        }
        catch(Exception e){
            e.printStackTrace();
            //读取遇到异常,则返回空字符串
            return "错了";
        }
    }

    //获取excel文件的最后一行的行号
    public static int getLastRowNum() {
        //函数返回sheet的最后一行行号
        return ExcelWSheet.getLastRowNum();
    }
}

data层即数据层
selenium + java po模式

遇到的问题:
问题1:org.apache.poi.openxml4j.exceptions.OLE2NotOfficeXmlFileException: The supplied data appears to be in the OLE2 Format. You are calling the part of POI that deals with OOXML (Office Open XML) Documents. You need to call a different part of POI to process this data (eg HSSF instead of XSSF)
selenium + java po模式
像这个报错就是所用的XSSF是支持excel2007版本以上的,支持格式为xlsx,如果想要支持2003版本的xls,需要将XSSF换成HSSF的
问题2:部分jar包没有,需要导入,按照报错内容导入jar包就好


本文转自 水滴的历程 51CTO博客,原文链接:http://blog.51cto.com/12390959/2059330

相关文章
|
2月前
|
Web App开发 Java
使用java操作浏览器的工具selenium-java和webdriver下载地址
【10月更文挑战第12天】Selenium-java依赖包用于自动化Web测试,版本为3.141.59。ChromeDriver和EdgeDriver分别用于控制Chrome和Edge浏览器,需确保版本与浏览器匹配。示例代码展示了如何使用Selenium-java模拟登录CSDN,包括设置驱动路径、添加Cookies和获取页面源码。
114 6
|
3月前
|
存储 Java 开发者
【Java新纪元启航】JDK 22:解锁未命名变量与模式,让代码更简洁,思维更自由!
【9月更文挑战第7天】JDK 22带来的未命名变量与模式匹配的结合,是Java编程语言发展历程中的一个重要里程碑。它不仅简化了代码,提高了开发效率,更重要的是,它激发了我们对Java编程的新思考,让我们有机会以更加自由、更加创造性的方式解决问题。随着Java生态系统的不断演进,我们有理由相信,未来的Java将更加灵活、更加强大,为开发者们提供更加广阔的舞台。让我们携手并进,共同迎接Java新纪元的到来!
71 11
|
3月前
|
设计模式 Java
Java设计模式-工厂方法模式(4)
Java设计模式-工厂方法模式(4)
|
4月前
|
消息中间件 Java
【实战揭秘】如何运用Java发布-订阅模式,打造高效响应式天气预报App?
【8月更文挑战第30天】发布-订阅模式是一种消息通信模型,发送者将消息发布到公共队列,接收者自行订阅并处理。此模式降低了对象间的耦合度,使系统更灵活、可扩展。例如,在天气预报应用中,`WeatherEventPublisher` 类作为发布者收集天气数据并通知订阅者(如 `TemperatureDisplay` 和 `HumidityDisplay`),实现组件间的解耦和动态更新。这种方式适用于事件驱动的应用,提高了系统的扩展性和可维护性。
76 2
|
4月前
|
XML Java 测试技术
Selenium WebDriver自动化测试(基础篇):不得不掌握的Java基础
关于Selenium WebDriver自动化测试的Java基础篇,涵盖了Java的变量、数据类型、字符串操作、运算符、流程控制、面向对象编程、关键字用法、权限修饰符、异常处理和IO流等基础知识点,为进行自动化测试提供了必要的Java语言基础。
111 1
|
4月前
|
Java
"揭秘Java IO三大模式:BIO、NIO、AIO背后的秘密!为何AIO成为高并发时代的宠儿,你的选择对了吗?"
【8月更文挑战第19天】在Java的IO编程中,BIO、NIO与AIO代表了三种不同的IO处理机制。BIO采用同步阻塞模型,每个连接需单独线程处理,适用于连接少且稳定的场景。NIO引入了非阻塞性质,利用Channel、Buffer与Selector实现多路复用,提升了效率与吞吐量。AIO则是真正的异步IO,在JDK 7中引入,通过回调或Future机制在IO操作完成后通知应用,适合高并发场景。选择合适的模型对构建高效网络应用至关重要。
92 2
|
4月前
|
设计模式 XML 存储
【二】设计模式~~~创建型模式~~~工厂方法模式(Java)
文章详细介绍了工厂方法模式(Factory Method Pattern),这是一种创建型设计模式,用于将对象的创建过程委托给多个工厂子类中的某一个,以实现对象创建的封装和扩展性。文章通过日志记录器的实例,展示了工厂方法模式的结构、角色、时序图、代码实现、优点、缺点以及适用环境,并探讨了如何通过配置文件和Java反射机制实现工厂的动态创建。
【二】设计模式~~~创建型模式~~~工厂方法模式(Java)
|
4月前
|
设计模式 XML Java
【一】设计模式~~~创建型模式~~~简单工厂模式(Java)
文章详细介绍了简单工厂模式(Simple Factory Pattern),这是一种创建型设计模式,用于根据输入参数的不同返回不同类的实例,而客户端不需要知道具体类名。文章通过图表类的实例,展示了简单工厂模式的结构、时序图、代码实现、优缺点以及适用环境,并提供了Java代码示例和扩展应用,如通过配置文件读取参数来实现对象的创建。
【一】设计模式~~~创建型模式~~~简单工厂模式(Java)
|
3月前
|
JSON Java UED
uniapp:使用DCloud的uni-push推送消息通知(在线模式)java实现
以上展示了使用Java结合DCloud的uni-push进行在线消息推送的基本步骤和实现方法。实际部署时,可能需要依据实际项目的规模,业务场景及用户基数进行必要的调整和优化,确保消息推送机制在保证用户体验的同时也满足业务需求。
213 0
|
5月前
|
数据采集 安全 Java
Java Selenium WebDriver:代理设置与图像捕获
Java Selenium WebDriver:代理设置与图像捕获