python学习重温(2)---自动case生成工具之elementtree

如何设计自动化测试case? 这篇文章我想跟大伙聊聊设计自动化测试case的一些实践和观点。 为什么要设计case? 无论是功能测试还是自动化测试甚至性能测试,设计测试case都是必须的。 当然,不同的测试类型,在设计测试case时候的侧重点和颗粒度是不同的。 设计测试case的目的,我个人认为主要有如下几点原因: 便于测试活动开展 测试工作的本质是尽可能以更高的效率保障交付产出物的质量满足甚至超出预期,这是所有测试工作的最终目标。 但在实际的工作实践中,绝大多数的测试工作都是围绕测试case来开展。比如:case评审/冒烟 阅读详情

   上一篇简单介绍了python的基本语法,主要是从使用C或C++人的观点来说的。这一篇详细说一下,elementtree库的用法。Elenmenttree是python2.5以后加入python标准库的一个用C写的python库。

    XML读取

   

from xml.etree.ElementTree import ElementTree, Element
import sys

def ReadFromXml(path):
    ''''read from xml and prase it
        author:limin 
        path: the file path
        return ElementTree'''
    tree = ElementTree()
    tree.parse(path);
    return tree

仍然以上文的那个XML文件为例子

<?xml version="1.0"?>
<pdml version="0" creator="wireshark/1.20.0.1">
<packet>
  <proto name="geninfo" pos="0" showname="General information" size="98">
    <field name="num" pos="0" show="1246" showname="Number" value="4de" size="98"/>
    <field name="len" pos="0" show="98" showname="Frame Length" value="62" size="98"/>
    <field name="caplen" pos="0" show="98" showname="Captured Length" value="62" size="98"/>
    <field name="timestamp" pos="0" show="Mar  6, 2013 18:28:28.729395000 China Standard Time" showname="Captured Time" value="1362565708.729395000" size="98"/>
  </proto>
  <proto name="frame" showname="Frame 1246: 98 bytes on wire (784 bits), 98 bytes captured (784 bits)" size="98" pos="0">
    <field name="frame.time" showname="Arrival Time: Mar  6, 2013 18:28:28.729395000 China Standard Time" size="0" pos="0" show="Mar  6, 2013 18:28:28.729395000"/>
    <field name="frame.time_epoch" showname="Epoch Time: 1362565708.729395000 seconds" size="0" pos="0" show="1362565708.729395000"/>
    <field name="frame.time_delta" showname="Time delta from previous captured frame: 0.000475000 seconds" size="0" pos="0" show="0.000475000"/>
    <field name="frame.time_delta_displayed" showname="Time delta from previous displayed frame: 0.000000000 seconds" size="0" pos="0" show="0.000000000"/>
    <field name="frame.time_relative" showname="Time since reference or first frame: 93.072253000 seconds" size="0" pos="0" show="93.072253000"/>
    <field name="frame.number" showname="Frame Number: 1246" size="0" pos="0" show="1246"/>
    <field name="frame.len" showname="Frame Length: 98 bytes (784 bits)" size="0" pos="0" show="98"/>
    <field name="frame.cap_len" showname="Capture Length: 98 bytes (784 bits)" size="0" pos="0" show="98"/>
    <field name="frame.marked" showname="Frame is marked: False" size="0" pos="0" show="0"/>
    <field name="frame.ignored" showname="Frame is ignored: False" size="0" pos="0" show="0"/>
    <field name="frame.protocols" showname="Protocols in frame: eth:ip:udp:mmtss:sicap" size="0" pos="0" show="eth:ip:udp:mmtss:sicap"/>
    <field name="frame.coloring_rule.name" showname="Coloring Rule Name: SICAP" size="0" pos="0" show="SICAP"/>
    <field name="frame.coloring_rule.string" showname="Coloring Rule String: sicap" size="0" pos="0" show="sicap"/>
  </proto>
  <proto name="eth" showname="Ethernet II, Src: 192.168.254.1 (00:0f:bb:69:93:ee), Dst: DCT-INF (00:10:18:cb:b5:fd)" size="14" pos="0">
    <field name="eth.dst" showname="Destination: DCT-INF (00:10:18:cb:b5:fd)" size="6" pos="0" show="00:10:18:cb:b5:fd" value="001018cbb5fd">
      <field name="eth.addr" showname="Address: DCT-INF (00:10:18:cb:b5:fd)" size="6" pos="0" show="00:10:18:cb:b5:fd" value="001018cbb5fd"/>
      <field name="eth.ig" showname=".... ...0 .... .... .... .... = IG bit: Individual address (unicast)" size="3" pos="0" show="0" value="0" unmaskedvalue="001018"/>
      <field name="eth.lg" showname=".... ..0. .... .... .... .... = LG bit: Globally unique address (factory default)" size="3" pos="0" show="0" value="0" unmaskedvalue="001018"/>
    </field>
    <field name="eth.src" showname="Source: 192.168.254.1 (00:0f:bb:69:93:ee)" size="6" pos="6" show="00:0f:bb:69:93:ee" value="000fbb6993ee">
      <field name="eth.addr" showname="Address: 192.168.254.1 (00:0f:bb:69:93:ee)" size="6" pos="6" show="00:0f:bb:69:93:ee" value="000fbb6993ee"/>
      <field name="eth.ig" showname=".... ...0 .... .... .... .... = IG bit: Individual address (unicast)" size="3" pos="6" show="0" value="0" unmaskedvalue="000fbb"/>
      <field name="eth.lg" showname=".... ..0. .... .... .... .... = LG bit: Globally unique address (factory default)" size="3" pos="6" show="0" value="0" unmaskedvalue="000fbb"/>
    </field>
    <field name="eth.type" showname="Type: IP (0x0800)" size="2" pos="12" show="0x0800" value="0800"/>
  </proto>
  <proto name="ip" showname="Internet Protocol, Src: 192.168.254.68 (192.168.254.68), Dst: DCT-INF (192.168.254.2)" size="20" pos="14">
    <field name="ip.version" showname="Version: 4" size="1" pos="14" show="4" value="45"/>
    <field name="ip.hdr_len" showname="Header length: 20 bytes" size="1" pos="14" show="20" value="45"/>
    <field name="ip.dsfield" showname="Differentiated Services Field: 0x00 (DSCP 0x00: Default; ECN: 0x00)" size="1" pos="15" show="0" value="00">
      <field name="ip.dsfield.dscp" showname="0000 00.. = Differentiated Services Codepoint: Default (0x00)" size="1" pos="15" show="0x00" value="0" unmaskedvalue="00"/>
      <field name="ip.dsfield.ect" showname=".... ..0. = ECN-Capable Transport (ECT): 0" size="1" pos="15" show="0" value="0" unmaskedvalue="00"/>
      <field name="ip.dsfield.ce" showname=".... ...0 = ECN-CE: 0" size="1" pos="15" show="0" value="0" unmaskedvalue="00"/>
    </field>
    <field name="ip.len" showname="Total Length: 84" size="2" pos="16" show="84" value="0054"/>
    <field name="ip.id" showname="Identification: 0xce64 (52836)" size="2" pos="18" show="0xce64" value="ce64"/>
    <field name="ip.flags" showname="Flags: 0x00" size="1" pos="20" show="0x00" value="00">
      <field name="ip.flags.rb" showname="0... .... = Reserved bit: Not set" size="1" pos="20" show="0" value="00"/>
      <field name="ip.flags.df" showname=".0.. .... = Don't fragment: Not set" size="1" pos="20" show="0" value="00"/>
      <field name="ip.flags.mf" showname="..0. .... = More fragments: Not set" size="1" pos="20" show="0" value="00"/>
    </field>
    <field name="ip.frag_offset" showname="Fragment offset: 0" size="2" pos="20" show="0" value="0000"/>
    <field name="ip.ttl" showname="Time to live: 254" size="1" pos="22" show="254" value="fe"/>
    <field name="ip.proto" showname="Protocol: UDP (17)" size="1" pos="23" show="17" value="11"/>
    <field name="ip.checksum" showname="Header checksum: 0x709b [correct]" size="2" pos="24" show="0x709b" value="709b">
      <field name="ip.checksum_good" showname="Good: True" size="2" pos="24" show="1" value="709b"/>
      <field name="ip.checksum_bad" showname="Bad: False" size="2" pos="24" show="0" value="709b"/>
    </field>
    <field name="ip.src" showname="Source: 192.168.254.68 (192.168.254.68)" size="4" pos="26" show="192.168.254.68" value="c0a8fe44"/>
    <field name="ip.addr" showname="Source or Destination Address: 192.168.254.68 (192.168.254.68)" hide="yes" size="4" pos="26" show="192.168.254.68" value="c0a8fe44"/>
    <field name="ip.src_host" showname="Source Host: 192.168.254.68" hide="yes" size="4" pos="26" show="192.168.254.68" value="c0a8fe44"/>
    <field name="ip.host" showname="Source or Destination Host: 192.168.254.68" hide="yes" size="4" pos="26" show="192.168.254.68" value="c0a8fe44"/>
    <field name="ip.dst" showname="Destination: DCT-INF (192.168.254.2)" size="4" pos="30" show="192.168.254.2" value="c0a8fe02"/>
    <field name="ip.addr" showname="Source or Destination Address: DCT-INF (192.168.254.2)" hide="yes" size="4" pos="30" show="192.168.254.2" value="c0a8fe02"/>
    <field name="ip.dst_host" showname="Destination Host: DCT-INF" hide="yes" size="4" pos="30" show="DCT-INF" value="c0a8fe02"/>
    <field name="ip.host" showname="Source or Destination Host: DCT-INF" hide="yes" size="4" pos="30" show="DCT-INF" value="c0a8fe02"/>
  </proto>
  <proto name="udp" showname="User Datagram Protocol, Src Port: 35429 (35429), Dst Port: rfe (5002)" size="8" pos="34">
    <field name="udp.srcport" showname="Source port: 35429 (35429)" size="2" pos="34" show="35429" value="8a65"/>
    <field name="udp.dstport" showname="Destination port: rfe (5002)" size="2" pos="36" show="5002" value="138a"/>
    <field name="udp.port" showname="Source or Destination Port: 35429" hide="yes" size="2" pos="34" show="35429" value="8a65"/>
    <field name="udp.port" showname="Source or Destination Port: 5002" hide="yes" size="2" pos="36" show="5002" value="138a"/>
    <field name="udp.length" showname="Length: 64" size="2" pos="38" show="64" value="0040"/>
    <field name="udp.checksum_coverage" showname="Checksum coverage: 64" hide="yes" size="0" pos="38" show="64"/>
    <field name="udp.checksum" showname="Checksum: 0xf3f8 [validation disabled]" size="2" pos="40" show="0xf3f8" value="f3f8">
      <field name="udp.checksum_good" showname="Good Checksum: False" size="2" pos="40" show="0" value="f3f8"/>
      <field name="udp.checksum_bad" showname="Bad Checksum: False" size="2" pos="40" show="0" value="f3f8"/>
    </field>
  </proto>


