关于selenium测试框架首先想到的就是PO模型,简单说下PO模型

PO模型的概念和理解:

PO就是一个设计思想,将代码以页面为单位进行组织,针对这个页面上的所有信息、相关操作都放到一个类中,从而使具体的测试用例变成了简单的调用和验证操作。

优点:进行了拆分和分层

缺点:对于复杂的业务page层变了,case也需要去改动

PO模型的目录结构:

其中,base_page是login_page、search_page的基础。test_login调用login_page,login_page调用base_page,同理test_search。

PO代码示例:

base_page.py

from selenium.webdriver.support.wait import WebDriverWait

'''

这个类主要是完成所有页面的一些公共方法的封装

'''

class Action(object):

#初始化

def __init__(self,se_driver):

self.driver = se_driver

#定义open方法

def open(self,url):

self.driver.get(url)

self.driver.maximize_window()

#重写元素定位的方法

def find_element(self,*loc):

try:

WebDriverWait(self.driver,).until(lambda driver:driver.find_element(*loc).is_displayed())

return self.driver.find_element(*loc)

except Exception as e:

print("未找到%s"%(self,loc))

#定义script方法,用于执行js脚本

def script(self,src):

self.driver.execute_script(src)

#重写send_keys方法

def send_keys(self,loc,value,clear_first=True,clik_first=True):

try:

if clik_first:

self.find_element(*loc).click()

if clear_first:

self.find_element(*loc).clear()

self.find_element(*loc).send_keys(value)

except AttributeError:

print("未找到%s"%(self,loc))

login_page.py

from selenium.webdriver.common.by import By

from seleniumframework.PO import base_page

import time

class LoginPage(base_page.Action):

link_loc = (By.LINK_TEXT,"登录")

name_loc = (By.ID,"TANGRAM__PSP_8__userName")

password_loc = (By.ID,"TANGRAM__PSP_8__password")

submit_loc = (By.ID,"TANGRAM__PSP_8__submit")

username_top = (By.LINK_TEXT,"hanxiaobei")

def click_link(self):

self.find_element(*self.link_loc).click()

time.sleep() #等待3秒,等待登录弹窗加载完成

def run_case(self,value1,value2):

self.find_element(*self.name_loc).send_keys(value1)

self.find_element(*self.password_loc).send_keys(value2)

time.sleep() #手动输入验证码

self.find_element(*self.submit_loc).click()

time.sleep() #等待5秒,登录后的页面加载完成

def get_username(self):

return self.find_element(*self.username_top).text

test_login.py

import unittest

from selenium import webdriver

from seleniumframework.PO.login_page import LoginPage

import time

class TestBaiduLogin(unittest.TestCase):

"""UI自动化登录"""

def setUp(self):

self.url = "http://www.baidu.com"

self.driver = webdriver.Firefox()

self.driver.implicitly_wait()

# self.verificationErrors = []

def tearDown(self):

time.sleep()

self.driver.quit()

# self.assertEqual([],self.verificationErrors)

def test_login(self):

"""百度登录"""

sp = LoginPage(self.driver)

sp.open(self.url)

sp.click_link()

sp.run_case("hanxiaobei","xxxxxxx")

self.assertEqual(sp.get_username(),"hanxiaobei",msg="验证失败!")

main.py 运行的主入口

import unittest

import HTMLTestRunner

#相对路径

testcase_path = ".\\testcase"

report_path = ".\\report\\report.html"

def creat_suite():

uit = unittest.TestSuite()

discover = unittest.defaultTestLoader.discover(testcase_path,pattern="test_*.py")

for test_suite in discover:

# print(test_suite)

for test_case in test_suite:

uit.addTest(test_case)

return uit

suite = creat_suite()

fp = open(report_path,"wb")

runner = HTMLTestRunner.HTMLTestRunner(stream=fp,title="测试结果",description="测试搜索结果")

runner.run(suite)

fp.close()

解决报告命名的问题:

now = time.strftime("%Y-%m-%d-%H-%M-%S",time.localtime(time.time()))

print(now)

3 report_path = ".\\report\\"+now+"report.html"

测试报告截图:

search_page.py

from selenium.webdriver.common.by import By

from seleniumframework.PO import base_page

#继承base后既可以调用base的方法也可自己添加新的方法

class SearchPage(base_page.Action):

#通过id进行定位元素

search_loc = (By.ID,"kw")

def run_case(self,value):

#第一种利用原生的send_keys方法

self.find_element(*self.search_loc).send_keys(value)

#第二种利用二次封装的send_keys方法

# self.send_keys(self.search_loc,value)

test_search.py

import unittest

from selenium import webdriver

from seleniumframework.PO.search_page import SearchPage

import time

class TestBaiduSearch(unittest.TestCase):

"""UI自动化搜索"""

def setUp(self):

self.url = "http://www.baidu.com"

self.driver = webdriver.Firefox()

self.driver.implicitly_wait()

self.verificationErrors = []

def tearDown(self):

