• Selenium4+Python3系列(十一) - Page Factory设计模式


    写在前面:

    Page Object模式,目的是将元素定位和元素操作分层,只接触测试内容,不写基础内容,便于后续对自动化测试用例体系的维护,这是中心思想,也是核心。

    那么我们继续将简洁延续,这里沿用JavaPage Factory模式思想,旨在减少代码冗余,简单易用,具有高度的可扩展能力。

    所以,这里我们使用基于PythonPage Factory设计模式

    Page Factory的使用

    作用:

    • 支持以注解的方式定义元素
    • 支持同一个元素多种定位方式
    • 支持动态的定位方式

    1、安装

    pip install pythium

    2、使用 Page Factory 模式将页面元素分离

    我们将继续沿用Page Object模式的风格,这里我又加了一层自己暂时定义叫基础层,现在就变成了四层:基础层、对象层、操作层、业务层。

    下面将举例说明Page Factory设计模式,以登陆功能为例,来做进一步讲解。

    3、基础层

    用来存放driver及初始化使用,示例代码如下:

    python
    # -*- coding: utf-8 -*-
    """
    @Time : 2022/12/5 21:07
    @Auth : 软件测试君
    @File :BasePage.py
    @IDE :PyCharm
    @Motto:ABC(Always Be Coding)
    """
    from selenium import webdriver
    from webdriver_manager.chrome import ChromeDriverManager
    
    from pagefactory.LoginPage import LoginPage
    
    
    class BasePage(object):
        """
        用来存放driver及初始化使用
        """
    
        def __init__(self) -> None:
            """
            初始化driver
            """
            self.driver = webdriver.Chrome(ChromeDriverManager().install())
            self.driver.maximize_window()
    
        def open_url(self, url: str) -> None:
            """
            打开项目首页
            :param url:
            :return:
            """
            self.driver.get(url)
    
        def quit_browser(self) -> None:
            """
            退出浏览器
            :return:
            """
            self.driver.quit()
    
        def get_LoginPage(self) -> LoginPage:
            # 返回登陆实体
            return LoginPage(self.driver)

    4、对象层

    用于存放页面元素定位和控件操作,示例代码如下:

    python
    # -*- coding: utf-8 -*-
    """
    @Time : 2022/12/5 21:13
    @Auth : 软件测试君
    @File :LoginPage.py
    @IDE :PyCharm
    @Motto:ABC(Always Be Coding)
    """
    import time
    
    from pythium import find_by, Page
    from selenium.webdriver.remote.webelement import WebElement
    
    
    class LoginPage(Page):
        """
        用于存放页面元素定位和控件操作
        """
    
        # 定位用户名元素
        @find_by(css="input[type='text']")
        def username_el(self) -> WebElement: ...
    
        # 定位密码元素
        @find_by(css="input[type='password']")
        def password_el(self) -> WebElement: ...
    
        # 定位登陆元素
        @find_by(name="submit")
        def loginbtn_el(self) -> WebElement: ...
    
        # 定位错误信息元素
        @find_by(id_="alert")
        def errormsg_el(self) -> WebElement: ...
    
        # 输入用户名
        def send_username(self, username: str):
            """
            输入用户名
            :param self:
            :param username:
            :return:
            """
            self.username_el().clear()
            self.username_el().send_keys(username)
    
        # 输入密码
        def send_password(self, password: str):
            """
            输入密码
            :param self:
            :param password:
            :return:
            """
            self.password_el().clear()
            self.password_el().send_keys(password)
    
        # 点击登陆按钮
        def click_loginbtn(self):
            """
            点击登陆按钮
            :return:
            """
            self.loginbtn_el().click()
    
        # 获取错误信息
        def get_erorMsg(self) -> str:
            """
            获取错误信息
            :return:
            """
            time.sleep(1)
            return self.errormsg_el().text

    5、操作层

    则是一些封装好的功能用例模块,也可以理解成我们写测试用例的步骤,示例代码如下:

    python
    # -*- coding: utf-8 -*-
    """
    @Time : 2022/12/5 21:33
    @Auth : 软件测试君
    @File :LoginAction.py
    @IDE :PyCharm
    @Motto:ABC(Always Be Coding)
    """
    from pagefactory.BasePage import BasePage
    
    
    class LoginAction(object):
        """
        登陆操作
        """
    
        def login(self, username: str, password: str):
            """
            登陆操作
            :param username: 用户名
            :param password: 密码
            :return:
            """
            basepage = BasePage()
            basepage.open_url('http://localhost:8080/login')
            basepage.get_LoginPage().send_username(username)
            basepage.get_LoginPage().send_password(password)
            basepage.get_LoginPage().click_loginbtn()
            msg = basepage.get_LoginPage().get_erorMsg()
            basepage.quit_browser()
            return msg

    6、业务层

    则是我们真正的测试用例的操作部分,示例代码如下:

    python
    # -*- coding: utf-8 -*-
    """
    @Time : 2022/12/5 21:40
    @Auth : 软件测试君
    @File :TestLogin.py
    @IDE :PyCharm
    @Motto:ABC(Always Be Coding)
    """
    import unittest
    
    from pagefactory.LoginAction import LoginAction
    
    
    class TestLogin(unittest.TestCase):
        """
        测试登陆功能
        """
        def test_login(self):
            msg = LoginAction().login("1", "1")
            self.assertEquals(msg, "用户名或密码错误!")

    从以上代码看,如果页面元素发生变化,我们在对应类里修改对应元素即可,而操作和业务层流程类及用例都不用改,如果仅是业务流程更改,只需要维护业务层流程类业务脚本,其他几个类都不用改,从而做到了很好的将页面、元素、脚本进行了分离。

    至此,关于Page Factory的使用分享完毕,有兴趣的同学可以自行拓展。

    写在最后

    又有很久没有更文了,因为一直都是996工作制,很难有时间去写文章,这里还请各位粉丝朋友理解,不过,我会努力持续更文。

    我是六哥,如果觉得文章对您有帮助,请继续关注我,原创不易,不求打赏,只求转发!🙏


    __EOF__

  • 本文作者: 久曲健的测试窝
  • 本文链接: https://www.cnblogs.com/longronglang/p/16953801.html
  • 关于博主: 评论和私信会在第一时间回复。或者直接私信我。
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
  • 声援博主: 如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。
  • 相关阅读:
    DAY17-深度学习100例-卷积神经网络(CNN)识别眼睛状态
    【十天系统学习】SMOKE多模式排放清单处理技术及EDGAR/MEIC清单制作方法以及 CMAQ空气质量模式运行
    编程可以自学吗
    134.如何进行实时计算
    6.30年终小结,学生时代结束
    Java 守护线程的作用 Java 守护线程线程
    RabbitMQ快速入门
    excel中设置图表图例的位置
    k8s 部署专业版 Thingsboard 集群
    c++ nlohmann::json 中文支持
  • 原文地址:https://www.cnblogs.com/longronglang/p/16953801.html