页面对象模型Page Object Modal是一种脚本设计模型,将页面元素,业务操作分割,当实际页面发生变化的时候,只需要修改页面元素文件,业务操作不需要修改。

具体实现需要先写一个页面公共类,里面写公共的方法,比如把元素定位,元素操作等方法重新封装。之后所有页面类继承页面公共类,页面类中只写该页面需要定位的元素,并把对应元素的操作封装成一个个方法。最后测试类调用这些方法组成一个业务测试用例。

还是以百度搜索为例子

framework包下面放一些公共类

pageobject包下面放需要测试的页面类

testsuites包下面放对应页面的测试类

class BasePage(object):

    def __init__(self,driver):
self.driver = driver def find_element(self,selector):
by = selector[0]
value = selector[1]
element = None
if by =='id' or by =='name' or by == 'class' or by == 'tag' or by =='link' or by =='plink' or by =='css' or by == 'xpath':
if by == 'id':
element = self.driver.find_element_by_id(value)
elif by == 'name':
element = self.driver.find_element_by_name(value)
elif by == 'class':
element = self.driver.find_element_by_class_name(value)
elif by == 'tag':
element = self.driver.find_element_by_tag_name(value)
elif by == 'link':
element = self.driver.find_element_by_link_text(value)
elif by == 'plink':
element = self.driver.find_element_by_partial_link_text(value)
elif by == 'css':
element = self.driver.find_element_by_css_selector(value)
elif by == 'xpath':
element = self.driver.find_element_by_xpath(value)
else:
print('没有找到元素')
return element
else:
print('输入的元素定位方式错误') def send(self,selector,value):
element=self.find_element(selector)#调用封装的定位元素方法
try:
element.send_keys(value)
print('输入的内容%s' % value)
except BaseException:
print('error') def click(self,selector):
element = self.find_element(selector)
element.click()

这是封装的公共方法。封装的元素定位方法需要传一个数组,数组下标第一个是定位方式,第二个是具体的值。元素定位写在封装的元素操作里面,不写在后面页面类里是因为方便在页面类里面重复使用元素。

from framework.base_page import BasePage

class baidu(BasePage):
kw = ['id','kw']#定位搜索输入框
su = ['id','su']#搜索按钮 def kw_send(self,value):#搜索框输入内容
self.send(self.kw,value) def su_click(self):#点击搜索按钮
self.click(self.su)

这是百度搜索页面的页面类。定位的元素单独拿出来,这样就可以重复使用。然后元素的操作也封装成一个方法。就比如上面这个搜索框输入内容。value这个值在后面测试类的时候,可以根据输入的不同,组装成不同的测试用例。

from selenium import webdriver
from pageobject.BaiduPage import baidu
import unittest
class BaiduSerch(unittest.TestCase): def test_baidu(self):
dr = webdriver.Firefox()
dr.get('https://www.baidu.com')
bai = baidu(dr)
bai.kw_send('selenium')
bai.su_click() if __name__ =='__main__':
unittest.main()

最后就是测试类的,这里使用了unittest单元测试框架。bai = baidu(dr)每个页面都需要把driver传进去。使用WebDriver有一个要注意的就是 脚本运行的时候要保持只有一个driver。

