首页 > 其他分享 >分离、参数化

分离、参数化

时间:2022-09-20 19:12:36浏览次数:48  
标签:self 分离 driver param element 参数 div find

1.导入parameterized,实现参数化

导入命令:

from parameterized import param,parameterized

2.分离

分离:把固件分离出来,方便以后换浏览器或者网址测试的修改,否则需要多处修改,使用继承的思想

分离的代码:定义一个Init的类

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.close()

调用分离的固件

class TestSina(Init):

3.登录部分的参数化

import  unittest
from  selenium import webdriver
from  selenium.webdriver.common.by import  By
import time
from parameterized import param,parameterized

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.close()


class TestSina(Init):

@parameterized.expand([
    param('','','请输入邮箱名'),
param('2334','','您输入的邮箱名格式不正确'),
param('[email protected]','123','登录名或密码错误')
])
def test_sina_login_param(self,username,password,result):
'''密码错误'''
self.driver.find_element(By.ID, 'freename').send_keys(username)
self.driver.find_element(By.ID, 'freepassword').send_keys(password)
self.driver.find_element(By.CLASS_NAME, 'loginBtn').click()
time.sleep(1)
test_password = self.driver.find_element(By.XPATH,
'/html/body/div[1]/div/div[2]/div/div/div[4]/div[1]/div[1]/div[1]/span[1]').text
self.assertEqual(test_password, result)

4.注册

从登录页面进行窗口切换到注册页面
再针对注册页面实行分离和参数化
此处是分离窗口切换和需要点击同意书的哪一步操作
class Qiehuan(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)
        '''打开当前窗口'''
        self.nowHandle=self.driver.current_window_handle
        '''点击注册'''
        self.driver.find_element(By.CLASS_NAME,'registerBtn').click()
        '''打开所有窗口'''
        self.allHandlers = self.driver.window_handles
        '''循环所有窗口并切换到到当前窗口'''
        for handle in self.allHandlers:
            if handle!= self.nowHandle:
                self.driver.switch_to.window(handle)
                time.sleep(2)
        '''点击同意协议'''
        self.driver.find_element(By.ID,'agreement1').click()
调用分离出来的固件和窗口切换,并且验证用户名和密码部分出现的所有错误
class Testsina(Qiehuan):

    @parameterized.expand([
            param('','请输入邮箱名'),
            param('1','邮箱名必须是4-16个字符之间(包括4、16)'),
            param('QQQQ','不能有大写字母'),
            param('@!!!!', '不能有全角字符'),
            param('@5678', '邮箱名仅允许使用小写英文、数字或下划线'),
            param('哈哈哈哈', '不能有中文'),
            param('fghj', '该邮箱名禁止注册,请换一个再试'),
        ])
    def test_sina_loginError(self,email,result):
        self.driver.find_element(By.NAME,'email').send_keys(email)
        self.driver.find_element(By.CLASS_NAME, 'subIco').click()
        time.sleep(2)
        loginError=self.driver.find_element(By.XPATH,'/html/body/div[2]/div/div/div/div/form[1]/div[2]/ul/li[1]/div[3]/p/abbr').text
        self.assertEqual(loginError,result)

    @parameterized.expand([
        param('','请输入密码'),
        param('1','密码的长度应该在6-16个字符之间'),
        param('       ','6-16位字符(字母、数字、特殊符号),区分大小写')
    ])
    def test_sina_passwError(self, password, result):
        self.driver.find_element(By.NAME,'psw').send_keys(password)
        self.driver.find_element(By.CLASS_NAME,'subIco').click()
        time.sleep(2)
        passwError = self.driver.find_element(By.XPATH, '/html/body/div[2]/div/div/div/div/form[1]/div[2]/ul/li[2]/div[1]/p/abbr').text
        time.sleep(1)
        self.assertEqual(passwError, result)




    def tearDown(self) -> None:
        self.driver.close()
在主函数运行
if __name__ == '__main__':
    '''参数化的执行必须把鼠标放到main函数上才能执行'''
    unittest.main()
建立和此目录平级的运行代码,以做输出报告的操作

 运行部分的代码如下:

记得导入:import HTMLTestRunner

import unittest
import os
import HTMLTestRunner

def allTests():
    '''使用测试套件加载所有的模块'''
    suite=unittest.TestLoader().discover(start_dir=os.path.dirname(__file__),
        pattern='test_*.py')
    return suite

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

def run():
   
    filename=os.path.join(base_dir(),'report','report_sina.html')
    fp=open(filename,'wb')
    runner=HTMLTestRunner.HTMLTestRunner(stream=fp,title='新浪自动化测试报告',description='Sina自动化测试报告')
    runner.run(allTests())

if __name__ == '__main__':
    run()
运行完成之后的结果:

针对以上操作的完整代码如下:
import  unittest
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
from parameterized import param,parameterized

'''
分离:把固件分离出来,方便以后换浏览器或者网址测试的修改,否则需要多处修改
继承的思想

'''
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.close()


class TestSina(Init):

