关于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

  1. from selenium.webdriver.support.wait import WebDriverWait
  2.  
  3. '''
  4. 这个类主要是完成所有页面的一些公共方法的封装
  5. '''
  6. class Action(object):
  7. #初始化
  8. def __init__(self,se_driver):
  9. self.driver = se_driver
  10.  
  11. #定义open方法
  12. def open(self,url):
  13. self.driver.get(url)
  14. self.driver.maximize_window()
  15.  
  16. #重写元素定位的方法
  17. def find_element(self,*loc):
  18. try:
  19. WebDriverWait(self.driver,).until(lambda driver:driver.find_element(*loc).is_displayed())
  20. return self.driver.find_element(*loc)
  21. except Exception as e:
  22. print("未找到%s"%(self,loc))
  23.  
  24. #定义script方法,用于执行js脚本
  25. def script(self,src):
  26. self.driver.execute_script(src)
  27.  
  28. #重写send_keys方法
  29. def send_keys(self,loc,value,clear_first=True,clik_first=True):
  30. try:
  31. if clik_first:
  32. self.find_element(*loc).click()
  33. if clear_first:
  34. self.find_element(*loc).clear()
  35. self.find_element(*loc).send_keys(value)
  36. except AttributeError:
  37. print("未找到%s"%(self,loc))

login_page.py

  1. from selenium.webdriver.common.by import By
  2. from seleniumframework.PO import base_page
  3. import time
  4.  
  5. class LoginPage(base_page.Action):
  6. link_loc = (By.LINK_TEXT,"登录")
  7. name_loc = (By.ID,"TANGRAM__PSP_8__userName")
  8. password_loc = (By.ID,"TANGRAM__PSP_8__password")
  9. submit_loc = (By.ID,"TANGRAM__PSP_8__submit")
  10.  
  11. username_top = (By.LINK_TEXT,"hanxiaobei")
  12.  
  13. def click_link(self):
  14. self.find_element(*self.link_loc).click()
  15. time.sleep() #等待3秒,等待登录弹窗加载完成
  16.  
  17. def run_case(self,value1,value2):
  18. self.find_element(*self.name_loc).send_keys(value1)
  19. self.find_element(*self.password_loc).send_keys(value2)
  20. time.sleep() #手动输入验证码
  21. self.find_element(*self.submit_loc).click()
  22. time.sleep() #等待5秒,登录后的页面加载完成
  23.  
  24. def get_username(self):
  25. return self.find_element(*self.username_top).text

test_login.py

  1. import unittest
  2. from selenium import webdriver
  3. from seleniumframework.PO.login_page import LoginPage
  4. import time
  5.  
  6. class TestBaiduLogin(unittest.TestCase):
  7. """UI自动化登录"""
  8. def setUp(self):
  9. self.url = "http://www.baidu.com"
  10. self.driver = webdriver.Firefox()
  11. self.driver.implicitly_wait()
  12. # self.verificationErrors = []
  13.  
  14. def tearDown(self):
  15. time.sleep()
  16. self.driver.quit()
  17. # self.assertEqual([],self.verificationErrors)
  18.  
  19. def test_login(self):
  20. """百度登录"""
  21. sp = LoginPage(self.driver)
  22. sp.open(self.url)
  23. sp.click_link()
  24. sp.run_case("hanxiaobei","xxxxxxx")
  25. self.assertEqual(sp.get_username(),"hanxiaobei",msg="验证失败!")

main.py 运行的主入口

  1. import unittest
  2. import HTMLTestRunner
  3.  
  4. #相对路径
  5. testcase_path = ".\\testcase"
  6. report_path = ".\\report\\report.html"
  7. def creat_suite():
  8. uit = unittest.TestSuite()
  9. discover = unittest.defaultTestLoader.discover(testcase_path,pattern="test_*.py")
  10. for test_suite in discover:
  11. # print(test_suite)
  12. for test_case in test_suite:
  13. uit.addTest(test_case)
  14. return uit
  15.  
  16. suite = creat_suite()
  17. fp = open(report_path,"wb")
  18. runner = HTMLTestRunner.HTMLTestRunner(stream=fp,title="测试结果",description="测试搜索结果")
  19. runner.run(suite)
  20. fp.close()

