PageObject设计模式,在selenium自动化测试中的运用

news2024/12/26 11:08:46

PageObject设计模式

  1. Web自动化测试框架(WebTestFramework)是基于Selenium框架且采用PageObject设计模式进行二次开发形成的框架。
  2. web测试时,建议强烈推荐使用_谷歌或_火狐浏览器。
  3. PageObject设计模式:是将某个页面的所有"元素(包含控件)属性"及"元素操作"封装在1个类(Class)里面~~~~
  4. 目的: 测试代码与被测页面对象代码分离,后期如果有页面元素发生了更改,只需要修改相应页面对象的代码(即对应Class文件),而不需要修改测试代码
  5. 尽量采用xpath方式来寻找页面元素,而不建议使用name,Link等方法; xpath是基于页面元素所处区域,一般不会发生变化,测试代码基本不受干扰.
  6. 将页面元素属性信息与代码分离,即与被测对象代码分离,目的也是为了进一步降低后续因页面变化带来的维护成本

以下是我的一个小的测试实例代码
Test—java工程名
src—源代码目录
CommonObject -----包名–存放公共类代码, 如 UseBrowser.java , 存放的操作chrome,firfox,ie等浏览器的相关代码
PageObject--------包名–存放页面对象(Page Object),以及相关的操作, 如 HomePageObject.java, 存放百度搜索主页的相关对象及操作方法
PagePath----------包名–存放页面对象元素的相关路径字符串文件, 如 PageElementPath.java, 存放百度搜索主页对象的路径字符串文件,
TestCases---------包名–存放页面对象的测试案例的相关类, 如 NewTest.java , 存放的就是真正的测试案例, 调用方法,使用数据进行测试的类.

 //公共类,操作浏览器相关的
 package CommonObject;
 import java.util.concurrent.TimeUnit;
 import org.openqa.selenium.WebDriver;
 import org.openqa.selenium.chrome.ChromeDriver;
 import org.openqa.selenium.firefox.FirefoxDriver;
 import org.openqa.selenium.ie.InternetExplorerDriver;
 import org.openqa.selenium.remote.DesiredCapabilities;
 
 public class UseBrowser {
     public WebDriver driver;    
     //启动谷歌浏览器
     public WebDriver setupChrome(String test_url){     
     System.setProperty("webdriver.chrome.driver", "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chromedriver.exe");
     driver = new ChromeDriver();
     driver.get(test_url);
     driver.manage().window().maximize();
     driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
     return driver;
     }
     //启动火狐浏览器(需要最新geckodriver.exe,放到firfox的根目录)
     public WebDriver setupFirfox(String test_url){
 //        System.setProperty("webdriver.firefox.marionette","C:/Program Files(x86)/Mozilla Firefox/geckodriver.exe");
         driver = new FirefoxDriver();
         driver.get(test_url);
         driver.manage().window().maximize();
         driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
         return driver;
     }
     //启动IE浏览器
     public WebDriver setupIE(String test_url){   
      System.setProperty("webdriver.ie.driver", "C:\\Program Files\\Internet Explorer\\IEDriverServer.exe");
      DesiredCapabilities dc = DesiredCapabilities.internetExplorer();
      dc.setCapability(InternetExplorerDriver.INTRODUCE_FLAKINESS_BY_IGNORING_SECURITY_DOMAINS, true);
      driver = new InternetExplorerDriver(dc);
      driver.get(test_url);
      return driver;
     }
     //关闭浏览器
     public void teardownBrowser(){
         driver.close();    
     }    
 }
//pageobject页面对象类,百度搜索页面的[输入框],[百度一下按钮]对象及操作
package PageObject;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import PagePath.PageElementPath;