time.sleep()

self.driver.quit()

self.assertEqual([],self.verificationErrors)

def test_search(self):

"""搜索测试关键字"""

sp = SearchPage(self.driver)

sp.open(self.url)

sp.run_case("测试")

基于Python接口自动化测试框架+数据与代码分离(进阶篇)附源码

引言 在上一篇讲过了接口自动化测试框架的搭建,最核心的模块功能就是测试数据库初始化,再来看看之前的框架结构: 可以看出testcase ...

Web自动化测试框架-PO模式

Web自动化测试框架(WebTestFramework)是基于Selenium框架且采用PageObject设计模式进行二次开发形成的框架. 一.适用范围:传统Web功能自动化测试.H5功能自动化测试 ...

python web自动化测试框架搭建(功能&接口)——功能测试模块

功能测试使用selenium,模块有: 1.futil: 公共方法,如元素高亮显示 # coding=utf-8 """高亮显示元素""" ...

python web自动化测试框架搭建(功能&接口)——测试用例执行和结果收集

由于unittest框架中结果收集在不同文件中,所以此处重写结果收集方法,加入执行时间,失败信息,失败截图等 TestRunner.py # coding=utf-8 import sys impor ...

python web自动化测试框架搭建(功能&接口)——环境搭建

自动化测试框架一般需要实现以下通用功能 执行前准备 结束后清理 执行步骤输出 执行结果输出 错误.失败截图 测试报告 发送邮件 日志 需要的软件和python第三方库有: 通用: JDK Eclips ...

Selenium基于Python web自动化基础一 -- 基础汇总及简单操作

Selenium是UI层WEB端的自动化测试框架,也是目前市面上比较流行的自动化测试框架. ui层自动化测试本质是什么?模拟用户的真实操作行为. 基础汇总: 导入所需要的模块 from seleniu ...

python web自动化测试框架搭建(功能&接口)——接口用例实现

测试用例基类: # coding=utf-8 import unittest import Logger log = Logger.Loger() class BaseCase(unittest.Te ...

python web自动化测试框架搭建(功能&接口)——接口公共方法

接口公共方法有:数据引擎.http引擎.Excel引擎 1.数据引擎:获取用例.结果检查.结果统计 # -*- coding:utf-8 -*- from XlsEngine import XlsEn ...

python web自动化测试框架搭建(功能&接口)——接口测试模块

Python接口测试采用python读取excel的方法,通过requests库发送请求和接收响应.模块有: Data:用于存放excel用例的,用例格式: iutil: 接口公共方法,数据引擎.ht ...

随机推荐

终于解决各种动画问题了,感谢雨松MOMO

http://www.xuanyusong.com/archives/2222 看懂了,什么问题关于动画的都可以解决的,加油!

ABK (枚举)

ABK Accepted : 24   Submit : 176 Time Limit : 1000 MS   Memory Limit : 65536 KB  题目描述 ABK是一个比A+B还要简单 ...

第十九章 数据访问(In .net4.5) 之 处理数据

1. 概述 本章介绍 数据库.Json和Xml.web services 三种介质上的数据操作. 2. 主要内容 2.1 数据库 ① 建立连接 .net平台中的数据连接类都继承自DbConnectio ...

css 嵌套 元素所属类别

元素所属类别 Metadata content(元数据元素)(8) base,link,meta,noscript,script,style,template, title Flow content( ...

CentOS7 安装NFS SSH免密码登陆

配置5台虚拟机 ip为192.168.1.160 - 164,使用160作为共享服务器 使用yum安装nfs 以及rpcbind,有很多文章介绍,这里不再赘述 一.启动服务 1.启动rpcbind s ...

OpenCV点滴2

明天回家了-- 昨天去见了老师,去之前告诉自己不要紧张,去了后还是紧张了,语无伦次,很没礼貌--(不敢看老师的眼睛) 刚才妈打电话说让我早点回去,不知道为什么,在空荡荡的宿舍里听到妈的声音,眼泪会夺眶 ...

EJB系列 - 会话Bean基础知识

本人博客文章网址:https://www.peretang.com/basic-knowledge-of-session-bean/ 什么是会话 有限的时间周期内,客户端和服务器之间的连接 为什么使用 ...

php 中self,this的区别和实地操作

面向对象编程(OOP,Object OrientedProgramming)现已经成为编程人员的一项基本技能.利用OOP的思想进行PHP的高级编程,对于提高PHP编程能力和规划web开发构架都是很有意 ...

MySQL 之管理脚本

Mysql中查看每个IP的连接数 ) as ip , count(*) from information_schema.processlist group by ip;

Dev Label显示不同颜色字体

labelControl1.Text = "Size = 14
" + "Bold ...

