《手把手教你》系列基础篇(九十三)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-上篇(详解教程)

1.简介

上一篇介绍了POM的基础理论知识和非POM方式写脚本,这篇介绍利用页面工厂类(page factory)去实现POM,通过查看PageFactory类,我们可以知道它是一个初始化一个页面实例的功能,在实例化该页面对象时候,也会一起实例化该页面的元素定位。

2.项目实战

在这里宏哥以百度首页登录的例子,如果用POM实现,在测试脚本中实际代码就几行。

2.1代码设计

1.先新建一个pageObjects包,然后在pageObjects包新建一个百度主页类:BaiduHomePage,代码设计如下图所示:

2.再次新建一个testSuites包,然后在testSuites包下新建一个测试类:TestWithPOM

2.2参考代码

1.BaiduHomePage

kotlin 复制代码
package pageObjects;

import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;

/**
 * @author 北京-宏哥
 * 
 * @公众号:北京宏哥
 * 
 * 《手把手教你》系列基础篇(八十七)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-上篇(详解教程)
 *
 * 2025年3月10日
 */

public class BaiduHomePage {

    // 元素定位
    // 登录按钮
    @FindBy(xpath="//*[@id='u1']/a[1]")
    WebElement login_link;

    // 输入用户名框
    @FindBy(xpath="//*[@id='TANGRAM__PSP_11__userName']")
    WebElement inputBox_username;

    // 输入密码
    @FindBy(xpath="//*[@id='TANGRAM__PSP_11__passwordWrapper']/input[2]")
    WebElement inputBox_password;

    // 登录按钮
    @FindBy(id = "TANGRAM__PSP_11__submit")
    WebElement login_submitBtn;

    // 业务逻辑和操作方法

    // 登录方法
    public void login(String username, String password) throws InterruptedException {

        login_link.click();
        Thread.sleep(3000);
        inputBox_username.sendKeys(username);
        inputBox_password.sendKeys(password);
        login_submitBtn.click();

    }

}

2.TestWithPOM

java 复制代码
package testSuites;

import org.testng.annotations.Test;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.PageFactory;
import org.testng.annotations.BeforeClass;

import pageObjects.BaiduHomePage;

/**
 * @author 北京-宏哥
 * 
 * @公众号:北京宏哥
 * 
 * 《手把手教你》系列基础篇(八十七)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-上篇(详解教程)
 *
 * 2025年3月10日
 */

public class TestWithPOM {
    
    WebDriver driver;
    
    @BeforeClass
    public void setUp() throws Exception{
        
        System.setProperty("webdriver.chrome.driver", ".\Tools\chromedriver.exe");
        driver = new ChromeDriver();
        driver.manage().window().maximize();
        driver.get("https://www.baidu.com/");
        Thread.sleep(2000);
    }
    
 
    @Test
    public void testLogin() throws InterruptedException{
        
        BaiduHomePage hp = PageFactory.initElements(driver, BaiduHomePage.class);
        hp.login("user1", "123456");
    }
    
 
}

2.3运行代码

1.运行代码,右键Run AS->TestNG Suite,控制台输出,如下图所示:

2.运行代码后电脑端的浏览器的动作,如下小视频所示:

3.非POM实现

下面跟随宏哥看一下不用POM怎么实现登录百度首页。

3.1代码设计

3.2参考代码

java 复制代码
package testSuites;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;

/**
 * @author 北京-宏哥
 * 
 * @公众号:北京宏哥
 * 
 * 《手把手教你》系列基础篇(八十七)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-上篇(详解教程)
 *
 * 2025年3月10日
 */

public class TestWithoutPOM {
    
    WebDriver driver;
    
    @BeforeClass
    public void setUp() throws Exception{
        
        System.setProperty("webdriver.chrome.driver", ".\Tools\chromedriver.exe");
        driver = new ChromeDriver();
        driver.manage().window().maximize();
        
    }
    
    @Test
    public void testBaidu() throws InterruptedException {
        
        driver.get("https://www.baidu.com/");
        Thread.sleep(2000);
        Thread.sleep(3000);
        // click login link
        // 元素定位
        // 登录按钮
        driver.findElement(By.xpath("//*[@id='u1']/a[1]")).click();
        Thread.sleep(2000);
        // 输入用户名框
        driver.findElement(By.xpath("//*[@id='TANGRAM__PSP_11__userName']")).clear();
        driver.findElement(By.xpath("//*[@id='TANGRAM__PSP_11__userName']")).sendKeys("user1");
        Thread.sleep(2000);
        // 输入密码
        driver.findElement(By.xpath("//*[@id='TANGRAM__PSP_11__passwordWrapper']/input[2]")).clear();
        driver.findElement(By.xpath("//*[@id='TANGRAM__PSP_11__passwordWrapper']/input[2]")).sendKeys("123456");
        // 登录按钮
        driver.findElement(By.id("TANGRAM__PSP_11__submit")).click();

    }
    
    @AfterClass
    public void tearDown(){
        
        driver.quit();
    }
 
}

3.3运行代码

1.运行代码,右键Run AS->TestNG Suite,控制台输出,如下图所示:

2.运行代码后电脑端的浏览器的动作,如下小视频所示:

4.小结

好了今天主要介绍和讲解了百度首页登录使用POM和不使用POM。二者的优缺点一目了然,宏哥在这里就不多说了,今天就到这里了,感谢您耐心的阅读!!!

相关推荐
~木雨8 分钟前
Java 并发编程架构全景:并发层的五域设计 —— 线程模型、线程池隔离、并发安全到问题治理(全体系汇总)
java·安全·架构·线程池·并发编程·高并发架构
志尊宝11 分钟前
Vue3 零基础每日笔记(005):ref 响应式基础——为什么 script 里要 .value
前端·javascript·vue.js·笔记
海鸥两三17 分钟前
Mac电脑使用 Tabby 部署前端项目到阿里云服务器完整教程
前端·macos·阿里云
console.log('npc')24 分钟前
2026 实测:Grok 4.5 与 Grok 4.6 怎么选?前端开发、教程写作、Figma 还原选型指南
前端·大模型·ai编程·figma·grok
极小狐26 分钟前
从复制粘贴到可复用组件:极狐GitLab CI/CD 组件目录实战
java·ci/cd·gitlab·devops·组件化
麻瓜code31 分钟前
【Agent】Spring AI RAG 实战:本地向量库 + 云端知识库
java·人工智能·spring
yyt36304584139 分钟前
一次鼠标交互触发两次 Vue flushJobs:把高频交互从 VDOM 里拆出来
前端·vue.js·计算机外设
YUJIANYUE1 小时前
查立得万用查分安卓版(web环境+查询系统免安装单文件一键运行包)
android·前端
小刘在重生~1 小时前
Java 集合|Collection、List、ArrayList、LinkedList、泛型、Collections 工具类
java·数据结构·list
我不会起名字3221 小时前
一天一道算法题(29):单调栈
java·数据结构·python·算法·leetcode·golang·单调栈