python selenium自动化测试框架搭建的方法步骤

设计思路

本文整理归纳以往的工作中用到的东西,现汇总成基础测试框架提供分享。

框架采用python3 + selenium3 + PO + yaml + ddt + unittest等技术编写成基础测试框架,能适应日常测试工作需要。

1、使用Page Object模式将页面定位和业务操作分开,分离测试对象(元素对象)和测试脚本(用例脚本),一个页面建一个对象类,提高用例的可维护性;

2、使用yaml管理页面控件元素数据和测试用例数据。例如元素ID等发生变化时,不需要去修改测试代码,只需要在对应的页面元素yaml文件中修改即可;

3、分模块管理,互不影响,随时组装,即拿即用。

GitHub项目地址:https://github.com/yingoja/DemoUI

测试框架分层设计

  • 把常见的操作和查找封装成基础类,不管是什么产品,可直接拿来复用
  • 业务层主要是封装对象页面类,一个页面建一个类,业务层页面继承基础层
  • 用例层针对产品页面功能进行构造摸拟执行测试
  • 框架层提供基础组件,支撑整个流程执行及功能扩展,给用例层提供各页面的元素数据、用例测试数据,测试报告输出等

测试框架目录结构

如下思维导图目录结构介绍:

编写用例方法

login.yaml

testinfo:
    - id: test_login001
     title: 登录测试
     info: 打开抽屉首页
 testcase:
    - element_info: login-link-a
     find_type: ID
     operate_type: click
     info: 打开登录对话框
    - element_info: mobile
     find_type: ID
     operate_type: send_keys
     info: 输入手机号
    - element_info: mbpwd
     find_type: ID
     operate_type: send_keys
     info: 输入密码
    - element_info: //input[@class='keeplogin']
     find_type: XPATH
     operate_type: click
     info: 单击取消自动登录单选框
    - element_info: //span[text()='登录']
     find_type: XPATH
     operate_type: click
     info: 单击登录按钮
    - element_info: userProNick
     find_type: ID
     operate_type: perform
     info: 鼠标悬停账户菜单
    - element_info: //a[@class='logout']
     find_type: XPATH
     operate_type: click
     info: 选择退出
 check:
    - element_info: //div[@class='box-mobilelogin']/div[1]/span
     find_type: XPATH
     info: 检查输入手机号或密码,登录异常提示
    - element_info: userProNick
     find_type: ID
     info: 成功登录
    - element_info: reg-link-a
     find_type: ID
     info: 检查退出登录是否成功

例如,我们要新增登录功能测试用例:

首先,只需在testyaml目录下新增一个页面对象yaml文件,参考login.yaml格式编写即可。这些文件是提供给封装页面对象类调用并执行定位识别操作。

login_data.yaml

 -
  id: test_login001.1
  detail : 手机号和密码为空登录
  screenshot : phone_pawd_empty
  data:
   phone: ""
   password: ""
  check :
    - 手机号不能为空
 -
  id: test_login001.2
  detail : 手机号为空登录
  screenshot : phone_empty
  data :
   phone: ""
   password : aa
  check :
   - 手机号不能为空
 -
  id: test_login001.3
  detail : 密码为空登录
  screenshot : pawd_empty
  data :
   phone : 13511112222
   password: ""
  check :
   - 密码不能为空
 -
  id: test_login001.4
  detail : 非法手机号登录
  screenshot : phone_error
  data :
   phone : abc
   password: aa
  check :
   - 手机号格式不对
 -
  id: test_login001.5
  detail : 手机号或密码不匹配
  screenshot : pawd_error
  data :
   phone : 13511112222
   password: aa
  check :
   - 账号密码错误
 -
  id: test_login001.6
  detail : 手机号和密码正确
  screenshot : phone_pawd_success
  data :
   phone : 13865439800
   password: ********
  check :
   - yingoja

 login_data.yaml

login_data.yaml

其次,在testdata目录下新增一个login_data.yaml文件提供给登录接口传参的测试数据,编写格式参考login_data.yaml文件。

