首页 > 编程语言 >Selenium4+Python3系列(十一) - Page Factory设计模式

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

时间:2022-12-05 23:01:51浏览次数:40  
标签:username 设计模式 self Factory Selenium4 LoginPage password Page def

写在前面:

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

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

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

Page Factory的使用

作用:

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

1、安装

pip install pythium

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

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

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

3、基础层

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

# -*- 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、对象层

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

# -*- 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、操作层

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

# -*- 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、业务层

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

# -*- 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工作制,很难有时间去写文章,这里还请各位粉丝朋友理解,不过,我会努力持续更文。

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

标签:username,设计模式,self,Factory,Selenium4,LoginPage,password,Page,def
From: https://blog.51cto.com/u_15009374/5913324

相关文章

  • Selenium4+Python3系列(十一) - Page Factory设计模式
    写在前面:PageObject模式,目的是将元素定位和元素操作分层,只接触测试内容,不写基础内容,便于后续对自动化测试用例体系的维护,这是中心思想,也是核心。那么我们继续将简洁延续......
  • 设计模式简单总结
    UML例子该例子主要有继承关系,实现接口关系,依赖关系,组合(合成)关系,关联关系。UML中接口的两种表示方法:简单工厂模式如果只有计算父类和具体的加减乘除子类就已经满足封......
  • SiteFactory支持pdf上传
    ​ ueditor粘贴不能粘贴word中的图片是一个很头疼的问题,在我们的业务场景中客户要求必须使用ueditor并且支持word的图片粘贴,因为这个需求头疼了半个月,因为前端方面因为安......
  • [设计模式] 装饰器模式
    一、装饰器模式在软件开发过程中,由于需求的改动,可能面临对某个或某些对象新增一些新的功能的需求。根据开闭原则,新增功能我们也不能直接去修改原有的类,而如果使用继......
  • 【设计模式】——你真的会单例吗?
    【简介】单例模式,属于创建类型的一种常用的​​软件设计​​模式。通过单例模式的方法创建的类在当前进程中只有一个实例(根据需要,也有可能一个线程中属于单例,如:仅线程上下文......
  • SiteFactory支持pdf一键上传
    ​ 当前功能基于PHP,其它语言流程大抵相同。大概流程:1.将docx文件上传到服务器中2.使用PHPoffice/PHPword实现将word转换为HTML3.将HTML代码返回并赋值到编辑器中......
  • 单例设计模式
    单例设计模式什么是单例设计模式所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个实例对象,并且该类只提供一个取得其对象实例的方......
  • SiteFactory支持pdf一键导入
    ​ 百度ueditor新增的将word内容导入到富文本编辑框的功能怎么没有啊,...ueditor实现word文档的导入和下载功能的方法:1、UEditor没有提供word的导入功能,只能说是粘贴复......
  • 软件设计模式之模拟游角色选择(Darren建造者模式)
    o(︶︿︶)o唉,今天的状态不是很好,但是学习还是要继续的,今天和大家一起分享一下建造者模式,记得之前自己之前一直再想QQ秀换装是怎么是怎么是实现的,今天看了建造者模式我明白了........
  • 软件设计模式之外观设计模式(Darren)
    先回顾一下之前我们已经讲过的设计模式:简单工厂模式,策略模式,单一职责原则,开放封闭原则,依赖倒转原则,装饰模式,抽象工厂模式,模板方法模式,迪米特法则;今天我们来讲一下......