赞
踩
目录
关于selenium测试框架首先想到的就是PO模型,简单说下PO模型
PO就是一个设计思想,将代码以页面为单位进行组织,针对这个页面上的所有信息、相关操作都放到一个类中,从而使具体的测试用例变成了简单的调用和验证操作。
优点:进行了拆分和分层
缺点:对于复杂的业务page层变了,case也需要去改动
其中,base_page是login_page、search_page的基础。test_login调用login_page,login_page调用base_page,同理test_search。
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,20).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) #等待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(20) #手动输入验证码
- self.find_element(*self.submit_loc).click()
- time.sleep(5) #等待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(20)
- # self.verificationErrors = []
-
- def tearDown(self):
- time.sleep(5)
- 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()

解决报告命名的问题:
- 1 now = time.strftime("%Y-%m-%d-%H-%M-%S",time.localtime(time.time()))
- 2 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(20)
- self.verificationErrors = []
-
- def tearDown(self):
- time.sleep(5)
- self.driver.quit()
- self.assertEqual([],self.verificationErrors)
-
- def test_search(self):
- """搜索测试关键字"""
- sp = SearchPage(self.driver)
- sp.open(self.url)
- sp.run_case("测试")

感谢每一个认真阅读我文章的人!!!
如果下面这些资料用得到的话可以直接拿走:
1、自学开发或者测试必备的完整项目源码与环境
2、测试工作中所有模板(测试计划、测试用例、测试报告等)
3、软件测试经典面试题
4、Python/Java自动化测试实战.pdf
5、Jmeter/postman接口测试全套视频获取
6、Python学习路线图
那么在这里我也精心准备了上述大纲的详细资料包含:电子书,简历模块,各种工作模板,面试宝典,自学项目等。如下,需要的点击下方群名片加入群聊免费领取
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。