调用读取函数后,可以看到在内存中文件的组织结构式这样的

文件在内存中是一个树结构,最外层是elementtree这个对象的内置方法,文件中的内容

elementtree读取的数据,操作的时候到要先获得root,如这个文件,root就是

<pdml version="0" creator="wireshark/1.20.0.1">


获得root的函数为

root = tree.getroot()

 

root节点下面,具备的属性有

children:root的子节点

attrib:属性,也就是XML文件中用

version="0" creator="wireshark/1.20.0.1

text:没有用<>包围的部分


展开root中的children节点

就可以看到root的节点,也就是用XML文件中<packet></packet> 包围的部分,同时也可以看到packet节点的子节点proto,也就是XML文件中用<proto></proto>包围的部分。

    到这来,基本上已经清楚了。elementtree这个库将XML读入内存用层化的机构连接。

 

XML文件中数据的读取

 如上文所说,我们要读取的就是各个层级节点下的attrib,tag,tail,text这几个参数。

几个读取的方法

直接读取

  py2.7支持直接读取的方式,如以下代码

 

for messagelstParaNode in node:     #1st<field
        if messagelstParaNode.attrib['name'] == 'sicap.header': #sicap header
            SicapHead = parseSiCapHead(messagelstParaNode)
            insertRecSendFieldIntoList(SicapMessageList,SicapHead)
        else:
            if messagelstParaNode.attrib['name'].find('sicap.') == 0: #para field 1st message type
               templist.insert(0,messagelstParaNode.attrib['showname'])
               templist.insert(1,SicapHead['value'])
               SicapMessageList.insert(0,templist)
               for message2stParaNode in messagelstParaNode:             #para field 2st message
                 GetFieldinfo(SicapMessageList,message2stParaNode)
                 for message3stParaNode in message2stParaNode:         #para field 3st message
                   GetFieldinfo(SicapMessageList,message3stParaNode)
                   for message4stParaNode in message3stParaNode:     #para field 4st message
                     GetFieldinfo(SicapMessageList,message4stParaNode)
                     for message5stParaNode in message4stParaNode:     #para field 5st message
                       GetFieldinfo(SicapMessageList,message5stParaNode)
                       for message6stParaNode in message5stParaNode:
                         GetFieldinfo(SicapMessageList,message6stParaNode)


 


 

