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及初始化使用,示例代码如下:

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

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

发表评论

相关文章