UI自动化测试实战之页面对象设计模式(po模式)

UI自动化测试实战之页面对象设计模式page object模式(po

模式)

优势:

  1、创建可以跨多个测试用例共享代码

  2、减少重复的代码

  3、如果用户界面发生了维护,我们只需要维护一个地方,这样修改以及维护的成本相对来说是比较低的

测试框架目录设置

  1、目录结构:

  base:基础层  里面主要是编写的测试框架的基础代码

  page:对象层  里面主要编写的是页面操作对象的每一个行为,也就是说,编写的是具体的业务理解,把每一个操作单独的写一个方法

  test:测试层  里面主要是编写测试模块,也就是说是编写测试用例的地方

  common:存储的公共的代码,比如路径处理等

  utils:存储的是工具类,主要指的是对各种文件的处理

  data:主要存储的是测试过程中使用到的数据

  report:该文件主要是存储报告测试的

  2、目录结构设计:

  框架的目录结构的设计

 

 

   3、基础层

   下面主要实现基础层的代码,在base包下创建名为base.py的文件,里面的代码为

from selenium import webdriver
from selenium.webdriver.common.by import By         '''导入元素定位方法'''
from selenium.webdriver.support.expected_conditions import NoSuchFrameException
import time as t



class WebUI():          '''元素定位发'''
	def __init__(self,driver):
		'''web实例化后的对象'''
		self.driver=driver
'''固定格式必须元组'''
	def findElement(self,*ages):
		'''
		单个元素定位的方式
		:param ages:
		:return: 他是一个元组,需要带上具体什么方式定位元素以及元素属性的值
		'''
		try:
			return self.driver.find_element(*ages)
		
		except NoSuchFrameException as e:
			return e.args[0]

	def findsElement(self,*ages,index):
		'''
		单个元素定位的方式
		:param ages:
		:param index:被定为的目标索引位置
		:return: 他是一个元组,需要带上具体什么方式定位元素以及元素属性的值
		'''
		try:
			return self.driver.find_element(*ages)[index]
		except NoSuchFrameException as e:
			return e.args[0]

  

 

   4、对象层

  下面以sina的邮箱案例练编写具体的代码,在page包下创建一个login.py的文件,里面的代码为:

from selenium.webdriver.common.by import By
from base.base import WebUI
import time as t


class Login(WebUI):
    '''登录继承base里面我们写的元素定位方法↑'''
    username=(By.ID,'freename')
    '''用户名↑'''
    password=(By.ID,'freepassword')
    '''密码↑'''
    login=(By.CLASS_NAME,'loginBtn')
    '''登录↑'''
    divText=(By.XPATH,'/html/body/div[3]/div/div[2]/div/div/div[4]/div[1]/div[1]/div[1]/span[1]')
    looText=(By.XPATH,'/html/body/div[3]/div/div[2]/div/div/div[4]/div[1]/div[1]/div[1]/span[2]')

    def inputUserName(self,username):
        # 输入账户值↑
        t.sleep(2)
        self.findElement(*self.username).send_keys(username)

    def inputPassword(self,password):
        # 输入密码值↑
        t.sleep(2)
        self.findElement(*self.password).send_keys(password)
    def clickLogin(self):
        # 点击登录
        self.findElement(*self.login).click()

    def getDivText(self):
        # 获取错误提示
        return self.findElement(*self.divText).text

    def getLooText(self):
        return self.findElement(*self.looText).text

    def sianLogin(self,username,password):
        self.inputUserName(username=username)
        self.inputPassword(password=password)
        self.clickLogin()

 

 

   5、测试层

    下来再测试层,也就是test包下创建的test_login.py的模块来执行,切记,需要执行验证下我们编写的具体测试用例。

    先将测试固件分离

    我们已经学会了数据驱动的分离,接下来我们将针对测试固件进行分离,在page包下创建Init.py文件,里面的代码如下

 

from selenium import webdriver
import unittest



class Init(unittest.TestCase):
	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()

  再写测试用例,此时就可以直接继承刚才编写的测试固件了

from page.login import Login
import time as t
from page.Init import Init

'''1、先继承测试固件'''
class LoginTest(Init,Login):


    '''2、编写测试用例'''
    def test_login_null(self):
        '''登录:验证账户为空返回的值'''
        self.sianLogin(username='',password='')
        t.sleep(3)
        self.assertEqual(self.getDivText(),'请输入邮箱名')


    def test_login_format(self):
        '''登录:验证邮箱名格式不正确'''
        self.sianLogin(username='fbajfa',password='sajlnfls')
        t.sleep(3)
        self.assertEqual(self.getDivText(), '您输入的邮箱名格式不正确')

    def test_login_error(self):
        '''登录:验证登录账户或密码错误'''
        self.sianLogin(username='dnana@sina.com',password='ajaja')
        t.sleep(3)
        self.assertEqual(self.getDivText(), '登录名或密码错误')

    def test_login_loo(self):
        '''登录:验证只输入邮箱号不输入密码的错误'''
        self.sianLogin(username='asjkaskj@sina.com',password='')
        t.sleep(3)
        self.assertEqual(self.getLooText(),'请输入密码')

    def test_login_biao(self):
        '''登录:验证邮箱输入标点符号'''
        self.sianLogin(username='adnl,da@sina.com',password='bkda')
        t.sleep(3)
        self.assertEqual(self.getDivText(),'您输入的邮箱名格式不正确')

 

posted @ 2022-04-12 21:10  挣大钱  阅读(477)  评论(0)    收藏  举报