写在前面:

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

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

最新文章

  1. 基于netty轻量的高性能分布式RPC服务框架forest<上篇>
  2. 创建第二个 local network - 每天5分钟玩转 OpenStack(84)
  3. 常用天气预报API接口整理(转)
  4. asp.net解决高并发的方案. (转自网络)
  5. Ubuntu下MySql配置
  6. dump datafile block
  7. java数据类型和运算优先级
  8. 调试exynos4412—ARM嵌入式Linux—LEDS/GPIO驱动之三
  9. 小步快跑的公司可以最简化操作直接通过log4net将日志写入ElasticSearch
  10. echarts 配置
  11. [Swift]LeetCode341. 压平嵌套链表迭代器 | Flatten Nested List Iterator
  12. 前端使用Mock服务Json-server
  13. python中的函数和变量
  14. 1013. Battle Over Cities 用dfs计算联通分量
  15. Git 遇到的坑
  16. windows 10下sublime text3环境的搭建以及配置python开发环境
  17. 解决jpgraph在php7.0版本下时,无法显示例子图表的问题
  18. beef局域网内模拟攻击
  19. (FFT) A * B Problem Plus
  20. 搞不清FastCgi与php-fpm之间是个什么样的关系

热门文章

  1. 五、frp内网穿透客户端frpc.ini各配置参数详解
  2. Traefik 2.0 实现灰度发布
  3. 彻底掌握Makeifle(三)
  4. NSIS检测到窗口最小化闪烁提示
  5. css事件穿透
  6. ASP.NET Core 中的模型绑定
  7. 微信DAT文件转JPG图片(图片恢复)
  8. 一天五道Java面试题----第六天(1)
  9. 齐博x1再来个抛砖引玉 内容页根据关键词调用相关内容 新功能哦!
  10. AIR32F103(四) 27倍频216MHz,CoreMark跑分测试