这个代码中,node就是root节点对象,一共解析了6层节点。在相应的节点层次,就可以使用采用如下方法访问各个参数

attrib:

attrib 在elemettree中是用字典格式存储的,使用它的key就可以访问,如

messagelstParaNode.attrib['name']


 

 

 

Pytest中实现自动生成测试用例脚本代码! 在Python的测试框架中,我们通常会针对某个系统进行测试用例的维护,在对庞大系统进行用例维护时,往往会发现很多测试用例是差不多的,甚至大多数代码是一样的。 故为了提高我们测试用例维护的效率,在本文中,我们将探讨如何自己设计脚本,自动生成测试用例脚本。 阅读详情

相关推荐

描述符链表(Descriptor Chain)是什么?

描述符链表是硬件加速数据传输的核心数据结构,通过链式描述符(包含地址、长度、控制标志等)实现DMA自动批量处理,显著降低CPU负载。其工作原理为:CPU初始化链表后,硬件按序处理每个描述符,完成自动跳转与中断通知。在网卡收包、NVMe存储等场景中应用广泛,优势包括批处理、低延迟和灵活调度。需注意内存对齐、缓存一致性等实现细节,优化手段包括预分配描述符池、环形缓冲区等。该技术是网络/存储领域提升吞吐量的关键方案。

