unittest学习之POM设计模式优化

将直接一步步写代码更改为使用unittest模式

  • 继承unittest.TestCase 类
  • setUp(self) -> None:前置方法
  • def tearDown(self) -> None:后置方法
  • 测试用例方法需要以test开头

优化元素等待时间问题

  • from selenium.webdriver.support.wait import WebDriverWait
  • from selenium.webdriver.support import expected_conditions as EC
  • 使用WebDriverWait(self.web,10).until((EC.visibility_of_all_elements_located((By.XPATH,’//*[@id=“name”]’))))方法,使得元素加载完成后在操作

引入POM设计模式,使用单独的类来管理某个界面的元素

  • 新建login_page.py
  • 新建类来管理页面元素
  • login_page.py内容
'''管理登录界面所有的元素'''
from selenium.webdriver.common.by import By
class LoginPage:
    #用户名的输入框
    username_imnput = (By.XPATH,'//*[@id="name"]')
    #密码输入框
    password_input = (By.XPATH,'//*[@id="password"]')
    #登录按钮
    login_button = (By.XPATH, '//*[@id="submit"]')

继续优化,封装常用公共方法,如 click ,sendkeys等

  • 新建common.py 文件
  • 新建InitBrowser 类,封装方法
  • 优化后的代码
'''封装公用的方法'''
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

class InitBrowser():
    '''浏览器的常用操作封装'''
    def __init__(self):
        self.web = webdriver.Chrome('./driver/chromedriver.exe')
        self.web.get('https://sso.kuaidi100.com/sso/authorize.do')

    def wait_element_visible(self,locate):
        '''
        等待元素出现
        :return: 返回这个元素
        '''
        # element = WebDriverWait(self.web, 10).until((EC.visibility_of_all_elements_located(locate)))
        element = WebDriverWait(self.web, 10).until(EC.visibility_of_element_located(locate))
        return element
    def click(self,locate):
        '''
        点击之前自动调用等待方法
        :return:
        '''
        self.wait_element_visible(locate).click()

    def send_kyes(self,locate,value):
        '''
        输入之前,自动调用等待时间方法
        :return:
        '''
        print(locate,value)
        self.wait_element_visible(locate).send_keys(value)

让用例继承公共类,直接调用公用方法

  • 用例继承InitBrowser类

项目结构

  • 项目目录

在这里插入图片描述

  • TestCase_po.py 文件
'''测试用例'''
from po_test.Pages.login_page import LoginPage
from po_test.common.common import InitBrowser
import unittest

class TestCases(unittest.TestCase,InitBrowser):
    def setUp(self) -> None:
        '''前置操作,初始化,打开浏览器,连接数据库,初始化数据'''
        # self.web = InitBrowser()
        InitBrowser.__init__(self)
        pass
    def tearDown(self) -> None:
        '''后置操作,关闭浏览器 关闭数据库 清理测试数据'''
        pass
    def test_01(self):
        #等待元素出现后再去操作
        # WebDriverWait(self.web,10).until((EC.visibility_of_all_elements_located((By.XPATH,'//*[@id="name"]'))))
        # self.web.find_element_by_xpath('//*[@id="name"]').send_keys('10085')
        #
        # WebDriverWait(self.web, 10).until((EC.visibility_of_all_elements_located((By.XPATH, '//*[@id="password"]'))))
        # self.web.find_element_by_xpath('//*[@id="password"]').send_keys('10086')
        #
        # WebDriverWait(self.web, 10).until((EC.visibility_of_all_elements_located((By.XPATH, '//*[@id="submit"]'))))
        # self.web.find_element_by_xpath('//*[@id="submit"]').click()
        '''引用POM'''
        #因为LoginPage.password_input 为返回的元组类型,而find_element接受参数为两个str,因为使用*将元组数据解析为可变参数,即两个str参数
        # self.web.find_element(*LoginPage.password_input).send_keys('10086')
        # self.web.find_element(*LoginPage.password_input).send_keys('10086')
        # self.web.find_element(*LoginPage.login_button).click()

        '''封装公用方法,click sendkey find_by,并继承'''
        self.send_kyes(LoginPage.username_imnput,'*******')
        self.send_kyes(LoginPage.password_input, '*******')
        self.click(LoginPage.login_button)

if __name__ == '__main__':
    unittest.main()
  • login_page.py
'''管理登录界面所有的元素'''
from selenium.webdriver.common.by import By
class LoginPage:
    #用户名的输入框
    username_imnput = (By.XPATH,'//*[@id="name"]')
    #密码输入框
    password_input = (By.XPATH,'//*[@id="password"]')
    #登录按钮
    login_button = (By.XPATH, '//*[@id="submit"]')
  • common.py
'''封装公用的方法'''
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

class InitBrowser():
    '''浏览器的常用操作封装'''
    def __init__(self):
        self.web = webdriver.Chrome('./driver/chromedriver.exe')
        self.web.get('https://sso.kuaidi100.com/sso/authorize.do')

    def wait_element_visible(self,locate):
        '''
        等待元素出现
        :return: 返回这个元素
        '''
        # element = WebDriverWait(self.web, 10).until((EC.visibility_of_all_elements_located(locate)))
        element = WebDriverWait(self.web, 10).until(EC.visibility_of_element_located(locate))
        return element
    def click(self,locate):
        '''
        点击之前自动调用等待方法
        :return:
        '''
        self.wait_element_visible(locate).click()

    def send_kyes(self,locate,value):
        '''
        输入之前,自动调用等待时间方法
        :return:
        '''
        print(locate,value)
        self.wait_element_visible(locate).send_keys(value)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值