我的最新日志

  • 论"自动化能做什么"

    2008-10-11

    最近在论坛、QQ群里,竟然看到有人问:自动化测试能做什么,还有人曾经发消息给我,提出在需求阶段自动化测试能做什么这样的问题。本人并不觉的这样的问题有什么不妥,而且我相信很多人都在为这样的问题而困扰。我从事测试工作的时间也不是很长,做自动化测试也就一年多点的时间,在这里我就结合我的一些体会,和大家一起讨论一下自动化测试的一些问题吧,想到哪儿说到哪儿。欢迎大家交流,如要转载请注明出处:http://blog.csdn.net/wyp_810618。感激不尽

        首先讨论自动化测试能做什么这个问题,要回答它就需要提这个问题的人首先回答另一个问题,那就是你希望自动化测试做什么。自动化测试只是一种测试活动之一,和我们熟悉的功能测试、系统测试没什么区别。我们已经很习惯在功能测试、系统测试、性能测试等测试过程中去定义测试目标、安排测试计划、设计测试方案,自动化测试也一样啊,它也有测试目标、测试计划(脚本开发计划)、设计测试方案等活动。我从来没见过有人问系统测试能做什么,性能测试能做什么的问题,自动化测试也有它擅长的领域,自动化测试并不神秘,我想很多人真正迷惑的地方并不是自动化测试能做什么,他们真实困惑的是我希望自动化测试做什么

    扩展一下上面的那个我希望自动化测试做什么的问题,其实这个问题本身就是一个测试需求设计的问题。我希望大家能接受测试需求这个概念,不是只有客户才有需求,我们测试人员也有同样有测试需求,这个需求来源于我们希望改进测试过程、提高测试执行的效率和可靠性,扩大测试的覆盖率。其实功能测试、系统测试、性能测试等都会有测试需求,只是大家可能对这些需求太熟悉,所以反而都忽略了。测试需求就是我们的测试目标,自动化测试的需求就是我们的自动化测试目标,就是我们希望自动化测试做什么。举一个具体的例子,我们有一个软件,有一天测试人员甲反映了一个问题:在每次发版后,都需要验证数据保存的正确,但是这个功能已经开发N年了,比较稳定,可是不测试一遍又总觉的不放心,但是每次测试又耗费了大量的时间,还没有效果,时间长了就厌倦了。OK,我们看到自动化测试的需求已经提出来了,那就是发版后对数据保存功能的验证测试。我们希望能通过自动化测试的方式完成每次发版后的数据保存功能的测试,让测试人员甲可以把精力放在更需要人主观能动性的工作上,这也就回答了“我希望自动化测试能做什么”的问题。

    现在我们讨论第二个问题:自动化测试能做什么。当我们明确了自动化测试的目标后,并不是马上着急动手写脚本。为什么呢,因为在我们的工作中,提出自动化测试需求的人往往不是自动化测试工程师,而是手工测试人员。就象上面那个例子中的测试人员甲。测试需求提出后我们不能立刻去实现,而是要对测试需求进行分析,此时关注的重点就是需求的合理性。自动化测试不是阿拉丁神灯,它有人工测试无法比拟的优势,但是它也有自身的局限性。我们需要分析在提出的测试需求中,哪些需求是适合用自动化测试实现的。也许有人问,那到底什么样的需求才是适合用自动化测试实现的呢?对不起,这个问题小马我也无法回答,因为这个问题才宽泛了,要看需求是什么样,所采用的自动化测试框架是什么样的,还要看自动化测试工程师的代码能力。换句话,自动化测试能做什么,与所测试的软件、测试流程、测试人员的技能有很大的关系,当然,这些都取决于一个根本问题,那就是“自动化测试需求”

    讨论完这两个问题,我们再来讨论“需求阶段自动化测试能做什么”,对于这个问题,我还是刚才的观点,首先提问题的人你要回答“你希望在需求阶段自动化测试做什么”,这样回答并不是托词,大家想一想,如果我们还不能明确需求阶段我们要做什么工作,就算没有自动化测试,我们的工作也没法开展。所以对于这个问题,我希望大家能拆成几个小问题来回答:第一,需求阶段我们有哪些工作要做?第二、这些工作项中又有哪些是适合用自动化测试来做的?第三,我们用什么样的工具去实现。最后就是去实现它。

    说到实现,我们要讨论的第三个问题就来了,那就是如何做自动化测试。这个问题曾经也困扰过我很长时间,到现在很多人也在提这个问题。但是我觉的这个问题同样是一个无法回答的问题,为什么呢,因为这个问题也很宽泛,不是回答了你做完一二三四后,就实现自动化测试了。自动化测试本身也是一个开发过程,它涉及到需求分析、框架设计、脚本开发、运行维护等。如果真要回答如何做自动化测试这个问题,就要分别回答如何做自动化测试需求、如何设计自动化测试框架、如何进行开发测试脚本、如何运行维护等等,哪个问题讨论的话都能写本书出来。我曾经开过一个玩笑,如何自动化测试的问题等同于问如何让航天飞机上天,因为它们都包含了很多的子过程和方法论,而且答案不是唯一的。有人可能会说我故弄玄虚,因为现在很多测试工具都提供了脚本录制功能,自动化测试真的有那么难吗?对于这样的疑问,我也不想多做讨论,我只提出一个针锋相对的问题:使用自动化测试工具等于自动化测试吗?

    刚才讨论了三个问题,但是还有很多问题没有讨论。自动化测试是一个博大精深的领域,着实令人着迷。希望刚才小马的一些想法能对大家有所帮助,那样的话也不枉我打这么多字了,呵呵。

  • RFT中代码不能完全显示的解决方法

    2008-9-08

    这两天在用RFT时碰到了一个比较怪异的问题,当打开一个脚本文件或者进入某个类时,只能显示部分代码,给代码的查看和调试带来了很大的不方便。

        通过查找资料,知道这个问题的根本原因在于选择了RFT中的“仅显示所选元素的源”,如果是英文版的话,该功能的按钮名称叫“show source of selected element”。从Eclipse 3.2开始,该功能按钮被默认为隐藏不显示的。RFT很明显使用的是Eclipse3.2以后的版本作为扩展平台。想想以前可能是按哪个快捷键的时候,不 小心按错结果就糊里糊涂的启用这个功能了,而且半天找不到这个按钮在哪里,着实费了不少的力气。

        取消该功能的方法是,点击“窗口——定制透视图”,在该界面中点击“命令”页签,在命令列表中选择“编辑器表示”项,此时右侧的“工具栏详细信息”列表中就会出现“仅显示所选元素的源”功能项,点击一下将其取消即可。界面如图:

     

       

    如果是英文版的,则相应操作的按钮名称依此为:Windows---Customize Perspective----Commands,选择其中的 Editor Presentation项,点击Show source of selected element 将其取消即可。

  • ruby中获取当前脚本文件的路径

    2008-7-12

    在ruby 中,以下代码可以获得当前脚本的绝对路径:

    require 'pathname' puts Pathname.new(__FILE__).realpath

    将以上代码保存在test1.rb中,然后放在D盘的根目录下。测试的时候我们进入C盘,执行ruby d:\test1.rb,控制台会输出当前脚本的绝对路径:d:\test1.rb。

    有人可能会问,Dir.pwd不是也可以获取吗?其实是不行的。Dir.pwd获取的是工作目录,我理解的工作目录就是RUBY的调用目录,也就是说你获取的是在哪个目录下调用的脚本,而不是脚本在哪个目录。我们可以做以下实验,首先创建一个test2.rb文件,录入代码如下:

    puts  Dir.pwd

    保存后,我们把这个文件也放到D盘根目录下,然后在CMD命令行下我们进入C盘,(注意,是C盘哦!),然后执行:ruby test2.rb,你认为它会输出什么呢,是D:/ 吗?错,是c:/ !让我们来看的更清楚些,在CMD命令行下进入c:\windows\system目录,执行ruby d:\test2.rb,你会看到输出的结果是c:/windows/system。这下清楚了吧,你在哪个目录下调用的脚本,Dir.pwd返回的就是哪个目录,但是这个脚本所在的真实路径是没有关系的。官方的API上写的是返回工作目录,我们很容易把它理解成绝对路径的。

    其他的操作方法有:

    获得当前执行文件的文件名:

    __FILE__

    获得当前文件的目录

    File.dirname(__FILE__)

    获得当前执行文件的完整路径

    require ‘pathname’
    Pathname.new(__FILE__).realpath

    获得当前执行文件的目录完整路径

    require ‘pathname’
    Pathname.new(File.dirname(__FILE__)).realpath

    资料来源:http://www.leesoft.com.cn/2008/04/15/ruby%e8%8e%b7%e5%8f%96%e5%bd%93%e5%89%8d%e7%9a%84%e6%89%a7%e8%a1%8c%e6%96%87%e4%bb%b6%e7%9a%84%e8%b7%af%e5%be%84%e5%92%8c%e7%9b%ae%e5%bd%95/#comment-9

  • RFT测试对象检查器与jdk版本的兼容性问题

    2008-7-09

    一、问题 我所使用的RFT是v7.0.1.2版本,一切正常。但是当我把JDK从1.4.2更新成1.6以后,测试对象检查器就出现了问题。具体表现是,当对象检 查器悬浮在IE界面上时,无论用鼠标点击那里,都无法识别出IE的任何属性。而对于RFT自带的演示程序,对象检查器可以正确的识别。
     二、分析 对比问题出现前后的工作环境,我将问题定位在了JDK上。IE使用默认的java插件,其版本与机器上所安装的JDK版本一致。可能RFT的对象检查器在 识别IE时,与IE的JAVA插件有依赖关系。RFT中的JDK是1.5版本,而我的JDK是1.6,这样有可能出现不兼容的情况(仅为个人推测)。恰巧 这时部门里一个漂亮的女同事也将JDK升级为1.6,在她的机器上,也出现了测试对象检查器不能识别IE对象的问题。
     三、解决 问题定位后就开始着手解决,首先我修改环境变量,将jdk1.6全部替换成1.4.2,重启机器,问题依旧;
     在IE的(工具——选项——程序——管理加载项)中,禁用JDK1.6插件,重启IE,问题依旧;
     同样在IE的(工具——选项——程序——管理加载项)中,点击JDK1.4.2,点击更新activeX插件,更新失败,放弃;
     在控制面板中,卸载jdk16和1.4.2,清除系统变量中所有关于JAVA的配置,然后重新安装JDK1.4.2并配置JAVA环境变量,问题依旧;
     在我的RFT中我曾经装过VSS插件,于是将VSS插件禁用,重启RFT,问题依旧,再重启机器,问题依旧;
     实在无奈,抱着机箱大喊:”我爱你“,问题依旧。 重装RFT,并升级为7.0.1.2,问题解决
    四、花絮
    今天早上,漂亮的女同事给我发消息,说这个问题不用重装也可以解决,方法是在RFT的“窗口—首选项”中,点击“JAVA—已安装的JRE”,将JDK1.6 添加进来;然后在“ECLPSE配置—启用环境进行测试“中,点击JAVA页签,将JDK1.6添加进来,最后将原来缺省的禁用。然后重启RFT就OK了, 前后不用五分钟的时间。
    想想一开始的时候我那么胡乱折腾,真是好笑。到底还是对RFT的相关功能不熟悉。
  • RFT不能安装RDT问题的处理

    2008-7-08

    RDT是ruby在eclipse上的插件,同样可以使用在rational functional tester中。但是RDT却对rft的版本有要求。如果安装的是rft 7.0.0.1,则不能安装RDT插件,表现就是看不到任何的ruby透视图,在帮助——查找并更新中虽然能看到ruby的节点,但是在网络畅通的情况下 却总是提示更新失败。
     要安装RDT插件,首先需要更新IM版本,如果是从7.0.0.1更新,则首先打开管理平台Installation Manager,他应该会提示有一个v1.1的更新,首先更新IM,如果没有该提示的话,则说明你的IM已经是最新版本。
    IM更新后,需要更新RFT版本,打开im,点击“更新软件包”,然后一直下一步即可完成更新。 截止到我发表这篇文章(2008-7-8)为止,RFT的更新版本是7.0.1.2,更新完成后,复制RDT的features和plugins文件夹到 rft安装目录下的sdp70目录,覆盖同名文件夹。然后启动RFT,在“窗口—选项”界面右侧的列表中,即可看到RUBY节点。相关配置在这里就不说 了,百度里一搜一堆,我另一篇文章也有写。
  • 安装Watir-1.5.6.gem失败

    2008-7-07

    现在网上很多人都在说用gem安装Watir,但是很多人都忽略了Watir和ruby之间的对应关系。

    我在本机上ruby的版本是1.8.6,从官网上下载了watir-1.5.6.gem,然后拷贝到根目录下。在网络畅通的情况下,在CMD命令行下执行如下命令:

    gem install watir-1.5.6.gem

    控制台报错,大概是需要win32-process这样的提示。

    网上有人说这个问题的原因是网络不好,其实根本原因是ruby和watir之间的版本不一致。在我本机的环境上,ruby1..8.6只能安装watir-1.5.4.gem。

    解决这个问题最好的方法是首先更新gem,执行如下命令

    gem update --system

    更新完毕后,才可以运行gem install watir-15.6.gem命令。该做法要求网络畅通,如果公司里使用了域服务器,则有可能会造成网络无响应,安装不成功。没什么理由,也没什么好办法,除非你跟公司的网管熟。

    第二个解决方法也简单,那就是放弃使用watir-1.5.6.gem。如果你的ruby版本是1.8.6,那么可以下载watir-1.5.4.gem。Watir-1.5.4.gem下载地址:

    http://rubyforge.iasi.roedu.net/files/wtr/watir-1.5.4.gem

    同时如果想下载其他版本的Watir,则可以访问以下地址:

    http://rubyforge.org/frs/?group_id=104

     

  • RFT无法识别windows对话框的处理方法

    2008-7-02

    一、概述

    RFT中提供了find方法,这是一个很强大的工具,可以让我们在脱离测试对象的情况下运行测试脚本,这样我们的脚本就有了很好的健壮性和可移植性(在去年的自动化测试项目中,QTP就经常因为测试对象的属性问题导致脚本运行失败)。但是今天在利用测试对象检查器获取windows对话框属性时,碰到了一个很极端的问题,对象检查器竟然无法识别windows对话框。最后几经周折,终于解决了这个问题

    二、问题

    脚本的操作过程是这样的,首先点击界面中的导出按钮,这时系统会弹出一个是否保存的确认提示框,这时点击“是”,然后系统会在该对话框的基础上打开一个新的文件保存对话框。这时我发现用测试对象检查器根本无法获取到该对象的任何属性,用find方法查找时也找不到任何的对象。使用的属性是“.name”,属性值是"另存为"

    三、分析

    该问题的根本原因在于RFT的对象识别机制。通过查阅资料和api,我觉的RFT所能处理的对象关系可以分为两种,一种是父子关系的对象集合,另一种我们暂且叫做顶层——下层关系的对象集合。举个简单的例子,一个拥有“确定”“取消”两个按钮的确认提示框就是父子关系的对象,确认提示框是父对象,确定按钮和取消按钮就是这个按钮的子对象。父子类型的对象可以很容易的被对象检查器或find方法找到;顶层——下层关系的对象就象我们上面举的那个例子:在已经存在的windows对话框的基础上,又出现了一个对话框。两个对话框并非是父子关系,而是一种嵌套关系,并且很明显,其中有一个对话框是顶层窗口,也就是焦点的拥有者,在开发上也有叫做模态窗口的。顶层——下层对象不能被对象检查器所识别。当然,这些都是我目前对rft的理解,IBM的网站并没见过类似的解释。利用GuiTestObject我们可以很方便的处理父子关系的对象,但是对于顶层——下层关系的对象,GuiTestObject对象则无能为力(至少在我这里是这样)

    四、解决

    要解决该问题不妨换一个角度,RFT提供了访问window平台控件的接口,那就是IWindow。既然我们不能通过TestObject类获取保存对话框的属性,那么我们就把保存对话框当成是一个windows对象,用IWindow来识别。我们需要解决以下问题:

    1、首先让脚本获取到文件保存对话框对象,该对象的类型是IWindow,对象获取可以使用getText返回的属性,文件保存对话框的getText会返回“另存为”。

    2、调用IWindow的inputChars录入文件保存的目录。

    3、让脚本获取到该保存对话框对象的子对象“保存”按钮,并执行点击操作

    为了实现以上的功能,我们需要两个方法,分别是getTopWindow和getLevelWindow,在IBM网站上有篇相关的文章,链接请见第五节,这里直接贴出代码:

    1. /**  
    2.      * 返回window系统中顶层窗口的对象,例如getTopWindow("另存为")将返回一个windows另存为对话框,与getLevelWindow不同的是,Topwindow对象可以执行inputChars方法,而LevelWindow则不行.  
    3.      * @param objName windows窗体、对话框、元素的getText属性  
    4.      * @return IWindow windows控件(对象),该对象是顶层窗口  
    5.      */  
    6.   
    7.     public IWindow getTopWindow(String objName) {   
    8.   
    9.   
    10.   
    11.         IWindow[] wins = RationalTestscrīpt.getTopWindows();   
    12.   
    13.         int length = wins.length;   
    14.   
    15.         for (int i = 0; i < length; i++) {   
    16.   
    17.   
    18.   
    19.             if (wins[i].getText().matches(objName)) {   
    20.   
    21.                 return wins[i];   
    22.   
    23.             }   
    24.   
    25.         }   
    26.   
    27.         return null;   
    28.   
    29.     }  
    1. <PRE class=java name="code">/**  
    2.      * 对于某些二级弹出窗口,可用该方法进行识别和操作,该方法返回指定名称的对象,例如getWinObject("另存为","保存(&S)"),该方法回返回windows保存对话框中的"保存"按钮.  
    3.      *   
    4.      * @param topWinName  
    5.      *            顶层窗口对象的getText属性  
    6.      * @param levelWinName  
    7.      *            顶层对象下子对象的getText属性  
    8.      * @return IWindow对象,该对象可执行单击和双击的操作.  
    9.      */  
    10.   
    11.     public IWindow getLevelWindow(String topWinName, String levelWinName) {   
    12.   
    13.         IWindow winobjects = null;   
    14.   
    15.         IWindow[] wins = RationalTestscrīpt.getTopWindows();// 返回windows对象数组   
    16.   
    17.         for (int i = 0; i < wins.length; i++) {// 在数组中查找所有符合topWinName属性的对象   
    18.   
    19.             if (wins[i].getText().equals(topWinName)) {   
    20.   
    21.                 winobjects = wins[i];   
    22.   
    23.             }   
    24.   
    25.         }   
    26.   
    27.         IWindow[] winobj = winobjects.getChildren();   
    28.   
    29.         for (int i = 0; i < winobj.length; i++) {   
    30.   
    31.             if (winobj[i].getText().equals(levelWinName)) {// 在顶层对象中,查找符合levelName属性的对象   
    32.   
    33.                 return winobj[i];   
    34.   
    35.             }   
    36.   
    37.         }   
    38.   
    39.         return null;   
    40.   
    41.     }</PRE>   
    42. <PRE class=java name="code">最后实现文件保存框识别和文件保存的代码如下:</PRE>   
    43. <PRE class=java name="code">test.getLevelWindow("另存为""文件名(&N):").click();//点击文件保存文本框,获取焦点.   
    44.   
    45. test.getTopWindow("另存为").inputChars("c:\\result.xls");//录入保存文件的对话框</PRE>  

    五、小结

     

    当代码完成后,我发现这个问题其实并不复杂,所有的类和方法rft都已经提供了,只是由于以前我不熟悉IWindow的用法,所以走了不少的弯路,直到看到ibm网站上的一篇文章才豁然开朗。其实不仅仅是保存对话框,任何windows平台的控件,我们都可以用IWindow来实现查找和定位。  

     

     

    http://www.ibm.com/developerworks/cn/rational/r-cn-extendsrftobj/index.html

  • 在Rational Function Tester中使用JRuby

    2008-6-29

    一、概述

    Rational Function Tester是IBM的一款功能自动化测试工具,使用JAVA作为脚本语言,不了解他的朋友可以去IBM网站看看。

    RUBY是目前WEB开发中炙手可热的语言,简单,灵活,宽松,并且有趣。在公司今年的自动化测试项目中使用了RFT搭建测试框架,同时对于页面中一些OCX控件的识别采用RUBY进行识别。这样的话就需要解决JAVA代码与RUBY脚本之间变量传递和方法调用的问题,JRUBY自然成了最好的选择。

    这篇文章里我把自己配置和实验的过程帖出来,与大家分享和交流

    二、准备

    需要安装的运行环境有:JRuby,RFT,JAVA SE 6.0。

    Jruby和jdk 1.6的安装在我的另一篇文章已经介绍了,大家可以访问以下地址查看:

     http://blog.csdn.net/wyp_810618/archive/2008/06/28/2595180.aspx

    RFT的安装请参考IBM网站的说明

    为了能在RFT中使用Ruby,我们还需要下载RDT插件,有人可能会奇怪,这不是Eclipse中的插件吗?没错,因为RFT本身就是一款基于Eclipse平台的测试工具(现在我更喜欢把RFT软件叫成“Eclipse的RFT插件”)

    RDT下载地址:http://jaist.dl.sourceforge.net/sourceforge/rubyeclipse/org.rubypeople.rdt-0.7.0.601192300PRD.zip

    三、RFT配置

    1、将RDT压缩包解压到任意目录,得到features和plugins两个目录,将这两目录拷贝到RFT的安装目录D:\program files\IBM\SDP70目录下,覆盖原目录。

    2、启动RFT,依此点击:窗口——首选项,在左侧列表中应该能看到Ruby节点,然后依此点击Ruby——Installed Interpreters节点

    3、在该界面中配置Jruby的运行环境。点击Add按钮,在新建窗口中,Interpreters Name可自定义,Location中填入%JRUBY_HOME%/bin/jruby.bat目录,其中%JRUBY_HOME%是你jruby的安装目录,可以在环境变量中查看。录入完成后应该类似于这个样子 :

    点击确定后即可完成配置

    四、验证

    安装完成后,我们需要验证jruby是否能在RFT下正常运行。

    首先在RFT中新建一个Ruby项目,在项目列表中能看到Ruby节点,不知道怎么操作的朋友自己去百度上搜一下eclipse的用法吧;

    在RFT中新建Ruby项目后,需要切换透视图才能看到项目节点,点击窗口——打开透视图——其他,在列表中选择Ruby节点,点击确定,此时在RFT左侧的项目中就能看到刚才新增的RUBY项目

    在RUBY项目节点上右键,新增一个文件,文件名为HelloWorld.rb(注意,一定要带.rb后缀名),然后在该文件中录入如下代码:

    puts "Hello JRuby world"

    以上代码末尾无任何符号。保存。

    最后,在该文件上点击右键——运行方式——Ruby application,运行该文件。如果能看到控制台中输出Hello JRuby world,则说明该配置已经生效。

    如果在控制台中出现报错信息:'cmd'不是内部命令也不是外部命令,那么请修改%JRUBY_HOME%/bin/jruby.bat文件,将最后一行代码注释掉即可。

  • RFT自动化测试中的相对路径

    2008-6-17

    相对路径的问题不是RFT自动化测试中独有的,所有涉及到团队开发的代码都必须解决相对路径的问题。解决方法也是多种多样,对于j2ee的程序来说,中间件提供了上下文环境,也有把根目录写在环境变量或配置文件里的。昨天在论坛上看到了RFT提供的getOption方法,感觉用它来实现脚本的相对路径和迁移十分方便。
    假设我们RFT自动化测试的项目路径为d:\ci_automation\src,然后在src下面我们有\data,\scrīpt,\lib,\common……文件夹,那么我们写这样的代码:
    String s = (String)getOption(IOptionName.DATASTORE);
    System.out.println(s)
    其中getOption方法是Rft提供的静态方法,可以直接调用;IOptionName是Rft提供的一个接口,具体作用目前不详,该接口有一个类成员变量static String DATASTORE,储存着RFt项目的目录;上面代码的作用就是返回Rft项目的目录,运行的结果是d:\ci_automation\src
    当我们需要引用\common文件夹时,我们可以这样写:
    String file = s + "\\common\\test.xls"//在java下目录的分隔符需要用\\
    用这样的方法,我们甚至连环境变量都省了。当然用这个方法也是有条件的,那就是测试机上必须安装Rft软件

  • 在RFT中实现文本框录入

    2008-6-16

    在RFT中,要对ie的文本框执行录入操作稍微有点怪异。在QTP中,获取到文本框对象后,执行object.set方法,就可以实现数据的录入,但是在RFT中不行。在RFT中,对文本框的数据录入要通过setproperty来实现。例如在我的测试过程中,RFT获取到用户名录入框有一个属性.value,录入用户名时要执行object.setproperty(".value","admin");其中,object就是我获取到的文本框对象,本来有一个setText(String s)方法的,但是我用find方法返回的是GuiTestObject对象,没有setText方法,所以只能使用setprpoerty方法了这也算是今天一个小小的收获吧。
Open Toolbar