UI自动化测试-PO模式

1、核心思想

PO是Page Object的缩写,核心思想是通过对界面元素的封装减少冗余代码,同时在后期维护中,若元素定位发生变化, 只需要调整页面元素封装的代码,提高测试用例的可维护性、可读性。
PO模式可以把一个页面分为三层,对象库层、操作层、业务层。
对象库层:封装定位元素的方法。
操作层:封装对元素的操作。
业务层:将一个或多个操作组合起来完成一个业务功能。比如登录:需要输入帐号、密码、点击登录三个操作。

2、优点

引入PO模式前
- 存在大量冗余代码
- 业务流程不清晰
- 后期维护成本大
引入PO模式后
- 减少冗余代码
- 业务代码和测试代码被分开,降低耦合性
- 维护成本低

3、PO模式实践

采用PO模式的分层思想对代码进行拆分

3.1 PO分层封装

对登录页面进行分层封装:
- 对象库层:LoginPage
- 操作层:LoginHandle
- 业务层:LoginProxy
调用业务层的方法,编写测试用例:
测试用例:TestLogin

3.2示例代码

from po.utils import DriverUtil

class LoginPage:
	"""
	对象库层
	"""
	def __init__(self):
		self.driver = DriverUtil.get_driver()
		# 用户名输入框
		self.username = None
		# 密码
		self.password = None
		# 验证码输入框
		self.verify_code = None
		# 登录按钮
		self.login_btn = None
		# 忘记密码
		self.forget_pwd = None
	def find_username(self):
		return self.driver.find_element_by_id("username")
	def find_password(self):
		return self.driver.find_element_by_id("password")
	def find_verify_code(self):
		return self.driver.find_element_by_id("verify_code")
	def find_login_btn(self):
		return self.driver.find_element_by_name("sbtbutton")
	def find_forget_pwd(self):
		return self.driver.find_element_by_partial_link_text("忘记密码")
class LoginHandle:
	"""
	操作层
	"""
	def __init__(self):
		self.login_page = LoginPage()
	def input_username(self, username):
		self.login_page.find_username().send_keys(username)
	def input_password(self, pwd):
		self.login_page.find_password().send_keys(pwd)
	def input_verify_code(self, code):
		self.login_page.find_verify_code().send_keys(code)
	def click_login_btn(self):
		self.login_page.find_login_btn().click()
	def click_forget_pwd(self):
		self.login_page.find_forget_pwd().click()
class LoginProxy:
	"""
	业务层
	"""
	def __init__(self):
		self.login_handle = LoginHandle()
	# 登录
	def login(self, username, password, verify_code):
		# 输入用户名
		self.login_handle.input_username(username)
		# 输入密码
		self.login_handle.input_password(password)
		# 输入验证码
		self.login_handle.input_verify_code(verify_code)
		# 点击登录按钮
		self.login_handle.click_login_btn()
		# 跳转到忘记密码页面
	def to_forget_pwd_page(self):
		# 点击忘记密码
		self.login_handle.click_forget_pwd()
from po import utils
from po.utils import DriverUtil
from po.v4.page.login_page import LoginProxy

class TestLogin:
	"""
	对登录模块的功能进行测试
	"""
	def setup_class(self):
		self.driver = DriverUtil.get_driver()
		self.login_proxy = LoginProxy()
	def teardown_class(self):
		DriverUtil.quit_driver()
	def setup(self):
		# 打开首页
		self.driver.get("http://localhost")
		# 点击首页的‘登录’链接,进入登录页面
		self.driver.find_element_by_link_text("登录").click()
	# 账号不存在
	def test_login_username_is_error(self):
		self.login_proxy.login("13099999999", "123456", "8888")
		# 断言提示信息
		msg = utils.get_tips_msg()
		print("msg=", msg)
		assert "账号不存在" in msg
	# 密码错误
	def test_login_password_is_error(self):
		self.login_proxy.login("13012345678", "error", "8888")
		# 断言提示信息
		msg = utils.get_tips_msg()
		print("msg=", msg)
		assert "密码错误" in msg

猜你喜欢

转载自blog.csdn.net/MARKDD915/article/details/126886073