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,如下图:

 

 

  

 

   

 

posted @ 2021-08-19 19:00  就不将就就  阅读(139)  评论(0编辑  收藏  举报