loginPage.py

 #!/usr/bin/env python
 # _*_ coding:utf-8 _*_
  __author__ = 'YinJia'

  import os,sys
  sys.path.append(os.path.dirname(os.path.dirname(os.path.dirname(__file__))))
  from config import setting
  from selenium.webdriver.support.select import Select
  from selenium.webdriver.common.action_chains import ActionChains
 from selenium.webdriver.common.by import By
 from public.page_obj.base import Page
 from time import sleep
 from public.models.GetYaml import getyaml

 testData = getyaml(setting.TEST_Element_YAML + '/' + 'login.yaml')

 class login(Page):
   """
   用户登录页面
   """
   url = '/'
   dig_login_button_loc = (By.ID, testData.get_elementinfo(0))
   def dig_login(self):
     """
     首页登录
     :return:
     """
     self.find_element(*self.dig_login_button_loc).click()
     sleep(1)

   # 定位器,通过元素属性定位元素对象
   # 手机号输入框
   login_phone_loc = (By.ID,testData.get_elementinfo())
   # 密码输入框
   login_password_loc = (By.ID,testData.get_elementinfo())
   # 取消自动登录
   keeplogin_button_loc = (By.XPATH,testData.get_elementinfo())
   # 单击登录
   login_user_loc = (By.XPATH,testData.get_elementinfo())
   # 退出登录
   login_exit_loc = (By.ID, testData.get_elementinfo())
   # 选择退出
   login_exit_button_loc = (By.XPATH,testData.get_elementinfo())

   def login_phone(self,phone):
     """
     登录手机号
     :param username:
     :return:
     """
     self.find_element(*self.login_phone_loc).send_keys(phone)

   def login_password(self,password):
     """
     登录密码
     :param password:
     :return:
     """
     self.find_element(*self.login_password_loc).send_keys(password)

   def keeplogin(self):
     """
     取消单选自动登录
     :return:
     """
     self.find_element(*self.keeplogin_button_loc).click()

   def login_button(self):
     """
     登录按钮
     :return:
     """
     self.find_element(*self.login_user_loc).click()

   def login_exit(self):
     """
     退出系统
     :return:
     """
     above = self.find_element(*self.login_exit_loc)
     ActionChains(self.driver).move_to_element(above).perform()
     sleep(2)
     self.find_element(*self.login_exit_button_loc).click()

   def user_login(self,phone,password):
     """
     登录入口
     :param username: 用户名
     :param password: 密码
     :return:
     """
     self.open()
     self.dig_login()
     self.login_phone(phone)
     self.login_password(password)
     sleep(1)
     self.keeplogin()
     sleep(1)
     self.login_button()
     sleep(1)

  phone_pawd_error_hint_loc = (By.XPATH,testData.get_CheckElementinfo(0))
  user_login_success_loc = (By.ID,testData.get_CheckElementinfo(1))
   exit_login_success_loc = (By.ID,testData.get_CheckElementinfo(2))

   # 手机号或密码错误提示
   def phone_pawd_error_hint(self):
     return self.find_element(*self.phone_pawd_error_hint_loc).text

   # 登录成功用户名
   def user_login_success_hint(self):
     return self.find_element(*self.user_login_success_loc).text

   # 退出登录
   def exit_login_success_hint(self):
     return self.find_element(*self.exit_login_success_loc).text

然后,在page_obj目录下新增一个loginPage.py文件,是用来封装登录页面对象类,执行登录测试流程操作。