解决报告命名的问题:

  1. now = time.strftime("%Y-%m-%d-%H-%M-%S",time.localtime(time.time()))
  2. print(now)
  1. 3 report_path = ".\\report\\"+now+"report.html"

测试报告截图:

search_page.py

  1. from selenium.webdriver.common.by import By
  2. from seleniumframework.PO import base_page
  3.  
  4. #继承base后既可以调用base的方法也可自己添加新的方法
  5. class SearchPage(base_page.Action):
  6.  
  7. #通过id进行定位元素
  8. search_loc = (By.ID,"kw")
  9.  
  10. def run_case(self,value):
  11. #第一种利用原生的send_keys方法
  12. self.find_element(*self.search_loc).send_keys(value)
  13.  
  14. #第二种利用二次封装的send_keys方法
  15. # self.send_keys(self.search_loc,value)

test_search.py

  1. import unittest
  2. from selenium import webdriver
  3. from seleniumframework.PO.search_page import SearchPage
  4. import time
  5.  
  6. class TestBaiduSearch(unittest.TestCase):
  7. """UI自动化搜索"""
  8. def setUp(self):
  9. self.url = "http://www.baidu.com"
  10. self.driver = webdriver.Firefox()
  11. self.driver.implicitly_wait()
  12. self.verificationErrors = []
  13.  
  14. def tearDown(self):
  15. time.sleep()
  16. self.driver.quit()
  17. self.assertEqual([],self.verificationErrors)
  18.  
  19. def test_search(self):
  20. """搜索测试关键字"""
  21. sp = SearchPage(self.driver)
  22. sp.open(self.url)
  23. sp.run_case("测试")

Selenium基于Python web自动化测试框架 -- PO的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. 剑指Offer - 两个链表第一个公共节点

    https://www.nowcoder.com/practice/6ab1d9a29e88450685099d45c9e31e46?tpId=13&tqId=11189&tPage= ...

  2. 怎样用ccache加速cocos2d-x android版本号的编译

    下面步骤在MAC下測试通过: 首先是安装CCache, 能够用homebrew brew install --HEAD ccache 也能够用源代码安装 git clone https://githu ...

  3. 【剑指Offer学习】【面试题31:连续子数组的最大和】

    题目:输入一个整型数组,数组里有正数也有负数.数组中一个或连续的多个整数组成一个子数组.求全部子数组的和的最大值.要求时间复杂度为O(n). 样例说明: 比如输入的数组为{1, -2, 3, 10, ...

  4. hdu1863

    #include<cstdio> #include<algorithm> using namespace std; int N,M; struct edge { int u,v ...

  5. python爬虫【第2篇】【多进程】

    一.多进程 1.fork方法(os模块,适用于Lunix系统) fork方法:调用1次,返回2次.原因:操作系统经当前进程(父进程)复制出一份进程(子进程),两个进程几乎完全相同,fork方法分别在父 ...

  6. 容器与容器编排实战系列 1 -- Docker 安装

    CentOS7.4 下安装Docker 详细步骤 第一步:安装Docker yum install -y yum-utils device-mapper-persistent-data lvm2 yu ...

  7. luogu2827 蚯蚓

    题目大意 本题中,我们将用符号[c]表示对c向下取整,例如:[3.0」= [3.1」= [3.9」=3. 蛐蛐国最近蚯蚓成灾了!隔壁跳蚤国的跳蚤也拿蚯蚓们没办法,蛐蛐国王只好去请神刀手来帮他们消灭蚯蚓 ...

  8. how to modify vs2017

    https://docs.microsoft.com/en-us/visualstudio/install/modify-visual-studio 直接用everything搜索vs_install ...

  9. gitlab gerrit jenkins CI/CD环境集成

    http://blog.csdn.net/williamwanglei/article/details/38498465

  10. 22.Extjs Panel中显示多行工具栏(tbar)

    转自:http://blog.sina.com.cn/s/blog_454fbf740100t0xj.html 在应用程序的制作中,我们经常性的会用到工具栏,在Extjs中Panel中提供了tbar和 ...