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 , 存放的就是真正的测试案例, 调用方法,使用数据进行测试的类.

 1 //公共类,操作浏览器相关的
2 package CommonObject;
3 import java.util.concurrent.TimeUnit;
4 import org.openqa.selenium.WebDriver;
5 import org.openqa.selenium.chrome.ChromeDriver;
6 import org.openqa.selenium.firefox.FirefoxDriver;
7 import org.openqa.selenium.ie.InternetExplorerDriver;
8 import org.openqa.selenium.remote.DesiredCapabilities;
9
10 public class UseBrowser {
11 public WebDriver driver;
12 //启动谷歌浏览器
13 public WebDriver setupChrome(String test_url){
14 System.setProperty("webdriver.chrome.driver", "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chromedriver.exe");
15 driver = new ChromeDriver();
16 driver.get(test_url);
17 driver.manage().window().maximize();
18 driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
19 return driver;
20 }
21 //启动火狐浏览器(需要最新geckodriver.exe,放到firfox的根目录)
22 public WebDriver setupFirfox(String test_url){
23 // System.setProperty("webdriver.firefox.marionette","C:/Program Files(x86)/Mozilla Firefox/geckodriver.exe");
24 driver = new FirefoxDriver();
25 driver.get(test_url);
26 driver.manage().window().maximize();
27 driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
28 return driver;
29 }
30 //启动IE浏览器
31 public WebDriver setupIE(String test_url){
32 System.setProperty("webdriver.ie.driver", "C:\\Program Files\\Internet Explorer\\IEDriverServer.exe");
33 DesiredCapabilities dc = DesiredCapabilities.internetExplorer();
34 dc.setCapability(InternetExplorerDriver.INTRODUCE_FLAKINESS_BY_IGNORING_SECURITY_DOMAINS, true);
35 driver = new InternetExplorerDriver(dc);
36 driver.get(test_url);
37 return driver;
38 }
39 //关闭浏览器
40 public void teardownBrowser(){
41 driver.close();
42 }
43 }
//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元素上操作的方法都保留在类文件中。
类的验证的任务应该作为测试方法的一部分分开

载于原文:

https://www.cnblogs.com/xiaofeifei-wang/p/6733753.html

PageObject设计模式 在selenium 自动化测试里面的应用的更多相关文章

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

    PageObject设计模式1. Web自动化测试框架(WebTestFramework)是基于Selenium框架且采用PageObject设计模式进行二次开发形成的框架. 2. web测试时,建议 ...

  2. selenium的PageObject设计模式

    PageObject设计模式1. Web自动化测试框架(WebTestFramework)是基于Selenium框架且采用PageObject设计模式进行二次开发形成的框架. 2. web测试时,建议 ...

  3. Selenium自动化测试Python五:WebDriver设计模式

    WebDriver 设计模式 欢迎阅读WebDriver进阶讲义.本篇讲义将会重点介绍Selenium WebDriver 自动化框架的设计,着重使用Page Object设计模式,以及使用HTML测 ...

  4. selenium自动化测试框架之PO设计模式

    面向对象的特性:封装.继承.多态.在自动化中一样适用,Selenium自动化测试中有一个名字常常被提及PageObject(思想与面向对象的特性相同),通过PO模式可以大大提高测试用例的维护效率. 传 ...

  5. 《手把手教你》系列基础篇(九十二)-java+ selenium自动化测试-框架设计基础-POM设计模式简介(详解教程)

    1.简介 页面对象模型(Page Object Model)在Selenium Webdriver自动化测试中使用非常流行和受欢迎,作为自动化测试工程师应该至少听说过POM这个概念.本篇介绍POM的简 ...

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

    1.简介 上一篇介绍了POM的基础理论知识和非POM方式写脚本,这篇介绍利用页面工厂类(page factory)去实现POM,通过查看PageFactory类,我们可以知道它是一个初始化一个页面实例 ...

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

    1.简介 上一篇宏哥用PageFactory实现了POM,宏哥再介绍一下如果不用PageFactory如何实现POM. 2.项目实战 在这里宏哥以百度首页登录的例子,如果用POM实现,在测试脚本中实际 ...

  8. python+selenium 自动化测试实战

    一.前言: 之前的文章说过, 要写一篇自动化实战的文章, 这段时间比较忙再加回家过11一直没有更新博客,今天整理一下实战项目的代码共大家学习.(注:项目是针对我们公司内部系统的测试,只能内部网络访问, ...

  9. 《Selenium自动化测试实战》新书上市,有需要朋友们可以了解下,欢迎大家多提宝贵意见

    京东:https://item.jd.com/13123910.html当当:http://product.dangdang.com/29204520.html 1. 本书基于 Python 3.8 ...

随机推荐

  1. xmake v2.1.5版本新特性介绍

    2.1.5版本现已进入收尾阶段,此版本加入了一大波新特性,目前正在进行稳定性测试和修复,在这里,先来介绍下新版本中引入了哪些新特性和改进. 1. 提供类似cmake的find_*系列接口,实现各种查找 ...

  2. python为什么人们喜欢学习呢?

    软件的质和量. 既有量的积累也有质的区别.继承一定的前人研究基础. 基本上来说,python更加的注重可读性,一致性,可移植性,其中软件的质量也是比较的讲究的. python支持开发的高级重用机制,例 ...

  3. Java中数据类型的分类

    我们知道Java是强类型语言,那么肯定对应的也就有弱类型语言,以下介绍强类型语言与弱类型语言的区别: 强类型语言: 强类型语言也就是强制数据类型定义的语言.也就是说,一旦一个变量被指定了某个数据类型, ...

  4. 1897. tank 坦克游戏

    传送门 显然考虑 $dp$,发现时间只和当前位置和攻击次数有关,设 $F[i][j][k]$ 表示当前位置为 $i,j$ ,攻击了 $k$ 次得到的最大分数 初始 $f[1][1][k]$ 为位置 $ ...

  5. ftp服务端

    #coding=utf-8 import SocketServer import json import os class MyTcpHandler(SocketServer.BaseRequestH ...

  6. SQL SERVER 数据库跨服务器备份

    原文:https://www.cnblogs.com/jaday/p/6088200.html 需求介绍:每天备份线上正式库并且把备份文件复制到测试服务器,测试服务器自动把数据库备份文件还原. 方案介 ...

  7. struts2导入多个xml引入报错<include>

    struts.xml <?xml version="1.0" encoding="UTF-8"?> <!-- 指定Struts 2配置文件的D ...

  8. ReactiveCocoa详解

    最近看了大神的博客后,感觉该对ReactiveCocoa做一个了断了. 首先大致的对以下关于ReactiveCocoa内容做一个简单的总结,其他的后续更新 1.ReactiveCocoa的操作思想 2 ...

  9. 2018-8-10-xaml-添加-region

    title author date CreateTime categories xaml 添加 region lindexi 2018-08-10 19:16:51 +0800 2018-03-15 ...

  10. mybaties数据源配置类型(POOLED、JNDI、UNPOOLED)

    dataSource的类型可以配置成其内置类型之一,如UNPOOLED.POOLED.JNDI. 如果将类型设置成UNPOOLED,mybaties会为每一个数据库操作创建一个新的连接,并关闭它.该方 ...