guigenyi的专栏 777

MeterSphere接口测试中的测试数据生成方法

接口测试中,经常会遇到需要生成特定测试数据

qq_26224539的博客 785

生态学家都在用的MixSIAR:用R语言搞定稳定同位素混合模型(从数据整理到结果解读)

本文详细介绍了生态学家常用的MixSIAR工具,通过R语言实现稳定同位素混合模型分析,从数据整理到结果解读全流程。文章涵盖环境准备、模型构建、参数设置、运行诊断及可视化等关键步骤,帮助研究者科学分析河口鱼类食物来源,适用于生态学研究和湿地保护政策制定。

weixin_28683065的博客 439

在MeterSphere接口测试中如何使用JMeter函数和MockJS函数

在MeterSphere中通过JMeter函数和MockJS函数构造生成接口测试数据的总结演示。

FIT2CLOUD飞致云的博客 1780

C# 操作Excel的时候,出现"被呼叫方拒绝接受呼叫的异常"的解决方案(参考官方给出的解决方案)

首先官方有对这个错误给出解释和解决方案,连接如下: https://docs.microsoft.com/zh-cn/previous-versions/ms228772(v=vs.120)#%E5%8F%AF%E9%9D%A0%E7%BC%96%E7%A8%8B 简单来说,貌似是线程问题,我猜。。。 之前我尝试着在代码中添加 Thread.Sleep(1000); 来进行解决,这种办...

