python selenium设计模式POM
POM模式是什么
- 页面对象模型(POM)是一种设计模式,用来管理维护一组web元素集的对象库
- 在POM模式下,应用程序的每一个页面都有一个对的page class
- 每一个page class维护着该web页的元素集合操作这些元素的方法
- page class中的方法名最好根据业务场景进行
POM模式的代码目录组织示例:

POM的优势:
- POM提供了一种在UI层操作、业务流程与验证分离的模式,这使得测试代码变得更加清晰和高可读性
- 对象库与用例分离,使得我们更好的复用对象,甚至能与不同的工具进行深度结合应用
- 可复用的页面方法代码会变得更加优化
- 更加有效的命名方式使得我们更加清晰的知道方法所操作的UI元素。例如我们要回到首页,方法名命名为: gotoHomePage(),通过方法名即可清晰的知道具体的功能实现。
可以理解POM模式是一种底层、逻辑、用例的分层。
一、driver层的封装(最底层的封装base)
这一层主要是对于webdriver方法的封装,这里来举一个栗子,最常用的定位方法,使用find_element()方法通过BY类、字符串、元组三种方法传递定位类型和数据,这里我使用元组的形式(例如locator = ("id","name_box"))来传递参数
1.1定位元素方法封装
这个定位元素的公共方法中,加了很多东西;如果每次定位的时候写这些异常捕获、打印操作的话,那么程序会非常臃肿,所以需要单独提出来,每次需要定位的时候统一调用这个方法。
- 有一个入参locator,格式为(‘定位类型’,‘定位参数值’),返回我们所定位到的元素
- 加入了元素等待,并判断该元素是否存在
- 对关键信息的打印输出,方便定位监控
- 加入了异常捕获,定位失败后可以继续执行程序
def findElementNew(self, locator):
'''定位到元素返回元素对象,没定位到,返回timeout异常'''
# isinstance() 函数来判断一个对象是否是一个已知的类型
if not isinstance(locator, tuple):
print('locator参数类型错误,必须是元祖类型:loc=("id", "value")')
else:
try:
print("正在定位元素信息:定位方式->%s, value值->%s" % (locator[0], locator[1]))
ele = WebDriverWait(self.driver, self.timeout, self.t).until(EC.presence_of_element_located(locator))
return ele
except:
return []
1.2封装类的初始化
对于webdriver的封装,我们要先创建一个class,这样方便我们继承调用这些封装的方法。在class中,我这里设计了一个初始化,每次调用封装的driver时,传递参数,一个必填项:driver,我这样的想法是每次引用这个封装类时,传递一个driver进来
def __init__(self, driver):
self.driver = driver
self.driver.maximize_window()
二、page层书写
page类在继承我们封装的webdriver后,主要写具体的操作步骤,例如输入登录名、输入登录密码、点击登录按钮等操作。
2.1继承driver类
2.2操作步骤书写
class LoginPage(Base): #继承
# 定位登录
loc_user = ('id', 'account')
loc_psw = ('css selector', '[name="password"]')
loc_button = ('xpath', '//*[@id="submit"]') loc_get_user = ('css selector', '#userMenu>a')
loc_forget_psw_page = ('xpath', '/html/body/div/div/div[2]/p/a') def input_user(self, text=''):
self.sendKeys(self.loc_user, text) def input_psw(self, text=''):
self.sendKeys(self.loc_psw, text) def click_login_button(self):
self.click(self.loc_button)
三、case层调用
终于到了第三层,这里我们要做的就是把page层的方法,像搭积木一样搭起来,并且连成完整的操作。
3.1使用unittest,并初始化数据
在unittest框架的基础上,主要是在setUp()方法中初始化我们的数据,例如网址、账号、driver的初始化。
3.2调用方法,完成用例
首先引用page层,然后使用page层的方法搭建case。
python selenium设计模式POM的更多相关文章
- Python Selenium设计模式-POM
前言 本文就python selenium自动化测试实践中所需要的POM设计模式进行分享,以便大家在实践中对POM的特点.应用场景和核心思想有一定的理解和掌握. 为什么要用POM 基于python s ...
- 转 Python Selenium设计模式-POM
前言 本文就python selenium自动化测试实践中所需要的POM设计模式进行分享,以便大家在实践中对POM的特点.应用场景和核心思想有一定的理解和掌握. 为什么要用POM 基于python s ...
- Python Selenium设计模式 - PO设计模式
整理一下python selenium自动化测试实践中使用较多的po设计模式. 为什么要用PO 基于python selenium2开始开始ui自动化测试脚本的编写不是多么艰巨的任务.只需要定位到元素 ...
- Python3+Selenium2完整的自动化测试实现之旅(五):自动化测试框架、Python面向对象以及POM设计模型简介
前言 之前的系列博客,陆续学习整理了自动化测试环境的搭建.IE和Chrome浏览器驱动的配置.selenium-webdriver模块封装的元素定位以及控制浏览器.处理警示框.鼠标键盘等方法的使用,这 ...
- python+selenium 自动化测试实战
一.前言: 之前的文章说过, 要写一篇自动化实战的文章, 这段时间比较忙再加回家过11一直没有更新博客,今天整理一下实战项目的代码共大家学习.(注:项目是针对我们公司内部系统的测试,只能内部网络访问, ...
- 学霸笔记系列 - Python Selenium项目实战(一)—— 怎么去验证一个按钮是启用的(可点击)?
Q: 使用 Python Selenium WebDriver 怎么去验证一个按钮是启用的(可点击)? A:Selenium WebDriver API 里面给出了解决方法is_enabled() 使 ...
- 《一头扎进》系列之Python+Selenium框架设计篇4- 价值好几K的框架,呵!这个框架有点意思啊
1.简介 前面文章,我们实现了框架的一部分功能,包括日志类和浏览器引擎类的封装,今天我们继续封装一个基类和介绍如何实现POM.关于基类,是这样定义的:把一些常见的页面操作的selenium封装到bas ...
- 《一头扎进》系列之Python+Selenium框架设计篇5 - 价值好几K的框架,哎呦!这个框架还真有点料啊!!!
1. 简介 其实,到前面这一篇文章,简单的Python+Selenium自动化测试框架就已经算实现了.接下来的主要是介绍,unittest管理脚本,如何如何加载执行脚本,再就是采用第三方插件,实现输出 ...
- Python+Selenium(1)- 环境搭建
一,Selenium 简介 Selenium是目前最流行的web自动化测试工具,也常用于网络爬虫,已经更新到3以上的版本. 1,组件 它提供了以下web自动化测试组件: Selenium IDE,Fi ...
随机推荐
- codeforces 1284E
计数每一个点被被其他点组成的四边形完全包含的四边形的个数,给出的点没有三点共线的情况 官方题解如下,说的很清楚,也很有技巧 代码也是直接参考官方的题解来的 #include<bits/stdc+ ...
- install multiple versions of CUDA
https://www.pugetsystems.com/labs/hpc/How-To-Install-CUDA-10-together-with-9-2-on-Ubuntu-18-04-with- ...
- 在W10系统中配置Java环境变量后,cmd命令提示符找不到java
java环境变量配置在W10系统上和以前有所区别,可能是W10版本导致也可能是W10一开始就出问题. 问题的表现就是你在环境变量里已经配置完JAVA_HOME,CLASSPATH,path之后在控制台 ...
- jmeter测试出现端口占用
原文地址:https://www.cnblogs.com/deepSleeping/p/12067654.html Jmeter测试会出现端口占用情况 这边在这里做个记录,每次都要百度查询,刚好需要整 ...
- H5_0012:js事件冒泡和捕获
捕获(capture)和冒泡(bubble)是事件传播过程中的两个概念, 比如用户单击某个元素, 但由于元素处于父元素内, 该父元素又处于document对象中, document对象又处于windo ...
- C#中怎样在ToolStripMenuItem下再添加子级菜单
场景 在右键菜单ContextMenuStrip下添加子菜单选项可以通过 ContextMenuStrip menuStrip ToolStripMenuItem mnuChartOption = n ...
- Hdu2099 整除的尾数
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2099 Problem Description 一个整数,只知道前几位,不知道末二位,被另一个整数除尽了 ...
- Spring的代理模式(静态,JDK,CGLIB)
一.静态代理 1.定义业务接口 public interface Subject { void doSomeThing(); } 2.真实业务类实现接口 public class RealSu ...
- C语言-基本数据类型
一.C语言数据类型深度剖析 1.什么是数据类型? -可以理解为固定内存大小的别名 -数据类型是创建变量的模子 -数据类型是对内存的格式化操作 上面三句话如何理解? 在以前的汇编语言时代,我们要存储一些 ...
- Cannot read property 'resolve' of undefined
可能是node下载的有问题 推荐官网:https://nodejs.org/zh-cn/