史上最简单Robotium跨进程操作实践——基于ADB框架

Robotium 自动遍历方案 Robotium 自动遍历方案是一种使用 Robotium 进行自动化测试的方案,可以用于测试应用程序的功能性和性能。 阅读详情

楼主原创,分享不易,转载请注明出处,谢谢。


2015年2月3日更新:

有些朋友在用真机尝试本方法时,抛出了InputStream cannot be null的异常。该异常是由于adb运行在robotium框架中时,是完全运行在手机中的,此时它的权限受到android系统的限制。而原框架是用在PC端的,这才导致了该异常的出现。具体的原因分析可以见我的这篇文章:http://blog.youkuaiyun.com/qingchunjun/article/details/43343735。

该问题的修改可以参考这里:http://blog.youkuaiyun.com/qingchunjun/article/details/43448371

注意:大家如果使用真机的话,务必使用已经root过的手机,否则将由于系统目录权限限制的原因导致文件生不成。


Robotium是Android平台下一款非常优秀的自动化测试框架,它做android平台自动化的优势想必看到这篇文章的人应该都很清楚。但优点归优点,缺点也比较多,最明显的缺点有两个,一是必须要和被测系统签名保持一致,二是不能做任何跨进程的操作。

 

很多小伙伴知道怎么用robotium,也知道它有这些限制,但不知道其中的原因。这里简单地说一下,robotium的这些先天不足的主要原因是由于它本身是基于instrumentation机制的,这既有好处也有坏处。好处是通过instrumentation注入到被测进程,从而与被测进程运行在同一进程空间,使得它能够非常方便地识别被测应用中的被测对象,并对这些对象进行操作。坏处是既然robotium已经跟被测应用”合体”了,那么根据android的进程隔离机制,它自然也被系统隔离在其他进程之外,无法跨进程操作任何对象,如图(1)所示。

 

图(1)Android进程沙箱示意图

 

其实使用相同的签名对于单应用的测试来说并不是难事,网上有很多应用重签名的方法和工具供大家使用。但不能跨进程操作确实成为了robotium最大的软肋,很多第三方的应用测试或多或少都有一些跨进程操作的测试场景,所以不少人因为这个问题而放弃了robotium,甚是可惜啊。

 

作为robotium的铁杆粉之一(我最开始接触android自动化测试就是用的robotium),断断续续用了好几年,一直觉得是android平台最好用的自动化测试工具之一。对于robotium怎样突破进程的限制也做过一些研究,网上比较多的解决方案无外乎有以下几种:

1. 自己写服务做server,基于AIDL或编写socket与monkeyserver进行通讯,然后在robotium测试脚本里调用接口方法来间接地进行跨进程的操作,这种方式可以参考下这篇文章的例子:http://www.robotium.cn/archives/584。文章的作者只是给出了思路,我自己曾经按照这种方法去实现过,发现该方法的优势是比较稳定,缺点就是实现起来确实比较复杂,而且有些操作无法找到现成的系统aidl接口来进行操作,比如调用拍照操作,所以其实例子并不是很多,技术上的局限性较大。

2. 基于广播和service服务。这种方法的实现方式可以参考http://www.ltesting.net/ceshi/open/kygncsgj/2013/0507/206229.html这篇文章的描述。这种方法我没有亲自去试过,但不难发现这种方法原理稍微简单些,但该方法貌似需要系统签名,而且自己写广播和服务来调用系统api,难度也不算小,所以一般不建议使用这种方式。

 

综合上面的这些跨进程的解决方案,其实都感觉不太理想,对于很多初学者来说不是太难实现就是局限性比较大,一直没有找到一个比较理想的解决方案。直到后来在testerhome上看到一个技术很牛的兄弟把常用的adb命令做了一个很完备的封装(PS:真的是很全了,至少常用的adb命令都在,我甚至之前都没有想过adb命令还能做这么多事情),做成了一个独立的测试辅助工具。我就突然联想到为何不能使用adb命令来辅助robotium进行跨进程操作呢?既然该框架已经封装了基于adb的所有操作,而且adb又是不受系统限制的,那么基于这个框架理论上进行跨进程操作是没有任何问题的。后来经过试验,确实效果不错,轻量级、操作简单、使用方便,并且轻松跨进程,真是居家测试、屌丝逆袭的必备神器啊。好了,闲话不多说了,接下来我们就来详细地看看究竟是怎么用的。

 

先来简单地介绍下这个adb命令框架的常用接口。这个框架里有三个主要的包,分别介绍如下:

 

xuxu.autotest这个包里面主要有两个类,一个是AdbDevice,封装了功能测试中常用的一些操作,如获取当前activity的名称和包名、获取设备分辨率、关闭应用、点击对象等常用功能,非常实用。另一个类是XuImage,顾名思义,即封装了一些常见的图片操作,如得到指定边界的图片截图、对比图片是否一致、截取图片等。

 

xuxu.autotest.element这个包主要用于获取被测对象,主要是封装了一个Position对象,用于通过Class Name、Id、Contentdesc等属性来获取一个被测对象,其底层是通过uiautomator来dump 当前ui的xml文件的,可以获取到所有对象节点的xml文件。

 

xuxu.autotest.utils这个包里面主要提供了对Date日期时间的操作,ImageUtil对图片的操作及正则表达式和shell语句的操作的封装,方便大家的使用。总的来说整个框架的接口设计还是非常齐全的,可以实现很多常用功能,具体功能大家可以自己看源码和帮助文档来摸索。

 

接下来就进入我们本次的主题——跨进程。为了方便大家理解,我会在本文中选择两个非常常见的跨进程操作场景来说明如何跨进程,也就是大家喜闻乐见的相机拍照和打电话来进行演示。

 

例子1、跨进程操作之相机拍照。

被测程序非常简单,程序界面截图如下图(2)所示:


图(2)

 

点击第一个界面的“拍照片”按钮后,进入界面2,点击其中的“拍张照片”后启动系统的相机,当用户按下拍照功能键后,系统可以将用户拍下的照片显示在应用中,以备后续浏览或者是上传。由于相机应用和我们所写的被测应用是两个不同的应用,所以这就属于典型的跨进程操作,Robotium框架本身是无法对这个相机界面进行操作的。

 

接下来看看关键的测试工程怎么创建的。测试工程的创建方法非常简单,操作步骤如下:

1. 首先按照常规的android测试工程的建法,创建一个常规测试工程。

2. 在工程中引入robotium和adbForAndroid的jar包。

这样,我们的测试工程就准备好了。

接下来的步骤就是写测试脚本。由于AdbForAndroid框架是按照元素的相关属性来查找并定位被测对象的,所以首先要弄清楚我们要操作的跨进程的界面上的对象的信息,这些信息我们可以通过很多现成工具来看,我这里选择android自带的uiautomatorviewer。先在模拟器上手工打开被测程序,进入拍照的相机界面,并用uiautomatorviewer查看界面元素信息如下图(3)所示:


图(3)

 

我们可以看到,我们要点击的拍照按钮的属性在图(3)的右下角的列表中已全部展现出来。那么我们该选哪个呢?这个问题取决于adbForAndroid框架支持由哪些属性来获取元素。通过查询其帮助文档,我们知道目前这个框架中常用的查找元素的方法如下:

  • findElementByContentdesc
  • findElementByClass
  • findElementByText
  • findElementById

由于我现在使用的模拟器版本为4.2.2,所以uiautomatorviewer无法显示id属性,如果大家用的是4.3版本以上,就可以看到元素的id属性了。

 

那么现在这种情况来看,我们最好就选择Contentdesc属性来定位对象了。代码很简单,如下:

[java]  view plain copy
  1. Element element =position.findElementByContentdesc("Shutter button");  
  2.   
  3. adbDevice.tap(element);  //点击拍照按钮  

好,接下来点击了拍照按钮之后,拍照功能还会让你选择是确定还是取消操作,如下图(4)所示:


图(4)

那么如法炮制,我们通过查询获知,这个用于确定的“√”按钮,它的属性能用于定位的其实只有class属性。不过这里要注意的是,此时由于我们用的是class属性,大家可以看到界面上class属性跟我们要点击的“√”这个按钮相同的对象很多,所以我们必须用findElementsByClass方法了。这个方法返回的是一个ArrayList<Element>,所以我们可以写如下的代码来获取所有class属性为”android.widget.ImageView”的元素列表。

[java]  view plain copy
  1. ArrayList<Element> imageViews =position.findElementsByClass("android.widget.ImageView");  

好,写完之后,现在问题来了,究竟这个数组里面哪个index才是对应的我们要点击的“√”按钮呢?经过试验,我发现界面上多个相同元素返回到数组中时,对应元素位置是按照界面上的位置从上到下、从左到右来的,所以我们要点击的这个按钮的index应该是4。所以点击它的代码如下:

[java]  view plain copy
  1. adbDevice.tap(imageViews.get(4));    //2是x,3是重拍,4是√  

上面的代码运行完后,界面就会回到我们的被测程序,后面的操作就不用我再多说了,大家看看是不是非常简单?大笑

 

例子2、跨进程操作之打电话

有了第一个例子的基础,其实第二个例子就很好实现了。被测程序非常简单,如下图(5)所示:


图(5)

点击“拨打该号码”后,系统自动进入拨号界面,所以也是典型的跨进程测试场景。

 

实现方法还是跟例1中一样,先还是用uiautomatorviewer查看界面中的对象信息,再使用对应的方法来操作对象即可。而且在这个例子中,我还给大家演示了另外一种情况,即有些跨进程操作不但要进行操作,还要取得一些对象属性来进行验证,这也是基本可以的。这里我直接给出我的测试代码(稍微封装了一下):

[java]  view plain copy
  1. public boolean CallUtil(String callNumber){  
  2.         Element  element;  
  3.         boolean  result;  
  4.         //验证是否拨打了正确的号码  
  5.         if(callNumber.length() == 11){//正常号码需要转变为 x xxx-xxx-xxxx的格式  
  6.                 StringformatCallNumber = callNumber.substring(0, 1) + " " +callNumber.substring(1, 4) + "-" + callNumber.substring(4,7) +"-" + callNumber.substring(7, callNumber.length());  
  7.                 element= position.findElementByText(formatCallNumber);  
  8.                 try{  
  9.                         Thread.sleep(2000);  //线程休眠2秒  
  10.                 }catch (InterruptedException e) {  
  11.                         e.printStackTrace();  
  12.                 }  
  13.         }else{  
  14.                 element= position.findElementByText(callNumber);//除正常号码外,其他格式的号码不进行格式转换  
  15.         }  
  16.         if(element != null){  
  17.                 result= true;  
  18.         }else{  
  19.                 result= false;  
  20.         }  
  21.         element= position.findElementByContentdesc("End");   //挂断电话  
  22.         if(element != null) adbDevice.tap(element);  
  23.         return  result;  
  24. }  

好了,整个过程非常简单。我相信能用robotium的童鞋用起来应该都没有任何问题,所有代码都是非常易用易懂的。

 

相信通过前面的实例,大家可以发现说这是“史上最简单”的Robotium跨进程操作解决方案我估计没人会反对,这并不是夸大事实、博人眼球,确实很简单,功能也很强大。其他也不用我多说了,最后我再来对该框架总结一下下吧:

优点:

1. 确实非常全,基本封装了adb的所有常用命令,它本身就是一个adb命令使用大全了。

2. 框架接口设计清晰易懂,简单明了,封装成jar包,用起来也很方便。另外希望大家都能看看它的源码并了解它的实现细节,作者封装得还是很不错的,很值得我们学习,而不仅仅是简单地使用它。

 

目前已知的不足:

1. 手机的版本必须是4.1以上,即至少必须支持uiautomator的手机才行,因为该框架本身底层是依赖于uiautomator来dump出对象布局xml文件,最终获取对象的坐标进行操作的,所以你的手机版本本身并不支持uiautomator的话,就没法实现dump操作。

2. 如果是真机的话,必须要root后的才可以。

2. 有些对象是uiautomator也无法识别和操作的,那当然这个框架也无能为力了。比如屏幕最上方的通知消息栏的对象,所有工具都没法显示和识别,这个肯定没办法了,另外还比如输入文字时的弹出键盘上的按钮对象等,也无法识别,大家可以试试。

 

以后想要尝试的改进:

1. 对于手机版本的支持问题,个人觉得有个曲线救国的方法可以解决。即我们可以稍微修改下源码,加入判断手机版本的代码,判断当前手机版本如果高于4.1,就直接通过uiautomator来dump,如果低于4.1,则读取PC上事先导出到指定位置的xml文件。这样的话,如果你使用的手机不是4.1以上的版本,只需要事先把被测应用用4.1以上版本的手机通过uiautomator先dump到PC的一个指定路径上就行了,这样效果应该是一样的,只要最终能得到对象坐标就OK。

2. 再加一些比较实用的功能。比如现在可以根据text来查找对象,但实际上很多时候我们可能是得到对象了,但想通过这个对象去获取对象的其他属性,所以建议增加类似getXXXXByElement(Element e)这样的方法,有空试一下,呵呵。

 

以上只是我的一些个人想法,如果大家还有一些什么别的建议,也欢迎大家都提出来,一起来完善这个很实用的框架。

 

最后,再次感谢AdbForAndroid框架的作者: xuxu。

想要研究框架源码的童鞋,可以去github地址下载:https://github.com/gb112211/Adb-For-Test

本文中相关样例工程源码(含被测程序和测试程序)下载

另外,如果实在不知道怎么用这个框架的童鞋,可以参考下光荣之路的美女讲师的视频,里面有讲怎么去用这个框架:http://pan.baidu.com/s/1i3raNv3?qq-pf-to=pcqq.group

十、Robotium测试入门 移动端测试_Robotium 工具介绍 一款国外的Android自动化测试框架,主要针对Android平台应用进行黑盒自动化测试,提供了模拟各种手势操作(点击、长按、滑动等),查找和断言机制的API。Robotium4.0已经支持对WebView的操作。Robotium是基于Instrumentation框架的,其编写的测试脚本与被测程序运行在同一个进程里面,所以需要测试程序与被测程序拥有相同的签名,否则无法进行通讯。 AS+Robotium 1.配置,build.gradle文件中添加依赖,如果编译时未同 阅读详情

相关推荐

robotium基于Android studio无源码测试

一、思路: 1、当我们在Android studio中运行测试用例时首先会编译出app-debug.apk和app-debug-androidTest.apk,然后通过adb命令将被测试apk push到手机然后执行adb命令进行安装;测试apk亦然。最后在调用adb shell am instrument.....命令来启动测试用例 2、Android studio将测试工程做了密封,无法设置A...

7117

史上最简单Robotium跨进程操作实践——基于ADB框架(转)

https://blog.youkuaiyun.com/qingchunjun/article/details/42580937?utm_medium=distribute.pc_relevant.none-task-blog-baidujs-4

1694

UiAutomator Robotium Appium三种自动化框架对比

一、原理 1.UiAutomator——基于UIAutomation的用户界面自动化测试框架,可以跨应用工作,谷歌亲生的。 UIAutomation在Android4.3发布时有了新版本,官方简介:http://blog.youkuaiyun.com/zhubaitian/article/details/40504827。 Android4.3之前:使用inputManager或者更早的Wi

liuyuxuan2011的博客 949

HermesEventBus-饿了么开源的Android跨进程事件分发框架

由于Android不同进程之前不能相互通信,所以当开发过程中遇到跨进程通信的时候,常用的方案就是AIDL(Android Interface Definition Language)通过它我们可以定义进程间的通信接口,但是当应用中出现大量跨进程通信的时候,比如你想体验一下插件化开发或者特殊需求在单应用中需要开多个进程,那么写过AIDL的同学都会有痛不欲生的感觉。现在福利来了,可以试试饿了么开源了一款

Dream It Possible 6386

Android-安卓跨进程跨app通信框架

本框架实现了安卓跨进程跨app通信的方便调用和封装

电阻基础知识及应用电路仿真(Multisim)

本文围绕硬件工程师必备的电阻知识,从基础知识、实操、应用仿真三方面做系统讲解:基础上明确电阻的核心参数、分类、串并联计算及核心特性;实操中详解贴片/色环电阻的阻值读取、贴片封装换算,重点区分0Ω电阻(贴装跳线,实现功能选通/调试等)与磁珠(高频吸噪)的差异及选型;应用上介绍限流、分压、上拉/下拉、阻抗匹配、过压/过流保护五大典型电路的设计公式、选型原则和实操要点,同时给出电阻通用的选型、测量和布线设计规范,形成完整的电阻应用知识体系。

XU157303764的博客 2775

史上最简单 Robotium 跨进程操作实践——基于 ADB 框架

最开始发在csdn的,为了更多小伙伴看到,特在这里再转一下。http://blog.youkuaiyun.com/qingchunjun/article/details/42580937 Robotium是Android平台下一款非常优秀的自动化测试框架,它做android平台自动化的优势想必看到这篇文章的人应该都很清楚。但优点归优点,缺点也比较多,最明显的缺点有两个,一是必须要和被测系统签名保持一致,二是

可口可乐的博客 999

模拟一个基站和一个移动台之间的信号传播

同样使用时间序列和上述参数计算出反射径信号的信号强度。根据时间序列和上述参数,计算出直射径信号的信号强度。该信号被视为一个简单的正弦波信号,其频率是2Hz。:时间序列,从0.1秒开始,每隔0.0001秒采样一次,直到12秒。:设置坐标轴范围,横轴范围为0到12秒,纵轴范围为-0.5到0.5。:移动台移动的速度。:移动台距离基站的初始距离。:基站到反射墙的距离。假设基站到反射墙的距离为15米。:绘制直射径信号、反射径信号和合成信号的波形图。:添加标签,标注每条曲线对应的含义。表示反射径信号的颜色为绿色,

Fanjufei的博客 292

【转】史上最简单Robotium跨进程操作实践——基于ADB框架

Robotium是Android平台下一款非常优秀的自动化测试框架,它做android平台自动化的优势想必看到这篇文章的人应该都很清楚。但优点归优点,缺点也比较多,最明显的缺点有两个,一是必须要和被测系统签名保持一致,二是不能做任何跨进程的操作。 很多小伙伴知道怎么用robotium,也知道它有这些限制,但不知道其中的原因。这里简单地说一下,robotium的这些先天不足的主要原因是由于它本

songlan22的专栏 560

Python3实现基于ARIMA模型来预测茅台股票价格趋势

ARIMA(Autoregressive Integrated Moving Average)模型是一种广泛使用的时间序列分析方法,它可以用于对未来的数据进行预测。ARIMA模型由自回归模型(AR模型)、差分整合模型(I模型)和移动平均模型(MA模型)组成,因此也被称为ARIMA(p,d,q)模型。其中,p表示自回归阶数,d表示差分阶数,q表示移动平均阶数。具体来说,ARIMA模型可以通过以下步骤进行建模:数据预处理:对时间序列进行平稳性检验,如果不满足平稳性,则进行差分操作。

m0_64336780的博客 2万+

【BlueDroid】【BLE】低功耗蓝牙客户端和服务端开发流程解析(超详细)

1. 精讲):SPP/A2DP/AVRCP/HFP/PBAP/IAP2/HID/MAP/OPP/PAN/GATTC/GATTS/HOGP等协议理论2. 欢迎大家关注和订阅,和专栏会持续更新中.....敬请期待!

风云说通信 1925

关于adb4robotium跨进程框架抛出InputStream cannot be null的异常的解决方案

之前我写的关于利用adb框架来进行robotium跨进程操作的文章中,有些朋友使用真机进行测试时,遇到一个比较奇怪的问题,会抛出"InputStream cannot be null"的异常。经过检查发现是由于代码中要生成的uidump.xml文件并没有在目标文件夹中生成,导致后面在使用File对象处理时,直接抛异常了。 这个问题其实比较怪异,经分析问题原因是跟adb命令在robotium框架中

0xAI 4757

第28节:cesium 加载高程数据(含源码+视频)

cesium 加载高程(地形)数据

qq_29384639的博客 1741

测试与调试利器:awesome-androidstudio-plugins中的Robotium Recorder与Adb Idea全解析

awesome-androidstudio-plugins是一个收集Android Studio常用插件的开源项目,其中Robotium Recorder和Adb Idea是提升测试与调试效率的两款实用工具。本文将详细解析这两款插件的功能特点与使用方法,帮助开发者优化Android开发流程。 ## 一、Robotium Recorder:自动化测试脚本录制神器 ### 1.1 核心功能与优势

gitblog_00517的博客 997

【3天快速入门WPF】从小白到新手入门教程

嘿,小伙伴们!如果你已经有一定的C#开发基础,但想快速掌握WPF开发,达到企业级水准,那接下来的这个三天快速入门计划绝对适合你!虽然听起来有点挑战,但别担心,只要跟着这个高强度、结构化的学习计划,你一定能搞定它。首先,我们得搞清楚,WPF的核心知识点到底有哪些。要想达到企业级开发水准,XAML、数据绑定、MVVM、控件使用、命令系统、样式模板这些统统都得拿下。听起来是不是有点多?别急,我们把任务分解到三天里,每天安排合理的内容,保证理论和实践相结合,让你学得扎实又高效。

Zy100Papa的博客 1423

第10篇:Agent + 爬虫 = 全自动数据采集专家

在企业级数据采集场景中,传统爬虫的痛点已经到了无法忽视的地步:而Agent + 爬虫的组合,就是这些痛点的终极解决方案。它的核心逻辑是:把爬虫从「人工写死的固定执行脚本」,升级为「能自主分析、自主决策、自主适配、自主修复的智能采集机器人」。我们在生产环境中做过对比测试:传统爬虫开发10个网站的采集脚本需要3人天,而Agent采集机器人只需要3分钟,页面改版后的修复成本从1人天降到了0,采集任务的成功率从62%提升到了95%以上。终端执行以下命令,安装基础依赖,与前9篇环境完全兼容: 二、核心能力拆解:Age

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1576

Robotium

本文内容:基于Android Studio 的Android自动化测试框架Robotium的开发 版权声明:本文为原创文章,未经允许不得转载 博客地址:http://blog.youkuaiyun.com/kevindgk 简介 Robotium Robotium Recorder 一白盒测试 创建Android项目 安装Robotium插件 启动插件 开始录制脚本 1 Runtime

一路向东 1万+

基于Simulink的四足机器人楼梯攀爬仿真模型

构建一个基于Simulink的四足机器人楼梯攀爬仿真模型,旨在模拟四足机器人在面对楼梯等障碍时的运动控制和稳定性调整。以下是一个详细的步骤指南,帮助你从零开始创建这样一个仿真模型。

xiaoheshang_123的博客 247

robotium原理

Clicker类 solo.clickonScreen方法,底层调用MotionEvent类。 MotionEventandroid.view中的类,Objectused to report movement (mouse, pen, finger, trackball) events robotium如何定位控件? search类获取当前所有的view,然后根据类型或

whuyi的专栏 3436

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Android 测试 Appium、Robotium、monkey等框架或者工具对比

1. Appium测试 (功能测试,用户接受度测试,黑盒测试) - Rating: 8 Website: http://appium.io/ Appium测试相当于黑盒测试。只是测试UI逻辑正确性。所以Appium测试框架提供的方法有限。获取一个AppiumDriver对象。该对象只是有很多findElements()的方法,获取到UI元素。UI元素是WebElement,这个类提

u012565107的专栏 1万+

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

UIAutomator2、Appium、Robotium搭建环境与框架对比

UIAutomator2、Appium、Robotium搭建环境与框架对比 一.框架介绍 Appium 特点 appium 是一个自动化测试开源工具,支持 iOS 平台和 Android 平台上的原生应用,web应用和混合应用。 “移动原生应用”是指那些用iOS或者 Android SDK 写的应用(Application简称app)。 “移动web应用”是指使用移动...

ainian1627的博客 1398

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

上一篇: Android Robotium跨应用处理方法
下一篇: android 常用adb 和 adb shell 命令
whackw
博客等级 码龄16年 203粉丝 69原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值