Ck_Max的博客 5768

OpenCV-Python实战(26)——复杂场景下的实时物体检测与跟踪

本节介绍了一种鲁棒的特征跟踪方法,该方法速度足够快,能够实时应用于网络摄像头的视频流。首先,算法展示了如何在一幅图像中提取和检测重要特征——无论是我们感兴趣的模板图像(训练图像),还是预期包含该物体的更复杂场景(查询图像),这些特征都具有视角和尺寸不变性。然后对关键点进行聚类,找到两幅图像中特征点之间的匹配。在此基础上,可以计算出一个将一组特征点映射到另一组的透视变换矩阵。利用这些信息,我们可以在查询图像中勾勒出训练图像的轮廓,并对查询图像进行透视变换,使感兴趣的物体以直立状态显示在屏幕中央。

盼小辉丶的博客 1922

AI测试|利用OpenAI的文本生成模型,自动生成测试用例的几个场景示例

示例1:自动生成测试用例 我们的用例围绕软件应用程序测试用例的自动生成展开。通过采用文本生成模型(Text Generation Model)从用户故事(User Story)或需求中自动生成测试方案,可以大大简化传统的人工劳动密集型流程。

m0_75277660的博客 3311

【绝对要收藏-优秀论文范文】高项-度量绩效域

摘要:本文基于某水库数字孪生平台建设项目(2022.9-2023.5,645.97万元)的管理实践,从信息系统度量绩效域角度展开论述。项目构建了包含防洪调度等6大子系统的数字平台,实现洪水"四预"功能。重点分析了度量绩效域的五大要点:制定有效指标(如成本±8%偏差阈值)、多维数据采集、预警临界值设定、基于趋势的主动干预和持续改进机制。特别阐述了绩效问题的诊断方法,包括设备采购全周期成本分析、阶段性成本报告制度等。项目状态展示采用三维可视化看板,集成进度、成本、质量等多维度实时数据,最终实

xylllamm的博客 345

python学习重温(1)---自动case生成工具

因为最近工作中,需要设计根据wirshark截获的报文自动产生测试case的小工具,我重温了python。这个笔记,就是根据这个工具的实现,来记录python语法的学习过程。 这个工具的功能如下图所示,其中wirshark cap可以通过wirshark自身的功能导出为pmsl格式,也就是一种XML,同时公司使用的case script也是一种XML,只是添加了一些循环,判断等功能。

linuxsee的专栏 1394

华为OD机试 - 末世分配资源包 - 二分查找 + 贪心(Python/JS/C/C++ 新系统 100分)

本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新。末世时代,政府为各地方配资源,现有资源分配表 nums[n],要求按如下规则分配给 k 个营地:在最优平均分配情况下,得到最大团队所获得的资源数4,3,6,9,7 216最佳划分之一:[4,3,6] -> 13 [9,7] -> 16最大

学Java,找哪吒 224

把 ABAP Unit 测试放进本地类:让重构更安全、让测试更好找的组织方式

ABAP测试代码组织策略:单元测试与集成测试的合理存放位置 本文针对ABAP开发中测试代码组织混乱的问题,提出了一套系统化的解决方案: 单元测试应存放在被测类的本地测试include中(...CCAU或...T99),确保测试与代码同步演进且易于发现 跨对象测试(组件/集成/系统测试)应创建单独的全局测试类,并通过FOR TESTING和ABSTRACT进行防护 使用! @testing注释建立测试关系,使测试与被测对象明确关联,提高可发现性 针对不同技术栈(RAP/CAP/OData)提供了具体落地建议,

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1729

接口测试用例生成工具介绍及应用

