做过UI自动化的都晓得,在做UI自动化时定位特别依赖页面,一旦页面发生变更就不得不跟着去修改页面定位。

在webdriver中,假设你想对一个元素定位操作,那么你可能会编写下面的代码:
driver.findElement(By.id("ad")).click();
发现问题:
你有10个地方对这个元素做了这个操作,哪天这个控件的元素变了,你就不得不去修改10个地方。
那么,有什么好的方法来解决这个问题呢?
这就是PageObject模式的引入的必要性。
那到底什么是PageObject模式?
PageObject 见名思意思,就是页面对象,也就是把界面定位和业务操作分开,在我现在团队我推行的是三层模式,把UI自动化分为了对象库层,操作层和业务层。PO思想对界面交互细节进行了封装,这样可以使测试案例更关注业务,而非界面细节,提高了测试案例的可读性,同样也可以为我后期BDD(Behavior Driven Deveopment)的推行打好基础。
 
废话这么多来看个例子吧:
假设我现在要做一个登陆操作,那么我创建一个对象库层:
 
public class LoginPage{
    public static By userName = By.name("userName");
    public static By pwd = By.name("passWord");
    public static By login=By.id("login");
}
 
 操作层:
public void inputUser(String name, String pwd) {
    driver.findElement(LoginPage.userName).sendKeys(name);
    driver.findElement(LoginPage.pwd ).sendKeys(pwd);
}
 
业务层:
@Test
public void login(){
    login.inputUser("username","pwd");
    tools.click("点击【登录】",login);
}
 
很容易从上面的案例可以看出,PO模式引入前后的区别:

当然减少UI自动化脚本的维护,提高测试案例的可读性方式很多的,PO不是唯一的,也不是什么真理,根据自己环境拿出一套合适的方案才是目标。

PageObject模式的层次结构的更多相关文章

  1. 浅谈pageobject模式

    先来看两段代码 代码1: package com.zlshuo.selenium.nonaming.pageobject; /** * @author leshuo * @version 2014年5 ...

  2. Cypress系列(62)- 改造 PageObject 模式

    如果想从头学起Cypress,可以看下面的系列文章哦 https://www.cnblogs.com/poloyy/category/1768839.html PO 模式 PageObject(页面对 ...

  3. 基于UiAutomator2+PageObject模式开展APP自动化测试实战

    前言 在上一篇<APP自动化测试框架-UiAutomator2基础>中,重点介绍了uiautomator2的项目组成.运行原理.环境搭建及元素定位等基础入门知识,本篇将介绍如何基于uiau ...

  4. Selenium系列(二十) - PageObject模式的详细介绍

    如果你还想从头学起Selenium,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1680176.html 其次,如果你不懂前端基础知识, ...

  5. 【python+selenium的web自动化】- PageObject模式解析及案例

    如果想从头学起selenium,可以去看看这个系列的文章哦! https://www.cnblogs.com/miki-peng/category/1942527.html PO模式 ​ Page O ...

  6. 【Python + ATX】之uiautomator2 PageObject模式自动化框架学习

    参考文章: 感谢:cynic (linpengcheng) <ATX 基于 ATX-Server 的 UI 自动化测试框架> <ATX-uiautomator2 实现 webview ...

  7. PageObject模式简介

    一.原理 将页面元素定位和对元素的操作行为封装成一个page类,实现对页面对象和测试用例的分离. 一条测试用例可能需要多个步骤操作元素,将每个步骤单独的封装成一个方法,在执行测试用例的时候调用封装好的 ...

  8. 【Selenium07篇】python+selenium实现Web自动化:PO模型,PageObject模式!

    一.前言 最近问我自动化的人确实有点多,个人突发奇想:想从0开始讲解python+selenium实现Web自动化测试,请关注博客持续更新! 这是python+selenium实现Web自动化第七篇博 ...

  9. Selenium WebDriver 之 PageObjects 模式 by Example

    目录 1. 项目配置 2. 一个WebDriver简单例子 3. 使用Page Objects模式 4. 总结 5. Troubleshooting 6. 参考文档 本篇文章通过例子来阐述一下Sele ...

随机推荐

  1. MyBatis-Spring 使用总结

    说明:Java-based Config. 不是通过 mybatis 的 SqlSessionFactoryBuilder 来创建 SqlSessionFactory ,而是通过 mybatis-sp ...

  2. 【BZOJ】1648: [Usaco2006 Dec]Cow Picnic 奶牛野餐(dfs)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1648 水题.. dfs记录能到达的就行了.. #include <cstdio> #in ...

  3. hdu 3336:Count the string(数据结构,串,KMP算法)

    Count the string Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  4. C++ map修改指定key的value

    对于修改C++指定key的value,网上查了很多,都说直接insert就会覆盖原来的值,是否是这样的呢?  C++ Code  12345678910111213141516171819202122 ...

  5. python3----requests

    import requests def get_html_text(url): try: r = requests.get(url, timeout=30) r.raise_for_status() ...

  6. Linux中使用SecureCRT上传、下载文件命令sz与rz用法实例

    来自:http://www.jb51.net/LINUXjishu/163820.html 其中,对于sz和rz的理解与记忆我用了如下的方法(因为很多时候容易搞混):sz中的s意为send(发送),告 ...

  7. 程序记录2(设置MapID)

    try{ INIT_PLUG I_MongoDB* i = NEW(MongoDB); /*[注] 若自定义错误消息的数组长度必需指定为MAX_ERROR_SIZE*/ //char errmsg[M ...

  8. iPhone 6 Screens Demystified

    http://www.paintcodeapp.com/news/iphone-6-screens-demystified

  9. Python全栈day18(迭代器协议和for循环工作机制)

    一,什么是迭代和递归 递归和迭代都是循环的一种. 简单地说,递归是重复调用函数自身实现循环.迭代是函数内某段代码实现循环,而迭代与普通循环的区别是:循环代码中参与运算的变量同时是保存结果的变量,当前保 ...

  10. HDU 1866 A + B forever!

    A + B forever! Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...