public class HomePageObject extends PageElementPath{    
    // 点击搜索栏
    public void click_Search_Bar(WebDriver driver){
        driver.findElement(By.id(search_bar_id)).click();
    }        
    // 搜索框输入
    public void input_Search_Box(WebDriver driver,String key_word){        
        driver.findElement(By.id(search_box_id)).clear();
        driver.findElement(By.id(search_box_id)).sendKeys(key_word);
        System.out.println("百度输入框已经成功输入的搜索内容:"+key_word);        
    }    
    //点击搜索按钮(百度一下)
    public void click_Search_Button(WebDriver driver){            
        driver.findElement(By.name(search_button_name)).click();
        System.out.println("click the 百度以下,success...");    
    }
}
//页面对象路径类, 百度一下页面的输入框,按钮的路径字符串
package PagePath;

public class PageElementPath {
    public String search_bar_id = "kw";
    public String search_box_id = "kw";
    public String search_button_name = "wd";
}
// 使用testng框架的测试类, 主要进行页面输入框,按钮的测试, 其中的测试数据也可以分离,暂时没有进行分离,
package TestCases;
import org.openqa.selenium.WebDriver;
import org.testng.annotations.Test;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeSuite;
import org.testng.annotations.AfterSuite;

import CommonObject.UseBrowser;
import PageObject.HomePageObject;

public class NewTest {
    HomePageObject page =new HomePageObject();
    UseBrowser browser = new UseBrowser();
    WebDriver drivers;
    
    
  @Test
  public void test_baidu() throws Exception {
      page.click_Search_Bar(drivers);
      page.input_Search_Box(drivers,"PageObject设计模式");
      Thread.sleep(10000);
      page.click_Search_Button(drivers);
  }
  @BeforeMethod
  public void beforeMethod() {
      System.out.println("Before method success....");
     
  }

  @AfterMethod
  public void afterMethod() {
      System.out.println("After Method success....");
  }

  @BeforeClass
  public void beforeClass() {
      System.out.println("Before Class success....");
  }

  @AfterClass
  public void afterClass() {
      System.out.println("After Class success....");
  }

  @BeforeTest
  public void beforeTest() {
      System.out.println("Before Test success....");
  }

  @AfterTest
  public void afterTest() {
      System.out.println("After Test success....");
  }

  @BeforeSuite
  public void beforeSuite() {
      drivers = browser.setupChrome("http://www.baidu.com/");
      System.out.println("Before Suite success....");
  }

  @AfterSuite
  public void afterSuite() {
      browser.teardownBrowser();
      System.out.println("After Suite success....");
  }
}

/**输入结果为
Before Suite success....
Before Test success....
Before Class success....
Before method success....
百度输入框已经成功输入的搜索内容:PageObject设计模式
click the 百度以下,success...
After Method success....
After Class success....
After Test success....
After Suite success....
*/
// 不使用testng框架的情况下, 可以使用java的main方法也可以进行测试.如下面
package PageObject;
import org.openqa.selenium.WebDriver;
import PageObject.HomePageObject;
import CommonObject.UseBrowser;

public class baidu_main_method{
    
    public static void main(String[]args) throws Exception{
        WebDriver drivers;    
        HomePageObject page = new HomePageObject();
        UseBrowser browser = new UseBrowser();
        
        drivers= browser.setupChrome("http://www.baidu.com/");
        page.click_Search_Bar(drivers);
        page.input_Search_Box(drivers,"PageObject设计模式");
        page.click_Search_Button(drivers);
        Thread.sleep(5000);
        browser.teardownBrowser();
    }
}

/*
百度输入框已经成功输入的搜索内容:PageObject设计模式
click the 百度以下,success...
*/

什么是POM?

  1. 页面对象模型 是 为Web UI元素创建Object Repository的设计模式 。
  2. 在这个模型下,对于应用程序中的每个网页,应该有相应的页面类。
  3. 此Page类将会找到该Web页面的WebElements,并且还包含对这些WebElements执行操作的页面方法。
  4. 这些方法的名称应该按照他们正在执行的任务给出

