7.1自动化测试—页面对象设计模式(1)

目录结构设计(创建一个项目,点击File下的New Project,再点击Attach)

image
每个目录功能总结如下:
base:基础层,主要编写的是底层元素封装
page:对象层,主要指的是把页面的每一个交互写成一个独立的方法
test:测试层,里面主要编写测试用例
common:公共方法,把公共的方法分离到这个里面
utils:工具类,主要指的是操作一些工具的类
data:把测试过程中的数据存储在这个目录下
report:测试报告,主要指的是存储生成的HTML的测试报告

页面对象设计模式:PO模式(Page Object

)
创建可以跨多个测试用例共享的代码,减少重复代码的数量,如果用户界面发生了维护,我们只需要维护一个地方,这样修改以及维护的成本相对而言是比较低的。

base基础层
在base包中创建base的模块,在该模块中编写基础代码,案例如下

# Author:LiuNa
from selenium import  webdriver
from selenium.webdriver.support.expected_conditions import NoSuchElementException
from selenium.webdriver.common.by import By
import  time as t

class WebDriver(object):
	def __init__(self,driver):
		#self.driver=webdriver.Chrome()
		self.driver=driver

	def findElement(self,*loc):
		'''单个元素的定位方式'''
		try:
			return self.driver.find_element(*loc)
		except NoSuchElementException as e:
			return e.args[0]

	def findElements(self,*loc):
		'''多个元素的定位方式'''
		try:
			return self.driver.find_elements(*loc)
		except NoSuchElementException as e:
			return e.args[0]

在上述代码块中,定义了类Webdriver,类的构造函数中driver指的是Webdriver实例化后的对象,在Webdriver类中又单个元素和多个元素定位的方法,但是参数都是*loc。

page对象层

在page包中编写对象层代码,下面以新浪邮箱登录为例,创建login.py模块文件,在此模块文件中编写新浪邮箱登录的对象层代码,代码如下:

from selenium import  webdriver
from selenium.webdriver.support.expected_conditions import NoSuchElementException
from selenium.webdriver.common.by import By
import  time as t
from base.base import WebDriver

class Login(WebDriver):
	'''
	将登录的方法封装成一个Login(),这样在实现登录的测试用例中直接调用该方法
	'''
	username=(By.ID,'freename')
	password=(By.ID,'freepassword')
	loginButton=(By.LINK_TEXT,'登录')
	userDiv=(By.XPATH,'/html/body/div[3]/div/div[2]/div/div/div[4]/div[1]/div[1]/div[1]/span[1]')
	passwdDiv=(By.XPATH,'/html/body/div[3]/div/div[2]/div/div/div[4]/div[1]/div[1]/div[1]/span[2]')
	emailDiv=(By.XPATH,'//*[@id="user_id"]/em[2]')
	autoLogin1=(By.ID,'store1')

	def inputUsername(self,username):
		t.sleep(3)
		self.findElement(*self.username).send_keys(username)

	def inputPassword(self,password):
		t.sleep(3)
		self.findElement(*self.password).send_keys(password)

	def clickLogin(self):
		t.sleep(3)
		self.findElement(*self.loginButton).click()

	def getUserDiv(self):
		'''获取账户的错误提示信息'''
		t.sleep(3)
		return self.findElement(*self.userDiv).text
	def getPsswdDiv(self):
		'''获取密码的错误提示信息'''
		t.sleep(3)
		return self.findElement(*self.passwdDiv).text

	def getEmailDiv(self):
		'''验证登录成功'''
		t.sleep(3)
		return self.findElement(*self.emailDiv).text
	def autoLogin(self):
		'''验证是否自动登录'''
		t.sleep(3)
		return  self.findElement(*self.autoLogin1).is_selected()

	def clickAutoLogin(self):
		t.sleep(3)
		self.findElement(*self.autoLogin1).click()

	def login(self,username,password):
		self.inputUsername(username=username)
		self.inputPassword(password=password)
		self.clickLogin()
测试层

在test包下创建test_login.py文件,首先需要导入对象层的类Login和unittest单元测试框架,在测试类TestLogin中继承了unittest.TestCase和Login类。

from selenium import  webdriver
from selenium.webdriver.support.expected_conditions import NoSuchElementException
from selenium.webdriver.common.by import By
import  time as t
from  utils.operationJson import readJson
import unittest
from page.login import Login

class TestLogin(unittest.TestCase,Login):
	def setUp(self) ->None:
		self.driver=webdriver.Chrome()
		self.driver.maximize_window()
		self.driver.get('https://mail.sina.com.cn/#')
		self.driver.implicitly_wait(30)
	def tearDown(self)->None:
		self.driver.quit()

	def test_username_null(self):
		'''登陆验证:账户为空错误提示信息验证'''
		self.login(username='',password='')
		self.assertEqual(self.getUserDiv(),readJson()['nullEmail'])

	def test_email_format(self):
		'''登录验证:验证邮箱格式错误'''
		self.login(username='asfdg',password='sfdgf')
		self.assertEqual(self.getUserDiv(),readJson()['formatEmail'])

	def test_username_passwd_error(self):
		'''登录验证:验证登录账户错误'''
		self.login(username='asfdg@sina.com',password='sfdgf')
		self.assertEqual(self.getUserDiv(), readJson()['loginError'])

	def test_passwd_username_error(self):
		'''登录验证:验证登录密码错误'''
		self.login(username='18220352488',password='12345')
		self.assertEqual(self.getPsswdDiv(),readJson()['loginError'])

	def test_passwd_null(self):
		'''登录验证:验证登录密码为空'''
		self.login(username='1888', password='')
		self.assertEqual(self.getPsswdDiv(),readJson()['nullPasswd'])

	def test_login_success(self):
		'''登录成功验证:验证登录成功'''
		self.login(username='wuya1303@sina.com', password='admin123')
		self.assertEqual(self.getEmailDiv(),'wuya1303@sina.com')
	def test_auto_login(self):
		'''登录验证:验证自动登录是否勾选'''
		self.assertTrue(self.autoLogin())


	def test_auto_login_cancel(self):
		'''登录验证:验证自动登录是否可以取消勾选'''
		self.clickAutoLogin()
		self.assertFalse(self.autoLogin())

if __name__ == '__main__':
	unittest.main()
公共方法

common包下创建public.py文件,里面主要编写针对文件路径的处理

import os

def base_dir():
	return os.path.dirname(os.path.dirname(__file__))

def filePath(directory,filename):
	'''
	获取文件的详细路径
	:param directory: 目录
	:param filename:  文件名称
	:return:
	'''
	return os.path.join(base_dir(),directory,filename)
posted @   NANA~  阅读(27)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示