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')



posted @ 2022-05-04 17:07  Avicii_2018  阅读(236)  评论(0编辑  收藏  举报