python的web自动化框架实例_Selenium基于Python web自动化测试框架 -- PO相关推荐

  1. python论坛系统源码_十个基于Python的BBS论坛类开源web框架汇总(附源码地址

    1.LBForum LBForum是用django开发的论坛系统,LBForum主要注重部署的方便性和易用性,功能方面目前还比较简单. LBForum的开发尽量遵照Django可复用app原则,因此即 ...

  2. python扫雷的代码及原理_基于Python实现的扫雷游戏实例代码

    摘要:这篇Python开发技术栏目下的"基于Python实现的扫雷游戏实例代码",介绍的技术点是"Python实现.Python.实例代码.扫雷游戏.扫雷.游戏" ...

  3. python中numpy数组的合并_基于Python中numpy数组的合并实例讲解

    基于Python中numpy数组的合并实例讲解 Python中numpy数组的合并有很多方法,如 - np.append() - np.concatenate() - np.stack() - np. ...

  4. 设计自己的基于Selenium 的自动化测试框架-Java版(2) - 定义自己的工作流程

    设计自己的基于Selenium的自动化测试框架-Java版(2) -定义自己的工作流程 Work flow chart 上图是整个工作流程,红色虚线上面的需要手动来完成,红色虚线下面的实现自动化. 我 ...

  5. 设计自己的基于Selenium 的自动化测试框架-Java版(3) - 给框架分分层

    设计自己的基于Selenium 的自动化测试框架-Java版(3) - 给框架分分层 给我们的框架分为3层,分别是叫逻辑层,数据层,对象层. 这三层的存储格式都用xml来表示. 1.逻辑层 (test ...

  6. python识别ppt文件格式 ——(专栏:基于python编写简单office阅卷程序③)

    ● 研二在读学生,非工科非计算机专业,故代码简陋初级勿喷,本文仅为记录和快乐分享. ○ 感谢肯定,感谢点赞收藏分享,转载请注明本页出处即可. ____Ⓙ即刻@王昭没有君 本文仅为笔者摸索总结-欢迎订正 ...

  7. 【优秀课设】武汉光迅科技22校招笔试Python题改进(增加GUI)——基于Python的125温度传感器模块数据处理

    武汉光迅科技22校招笔试Python题改进(增加GUI) 基于Python的125温度传感器模块数据处理 原本的基础代码: blog.csdn.net/weixin_53403301/article/ ...

  8. python识别excel文件格式 ——(专栏:基于python编写简单office阅卷程序②)

    ● 研二在读学生,非工科非计算机专业,故代码简陋初级勿喷,本文仅为记录和快乐分享. ○ 感谢肯定,感谢点赞收藏分享,转载请注明本页出处即可. ____Ⓙ即刻@王昭没有君 本文仅为笔者摸索总结-欢迎订正 ...

  9. python识别word文件格式 ——(专栏:基于python编写简单office阅卷程序①)

    ● 研二在读学生,非工科非计算机专业,故代码简陋初级勿喷,本文仅为记录和快乐分享. ○ 感谢肯定,感谢点赞收藏分享,转载请注明本页出处即可. ____Ⓙ即刻@王昭没有君 本文仅为笔者摸索总结-欢迎订正 ...

最新文章

  1. c语言小数点进制转换,新手求教,关于含小数的二进制转换成十进制
  2. Ubuntu下使用VSCode的launch.json及tasks.json编写
  3. 谈谈如何利用 valgrind 排查内存错误
  4. 扼杀 304,Cache-Control: immutable
  5. jdbc连接云数据库mysql数据库_使用jdbc连接mysql数据库
  6. 学习资料参考:从深度学习到自然语言处理
  7. linux中文件查找命令
  8. 写日报、写日报,每天都要写,写工作日报到底有什么意义?
  9. 14-父子组件通讯,父传子(props)
  10. 哲学家谈“情绪”——欲望以上,理性未满
  11. 360浏览器怎么添加拓展(有图文步骤)
  12. IE8上面的旋转和透明度,利用滤镜属性去处理(兼容css3的transform和rgba())
  13. 公历转农历linux C程序
  14. Pyspark学习笔记小总
  15. 抗混叠滤波及折叠频率
  16. curl php 宝塔 开启_宝塔安装php失败
  17. 俄罗斯方块linux服务器,基与Linux环境下 C 俄罗斯方块
  18. What are the best ways to learn self discipline?
  19. 实战:如何优化宝贝标题?
  20. C语言100个囚徒和灯泡,经典算法问题其一:百日囚徒问题

热门文章

  1. [通达OA二次开发]FineReport 与通达OA集成 如何实现统一登录。
  2. 时间时区错误修复moment
  3. 小米2s安卓10刷机包_小米 2S 4.3 ROM刷机包 CM10.2_8.30 官方流畅版
  4. 432. 全 O(1) 的数据结构
  5. oracle建用户之前是否必须建表空间,Oracle数据库-建库、建表空间,建用户
  6. 第一个小游戏“三子棋”超详细
  7. 预制资源(Prefab)
  8. 台式机开机无logo显示直接进入欢迎界面,无法进入bios
  9. HDU 2209 翻纸牌游戏 模拟
  10. android中实现ImageView中显示视频的略缩图