Selenium基于Python web自动化测试框架 -- PO
关于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("测试")
Selenium基于Python web自动化测试框架 -- PO的更多相关文章
- 基于Python接口自动化测试框架+数据与代码分离(进阶篇)附源码
引言 在上一篇<基于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 ...
随机推荐
- vue assetsPublicPath
vue 中 /config/index.js, assetsPublicPath 的作用是便于访问打包后的静态资源,默认是相对于根 /, 当然如果直接把dist文件夹当成根来配置域名 可以什么都不用 ...
- CCNA参考链接
http://www.cisco.com/c/en/us/support/docs/lan-switching/vtp/10558-21.html http://www.cisco.com/c/en/ ...
- HDU 5265 pog loves szh II (二分查找)
[题目链接]click here~~ [题目大意]在给定 的数组里选两个数取模p的情况下和最大 [解题思路]: 思路见官方题解吧~~ 弱弱献上代码: Problem : 5265 ( pog love ...
- 1064 - You have an error in your SQL syntax问题解决
新建表sql语句例如以下,在navicat for mysql 中执行,报错. CREATE TABLE `t_article`( `bh` bigint(20) NOT NULL PRIMARY K ...
- Postgis经常使用函数
1,基本操作函数 AddGeometryColumn(<schema_name>, <table_name>,<column_name>, <srid> ...
- 何时、怎样开启 MySql 日志?
假如你是一名 web 开发者.假设你想调试你的应用或提升其性能的话,那你须要去參考各种日志文件.日志是開始故障排除最好的选择.就著名的 MySql 数据库server而言,你须要參考下面日志文件: 错 ...
- [计算机故障处理]EXCEL文件双击不能直接打开
同事的电脑里的EXCEL文件不知什么原因双击不能直接打开了,双击只能打开软件而且是没有任何表格的,但通过软件中的“打开”再找到指定的文件能打开. 解决方案: 打开excel,依次选择:工具-选项-常规 ...
- iOS开发——高级篇——线程同步、线程依赖、线程组
前言 对于iOS开发中的网络请求模块,AFNet的使用应该是最熟悉不过了,但你是否把握了网络请求正确的完成时机?本篇文章涉及线程同步.线程依赖.线程组等专用名词的含义,若对上述名词认识模糊,可先进行查 ...
- iOS开发——基础篇——assign,copy,retain之间的区别以及weak和strong的区别
@property (nonatomic, assign) NSString *title; 什么是assign,copy,retain之间的区别? assign: 简单赋值,不更改索引计数(Refe ...
- 利用JProfile 7分析内存OOM
今天发现一个OOM问题,想来可能是有部分内存没有正确释放导致的 于是想到了之前使用的JProfile来分析一下 由于大概知道哪个类没有释放,可以在Memory Views里看一下对应的类有多少实例来确 ...