python+selenium 自动化测试--完成的第一个查询功能测试用例

一、UnitTest框架

1、概念:UnitTest框架是专门用来进行执行代码测试的框架

2、作用:1)能够阻止多个用例去执行

                2)提供丰富的断言方法

                3)提供丰富的日志和测试结果

3、核心要素

1)TestCase:测试用例,一个testcase就是一条测试用例。

2)TestSuite:测试套件,多条测试用例集合在一起

3)TextTestRunner:测试执行,用来执行测试用例套件

4)FixTure:是一个概述,对一个测试用例环境的搭建和销毁就是一个Fixture

具体分析:

1)TestCase:测试用例必须以test开头。(原因:unittest.TestCase类批量运行的方法是搜索执行test开头的方法)

使用方法:

  导包:import unittest             --> 导入unitest框架  

  继承:unittest.TestCase         --> 新建测试类继承unittest.TestCase

2)TestSuite: 

一条测试用例(.py)内,多个方法也可以使用测试套件  

TestSuite需要配合TextTestRunner才能被执行

使用:    

实例化:     suite=unittest.TestSuite()             (suite:为TestSuite实例化的名称)  

添加用例:suite.addTest("ClassName(MethodName)")     (ClassName:为类名;MethodName:为方法名)  

添加扩展:suite.addTest(unittest.makeSuite(ClassName))    (搜索指定ClassName内test开头的方法并添加到测试套件中)

3)TextTestRunner:

使用:    

实例化: runner=unittest.TextTestRunner()          (runner:TextTestRunner实例化名称)    

执行:    runner.run(suite)           (suite:为测试套件名称)

4) FixTure

 注意点: 

必须继承unittest.TestCase类,setUp、tearDown才是一个Fixture;    

setUp:一般做初始化工作,比如:实例化浏览器、浏览器最大化、隐式等待设置    

tearDown:一般做结束工作,比如:退出登录、关闭浏览器    

如果一个测试类有多个test开头方法,则每个方法执行之前都会运行setUp、结束时运行tearDown

以系统网页上查询功能为例

步骤如下:

1. 导包 import unittest

2. 新建测试类并继承unittest.TestCast

3. 新建一个Fixture(setUp、tearDown)

4. 新建登录方法

5. if __name__ == '__main__':

6. unittest.main()执行

具体脚本如下:

1)先登录系统

登录系统写在初始化函数中

import unittest
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
class TestZhiku(unittest.TestCase):
    def setUp(self) -> None:
        self.driver = webdriver.Chrome()
        # 隐式等待15s
        self.driver.implicitly_wait(15)
        # 浏览器窗口最大化
        self.driver.maximize_window()
        url = "地址自己输入"
        # 打开浏览器地址,输入用户名和密码进行登录
        self.driver.get(url)
        self.driver.find_element(By.XPATH, "//*[@id='app']/div/div/div[2]/div[2]/img").click()
        self.driver.find_element(By.CSS_SELECTOR, "input[placeholder = '请输入用户名']").send_keys("用户名自己输入")
        self.driver.find_element(By.CSS_SELECTOR, "input[placeholder = '请输入密码']").send_keys("密码自己输入")
        self.driver.find_element(By.XPATH, "//span[text() = '登录']").click()

2)进入查询页面,定位到关键字查询输入框输入关键字:测试

text01 = self.driver.find_element(By.XPATH, "//*[@id='app']/div/div[1]/div[3]/div[6]/span").text
self.driver.find_element(By.XPATH, "//*[text() = '项目工作台']").click()
self.driver.switch_to.frame("mainIframe") # 若有iframe内嵌,先切换进入到该iframe
self.driver.find_element(By.CSS_SELECTOR, "input[placeholder = '请输入关键字搜索']").send_keys("测试")
self.driver.find_element(By.XPATH, "//span[text() = '查询']").click()

3)获取页面数据,写一个方法进行调用

def get_page_data01(self, dri):
    tab01 = self.driver.find_element(By.CSS_SELECTOR, "table.el-table__body")
    rows01 = tab01.find_elements(By.TAG_NAME, "tr")
    data01 = []
    # 遍历每一行
    for row01 in rows01:
        # 在每一行中获取所有单元格
        cells01 = row01.find_elements(By.TAG_NAME, 'td')
        # 将单元格的文本添加到列表中
        data01.append([cell.text for cell in cells01])
    return data01

调用方法获取每一页的数据

page_data = TestZhiku.get_page_data01(self, self.driver)
# 获取每一页的数据
while True:
    try:
        # 假设下一页按钮有特定的class名,根据实际情况调整选择器
        # element_to_be_clickable(locator)检查页面上指定的元素是否可见且可点击,可点击则返回该元素对象
        next_page_button = WebDriverWait(self.driver, 15).until(
            EC.element_to_be_clickable((By.CLASS_NAME, 'btn-next'))
        )
        next_page_button.click()
        print(time.ctime())
        time.sleep(3)
        # 继续获取数据
        page_data += TestZhiku.get_page_data01(self.driver)
    except:
        # 没有下一页了,退出循环
        break

4)对比查询到的数据是否正确,若查询到的数据不包含关键字,则查询功能有误

text04 = "测试"
ass04 = True
for i in page_data:
    if text04 not in i[3]:
        print("查询到不包含关键字的内容")
        ass04 = False
        break
self.assertTrue(ass04)

5)执行脚本

if __name__ == '__main__':
    unittest.main

6)若要出测试报告。加一下代码。放在另外的.py文件中

from HTMLTestRunner_cn import HTMLTestRunner
import unittest
import  time

# 测试用例存放位置
test_dir = './test_case'
# 批量执行
discovery = unittest.defaultTestLoader.discover(test_dir, pattern="test*.py")

if __name__ == '__main__':
    report_dir = './test_rep'
    now = time.strftime("%Y-%m-%d %H_%M_%S")
    report_name = report_dir + '/' + now + 'result.html'

    with open(report_name,'wb') as f:
        runner = HTMLTestRunner(stream=f, title="Test Report",description="ceshilogin")
        runner.run(discovery)

测试报告结果如下:

  • 24
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值