POM的优点

  1. 页面对象Patten表示UI中的操作和流程应与验证分开。这个概念使我们的代码更清洁,易于理解。
  2. 第二个好处是 对象存储库独立于测试用例,因此我们可以使用与不同工具不同的目的使用相同的对象存储库。
    例如,我们可以将POM与用于功能测试的TestNG / JUnit进行集成,并与JBehave / Cucumber同时进行验收测试。
  3. 由于POM类中的可重用页面方法,代码变得更少和优化。
  4. 方法采用更实际的名称 ,可以轻松地映射UI中发生的操作。即如果在点击按钮后,我们登陆主页,方法名称就像’gotoHomePage()’
    如何实现POM?
    简单的POM:
    它是页面对象模型(POM)的基本结构,其中AUT的所有Web元素和在这些Web元素上操作的方法都保留在类文件中。
    类的验证的任务应该作为测试方法的一部分分开

最后:下方这份完整的软件测试视频学习教程已经整理上传完成,朋友们如果需要可以自行免费领取 【保证100%免费】

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/358108.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【网络原理3】TCP连接管理

TCP这种传输层协议必须是有连接的。连接管理,就是TCP当中管理如何建立连接、如何断开连接的方式。 目录 TCP建立连接的方式(三次握手) 合并两次连接之后变成"三次握手" 站在具体发送什么报文的视角,理解三次握手 发送报文之前 第一步:客…

Git - 在主分支上创建分支并提交代码

拉取最新代码 因为当前在 master 分支下,你必须拉取最新代码,保证当前代码与线上同步(最新),执行以下命令: git pull origin master创建分支 目前我们在 master 主分支上,需要执行以下命令&…

【Unity】[入门tips与通用性原则] 一些经验技巧和更好地写出简洁易懂的程序的原则方法

本文将持续间断更新 本文主要面向初级程序员,为了方便Unity开发,有些快捷键的方式和一些通用性的技巧tips等会在这篇博客内持续更新,欢迎点赞收藏 快捷键 Ctrl S ; 快捷保存!闲着没事就来两下!CtrlShif…

CMake基础使用和实战详解

CMake基础使用和实战详解一、CMake简介1.1、cmake 的特点1.2、注意1.3、使用建议二、安装 cmake三、CMake的简单使用3.1、准备工作3.2、开始构建3.3、解释CMakeLists.txt的内容3.4、基本语法规则四、更像样的CMake工程4.1、准备工作4.2、构建4.3、语法解释4.4、修改保存目标二进…

水文监测场景的数据通信规约解析和落地实践

[小 迪 导 读]:江苏云上需要通过云平台接入水文设备来实现水文数据的采集、存储、显示、控制、报警及传输等综合功能。企业介绍江苏云上智联物联科技有限公司是专业从事物联网相关产品与解决方案服务的高科技公司,总部位于美丽的江苏无锡。公司遵循“智联…

linux高级命令之死锁

死锁学习目标能够知道产生死锁的原因1. 死锁的概念死锁: 一直等待对方释放锁的情景就是死锁为了更好的理解死锁,来看一个现实生活的效果图:说明:现实社会中,男女双方一直等待对方先道歉的这种行为就好比是死锁。死锁的结果会造成应用程序的停止响应&…

面试官:你是怎样理解Fiber的

hello,这里是潇晨,今天我们来聊一聊Fiber。不知道大家面试的时候有没有遇到过和react Fiber相关的问题呢,这一类问题比较开放,但也是考察对react源码理解深度的问题,如果面试高级前端岗,恰巧你平时用的是re…

细谈JavaWeb中的Request和Response

文章目录1,Request和Response的概述2,Request对象2.1 Request继承体系2.2 Request获取请求数据2.2.1 获取请求行数据2.2.2 获取请求头数据2.2.3 获取请求体数据2.2.4 获取请求参数的通用方式2.4 请求参数中文乱码问题2.4.1 POST请求解决方案2.4.2 GET请求…

MySQL使用C语言连接

文章目录MySQL使用C语言连接引入库下载库文件在项目中使用库使用库连接数据库下发SQL请求获取查询结果MySQL使用C语言连接 引入库 要使用C语言连接MySQL,需要使用MySQL官网提供的库。 下载库文件 下载库文件 首先,进入MySQL官网,选择DEVEL…