@parameterized.expand([
param('','','请输入邮箱名'),
param('2334','','您输入的邮箱名格式不正确'),
param('[email protected]','123','登录名或密码错误')
])
def test_sina_login_param(self,username,password,result):
'''密码错误'''
self.driver.find_element(By.ID, 'freename').send_keys(username)
self.driver.find_element(By.ID, 'freepassword').send_keys(password)
self.driver.find_element(By.CLASS_NAME, 'loginBtn').click()
time.sleep(1)
test_password = self.driver.find_element(By.XPATH,
'/html/body/div[1]/div/div[2]/div/div/div[4]/div[1]/div[1]/div[1]/span[1]').text
self.assertEqual(test_password, result)





class Qiehuan(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)
'''打开当前窗口'''
self.nowHandle=self.driver.current_window_handle
'''点击注册'''
self.driver.find_element(By.CLASS_NAME,'registerBtn').click()
'''打开所有窗口'''
self.allHandlers = self.driver.window_handles
'''循环所有窗口并切换到到当前窗口'''
for handle in self.allHandlers:
if handle!= self.nowHandle:
self.driver.switch_to.window(handle)
time.sleep(2)
'''点击同意协议'''
self.driver.find_element(By.ID,'agreement1').click()


class Testsina(Qiehuan):

@parameterized.expand([
param('','请输入邮箱名'),
param('1','邮箱名必须是4-16个字符之间(包括4、16)'),
param('QQQQ','不能有大写字母'),
param('@!!!!', '不能有全角字符'),
param('@5678', '邮箱名仅允许使用小写英文、数字或下划线'),
param('哈哈哈哈', '不能有中文'),
param('fghj', '该邮箱名禁止注册,请换一个再试'),
])
def test_sina_loginError(self,email,result):
self.driver.find_element(By.NAME,'email').send_keys(email)
self.driver.find_element(By.CLASS_NAME, 'subIco').click()
time.sleep(2)
loginError=self.driver.find_element(By.XPATH,'/html/body/div[2]/div/div/div/div/form[1]/div[2]/ul/li[1]/div[3]/p/abbr').text
self.assertEqual(loginError,result)

@parameterized.expand([
param('','请输入密码'),
param('1','密码的长度应该在6-16个字符之间'),
param(' ','6-16位字符(字母、数字、特殊符号),区分大小写')
])
def test_sina_passwError(self, password, result):
self.driver.find_element(By.NAME,'psw').send_keys(password)
self.driver.find_element(By.CLASS_NAME,'subIco').click()
time.sleep(2)
passwError = self.driver.find_element(By.XPATH, '/html/body/div[2]/div/div/div/div/form[1]/div[2]/ul/li[2]/div[1]/p/abbr').text
time.sleep(1)
self.assertEqual(passwError, result)


def tearDown(self) -> None:
self.driver.close()


if __name__ == '__main__':
'''参数化的执行必须把鼠标放到main函数上才能执行'''
unittest.main()

 

 

标签:self,分离,driver,param,element,参数,div,find
From: https://www.cnblogs.com/zxx4/p/16712157.html

相关文章

  • MySQL5.7读写分离
    读写分离关闭防火墙systemctlstopfirewalldsetenforce0Amoeba服务器环境安装安装jdkyuminstalljava安装完成后查看版本java-version修改配置文件vi/etc/......
  • jvm参数说明
     jvm参数说明:-server一定要作为第一个参数,启用JDK的server版本,在多个CPU时性能佳。-Xms初始堆大小。默认是物理内存的1/64。-Xmx堆最大值。默认是物理内存大小20%......
  • python-命令行参数处理 getopt模块详解
    有时候我们需要写一些脚本处理一些任务,这时候往往需要提供一些命令行参数,根据不同参数进行不同的处理,在Python里,命令行的参数和C语言很类似(因为标准Python是用C语言实......
  • linux系统 net.core.somaxconn参数
    1、如何查看该参数值1)查看所有内核参数及值sysctl-a #查看所有内核参数及值2)查看net.core.somaxconn参数[root@localhost]#sysctl-a|grepnet.co......
  • Ti毫米波学习笔记---参数设置和雷达距离方程
    前言​ 在之间的文章中已经分析FMCW雷达的测距和测速的理论知识,在了解这些知识后,我们便可以根据我们的功能的需求参数来设置我们的雷达的参数。本章先简单的说明了雷达参......
  • Python笔记-built-in functions之range class的step参数说明
    class range(start, stop[, step]) Forapositive step,thecontentsofarange r aredeterminedbytheformula r[i] = start + step*i where i >=......
  • ROS通信 9.19 话题通信+服务器参数
    ROS通信服务通信服务通信也是ROS中一种极其常用的通信模式,服务通信是基于请求响应模式的,是一种应答机制。也即:一个节点A向另一个节点B发送请求,B接收处理请求并产生响......
  • netstat参数
    谁还说不懂用netstat命令排障,我就把这个丢过去!点击关注......
  • 20. Requests库方法和参数
    1.前言Requests库中定义了七个常用的请求方法,这些方法各自有着不同的作用,在这些请求方法中requests.get()与requests.post()方法最为常用。请求方法如下所示:常用请......
  • ASEMI快恢复二极管ES8JC参数,ES8JC规格,ES8JC封装
    编辑-ZASEMI快恢复二极管ES8JC参数:型号:ES8JC最大重复峰值反向电压(VRRM):600V最大RMS电桥输入电压(VRMS):420V最大直流阻断电压(VDC):600V最大平均正向整流输出电流(IF):8.0A峰......