7.1自动化测试—页面对象设计模式(1)
目录结构设计(创建一个项目,点击File下的New Project,再点击Attach)
每个目录功能总结如下:
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)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架