Java代码使用最小二乘法实现线性回归预测

最小二乘法简介最小二乘法是一种在误差估计、不确定度、系统辨识及预测、预报等数据处理诸多学科领域得到广泛应用的数学工具。它通过最小化误差(真实目标对象与拟合目标对象的差)的平方和寻找数据的最佳函数匹配。利用最小二乘法可以简便地求得未知的数…

如何写一个 things3 client

Things3[1] 是一款苹果生态内的任务管理软件,是一家德国公司做的,非常好用。我前后尝试了众多任务管理软件,最终选定 things3,以后有机会会写文章介绍我是如何用 things3 来管理我的日常任务。本文主要介绍欧神写的 tli[2] 工具来…

3D沉浸式体验开发技巧【Three.js】

在本文中,我们将看看如何使用 Three.js 创建一个充满后期效果和微交互的迷你城市。 推荐:将 NSDT场景编辑器 加入你的3D开发工具链。 1、背景介绍 我是一个游戏爱好者。 我一直梦想创建一个交互式迷你城市,使用饱和的颜色,类似于…

Android自动化测试(UiAutomator)——UiObject

本文主要讲解使用UiAutomator的一些技巧,希望对于初学者有一定的帮助 UiObject 1、首先要声明对象 UiObject XXX new UiObject(new Selector) ; 2、其次对对象进行操作 操作类型包括: 执行类:文本输入与清除、点击/长按、拖动/滑动、 …

JAVA JDK 常用工具类和工具方法

目录 Pair与Triple Lists.partition-将一个大集合分成若干 List集合操作的轮子 对象工具Objects 与ObjectUtils 字符串工具 MapUtils Assert断言 switch语句 三目表达式 IOUtils MultiValueMap MultiMap JAVA各个时间类型的转换(LocalDate与Date类型&a…

开源软件AirByte:入湖入仓,数据集成管道

从ETL到ELT就传统的 ETL而言,当我们开始构建数据仓库时,都要先去了解业务流程,明晰业务是如何运转的,数据是如何留痕的。通过收集用户的相关需求,从而去规划设计报表。企业需要进行数仓分域、分层、逻辑建模等一系列操…

Linux下程序调试的方法【GDB】GDB相关命令和基础操作(命令收藏)

目录 1、编译 2、启动gdb调试 2.1 直接运行 2.2 运行gdb后使用run命令 2.3 调试已运行的程序 3、图形界面提示 4、调试命令 1、查看源码 2、运⾏程序/查看运⾏信息 3、设置断点 5、单步/跳步执⾏ 6、分割窗口 7、其他命令 8、相关参数 1、编译 在编译时要加上-g选…

stm32f407探索者开发板(十七)——串口寄存器库函数配置方法

文章目录一、STM32串口常用寄存器和库函数1.1 常用的串口寄存器1.2 串口相关的库函数1.3 状态寄存器(USART_ SR)1.4 数据寄存器(USART_ DR)1.5 波特率寄存器(USART_BRR)二、串口配置一般步骤一、STM32串口常…

java static关键字 万字详解

目录 一、为什么需要static关键字: 二、static关键字概述 : 1.作用 : 2.使用 : 三、static修饰成员变量详解 : 1.特点 : 2.细节 : ①什么时候考虑使用static关键字? ②静态变量和非静态变量的区别? ③关于静态变量的初始化问题 : ④关于静态变…

基于springboot+vue的器官捐献系统

基于springbootvue的器官捐献系统 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取项目下载方式🍅 一、项目背景介绍&…

内网渗透(四十一)之横向移动篇-PsExec工具远程命令执行横向移动

系列文章第一章节之基础知识篇 内网渗透(一)之基础知识-内网渗透介绍和概述 内网渗透(二)之基础知识-工作组介绍 内网渗透(三)之基础知识-域环境的介绍和优点 内网渗透(四)之基础知识-搭建域环境 内网渗透(五)之基础知识-Active Directory活动目录介绍和使用 内网渗透(六)之基…