python3+selenium框架设计01-Page Object的更多相关文章

  1. python3+selenium框架设计02-自动化测试框架需要什么

    什么是自动化测试框架 自动化测试框架能够提供便利给用户高效完成一些事情,比如,结构清晰开发脚本,多种方式.平台执行脚本,良好的日志和报告去跟踪脚本执行结果. 关于自动化测试框架的定义有很多,在我大致理 ...

  2. python3+selenium框架设计03-封装日志类

    首先我们先来实现日志的功能,日志可以使用python3自带logging模块,不会的可以百度一下相关文章,也可以看我另外一篇文章Python3学习笔记24-logging模块 在封装日志类前,我们需要 ...

  3. python3+selenium框架设计10-发送邮件

    使用python3的email模块和smtplib模块可以实现发送邮件的动能.email模块用来生成email,smtplib模块用来发送邮件,接下来看如何在生成测试报告之后,并将报告放在邮件附件中并 ...

  4. python3+selenium框架设计07-unittest单元测试框架

    可以自行百度学习下单元测试框架,或者看Python3学习笔记26-unittest模块 在项目下新建一个entrance.py文件.并使用之前的测试用例进行演示.目前项目结构. ​ 在entrance ...

  5. python3+selenium框架设计06-编写POM测试用例

    之前我们已经把测试基类,配置文件操作,浏览器引擎类封装完成.接下来使用POM的设计思路来创建我们的测试用例.接下来看一个实例,先在项目下新建pageobject文件夹.这个文件夹下放所有要测试的页面类 ...

  6. python3+selenium框架设计04-封装测试基类

    在完成了日志类封装之后,那我们就要对测试基类进行实现,在其中对一些请求再次封装,在项目下新建一个framework文件夹,在文件夹下新建Base_Page.py文件,这是用来写测试基类的文件.在项目下 ...

  7. python3+selenium框架设计08-进一步实现POM

    之前都是只有一个页面,一个用例.这次两个页面.两个测试用例.其实界面自动化测试最大的难点在于driver的传递,需要保持唯一性.另外就是断言的难点. 修改之前的BaiduPage,新增部分代码 fro ...

  8. python3+selenium框架设计05-配置文件和浏览器引擎类

    python3配置文件的增删改查等操作可以使用内置的ConfigParser模块,可以自行百度学习,也可以看Python3学习笔记27-ConfigParser模块 配置文件一般存放着环境信息,比如u ...

  9. python3+selenium框架设计09-生成测试报告

    使用HTMLTestRunner可以生成测试报告.HTMLTestRunner是unittest模块下的一个拓展,原生的生成报告样式比较丑,GitHub上有大佬优化过后的版本:GitHub地址.下载之 ...

随机推荐

  1. 6.Hystrix-超时设置

    由于客户端请求服务端方法时,服务端方法响应超过1秒将会触发降级,所以我们可以配置Hystrix默认的超时配置 如果我们没有配置默认的超时时间,Hystrix将取default_executionTim ...

  2. HDU - 4625 JZPTREE(第二类斯特林数+树DP)

    https://vjudge.net/problem/HDU-4625 题意 给出一颗树,边权为1,对于每个结点u,求sigma(dist(u,v)^k). 分析 贴个官方题解 n^k并不好转移,于是 ...

  3. hdu 6385

    题意是在一个矩形中任给N个点,求这N个点到矩形某边的最短距离和. 一开始想到直接贪心,求出每个点到矩形一边的最短距离,但题中说到线段间不能交叉,这里好像是比较麻烦,但题目中同时说了点与点之间的横纵坐标 ...

  4. HashMap 集合的遍历

    HashMap 集合的遍历: 两种方式遍历HashMap: //集合hashMap的遍历: //方式一: @Test public void testMethod1(){ HashMap<Str ...

  5. mysql驱动参数变化

    在java平台使用的mysql jdbc驱动为:mysql-connector-java. 在项目中添加如下依赖: <dependency> <groupId>mysql< ...

  6. Java8新特性 重复注解与类型注解

    import java.lang.annotation.Repeatable; import java.lang.annotation.Retention; import java.lang.anno ...

  7. Python学习之json序列化

    一.什么是序列化 在我们存储数据或者网络传输数据的时候,需要对我们的对象进行处理,把对象处理成方便存储和传输的数据格式.这个过程叫序列化,不同的序列化结果也不同,但目的是一样的,都是为了存储和传输 在 ...

  8. 获取对象的key值,并保存在数组中

    const itm = { a:1, b:2, c:3 } //Object.keys获取对象的属性,再遍历 Object.keys(itm).forEach(function(key,i,v){ c ...

  9. Coursera Deep Learning 2 Improving Deep Neural Networks: Hyperparameter tuning, Regularization and Optimization - week3, Hyperparameter tuning, Batch Normalization and Programming Frameworks

    Tuning process 下图中的需要tune的parameter的先后顺序, 红色>黄色>紫色,其他基本不会tune. 先讲到怎么选hyperparameter, 需要随机选取(sa ...

  10. 第25月第8天 100-Days-Of-ML-Code

    1.100-Days-Of-ML-Code https://github.com/Avik-Jain/100-Days-Of-ML-Code https://github.com/llSourcell ...