login_sta.py

 #!/usr/bin/env python
 # _*_ coding:utf-8 _*_
 __author__ = 'YinJia'

 import os,sys
 sys.path.append(os.path.dirname(os.path.dirname(__file__)))
 import unittest,ddt,yaml
 from config import setting
 from public.models import myunit,screenshot
 from public.page_obj.loginPage import login
 from public.models.log import Log

 try:
   f =open(setting.TEST_DATA_YAML + '/' + 'login_data.yaml',encoding='utf-8')
   testData = yaml.load(f)
 except FileNotFoundError as file:
   log = Log()
   log.error("文件不存在:{0}".format(file))

 @ddt.ddt
 class Demo_UI(myunit.MyTest):
   """抽屉新热榜登录测试"""
   def user_login_verify(self,phone,password):
     """
     用户登录
     :param phone: 手机号
     :param password: 密码
     :return:
     """
     login(self.driver).user_login(phone,password)

   def exit_login_check(self):
     """
     退出登录
     :return:
     """
     login(self.driver).login_exit()

   @ddt.data(*testData)
   def test_login(self,datayaml):
     """
     登录测试
     :param datayaml: 加载login_data登录测试数据
     :return:
     """
     log = Log()
    log.info("当前执行测试用例ID-> {0} ; 测试点-> {1}".format(datayaml['id'],datayaml['detail']))
     # 调用登录方法
     self.user_login_verify(datayaml['data']['phone'],datayaml['data']['password'])
     po = login(self.driver)
     if datayaml['screenshot'] == 'phone_pawd_success':
       log.info("检查点-> {0}".format(po.user_login_success_hint()))
       self.assertEqual(po.user_login_success_hint(), datayaml['check'][0], "成功登录,返回实际结果是->: {0}".format(po.user_login_success_hint()))
       log.info("成功登录,返回实际结果是->: {0}".format(po.user_login_success_hint()))
       screenshot.insert_img(self.driver, datayaml['screenshot'] + '.jpg')
       log.info("-----> 开始执行退出流程操作")
       self.exit_login_check()
       po_exit = login(self.driver)
       log.info("检查点-> 找到{}元素,表示退出成功!".format(po_exit.exit_login_success_hint()))
       self.assertEqual(po_exit.exit_login_success_hint(), '注册',"退出登录,返回实际结果是->: {0}".format(po_exit.exit_login_success_hint()))
       log.info("退出登录,返回实际结果是->: {0}".format(po_exit.exit_login_success_hint()))
     else:
       log.info("检查点-> {0}".format(po.phone_pawd_error_hint()))
       self.assertEqual(po.phone_pawd_error_hint(),datayaml['check'][] , "异常登录,返回实际结果是->: {}".format(po.phone_pawd_error_hint()))
       log.info("异常登录,返回实际结果是->: {0}".format(po.phone_pawd_error_hint()))
       screenshot.insert_img(self.driver,datayaml['screenshot'] + '.jpg')

 if __name__=='__main__':
   unittest.main()

最后,在testcase目录下创建测试用例文件login_sta.py,采用ddt数据驱动读取yaml测试数据文件

综上所述,编写用例方法只需要按以上四个步骤创建->编写即可。

执行如下主程序,可看输出的实际结果。

#!/usr/bin/env python
# _*_ coding:utf-8 _*_
__author__ = 'YinJia'

import os,sys
sys.path.append(os.path.dirname(__file__))
from config import setting
import unittest,time
from package.HTMLTestRunner import HTMLTestRunner
from public.models.newReport import new_report
from public.models.sendmail import send_mail

# 测试报告存放文件夹,如不存在,则自动创建一个report目录
if not os.path.exists(setting.TEST_REPORT):os.makedirs(setting.TEST_REPORT + '/' + "screenshot")

def add_case(test_path=setting.TEST_DIR):
  """加载所有的测试用例"""
  discover = unittest.defaultTestLoader.discover(test_path, pattern='*_sta.py')
  return discover

def run_case(all_case,result_path=setting.TEST_REPORT):
  """执行所有的测试用例"""
  now = time.strftime("%Y-%m-%d %H_%M_%S")
  filename = result_path + '/' + now + 'result.html'
  fp = open(filename,'wb')
  runner = HTMLTestRunner(stream=fp,title='抽屉新热榜UI自动化测试报告',
              description='环境:windows 7 浏览器:chrome',
              tester='Jason')
  runner.run(all_case)
  fp.close()
  report = new_report(setting.TEST_REPORT) #调用模块生成最新的报告
  send_mail(report) #调用发送邮件模块

if __name__ =="__main__":
  cases = add_case()
  run_case(cases)

测试结果展示

HTML报告日志

HTML报告点击截图,弹出截图

测试报告通过的日志

自动截图存放指定的目录

邮件测试报告

