Python+unittest 项目实战
pom 模式 + 关键字驱动
pom 分层模式: 3层对应3个package
1. 基础层 : 存放selenium 原生方法
2. 页面对象层 : 存放页面的元素 和 页面的动作
3. 测试用例层 : 存放测试用例 与 测试数据
(1)基础层代码如下:
base_page.py代码如下:
""" POM设计思想: 3层即3个package 基础层 : base 主要存放selenium原生方法 页面对象层 : pageobject 主要存放页面的元素和页面的动作 测试用例层 : testase 存放测试用例 及 测试数据 本模块为基础层: 放selenium原生方法 """ from selenium import webdriver from selenium.webdriver.chrome.webdriver import WebDriver class BasePage: """ 新建一个基础层的类BasePage """ def __init__(self,driver): self.driver = driver self.driver.implicitly_wait(10) # 隐性等待,全局生效,整个webdriver生命周期都生效 # 定位元素的关键字 def locate_element(self, method_attribute): """ :type method_attribute: 定位元素的 方法和属性. 通过什么方法 ,什么属性 来定位元素 """ # 将 (By.xpath,attribute) 当成一个元组传入method_attribute # 这样method_attribute本身是一个元组, (method,attribute) 传过来成为 find_element((By.NAME,'username')),是错误的. # 这里需要加*将括号解包. return self.driver.find_element(*method_attribute) # 调用实际参数时解包. arg1 , arg2 = (1,2), arg1=1 ,arg=2 # 输入的关键字 def input(self,method_attribute,value): self.locate_element(method_attribute).send_keys(value) # 单击 的关键字 def click(self,method_attrubute): self.locate_element(method_attrubute).click() def get_actual_value(self,method_attribute): return self.locate_element(method_attribute).text def swith_handle(self,index): handles = self.driver.window_handles self.switch_to.window(handles[index])
base_util.py 代码如下
import unittest from selenium import webdriver class BaseUtil(unittest.TestCase): """ setUp,tearDown方法重写 """ def setUp(self) -> None: global driver driver = webdriver.Chrome() self.driver = driver self.driver.get('********') def tearDown(self): self.driver.quit()
(2) 页面对象层代码如下:
login_page.py代码如下:
""" 页面对象层 : 存放页面的元素和页面的动作 调用基础层的方法 """ from selenium.webdriver.common.by import By from base.base_page import BasePage class LoginPage(BasePage): """ 在页面对象层 新建一个类,继承基础层的类 """ # 页面的元素 denglu = (By.XPATH, "//*[contains(text(), '登录')]") yonghuming = (By.ID, 'loginStr') mima = (By.CSS_SELECTOR, '#pwd') tijiao = (By.XPATH, '//button') panduan = (By.XPATH,"//div[@class='user-info']/div[2]/span") # 页面的动作 # 登录 def login_51zxw(self): self.click(LoginPage.denglu) # 全局变量通过类名去访问. self.input(LoginPage.yonghuming,'*******') self.input(LoginPage.mima,'*******') self.click(LoginPage.tijiao)
search_page.py 代码如下:
from selenium.webdriver.common.by import By from base.base_page import BasePage from pageobject.login_page import LoginPage class SearchPage(BasePage): """ 继承 BasePage ,因为要调用其中的方法 """ # 页面的元素 shuru = (By.XPATH, "//input[@id='keyWordsT']") value = 'web自动化' chaxunanniu = (By.XPATH, "//button[@type='submit']") # 页面的动作 # 查询 def search_page(self): object = LoginPage(self.driver) object.login_51zxw() self.input(SearchPage.shuru,SearchPage.value) self.click(SearchPage.chaxunanniu) # 断言 def get_actual_value(self): return self.get_value(LoginPage.panduan)
(3) 测试用例层代码如下:
test_login.py
from base.base_util import BaseUtil from pageobject.login_page import LoginPage # 导包 alt+enter class TestLogin(BaseUtil): """ 测试用例-登陆 TestLogin类继承了BaseUitil,会调用其中的setUp(),tearDown()方法, 而BaseUitil继承了unittest.TestCase """ def test_login(self): """登录""" classobject = LoginPage(self.driver) # 初始化类对象时,会调用类中的init方法 classobject.login_51zxw() # 调用类方法 self.assertEqual(classobject.get_actual_value(LoginPage.panduan), '*******')
test_search.py
from base.base_util import BaseUtil from pageobject.search_page import SearchPage class TestSearch(BaseUtil): def test_search(self): """查询""" classobject = SearchPage(self.driver) classobject.search_page()
(4) : 执行测试用例代码如下:
all.py 代码如下:
import unittest from HTMLTestRunner import HTMLTestRunner if __name__ == '__main__': # 执行需要的用例,并且生成html格式的自动化测试报告 # 使用unittest默认的测试用例的加载器去发现testcase目录下的.py结尾的测试用例 suite = unittest.defaultTestLoader.discover("./testcase","*.py") # 生成html报告文件 report_file = open("./report/reports.html","wb") # 生成一个HTMLTestRunner运行器对象(必须下载一个文件HTMLTestRunner.py ,放到python的lib目录下) runner = HTMLTestRunner(stream=report_file,title='51zxw自动化测试报告',description="报告详情如下:") # 通过运行器运行测试用例 runner.run(suite)
(5)测试报告:
(6) HTMLTestRunner.py 文件需要下载,且需要修改. 自行查询.
from base.base_util import BaseUtil
from pageobject.login_page import LoginPage # 导包 alt+enter
class TestLogin(BaseUtil):
"""
测试用例-登陆
TestLogin类继承了BaseUitil,会调用其中的setUp(),tearDown()方法, 而BaseUitil继承了unittest.TestCase
"""
def test_login(self):
"""登录"""
classobject = LoginPage(self.driver) # 初始化类对象时,会调用类中的init方法
classobject.login_51zxw() # 调用类方法
self.assertEqual(classobject.get_actual_value(LoginPage.panduan), '猪太肥2018')
钟声敲响了日落,柏油路跃过山坡,一直通向北方的是我们想象,长大后也未曾经过~