Web自动化之PO设计模式

本文详细介绍了Web自动化测试中的PO设计模式,从方法封装的基本步骤出发,逐步展示V1到V6的设计优化,包括页面对象库层、操作层和业务层的划分,强调了代码复用、可维护性和隐藏实现细节的重要性。通过具体的代码实例,解释了如何创建和优化PO文件,以及如何在测试用例中应用这些设计模式。
摘要由CSDN通过智能技术生成

1. 方法封装基本步骤

  1. 找个合适的位置存放封装的方法(谁都能够方便调用)
  2. 定义方法(函数)
  3. 将要封装内容原方不动的拷贝到定义的方法内部
  4. 观察拷贝过的来的内容, 是否缺少某些东西(是否有报错)
  5. 缺什么给什么(修复错误), 确认是否需要添加返回值
  6. 将原来的位置替换为封装好的方法名(使用)

2. PO设计模式

V1


  • 实现形式:一条测试用例对应一个测试脚本

  • 缺陷:

    • 由于是同一个模块下的测试用例, 测试步骤完全一致, 测试数据不同, 测试脚本代码存在高度冗余
    • 一条用例对应一个测试脚本, 后期不好维护
  • 结论:属于自动化测试, 但是存在缺陷

  • 代码实现:

    • 账号不存在
    • 密码不存在
    """
    账号不存在
    点击首页的‘登录’链接,进入登录页面
    输入一个不存在的用户名
    输入密码
    输入验证码
    点击登录按钮
    获取错误提示信息
    """
    from selenium import webdriver
    import time
    
    driver = webdriver.Chrome()
    driver.get('http://127.0.0.1/')
    driver.implicitly_wait(10)  # 隐式等待
    driver.maximize_window()  # 窗口最大化
    
    # 点击首页的‘登录’链接,进入登录页面
    driver.find_element_by_link_text('登录').click()
    
    # 输入一个不存在的用户名
    driver.find_element_by_id('username').send_keys('13811110000')
    # 输入密码
    driver.find_element_by_id('password').send_keys('123456')
    # 输入验证码
    driver.find_element_by_id('verify_code').send_keys('8888')
    # 点击登录按钮
    driver.find_element_by_name('sbtbutton').click()
    
    # 获取错误提示信息
    msg = driver.find_element_by_class_name('layui-layer-content').text
    print('msg:', msg)
    
    time.sleep(3)
    driver.quit()
    
    """
    密码错误
    点击首页的‘登录’链接,进入登录页面
    输入用户名
    输入一个错误的密码
    输入验证码
    点击登录按钮
    获取错误提示信息
    """
    from selenium import webdriver
    import time
    
    driver = webdriver.Chrome()
    driver.get('http://127.0.0.1/')
    driver.implicitly_wait(10)  # 隐式等待
    driver.maximize_window()  # 窗口最大化
    
    # 点击首页的‘登录’链接,进入登录页面
    driver.find_element_by_link_text('登录').click()
    
    # 输入用户名
    driver.find_element_by_id('username').send_keys('13800001111')
    # 输入一个错误的密码
    driver.find_element_by_id('password').send_keys('error')
    # 输入验证码
    driver.find_element_by_id('verify_code').send_keys('8888')
    # 点击登录按钮
    driver.find_element_by_name('sbtbutton').click()
    
    # 获取错误提示信息
    msg = driver.find_element_by_class_name('layui-layer-content').text
    print('msg:', msg)
    
    time.sleep(3)
    driver.quit()
    

V2


  • 实现形式:

    • 一条测试用例对应一个测试方法
    • 类级别 Fixture 和方法级别 Fixture 结合使用, 优化所有测试用例的前置操作和后续收尾工作
  • 缺陷:元素定位及元素操作部分的代码依然存在冗余

  • 结论:属于自动化测试, 但是存在缺陷

  • 代码实现:

    """
    登录测试用例
    """
    import unittest
    from selenium import webdriver
    import time
    
    
    class TestTPShopLogin(unittest.TestCase):
        """登录测试类"""
    
        @classmethod
        def setUpClass(cls) -> None:
            cls.driver = webdriver.Chrome()
            cls.driver.get('http://127.0.0.1/')
            cls.driver.implicitly_wait(10)  # 隐式等待
            cls.driver.maximize_window()  # 窗口最大化
    
        @classmethod
        def tearDownClass(cls) -> None:
            time.sleep(3)
            cls.driver.quit()
    
        def setUp(self) -> None:
            self.driver.get('http://127.0.0.1/')  # 打开首页
            # 点击首页的‘登录’链接,进入登录页面
            self.driver.find_element_by_link_text('登录').click()
    
        # def tearDown(self) -> None:
        #     pass
    
        def test_account_does_not_exist(self):
            """用户不存在"""
    
            # 输入一个不存在的用户名
            self.driver.find_element_by_id('username').send_keys('13811110000')
            # 输入密码
            self.driver.find_element_by_id('password').send_keys('123456')
            # 输入验证码
            self.driver.find_element_by_id('verify_code').send_keys('8888')
            # 点击登录按钮
            self.driver.find_element_by_name('sbtbutton').click()
    
            time.sleep(2)
            # 获取错误提示信息
            msg = self.driver.find_element_by_class_name('layui-layer-content').text
            print('msg:', msg)
    
            # 设置断言判断测试结果
            # self.assertIn(预期结果, 实际结果)
            self.assertIn('账号不存在', msg)
    
        def test_wrong_password(self):
            """密码错误"""
    
            # 输入用户名
            self.driver.find_element_by_id('username').send_keys('13800001111')
            # 输入一个错误的密码
            self.driver.find_element_by_id('password').send_keys('error')
            # 输入验证码
            self.driver.find_element_by_id('verify_code').send_keys('8888')
            # 点击登录按钮
            self.driver.find_element_by_name('sbtbutton').click()
    
            # 获取错误提示信息
            msg = self.driver.find_element_by_class_name('layui-layer-content').text
            print('msg:', msg)
    
            # 设置断言判断测试结果
            self.assertIn('密码错误', msg)
    
    
    if __name__ == '__main__':
        unittest.main()
    

V3


  • 核心内容

    • 方法封装:是将一些有共性的或多次被使用的代码提取到一个方法中,供其他地方调用
    • 好处:
      • 减少代码冗余度
      • 提高可维护性
      • 隐藏代码的具体实现细节
  • 实现内容

    • 浏览器驱动对象工具类的封装实现
      1. 定义浏览器对象工具类
      2. 定义获取和退出浏览器对象方法 : 确保在一次代码执行周期内, 只有一个浏览器驱动对象
      3. 调用
    • 获取弹窗信息方法的封装实现
      • 方法封装基本步骤
        1. 找个合适的位置存放封装的方法(谁都能够方便调用)
        2. 定义方法(函数)
        3. 将要封装内容原方不动的拷贝到定义的方法内部
        4. 观察拷贝过的来的内容, 是否缺少某些东西(是否有报错)
        5. 缺什么给什么(修复错误), 确认是否需要添加返回值
        6. 将原来的位置替换为封装好的方法名(使用)
  • 代码实现

    """
    登录测试用例
    """
    import unittest
    from selenium import webdriver
    import time
    
    from utils import DriverUtil, get_tip_message
    
    
    class TestTPShopLogin(unittest
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值