到此这篇关于python selenium自动化测试框架搭建的方法步骤的文章就介绍到这了,更多相关python selenium自动化测试框架搭建内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

作者:YinJia
出处:http://www.cnblogs.com/yinjia/

(0)

相关推荐

  • python+selenium开发环境搭建图文教程

    web 调试工具介绍和开发环境搭建 python与selenium开发环境搭建: 一.下载python软件:https://www.python.org/ 下载完后,进行安装,安装成功后,打开IDLE(Python 3.6.2),如下图: 如上图在里面输入print("Hello Wrod!")按回车,出现Hello Wrod!,说明已经把IDLE装好了,下面打开dos命令窗口输入Python按回车.如下图: 出现python版本号等信息说明python已经安装成功.如果出现错误信息,

  • selenium3+python3环境搭建教程图解

    1.首先安装火狐浏览器 有单独文章分享怎么安装 2.搭建python环境 安装python,安装的时候把path选好,就不用自己在配置,安装方法有单独文档分享 安装好以后cmd打开输入python查看是否配置好 3.安装pip 一般python会默认带一个,放置和python一个地址,这样就不需要重新配置环境变量 安装路径可以上网查询很多的教程 https://pypi.python.org/pypi/pip 下载pip源码包 减压以后在cmd 窗口下用cd命令切换到 E:\新建文件夹 (2)\

  • Python + selenium自动化环境搭建的完整步骤

    前言 本文主要介绍了关于Python+selenium自动化环境搭建的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧 Python +selenium+googledriver 小白的血泪安装使,不停的总结写心得是理解透彻的毕竟之路 一,python的安装: 首先去Python的官网下载安装包:https://www.python.org/  ,大家也可以通过我们进行下载://www.jb51.net/softs/415916.html 2.下载完成后如下图所示 3.双

  • selenium+python自动化测试环境搭建步骤

    相对于自动化测试工具QTP来说,selenium小巧.免费,而且兼容Google.FireFox.IE多种浏览器,越来越多的人开始使用selenium进行自动化测试. 我是使用的python 2.7,下面说一下selenium+Python的自动化测试环境搭建. 安装Python环境,从python官网下载安装包 双击安装包,进行安装 可以选择python的安装目录,按步骤安装,直至完成. 在早期的版本中,需要单独安装setuptools和pip,在新的python安装包版本中已经集成了setu

  • selenium+python自动化测试之环境搭建

    最近由于公司有一个向谷歌网站上传文件的需求,需要进行web的自动化测试,选择了selenium这个自动化测试框架,以前没有接触过这门技术,所以研究了一下,使用python来实现自动化脚本,从环境搭建到实现脚本运行. selenium是一个用于Web应用程序测试的工具.Selenium测试直接运行在浏览器中,就像真正的用户在操作一样.支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera等.支持自动录制动作和自动

  • python selenium自动化测试框架搭建的方法步骤

    设计思路 本文整理归纳以往的工作中用到的东西,现汇总成基础测试框架提供分享. 框架采用python3 + selenium3 + PO + yaml + ddt + unittest等技术编写成基础测试框架,能适应日常测试工作需要. 1.使用Page Object模式将页面定位和业务操作分开,分离测试对象(元素对象)和测试脚本(用例脚本),一个页面建一个对象类,提高用例的可维护性: 2.使用yaml管理页面控件元素数据和测试用例数据.例如元素ID等发生变化时,不需要去修改测试代码,只需要在对应的

  • python+selenium自动化框架搭建的方法步骤

    环境及使用软件信息 python 3 selenium 3.13.0 xlrd 1.1.0 chromedriver HTMLTestRunner 说明: selenium/xlrd只需要再python环境下使用pip install 名称即可进行对应的安装. 安装完成后可使用pip list查看自己的安装列表信息. chromedriver:版本需和自己的chrome浏览器对应,百度下载. 作用:对chrome浏览器进行驱动. HTMLTestRunner:HTMLTestRunner是Pyt

  • Python爬虫代理池搭建的方法步骤

    一.为什么要搭建爬虫代理池 在众多的网站防爬措施中,有一种是根据ip的访问频率进行限制,即在某一时间段内,当某个ip的访问次数达到一定的阀值时,该ip就会被拉黑.在一段时间内禁止访问. 应对的方法有两种: 1. 降低爬虫的爬取频率,避免IP被限制访问,缺点显而易见:会大大降低爬取的效率. 2. 搭建一个IP代理池,使用不同的IP轮流进行爬取. 二.搭建思路 1.从代理网站(如:西刺代理.快代理.云代理.无忧代理)爬取代理IP: 2.验证代理IP的可用性(使用代理IP去请求指定URL,根据响应验证

  • Python + selenium 自动化测试框架详解

    目录 自动化测试框架 1.基础层(通用层) 2.功能层(页面层) 3.业务层 4.用例层 4层框架对应的项目工程 总结 自动化测试框架 项目自动化测试框架设计为4层 1.基础层(通用层) 基础层: 将通用,重复性比较高的代码封装到这里. 写通用的代码的. 其他3层想要的话,就可以直接调用. 例如: 读取测试数据的代码,读取配置信息的代码:截图的代码的,定位元素的代码等等 2.功能层(页面层) 功能层: pages 封装页面的. 把页面封装成类.类中包含:属性和方法 把页面上的界面元素定义成类的属

  • Python 离线工作环境搭建的方法步骤

    准备 在断网的和联网的机器安装pip,下载地址https://pypi.python.org/pypi/pip 在联网的开发机器上安装好需要的包 例如: pip3 install paramiko pip3 install fabric 打包已安装的包 新建pyenv文件夹用来存储下载下来的所需安装包 pip3 list #查看安装的包 #使用pip导出当前环境所有依赖包信息文件 pip3 freeze >requirements.txt # 下载所有依赖包到本地 pip3 install -r

  • Go语言框架Beego项目搭建的方法步骤

    1,命令行查看 Go 开发包的环境变量配置信息 命令行说明如下: 第 1 行,执行 go env 指令,将输出当前 Go 开发包的环境变量状态. 第 2 行,GOARCH 表示目标处理器架构. 第 3 行,GOBIN 表示编译器和链接器的安装位置. 第 7 行,GOOS 表示目标操作系统. 第 8 行,GOPATH 表示当前工作目录. 第 10 行,GOROOT 表示 Go 开发包的安装目录. 从命令行输出中,可以看到 GOPATH 设定的路径为:C:\Users\Administrator\g

  • Python+unittest+requests 接口自动化测试框架搭建教程

    一.Python+unittest+requests+HTMLTestRunner 完整的接口自动化测试框架搭建_00--框架结构简解 首先配置好开发环境,下载安装Python并下载安装pycharm,在pycharm中创建项目功能目录.如果不会的可以百度Google一下,该内容网上的讲解还是比较多比较全的! 大家可以先简单了解下该项目的目录结构介绍,后面会针对每个文件有详细注解和代码. common: --configDb.py:这个文件主要编写数据库连接池的相关内容,本项目暂未考虑使用数据库

  • selenium3.0+python之环境搭建的方法步骤

    本文目标: 使用selenium3.0+python3操纵浏览器,打开百度网站.(相当于selenium的hello world) 环境基础:python3已安装,pycharm编辑器已安装. 第一步:安装selenium 打开cmd窗口,输入pip install selenium,然后回车. 第二步:安装WebDriver 1)下载WebDriver 由于selenium是通过调用浏览器的给的接口来操纵浏览器,所以WebDriver不统一,需要根据自己的浏览器登录相应的地址,下载最新的Web

  • Python3+RIDE+RobotFramework自动化测试框架搭建过程详解

    Python2.7已于2020年1月1日开始停用,之前RF做自动化都是基于Python2的版本. 没办法,跟随时代的脚步,我们也不得不升级以应用新的控件与功能. 升级麻烦,直接全新安装. 一.Python安装 最新版Python下载地址:https://www.python.org/ 根据操作系统选择对应版本制品下载安装即可,本机用的是Windows x86-64 executable installer. 注意事项: 安装完成后检查下环境变量,默认会配置好,可以检查下. 检测是否安装成功,可在

随机推荐