2.功能测试:指满足功能需求,有一定功能含义的测试用例,如对卡号这个参数来说,已销户的卡号对大多数交易来说就是一个有功能含义的反例,对于功能测试,大多数测试用例与数据是有一定的时效性和可复用性的,但对数据的维护仍需要一定成本,对于经常变动的数据,目前的解决方案是通过sql语句进行动态提取。通过配置用例集我们实现了对测试经验的积累,对测试场景的全覆盖。兜底测试组装层的用例和数据的衍生规则与用例集组装层是类似的,不同的是兜底测试组装层会对每个参数都进行相应的兜底测试,兜底测试也不需要选择相应的用例集。

主要分享测试的学习资源,帮助快速了解测试行业,帮助想转行、进阶、小白成长为高级测试工程师。 6477

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

python学习(二) ElementTree解析、读写、创建xml文件

python学习(二) 读写xml文件 1.xml格式 将其存储为sample.xml  Tag:使用&lt;&gt;包围的部分  Element:被Tag包围的部分,例如22中的22  Attribute:在Tag中可能存在的name/value对,如'name':'Blue' 2.解析XML 以下都是使用ElementTree处理XML  from xml.etree import ...

qq_35153620的博客 1万+

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

python标准库ElementTree个人学习笔记

个人学习笔记

qq_43450443的博客 2126

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Wireshark 基础 | 显示过滤篇

Wireshark 基础 | 显示过滤篇

7ACE的博客 8997

Java自动生成testcase

package com.citi.sl.tlc.common.extract; import java.io.BufferedWriter; import java.io.IOException; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.nio.file.Fil...

weixin_30235225的博客 1201

flex 自动生成switch case 的工具

千古月 483

Python实现自动生成测试用例

基于正交表测试用例设计法,用python实现自动生成测试用例

zhaodengdeng1984的博客 9181

自动化测试代码的自动生成

自动化测试代码的自动生成一、界面展示 我们来看看可视化的代码自动化生成界面设计, 二、字段用途解释 选择目标测试类 指: 需要生成代码所要依据的接口类名称。 备注: 这个是使用的文件上传,自动载入接口类名。 本地的测试工程 指:需要生成代码的路径地址。 备注: 默认是生成在项目空间的java代码资源路径。 脚本使用的模板 指: 自动生

子木清风阁 5153

python代码自动生成_Python自动生成代码 使用tkinter图形化操作并生成代码框架

背景在写代码过程中,如果有频繁重复性的编码操作,或者可以Reuse的各类代码,可以通过Python写一个脚本,自动生成这类代码,就不用每次手写、或者copy了。比如新建固定的代码框架、添加一些既定的软件逻辑,通讯协议、消息模板等等,再编写一套代码时,或者一个Function时,每次使通过脚本一键生成代码,就不需要每次都写一遍了,同时可以把相关软件逻辑放进去,也能避免出错。脚本代码Demo_Code...

weixin_39627201的博客 479

python自动操作脚本_批量生成python自动化测试脚本

#!/usr/bin/env python#-*- coding:utf-8 -*-#!python3__author__ = "xxx""""自动化脚本生成工具"""importosimportxlrdimporttimeTestCaseName= ""TestCaseDescription= ""TestCasePreCondition= ""TestCaseStep= ""TestCaseE...

weixin_39566387的博客 247

python自动化测试脚本后端_批量生成python自动化测试脚本

#!/usr/bin/env python#-*- coding:utf-8 -*-#!python3__author__ = "xxx""""自动化脚本生成工具"""importosimportxlrdimporttimeTestCaseName= ""TestCaseDescription= ""TestCasePreCondition= ""TestCaseStep= ""TestCaseE...

weixin_39653481的博客 325

python 使用ElementTree解析xml

def run(): “”" 1.解析 1)调用parse()方法,返回解析树 python3.3之后ElementTree模块会自动寻找可用的C库来加快速度 “”" try: import xml.etree.cElementTree as ET except ImportError: import xml.etree.ElementTree as ET tree = ET.parse("cou...

君子不器 3964
上一篇: UTMS 信令培训(16)
海之渊
博客等级 码龄19年 15粉丝 31原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值