4

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

 1 year ago
source link: https://www.cnblogs.com/longronglang/p/16953801.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

写在前面:

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

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

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

Page Factory的使用

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

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__


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK