手把手教你Testcomplete_深入分析TestComplete名称映射

TestComplete多语言UI自动化测试:原理、实践与框架构建 UI自动化测试是现代软件质量保障的核心环节,其核心原理是通过脚本模拟用户操作,验证界面功能与交互。在软件全球化背景下,多语言支持成为基本需求,这给UI自动化带来了对象识别稳定性、布局适配性等独特挑战。TestComplete的多语言引擎通过别名与名称映射机制,结合数据驱动设计,实现了脚本与语言环境的解耦,显著提升了测试套件的健壮性和可维护性。该技术方案能有效应对文本长度差异、RTL布局等典型场景,确保国际化产品在不同语言环境下功能与显示均符合预期,是构建高效、可靠全球化测试体系的关键实践。 阅读详情
 

 

摘要:通过实例和分析对TestComplete名称映射的功能步步推进层层展开,将名称映射

 

关键词:TestComplete,NameMapping,Templates,FullName

 

 

一.前言

 

TestComplete是AutomatedQA公司开发的一套支持自动测试软件的工具,近年来发展异常迅速,屡获大奖。支持VBScript、DelphiScript、JScript、C#Script等多种脚本语言,支持传统的各类桌面应用程序、WEB应用、单元测试和分布式测试等等领域,最新版本对flash的测试技术发展也非常迅猛,据说可以不用加编译参数重新编译被测程序源码。

对比同领域的其他的自动化测试工具,TestComplete的特点是简洁而强大。在TestComplete的常规应用中,对象识别能力也非常出色,本文重点分析其对象识别的原理和使用方法。

 

 

二.TestComplete名称映射分析

1. FullName和MappedName

Windows系统中应用程序、从属于应用程序的窗体、窗体中的控件都是对象,每个对象都有唯一的标识(通常是十六进制的一个值),这些共同构建出一个庞大的对象目录树,根节点就是Sys,可以想象一棵挂满了十六进制数树叶的树,每片树叶还有属性方法事件装饰它,如果录制的代码全是十六进制数做对象名称,所有人都会崩溃的,所以首先要对这些对象起个名字,最简单的法子是使用这个对象的类似caption,index和classname一类的属性来起一个名字,于是TestComplete给每个在内存中的对象起了名字,为了清晰表明各个对象的层次关系,使用了fullname来标识。Fullname看起来大概象这个样子:

Sys.Process("IEXPLORE").Page("http://xxx:nn/xxx.html").Panel("ext_comp_1017").Panel("ext_gen15").Panel("ext_gen16").Panel("ext_comp_1009").Panel("ext_gen26").Panel("ext_gen28").Panel("ext_comp_1008").Panel("ext_gen75").Panel("ext_gen76").Panel("ext_comp_1073").Panel("ext_gen161").Panel(0).Panel(0).Panel(0).Panel("ext_gen162").Panel("ext_comp_1075").Table(0).Cell(0,7).Table("ext_comp_1048").Cell(0,1).Button("ext_gen195")

 

呃…介个…是有点头晕,实在是太长了,不便于书写和阅读,是需要搞个短点的名字才行,于是TestComplete搞了个映射名称MappedName:

NameMapping.Sys.IEXPLORE.pageHttp1213289411581Citymanager.panelExtComp1017.panelExtGen15.panelExtGen16.panelExtComp1009.panelExtGen26.panelExtGen28.panelExtComp1008.panelExtGen75.panelExtGen76.panelExtComp1073.panelExtGen161.panelXPanelMl.panelXPanelMr.panelXPanelMc.panelExtGen162.panelExtComp1075.table.cellExtGen193.tableExtComp1048.cellXBtnCenter.buttonExtGen195

 

如果看起来还是有些长,可以使用对象引用的法子来截短一些:

Aliases是NameMapping.Sys

Set iexplore=Aliases.IEXPLORE

Set page=pageHttp1213289411581Citymanager

Set p1=panelExtComp1017.panelExtGen15.panelExtGen16.panelExtComp1009.panelExtGen26

Set p2=p1. panelExtGen28.panelExtComp1008.panelExtGen75.panelExtGen76

Set p3=p2.panelExtComp1073.panelExtGen161.panelXPanelMl.panelXPanelMr.panelXPanelMc

Set p4=p3.panelExtGen162.panelExtComp1075

Set p5=p4.table.cellExtGen193.tableExtComp1048.cellXBtnCenter.buttonExtGen195

Call p5.click

这下看起来好点了

 

 

2. MappedName有啥用处

 

映射名称仅仅是为了书写阅读的方便吗?当然不是!那是为了什么?

 

试想你录制了一段脚本,录制的时候对象obj,显示的内容是”aaa07201701”,回放的时候这个显示的内容发生了变化,成了”aaa07201721”,内容aaa的后面几位是时间,每次运行的时候这个时间都会相应变化,但是你希望能得到该对象的引用,加以操作,如果是使用fullname,名称可能就从obj(”aaa07201701”)变成了obj(” aaa07201721”)

问:怎么办?

答:可以使用类似正则匹配的方式来寻找对象,修改对象引用为obj(“aaa*”),这下总行了吧。

问:不见得哟,假设有很多个对象都一样的显示,obj(“aaa*”)匹配上的就会是很多个名称aaa开头的对象。

答:那就使用其他的属性来共同限定,比如这个对象类型是button,其他显示为aaa开头的对象都不是button,那就可以obj(“aaa*”,“classname=Button”),要是有多个button都是一样显示,那就加上实例索引,第几个button,例如:obj(“aaa*”,“classname=Button”,2) ,这次没问题了吧

 

是的,这样的确就已经可以了,不过这个方法有个缺点,对象的引用修改全部是在源代码中,如果代码量很大,非常容易修改错误,有什么好点的法子吗?

答:当然,可以使用NameMapping。双击开project下的NameMapping(没有?自己创建一个,或者随便录制一段脚本,结束录制后会自动保存一个的),双击目录树上你的对象obj aaa07201721进入一个编辑界面,把左面的text属性修改为aaa*,然后添加上右面的classname=Button,其实和修改fullname是一样的效果,但是这种法子有个好处,更直观,并且修改是在NameMapping中统一修改的,便于管理,不用跑源码里面去找得那么痛苦,当然现在TestComplete高版本的也不会再使用fullname来录制脚本了,都是映射名称了。

 

想起前面的那个问题,现在来回答一下,映射名称还可以使得修改属性更方便管理,就这样啦?还有没有其他的目的呢?

 

 

3. MappedName的本质

 

问:如果整个项目中这种需要修改属性的情况很多,一个个这么修改不是很崩溃?

答:不可能吧,哪有那么多意外情况

 

那就给你看个例子,这是录制的一个web应用:

录制的内容是点击添加套餐:

001.JPG

 

录制前可以看到该映射名称下没有子节点:

002.JPG

 

录制完成后:

Sub Test1

  Dim iexplore

  Set iexplore = Aliases.IEXPLORE

  Call iexplore.ToURL("http://xxx/xxx/cityMainFrame.html")

  iexplore.pageHttp1213289411581Citymanager.panelExtComp1017.panelExtGen15.panelExtGen16.panelExtComp1009.panelExtGen26.panelExtGen28.panelExtComp1008.panelExtGen75.panelExtGen76.panelExtComp1073.panelExtGen161.panelXPanelMl.panelXPanelMr.panelXPanelMc.panelExtGen162.panelExtComp1075.table.cellExtGen193.tableExtComp1048.cellXBtnCenter.buttonExtGen195.Click

End Sub

 

 

003.JPG

 

关闭IE,重新登录后,回放脚本,提示找不到对象了

 

找到之前录制脚本中的映射名称:

004.JPG

 

005.JPG

 

 

说明之前的映射名称根据预先设置的属性属性值,查找不到现在的实例了

 

让我们来猜猜TestComplete的映射名称是怎么根据自己的预设属性和属性值来找到对应的对象实例的呢,我猜大概应该是这样的。

Ø  首先是NameMapping映射上Sys

Ø  根据进程名字和实例顺序找到进程IEXPLORE

Ø  在IEXPLORE的儿子辈对象中,查找出ObjectType=Page并且URL=xxx的一个对象,这样iexplore.pageHttp1213289411581Citymanager就和Sys.Process("IEXPLORE").Page("http://xxx:nn/xxx.html")映射上了

Ø  后面同一个逻辑,匹配上一个对象实例后,根据映射名称设定的属性和属性值,在该匹配上的对象实例的儿子辈对象中查找相应对象,一直到结束

 

 

006.JPG

 

 

其实只要看看过滤的属性就知道了,当页面中的<添加套餐>出现的时候,在其已经匹配上的儿子辈对象实例中,用四个属性一个个的去比对,objecttype=button的对象,可能有好多个,再在这几个对象中继续搜索,innerText=添加套餐的,刚好就只有一个!这不就成功了,不好意思,还有两个属性呢,在找到的对象中再找找[idStr=ext-gen195]和[OjbectIdentifier=ext_gen195]的对象,这下糗了,因为这两个属性的值发生了变化,不再是ext-gen195,而是ext-genXXX了,具体是多少没有规律,每次运行都不同。

 

前文也描述过类似情况,那我们去掉那两个属性,留下可以匹配为唯一的属性不就行了,聪明!开工。

 

007.JPG

008.JPG

 

009.JPG

 

再次回放,发现还是不行,郁闷,再仔细一看,明白了

 

 

010.JPG

 

这个目录上面随便一个节点,都是idStr和ObjectIdentifier属性约束的,下次运行的时候就发生了变化。Oh,卖锅的!一个个panel改下去不得累死!这还仅仅是一个点击动作,要整个项目做下来,那比给周扒皮当长工还惨。不管怎样,有个法子总比没有法子好。痛定思痛,发现更痛。因为发现这个法子其实根本就不可行,原因如下:

 

选择className其实还是有风险的,仔细观察会发现web中的对象类名在不同的状态下有可能不同

比如:

className=x-panel-header x-unselectable x-accordion-hd,这次是unselectable,下次可能就是selectedtable

 

也就是说,除非你修改属性的同时,保证界面在相应的操作状态上才行。

 

彻底崩溃了,除非有个方法,让TestComplete在录制脚本的时候,映射panel对象就使用className,objectType,innerText三个属性,这样才能记录到运行当时的值,然后再修改innerText,去掉一些会变化的内容,替换成星号就可以了,至于怎么修改,你可以在NameMapping的目录树上修改,也可以跑到NameMapping目录下修改文件NameMapping.tcNM,不过不建议这种法子,怕改错了。现在问题的关键是怎么提前预设需要的属性和属性值。

 

经过摸索,找到了一个方法:

 

以panel为例,需要去掉[idStr和ObjectIdentifier],使用[className,objectType,innerText三个属性],在录制的时候就用这三个属性进行panel的名称映射。

 

 

l  在录制脚本之前删除掉不用的namemapping

011.JPG

 

 

l  点击[map object from screen]

 

012.JPG

 

要是怕选择的不对,可以用highlight看看有没有选对对象

013.JPG

 

这里是要映射对象了,点击Yes

如果提示你要映射的对象找不到,刷新一下ObjectBrowser就好了

 

l  去掉[idStr,ObjectIdentifier],加上[innerText,className],innerText的值变化的部分需要修改为星号

014.jpg

 

 

 

015.JPG

 

016.JPG

 

 

 

l  这里是关键了,要建立模板,当出现panel对象的时候:

只有在这种情况下,点击了templates才会出现add按钮,非常难找

017.JPG

 

018.JPG

 

 

参看帮助:Edit NameMapping Template Dialog

这里是解释active和store的:

The properties currently used to match the mapped object with the template have the Active option checked. To modify this set of properties, simply check or uncheck their Active checkbox.

 

Note: When name mapping, TestComplete automatically chooses one or several templates that match the mapped object. If that object does not contain a property specified by the template or the property’s value does not match the value defined by the template, the template is not chosen for the object.

 

The properties that are added to the list of properties used for object identification, have the Store option checked. To change this property set, check or uncheck the Store checkbox for the desired properties.

 

Note: Do not use the Name and FullName properties to identify objects. Objects mapped using these properties may be identified incorrectly.

 

简单的说,就是如果钩选了active,等你点击确定退出模板窗口,你会发现当前窗口的属性变成你的最新设定了;

只要钩选了store识别panel的时候,就会启用className=.*、innerText=.*和ObjectType=panel

 

说了一大堆,其实就这点管用

 

 

019.JPG

 

 

 

模板都建立了,大功告成了,你可以试试再录制脚本,凡是panel对象就会启动新设置的三个属性进行映射了。

 

 

做到这里,再回头看看之前的那个问题,NameMapping除了方便书写阅读,还可以使得修改属性更方便管理,其实NameMapping最重要的能力是根据设定条件进行名称的映射,对象的高效识别。

 

 

TestComplete看界面很简单,其实内在丰富呀。不单对象展现直观,更重要的是对象的识别简单实用。些许收获,不敢专享,有错漏之处,望不吝赐教。

 

 

 

TestComplete 2全面使用指南 本文还有配套的精品资源,点击获取 简介:TestComplete 2(TC2)是一款在软件测试领域中表现出色的自动化测试工具,特别是在功能测试、回归测试和数据驱动测试方面。本指南详细介绍了如何下载安装、创建测试项目、选择脚本语言、使用对象识别与录制功能、编写和编辑脚本、组织测试套件和用例、实施数据驱动测试、运行测试和分析结果、进行调试和优化,以及利用版本控制和持续集成来提升... 阅读详情

相关推荐

Testcomplete基础教程.ppt

介绍TestComplete的基本使用方法,以及如何利用TestComplete的各种特性对.NET软件进行自动化的功能测试

GUI测试首推!TestComplete 帮助有效缩短 40-50% 测试时长!

TestComplete 集成了一种精心设计的自动化引擎,可以自动记录和回放用户的操作,方便用户进行UI(用户界面)测试,该工具提供了脚本和图形化界面操作支持。

励志做最业余的专业博主,控件产品可以私我~ 2593

零样本缺陷检测新体验:用AnomalyGPT大模型快速搭建智能质检系统(附Win10适配指南)

本文详细介绍了如何利用AnomalyGPT大模型在Windows 10系统上快速搭建零样本工业缺陷检测系统。通过实战指南,涵盖从环境部署、模型准备到工程化落地的全过程,包括将模型封装为API服务、接入工业相机以及开发可视化监控看板,为制造业智能质检提供了一套高效、低门槛的本地部署解决方案。

weixin_29094775的博客 310

以初学者角度介绍TestComplete的使用

以初学者角度介绍TestComplete的使用 2019-01-11 出处:埃森哲测试中心 作/译者:Shuyan 使用背景 在上一个Automation Project中有幸使用了TestComplete自动化测试工具,作为一只小菜鸟,第一次接触到融合了界面录制和脚本的工具,简直不要太好用。 引用一下百度百度的介绍:“TestComplete为Windows、.N...

qq_39081511的博客 1万+

ROS新手必看:如何用URDF快速搭建UR5机械臂模型(附完整代码)

本文为ROS新手提供了一份详细的UR5机械臂URDF建模实战指南。通过解析URDF核心概念,逐步讲解如何定义link与joint,并整合官方网格文件,最终构建出完整的、可在RViz中可视化与控制的UR5模型。文章还介绍了模型验证、调试技巧以及如何添加碰撞与惯性属性,为后续的物理仿真与算法开发奠定坚实基础。

pz89012345的博客 498

eMMC FFU固件更新实战:从协议解析到设备修复

本文详细解析eMMC FFU固件更新技术,从协议原理到实战操作,涵盖EXT_CSD寄存器操作、命令流状态机解析及专业工具使用指南。通过真实维修案例,展示如何利用FFU机制修复设备故障,并提供高级优化技巧与安全注意事项,是硬件工程师和维修技术人员的实用参考。

weixin_29191761的博客 377

test ui-04-testcomplete 入门介绍

TestComplete是一款适用于各种应用程序类型和技术的自动化测试环境,包括(但不限于)Windows、.NET、WPF、Visual C++、Visual Basic、Delphi、C++Builder、Java以及Web应用程序和服务。TestComplete既适用于功能测试,也适用于单元测试。它提供卓越的支持,可用于日常回归测试,并支持许多其他类型的测试:数据驱动测试、分布式测试等。您可以通过录制或在TestComplete面板和编辑器中编辑测试命令来创建测试。

1345

别再乱点U盘里的.exe了!手把手教你彻底清除那个伪装成Usb Disk的蠕虫病毒

本文详细介绍了如何识别、清除和预防伪装成Usb Disk的蠕虫病毒。从识别感染迹象到安全备份文件,再到深度清理病毒残留和构建防护策略,提供了一套完整的U盘病毒解决方案。特别提醒用户注意U盘病毒的风险,并养成良好的使用习惯。

weixin_30496999的博客 659

手把手教你TestComplete_TestComplete是啥东东

手把手教你TestComplete_TestComplete是啥东东    TestComplete是啥东东?   答案一:   谨遵内事不决问百度的法则,先查查百度百科,解释是:   TestComplete是AutomatedQA公司开发的一套支持自动测试软件

Testingba工作室 4299

使用 MATLAB/Simulink 构建一个 压水堆核电机组的反应堆控制与功率调节系统 仿真模型

本文通过Simulink构建压水堆核电机组的反应堆控制与功率调节模型,详细介绍了建模流程:从中子点动力学核心方程、反应性反馈模型(控制棒、多普勒和慢化剂效应)、一回路热工模型到完整的闭环控制系统。教程包含系统结构设计、参数设置、模块连接方法,以及典型负荷变化场景的仿真分析,帮助读者理解核反应堆动态特性和控制原理。同时提供了进阶建模建议,如分布参数模型和先进控制策略的应用。该模型为教学简化版,强调核能系统的机理建模与Simulink实现方法,适合核工程与控制领域的学习者参考实践。

amy_mhd的博客 186

【查找单入口空闲区域】-python实现-附ChatGPT解析

时间限制:1s 空间限制: 256MB 限定语言:不限题目描述:给定一个 m x n 的矩阵,由若干字符X’和 O构成,"X表示该处已被占据,O表示该处空闲,请找到最大的单入口空闲区域。空闲区域是由连通的O组成的区域,位于边界的O可以构成入口,单入口空闲区域即有且只有一个位于边界的o作为入口的由连通的O组成的区域如果两个元素在水平或垂直方向相邻,则称它们是“连通”的。第一行输入为两个数字,第一个数字为行数m,第二个数字列数n,两个数字以空格分隔,1

sinat_29950703的博客 242

手把手教你TestComplete_对象浏览功能

扎实的基本功是必须的,似是而非模棱两可的认识,往往会成为你自动化测试的最大障碍。甚至比什么技术难点还要要命。这篇文章仔细的讲解了TestComplete的对象浏览相关的各个功能,以及各部分之间的关联关系。   首先在TestComplete的项目中添加 TestedApps,

Testingba工作室 2586

scp 出现Permission denied错误 解决方法

第一种说辞(来源于网络),说是scp涉及root远程登录,默认是没有打开的,只需要把配置文件中的permit打开即可。最后scp的时候发现还不行,只需要将其scp的服务器用户名 修改为root即可。第二种解决方案,将scp 传输的服务器用户名改为root即可。(这是最基本的,一开始我忽视了这个问题,导致一直scp不了)window系统下,向ubuntu操作系统 scp传输文件。

码农研究僧的博客 6727

手把手教你TestComplete_回放找不着对象了

录制很顺利,回放找不着对象了?哦,习惯了就好了,回放找不着对象,那是常事。没事,小意思。咱来看看怎么回事。 点击业务管理   看看录制下来的脚本: Sub Test2 Call Aliases.iexplore.pageHttp102296443103M

Testingba工作室 2992

【Halcon-2D测量】add_metrology_object_rectangle2_measure 函数功能(用于向2D计量模型中添加旋转矩形(rectangle2类型)计量对象)

HALCON算子add_metrology_object_rectangle2_measure解析摘要 该算子是HALCON 2D计量模块的核心算子,用于添加旋转矩形计量对象并配置测量参数。主要功能包括:定义旋转矩形几何轮廓(中心坐标、主轴角度、长短半长);生成垂直于矩形边界的测量区域;设置边缘提取预处理参数(高斯平滑、振幅阈值)。关键注意事项:MeasureLength1必须小于矩形长短半长;角度参数Phi需使用弧度单位;多线程需同步模型句柄。该算子适用于方形螺母、PCB板边框等矩形零件的精密测量,需与a

weixin_45590420的博客 1223

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

手把手教你TestComplete_自动化测试流程示例

摘要:这篇文章讲解如何使用TestComplete运行一个记事本,输入内容后保存,通过这个实例熟悉TestComplete的环境,了解windows的GUI的测试基本流程。 整个文档的步骤: 1.        创建projectsuite; 2.        创建p

Testingba工作室 4898

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...

【教程】TestComplete测试桌面应用程序教程(四)

TestComplete是一款具有人工智能的自动UI测试工具,利用自动化测试工具和人工智能支持的混合对象识别引擎,轻松检测和测试每个桌面,Web和移动应用程序。其中,TestComplete支持测试使用C++、C#、VB.NET、Java、Delphi、C ++ Builder等其他开发...

chouhuayi4086的博客 116

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

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

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

手把手教你TestComplete_杂七杂八

本文零敲碎打的罗列了一些内容,供大家参考: 一.        得到当前的时间 Function FstrNow()     Utilities.DateTimeToString FstrNow,"yyyy-mm-dd hh:nn:ss",Utilities.Now

Testingba工作室 2646

TestComplete数据驱动测试教程(四)——修改MasterCard.ClickButton操作以及运行

TestComplete是一款具有人工智能的自动UI测试工具,利用自动化测试工具和人工智能支持的混合对象识别引擎,轻松检测和测试每个桌面,Web和移动应用程序。 本文中我们将讲解如何进行数据驱动的测试,方便大家更快更直接的学习TestComplete的使用。本教程包含两个方面的讲解,可以帮助你从脚本或关键字测试创建数据驱动的测试。今天接着讲解如何修改MasterCard.ClickButton操...

mnrssj的博客 297

TestComplete使用关键字测试的数据驱动测试(三)

TestComplete是一款具有开放灵活架构的自动化功能测试平台,可以方便快捷的在桌面、网络、移动应用中创建、维护和执行自动化测试。数据驱动测试的主要思想是将测试命令与用于测试的数据分开,并使用不同的输入值集运行测试。这里将通过三篇连续教程的介绍来演示如何使用TestComplete关键字测试执行数据驱动的测试。 修改MasterCard.ClickButton操作 进行到这里我们将修改...

ymy_666666的博客 434

手把手教你TestComplete_第一个脚本_notepad自动化测试示例

回来翻看文章的时候,无意间发现居然这篇文章给写漏下了,真是意外,赶紧补上:    摘要:这篇文章讲解如何使用TestComplete运行一个记事本,输入内容后保存,通过这个实例熟悉TestComplete的环境,了解windows的GUI的测试基本流程。     整个文档的步骤: 1.  创建projectsuite; 2.  创建project; 3.  加入TestAp

Testingba工作室 5372

TestComplete实现SaaS系统自动化测试的8个技巧

大型SaaS系统的自动化测试常常受制于界面变化快、结构复杂、加载机制多变等因素。从元素识别到脚本管理,SmartBear TestComplete帮助Salesforce建了可靠的自动化测试体系。

2501_91602431的博客 879

为什么顶尖企业开始从TestComplete转向Open-AutoGLM?真相曝光

揭秘企业自动化测试升级路径,通过Open-AutoGLM 与 TestComplete 功能覆盖对比,揭示新一代AI驱动测试方案在Web、移动端及复杂系统的高效适配优势。Open-AutoGLM凭借智能脚本生成与跨平台兼容性,显著提升测试效率与维护性,正在成为头部企业的首选。值得收藏

LiteProceed的博客 891
上一篇: 排列组合的算法
下一篇: 自行控制loadrunner的socket协议性能测试
Testingba
博客等级 码龄15年 128粉丝 86原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Testingba

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值