PO页面对象设计的包名和HTMLTestRunner生成测试报告
1、
Page Objects的实现
创建UI,在UI的工程中创建对应的包和目录:
base:基础类(存放基础类代码)
Config:配置文件(公用/共的部分)
data:存放测试数据的
image:存放图片文件的
log:存储日志文件
page:对象层(编写关于页面对象层的代码(若web页面发生变更,修改的代码主要在page包中))
report:存储测试报告
test:测试模块(编写页面对象中的所有测试代码)
utils:工具类(编写读取文件的方法)
run.程序执行入口
首先,我们需要在基础包 base 中创建一个 bases.py 文件,在该文件中编写基础代码,代码如下:
from selenium.webdriver.common.by import By from selenium.webdriver.support.expected_conditions import NoSuchFrameException from selenium.webdriver.support.wait import WebDriverWait from selenium import webdriver
#定义了WebDriver,类的构造函数中的driver指的是webdriver实例化后的对象 class WebDriver: def __str__(self): return 'driver' '''不管是单元素定位还是单元素定位参数都是*loc''' '''单个元素定位的方法''' def findElement(self,*loc): return self.driver.find_element(*loc) '''多个元素定位的方法''' def findsElements(self,*loc): return self.driver.find_elements(*loc) def findFrame(self, frameID): return self.driver.switch_to.frame(frameID)
在 page 包中编写对象层的代码,以QQ邮箱全选框为例,创建一个 login.py,代码如下:
from selenium.webdriver.common.by import By from base.bases import WebDriver import time as t #继承了WebDrive的类 class Login(WebDriver): login_loc=(By.ID,'select_all') frameID='login_frame1' def isSelected(self): '''验证是否勾选''' return self.findElement(*self.login_loc).is_selected() def clickAllSelected(self): '''点击全选''' return self.findElement(*self.login_loc).click() def loginFrame(self): '''进入到login页面的iframe框架''' self.findFrame(frameID=self.frameID)
接下来编写测试层的测试用例代码。在test包中创建一个 test_login_page.py文件,在该文件中编写测试用例,代码如下:
import unittest from selenium import webdriver import time as t from page.login import Login #继承unittest.TestCase,Login class QQTest(unittest.TestCase,Login): def setUp(self) -> None: self.driver=webdriver.Chrome() self.driver.maximize_window() self.driver.get('https://file.qq.com/') self.driver.implicitly_wait(30) def tesrDown(self) -> None: self.driver.quit() def test_file_qq_001(self): '''登录验证,校验全选是否勾选''' self.loginFrame() self.assertEqual(self.isSelected(),True) if __name__ == '__main__': unittest.main(verbosity=2)
2、实例(QQ邮箱):
读取文件(当系统不一样时,在 utils 包下的 pathUtils.py 文件)
import os '''获取当前的工程路径''' def base_dir(): #os.path.dirname()去掉脚本的文件名,返回目录 return os.path.dirname(os.path.dirname(__file__))
测试点1(在 test 包下的 test_login.py 文件)
#! /usr/bin/env pytho # -*- coding:utf-8 -*- import unittest from selenium import webdriver class LoginTest(unittest.TestCase): def setUp(self) -> None: pass def tearDown(self) -> None: pass def test_login_001(self): pass def test_login_002(self): pass def test_login_003(self): pass if __name__ == '__main__': unittest.main(verbosity=2)
测试点2(在 test 包下的 test_qq_file.py 文件)
#! /usr/bin/env pytho # -*- coding:utf-8 -*- import unittest from selenium import webdriver import time as t class QQTest(unittest.TestCase): def setUp(self) -> None: self.driver=webdriver.Chrome() self.driver.maximize_window() self.driver.get('https://file.qq.com/') self.driver.implicitly_wait(30) def tearDown(self) -> None: self.driver.quit() def test_file_qq_001(self): '''登录验证:校验全选是否勾选''' self.driver.switch_to.frame('login_frame1') t.sleep(2) isRadio=self.driver.find_element_by_id('select_all') self.assertEqual(isRadio.is_selected(),True) def test_file_qq_002(self): '''登录验证:校验点击注册跳转到注册的页面''' self.driver.switch_to.frame('login_frame1') t.sleep(2) self.driver.switch_to.frame('ptlogin_iframe') t.sleep(2) nowHandler=self.driver.current_window_handle self.driver.find_element_by_link_text('注册新帐号').click() allHandlers=self.driver.window_handles for handler in allHandlers: if nowHandler!=handler: self.driver.switch_to.window(handler) t.sleep(2) self.assertEqual(self.driver.title,'QQ注册') self.driver.close() def test_file_qq_003(self): '''登录验证,登录的提示信息''' self.driver.switch_to.frame('login_frame1') t.sleep(2) self.driver.switch_to.frame('ptlogin_iframe') t.sleep(2) self.driver.find_element_by_link_text('帐号密码登录').click() t.sleep(2) username=self.driver.find_element_by_xpath('//*[@id="uin_tips"]') self.assertEqual(username.text,'支持QQ号/邮箱/手机号登录') if __name__ == '__main__': #verbosity=2(详细模式):测试结果会显示每个测试⽤例的所有相关信息 unittest.main(verbosity=2)
执行run.py
import time import unittest
#导入HTNLTestRunner包时,需要将提前准备好的HTMLTestRunner.py文件复制到python3下面的lib目录下 import HTMLTestRunner from utils.pathUtils import base_dir import os def suites(): '''获取被执行的测试套件''' suite=unittest.TestLoader().discover( # start_dir='D:/code/uiFrame/test', #/打开文件夹,\关闭文件夹 start_dir=os.path.join(base_dir(),'test'), pattern='test_*.py', top_level_dir=None ) return suite def run(): '''执行测试套件''' fp=open(os.path.join(base_dir(),'report','report.html'),'wb') runer=HTMLTestRunner.HTMLTestRunner( stream=fp, title='QQ邮箱测试报告', description='QQ邮箱测试报告详细信息', ) runer.run(suites()) if __name__ == '__main__': run()
最后生成测试报告report.html如下图:
也可以将生成的测试report报告文件命名为带有时间的html文件,代码如下:
import time import unittest import HTMLTestRunner from utils.pathUtils import base_dir import os def suites(): '''获取被执行的测试套件''' suite=unittest.TestLoader().discover( # start_dir='D:/code/uiFrame/test', #/打开文件夹,\关闭文件夹 start_dir=os.path.join(base_dir(),'test'), pattern='test_*.py', top_level_dir=None ) return suite def nowTime(): return time.strftime('%y_%m_%d_%H_M_%S',time.localtime()) def run(): '''执行测试套件''' fp=open(os.path.join(base_dir(),'report',nowTime()+'report.html'),'wb') runer=HTMLTestRunner.HTMLTestRunner( stream=fp, title='QQ邮箱测试报告', description='QQ邮箱测试报告详细信息', ) runer.run(suites()) if __name__ == '__main__': run()
修改代码后再次运行run.py,如下图: