Selenium4+Python3系列(十一) - Page Factory设计模式
写在前面:
Page Object模式,目的是将元素定位和元素操作分层,只接触测试内容,不写基础内容,便于后续对自动化测试用例体系的维护,这是中心思想,也是核心。
那么我们继续将简洁延续,这里沿用Java的Page Factory模式思想,旨在减少代码冗余,简单易用,具有高度的可扩展能力。
所以,这里我们使用基于Python 的Page 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工作制,很难有时间去写文章,这里还请各位粉丝朋友理解,不过,我会努力持续更文。
我是六哥,如果觉得文章对您有帮助,请继续关注我,原创不易,不求打赏,只求转发!
Selenium4+Python3系列(十一) - Page Factory设计模式的更多相关文章
- Selenium4+Python3系列(五) - 多窗口处理之句柄切换
写在前面 感觉到很惭愧呀,因为居然在Selenium+Java系列中没有写过多窗口处理及句柄切换的文章,不过也无妨,不管什么语言,其思路是一样的,下面我们来演示,使用python语言来实现窗口句柄的切 ...
- Selenium4+Python3系列(六) - Selenium的三种等待,强制等待、隐式等待、显式等待
为什么要设置元素等待 直白点说,怕报错,哈哈哈! 肯定有人会说,这也有点太直白了吧. 用一句通俗易懂的话就是:等待元素已被加载完全之后,再去定位该元素,就不会出现定位失败的报错了. 如何避免元素未加载 ...
- SQL Server 2008空间数据应用系列十一:提取MapInfo地图数据中的空间数据解决方案
原文:SQL Server 2008空间数据应用系列十一:提取MapInfo地图数据中的空间数据解决方案 友情提示,您阅读本篇博文的先决条件如下: 1.本文示例基于Microsoft SQL Serv ...
- Page Object设计模式(项目整体结构)
1. 什么是框架 1.1 定义: 框架(Framework)是整个或部分系统的可重用设计,表现为一组抽象构件(类)及构件(类)实例间交互的方法. 1.2 为什么要搭建自动化测试框架 自动化测试的开发, ...
- selenium page object & Page Factory
package demo; import java.util.concurrent.TimeUnit; import org.openqa.selenium.By; import org.openqa ...
- java基础解析系列(十一)---equals、==和hashcode方法
java基础解析系列(十一)---equals.==和hashcode方法 目录 java基础解析系列(一)---String.StringBuffer.StringBuilder java基础解析系 ...
- Page Object设计模式实践
Page Object模式是使用Selenium的广大同行最为公认的一种设计模式.在设计测试时,把元素和方法按照页面抽象出来,分离成一定的对象,然后再进行组织. Page Object模式,创建一个对 ...
- Python3 系列之 基础语法篇
基础数据类型 整数 python 可以处理任意大小的整数 浮点数 python 可以处理任意大小的浮点数,但是需要注意的一点是:整数运算永远是精确的(除法也是精确的),而浮点数运算则可能会有四舍五入的 ...
- selenium+Python(Page Object 设计模式实例)
以下实例演示了采用了page Object设计模式的方式登录qq空间: 1.创建基础类page:在初始方法__init__()定义驱动的(driver),基本url(base_url)和超时时间(ti ...
- struts2官方 中文教程 系列十一:使用XML进行表单验证
在本教程中,我们将讨论如何使用Struts 2的XML验证方法来验证表单字段中用户的输入.在前面的教程中,我们讨论了在Action类中使用validate方法验证用户的输入.使用单独的XML验证文件让 ...
随机推荐
- 域名服务DNSmasq搭建
假设该服务端主机ip是:192.168.80.100 服务端安装(yum方式) yum install dnsmasq -y # 配置系统文件 # cp /etc/resolv.conf /etc/r ...
- centos7.5升级系统内核版本
1.yum update curl nss 2.yum install wget 3.rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.or ...
- gitlab备份和恢复
备份 生产环境下,备份是必需的.需要备份的文件有:配置文件和数据文件. 备份配置文件 配置文件包含密码等敏感信息,不要和数据文件放在一起. sh -c 'umask 0077; tar -cf $(d ...
- CentOS8本地安装Redash中文版,并且配置为生产环境
Centos8内置的Python为3.6.8版本,以下是在内置Python3.6.8基础上的安装步骤.由于安装多版本Python会导致系统底层库需要下载源码重新编译,比较麻烦,不建议在多版本Pytho ...
- [CG从零开始] 5. 搞清 MVP 矩阵理论 + 实践
在 4 中成功绘制了三角形以后,下面我们来加载一个 fbx 文件,然后构建 MVP 变换(model-view-projection).简单介绍一下: 从我们拿到模型(主要是网格信息)文件开始,模型网 ...
- SpringBoot(一) - SpringBoot 初识
1.创建SpringBoot项目 1.1 使用Spring Initializr 的 Web页面创建项目 创建网址:https://start.spring.io/ 1.2 使用IDEA创建 省略: ...
- hwj是猪
黄伟佳不爱我了吧唧吧唧
- 虚拟化_Vmware——敬请期待!
Esxi 7.0 安装部署完成! vSphere vCenter 安装部署完成!
- 2022最新最详细必成功的在Vscode中设置背景图、同时解决不受支持的问题
文章目录 1.效果展示 2.设置背景图的详细步骤 2.1 .下载background插件 2.2 .选择扩展设置 2.3 .在setting.json中编辑 2.4.对应的配置文件 2.5 .重启电脑 ...
- 部署redis-cluster
1.环境准备 ☆ 每个Redis 节点采用相同的相同的Redis版本.相同的密码.硬件配置 ☆ 所有Redis服务器必须没有任何数据 #所有主从节点执行: [root@ubuntu2004 ~]#ba ...