zoukankan      html  css  js  c++  java
  • 【Selenium07篇】python+selenium实现Web自动化:PO模型,PageObject模式!

    一、前言

    最近问我自动化的人确实有点多,个人突发奇想:想从0开始讲解python+selenium实现Web自动化测试,请关注博客持续更新!

    这是python+selenium实现Web自动化第七篇博文

    二、Selenium前六篇博文地址:

    【Selenium01篇】python+selenium实现Web自动化:搭建环境,Selenium原理,定位元素以及浏览器常规操作!

    【Selenium02篇】python+selenium实现Web自动化:鼠标操作和键盘操作!

    【Selenium03篇】python+selenium实现Web自动化:元素三类等待,多窗口切换,警告框处理,下拉框选择

    【Selenium04篇】python+selenium实现Web自动化:文件上传,Cookie操作,调用 JavaScript,窗口截图

    【Selenium05篇】python+selenium实现Web自动化:读取ini配置文件,元素封装,代码封装,异常处理,兼容多浏览器执行

    【Selenium06篇】python+selenium实现Web自动化:日志处理

    三、Selenium之-PO模型

    PO 模型:将测试的每个页面看作一个对象,将这些对象抽象成类,完成页面元素和业务操作;将测试类和 page 类区分开来,需要调用什么类去取即可,降低耦合。当页面元素发生变化时,只需修改对应页面类部分,其他部分极可能做到最小修改。

    PO 模型的分层结构(以注册页面作为page对象):

    (1)register_page(页面元素查找类) --->
    (2)register_handle(操作层:将查找到的元素上传递数据) --->
    (3)register_business(业务层:调用操作层,根据操作层传递的数据进行测试业务场景判断,如验证码输入错误场景等) 
    (4)register_cases(测试模块:封装业务层,进行测试用例业务组装)。

    1. 元素查找

    此页面主要是查找注册页面中正常的元素和异常的元素(错误的提示信息)。

    register_email_error = id>register_email-error
    register_nickname_error = id>register_nickname-error
    register_password_error = id>register_password-error
    captcha_code_error = id>captcha_code-error

    #!/usr/bin/env python
    # -*- encoding: utf-8 -*-
    """
    @Time    :   2020/4/17
    @Author  :   公众号:软测之家  更多技术干货,软测视频,面试资料请关注!
    @Contact :   软件测试技术群:695458161
    @License :   (C)Copyright 2017-2019, Micro-Circle
    @Desc    :   None
    """
    
    from basic.find_element import FindElement
    from selenium import webdriver
    
    class RegisterPage(object):
        # 初始化元素查找类,执行该类的时候就会加载
        def __init__(self, driver):
            self.fe = FindElement(driver)
    
        # 注册邮箱
        def get_register_email(self):
            return self.fe.get_element('register_email')
    
        # 用户昵称
        def get_register_nickname(self):
            return self.fe.get_element('register_nickname')
    
        # 密码
        def get_register_password(self):
            return self.fe.get_element('register_password')
    
        # 验证码输入框
        def get_getcode_num(self):
            return self.fe.get_element('getcode_num')
    
        # 验证码图片
        def get_captcha_code(self):
            return self.fe.get_element('captcha_code')
    
        # 注册邮箱框文本提示语
        def get_register_email_placeholder(self):
            print(self.fe.get_element('register_email').get_attribute('placeholder'))
            return self.fe.get_element('register_email').get_attribute('placeholder')
    
        # 用户昵称框文本提示语
        def get_register_nickname_placeholder(self):
            print(self.fe.get_element('register_nickname').get_attribute('placeholder'))
            return self.fe.get_element('register_nickname').get_attribute('placeholder')
    
        # 密码框文本提示语
        def get_register_password_placeholder(self):
            print(self.fe.get_element('register_password').get_attribute('placeholder'))
            return self.fe.get_element('register_password').get_attribute('placeholder')
    
        # 验证码框文本提示语
        def get_captcha_code_placeholder(self):
            print(self.fe.get_element('captcha_code').get_attribute('placeholder'))
            return self.fe.get_element('captcha_code').get_attribute('placeholder')
    
       # 不合法注册邮箱错误提示语
        def get_register_email_error(self):
            return self.fe.get_element('register_email_error')
    
        # 不合法注册用户错误提示语
        def get_register_nickname_error(self):
            return self.fe.get_element('register_nickname_error')
    
        # 不合法密码错误提示语
        def get_register_password_error(self):
            return self.fe.get_element('register_password_error')
    
        # 不合法验证码错误提示语
        def get_captcha_code_error(self):
            return self.fe.get_element('captcha_code_error')
    
    if __name__ == "__main__":
        register_url = 'http://www.5itest.cn/register'
        driver = webdriver.Chrome('../tools/chromedriver.exe')
        driver.get(register_url)
        rp = RegisterPage(driver)
        rp.get_register_email_placeholder()
        rp.get_register_nickname_placeholder()
        rp.get_register_password_placeholder()
        rp.get_captcha_code_placeholder()
        driver.close()

    2.操作层

    上一层我们获取到注册页面中主要元素信息,接下来就该给这些元素进行数据上的操作处理(赋值)。

    #!/usr/bin/env python
    # -*- encoding: utf-8 -*-
    """
    @Time    :   2020/4/17
    @Author  :   公众号:软测之家  更多技术干货,软测视频,面试资料请关注!
    @Contact :   软件测试技术群:695458161
    @License :   (C)Copyright 2017-2019, Micro-Circle
    @Desc    :   None
    """
    
    from page_object_model.regitser_page import RegisterPage
    from selenium import webdriver
    from time import sleep
    
    class RegisterHandle(object):
        def __init__(self, driver):
            self.rp = RegisterPage(driver)
    
        # 输入注册邮箱
        def send_register_email(self, email):
            self.rp.get_register_email().send_keys(email)
    
        # 输入用户昵称
        def send_register_nickname(self, nickname):
            self.rp.get_register_nickname().send_keys(nickname)
    
        # 输入注册密码
        def send_register_password(self, password):
            self.rp.get_register_password().send_keys(password)
    
        # 输入验证码
        def send_register_captcha(self, captcha):
            self.rp.get_getcode_num().send_keys(captcha)
    
        # 获取错误信息
        def get_user_text(self, error_info, error_value):
            text = None
            if error_info == "register_email_error":
                text = self.rp.get_register_email_error().send_keys(error_value)
            elif error_info == 'register_nickname_error':
                text = self.rp.get_register_nickname_error().send_keys(error_value)
            elif error_info == 'register_password_error':
                text = self.rp.register_password_error().send_keys(error_value)
            elif error_info == 'captcha_code_error':
                text = self.rp.captcha_code_error().send_keys(error_value)
            else:
                print("error element not found")
            return text
    
        # 点击注册按钮
        def click_register_btn(self):
            self.rp.get_register_btn().send_keys()
    
    if __name__ == "__main__":
        register_url = 'http://www.5itest.cn/register'
        driver = webdriver.Chrome('../tools/chromedriver.exe')
        driver.get(register_url)
        rh = RegisterHandle(driver)
        rh.send_register_email('jjij@163.com')
        rh.send_register_nickname('MiFan')
        rh.send_register_password('123@123abc')
        rh.send_register_captcha('qwer')
        rh.click_register_btn()
        sleep(5)
        driver.close()

    3.业务层

    业务层,也就是我们要做些什么,做事的逻辑是什么?对于自动化测试来说,就是自动化的测试场景,也就是我们的测试点逻辑。

    #!/usr/bin/env python
    # -*- encoding: utf-8 -*-
    """
    @Time    :   2020/4/17
    @Author  :   公众号:软测之家  更多技术干货,软测视频,面试资料请关注!
    @Contact :   软件测试技术群:695458161
    @License :   (C)Copyright 2017-2019, Micro-Circle
    @Desc    :   None
    """
    
    from page_object_model.register_handle import RegisterHandle
    from selenium import webdriver
    from time import sleep
    
    class RegisterBusiness(object):
        def __init__(self, driver):
            self.rh = RegisterHandle(driver)
    
        # 正常注册
        def common_register(self, register_email, nickname, password, captcha):
            self.rh.send_register_email(register_email)
            self.rh.send_register_nickname(nickname)
            self.rh.send_register_password(password)
            self.rh.send_register_captcha(captcha)
    
        # 判断是否注册成功
        def success_or_fail(self):
            if self.rh.get_register_btn_text() is None:
                return True
            else:
                return False
    
        # 邮箱错误
        def register_email_error(self, register_email, nickname, password, captcha):
            self.common_register(register_email, nickname, password, captcha)
            if self.rh.get_user_text('register_email_error', "请输入有效的电子邮件地址") is None:
                print("注册邮箱输入错误")
                return True
            else:
                return False
    
        # 用户昵称错误
        def register_nickname_error(self, register_email, nickname, password, captcha):
            self.common_register(register_email, nickname, password, captcha)
            if self.rh.get_user_text('register_nickname_error', "字符长度必须大于等于4,一个中文字算2个字符") is None:
                print("用户昵称错误")
                return True
            else:
                return False
    
        # 用户密码错误
        def register_password_error(self, register_email, nickname, password, captcha):
            self.common_register(register_email, nickname, password, captcha)
            if self.rh.get_user_text('register_password_error', "最少需要输入 5 个字符") is None:
                print("用户密码错误")
                return True
            else:
                return False
    
        # 验证码错误
        def captcha_code_error(self, register_email, nickname, password, captcha):
            self.common_register(register_email, nickname, password, captcha)
            if self.rh.get_user_text('captcha_code_error', "验证码错误") is None:
                print("验证码错误")
                return True
            else:
                return False
    
    if __name__ == "__main__":
        register_url = 'http://www.5itest.cn/register'
        driver = webdriver.Chrome('../tools/chromedriver.exe')
        driver.get(register_url)
        rb = RegisterBusiness(driver)
        rb.captcha_code_error('1243589@163.com', 'pass123', 'test@123', 'sds')
    
        sleep(3)
        driver.close()

    4.测试层

    经过一些列分层计划,虽然在每一层我们都在进行测试,但是我们最终还是要回归到本质进行测试,将各层模块一同调用起来。基于业务层编写测试用例。

    #!/usr/bin/env python
    # -*- encoding: utf-8 -*-
    """
    @Time    :   2020/4/17
    @Author  :   公众号:软测之家  更多技术干货,软测视频,面试资料请关注!
    @Contact :   软件测试技术群:695458161
    @License :   (C)Copyright 2017-2019, Micro-Circle
    @Desc    :   None
    """
    
    from page_object_model.register_business import RegisterBusiness
    from selenium import webdriver
    import unittest
    
    class RegisterTestcase(unittest.TestCase):
        @classmethod
        def setUpClass(cls) -> None:
            cls.register_url = 'http://www.5itest.cn/register'
            cls.driver = webdriver.Chrome('../tools/chromedriver.exe')
            cls.driver.get(cls.register_url)
            cls.driver.maximize_window()
            cls.rb = RegisterBusiness(cls.driver)
    
        @classmethod
        def tearDownClass(cls) -> None:
            cls.driver.close()
    
        # 注册邮箱错误,但用例执行成功
        def test_register_email_error(self):
            register_email_error = self.rb.register_email_error('23', 'test01', 'test01abc', 'abc4')
            if register_email_error is True:
                print("账号注册失败,该用例执行成功")
            else:
                print("账号注册成功,该用例执行失败")
    
        # 验证码错误,但用例执行成功‘
        def test_captcha_code_error(self):
            captcha_code_error = self.rb.captcha_code_error('test02@163.com', 'test02', 'test02abc', 'height')
            if captcha_code_error is True:
                print("账号注册失败,该用例执行成功")
            else:
                print("账号注册成功,该用例执行失败")
    
    if __name__ == "__main__":
        unittest.main()

    四、持续更新中请关注

    如果你对此文有任何疑问,如果你觉得此文对你有帮助,如果你对软件测试、接口测试、自动化测试、面试经验交流感兴趣欢迎加入:

    软件测试技术群:695458161,群里发放的免费资料都是笔者十多年测试生涯的精华。还有同行大神一起交流技术哦。

    作者:来自公众号:软测之家
    出处:https://www.cnblogs.com/csmashang/p/12719127.html
    原创不易,欢迎转载,但未经作者同意请保留此段声明,并在文章页面明显位置给出原文链接。

  • 相关阅读:
    .NET ------- 根据关键字查询后,点击详细页面对关键字标红
    .NET ------ 禁止文本输入的三种方式
    .NET ---- 借助repeater在行中进行下拉框编辑 (前端赋值给下拉框)
    Android ------ Android Studio 生成 apk 文件
    CentOS 8 Stream 简单的网络配置
    最受欢迎的 10 本编程书籍(文末附地址)
    优秀程序员必须掌握的 8 种通用数据结构
    一次阿里 P7 的面经,分享给大家
    如何在 Windows 上运行 Linux? 这里有一份攻略!
    为啥程序员下班后从不关电脑?
  • 原文地址:https://www.cnblogs.com/csmashang/p/12719127.html
Copyright © 2011-2022 走看看