《精通QTP——自动化测试技术领航》—第1章1.3节录制与回放—QTP的开关-阿里云开发者社区

开发者社区> 开发与运维> 正文
登录阅读全文

《精通QTP——自动化测试技术领航》—第1章1.3节录制与回放—QTP的开关

简介:

本节书摘来自异步社区《精通QTP——自动化测试技术领航》一书中的第1章1.3节录制与回放—QTP的开关,作者余杰 , 赵旭斌,更多章节内容可以访问云栖社区“异步社区”公众号查看。

1.3 录制与回放—QTP的开关
精通QTP——自动化测试技术领航
阶段要点

录制在实际项目应用中的价值观(极低)。

新手切记不可在项目应用时被禁锢在录制中。

录制及其相关功能的重点知识点提炼。

录制功能“旁门左道”式的妙用。

录制的3种模式及应用。

QTP回放机制重要原理。

实际项目应用时关于QTP脚本回放的几项重要设置详解。

1.3.1 请拒绝“录制”,再开始你的实际项目之旅
1.3.1.1 引言
当人们一提到QTP,第一反应就是,它是Mercury公司旗下的一款强大的商业化自动化测试工具(现已被HP公司收购)。那么当提到QTP有什么主要功能的时候,大家的第一反应一定是“录制”。

很多新人认为,QTP自动化测试工具最强大的功能就是“录制”。在众多的自动化测试工具中,QTP的“录制”的确做地非常有优势和全面、以及高档。但是,作者很负责任地告诉读者,QTP的录制功能虽然相当精彩,一些相关的“出彩”功能,作者甚至碰都没有碰过,不过这并不影响作者使用QTP出色地完成各类自动化测试项目,因为靠“录制”是做不了项目的,甚至连一个demo都做不出来。

就像作者在之前的“1.1.2 严格的自动化测试流程”章节中说过的那样,自动化测试项目和软件开发项目同属软件工程学,两者是同属一派的。在自动化测试项目的实际应用中,只有直接编码才能出色地根据之前的设计思想来完成脚本,如果是靠“录制+加强”的模式,那就不可能按照前面定制的设计方法和思想来开发测试脚本。

1.3.1.2 一些“理论性的社会实际问题”实例
作者在1.1.2.1“测试流程是关键”这一节中的第五大点里提到过几种测试脚本种类,录制就属于其中最低级的“线性脚本”的范畴。录制出来的脚本给作者这样一种感觉“貌似华丽,其实没有任何价值和思想”,也可以把这类脚本比作古代战场中的一员有勇无谋的武将,表面上凶猛无比,其实只不过是横冲直撞之辈尔,没有任何战略、谋略,必然无法永远打胜仗。

虽然QTP在录制时有很多“华丽”的辅助功能,比如Keyword View界面的各种直观操作、Active Screen等。但是这些东西基本上也只是有一个华丽的表面而已,如Active Screen,如果开启了这个功能,那么即使你录制一个简单的注册功能,这个脚本的大小估计都有10MB左右!因为脚本里都是截取下来的图!一个注册脚本就要10MB,那么一个自动化测试项目测试下来需要多少MB?另外,在添加对象方面上,录制也显得差强人意,因为靠录制的方式添加对象,表面上来看十分快速,但是通过这种方式添加到对象库中的对象,它们的命名都是QTP自动命名的,相当乱,还需要一个个去改,而且很多对象还是不需要的,QTP也给自动添加进来了,这样,效率远不如一开始就一个个添加对象,并根据规范为它们逐一命名再进行编程呢。对象库这章还没讲到,届时会在章节中引导读者做一个有趣的实验来证明,在这里也不再阐述了。

关于文中提到的“录制”两字。—作者在文中提到的“录制”是指以录制的方式并配合使用其他QTP自带的功能录制出来的脚本,从而完成自动化测试脚本编写的整个过程(线性脚本、结构化脚本都在此范畴之内),而不是指单一的录制功能。举个例子,比如QTP这个测试工具自带了很多检查点的设置与操作,其实在真正的项目应用中,是用不到的,而是靠代码的方式去实现,绝非靠工具本身提供的功能去实现。关于检查点,在这里点到为止,后续的“验证点”章节中,会详细地讲解靠代码实现验证点并且通过实例证明,为什么实际项目应用中的验证是从来不靠QTP自带的检查点功能的。

最后,有一点需要做声明,本书的作者绝对没有诋毁QTP的录制功能,正是因为有了这项强大功能的开发与研究成果,才能让自动化测试工具一步一步走上更高的高度。只是作者觉得,“录制”在实际的自动化测试项目的应用中几乎没有任何可发挥的余地。因为本书并不是一本自动化测试工具功能的介绍书籍,而是一本融合实战技术、项目实践及经验的指导书籍。

在下一个章节中,会对“QTP录制”的核心做必要的介绍和讲解,这些内容,读者还是必须掌握的。

1.3.2 录制功能更多的只是新人学习时的利器
1.3.2.1 录制相关功能只需把握几个重点
学习“录制”只是能更多的了解QTP这个自动化测试工具,但在自动化测试项目中几乎没有发挥的余地。如果只从实际项目角度出发,那是不是可以完全抛弃学习呢?是可以的。不过在本章节中,作者总结了一些关于“录制”方面的重点知识点,这些重要的知识点不仅和“录制”有关,它们和以后在具体的项目应用中也有关系。所以把这些知识拎出来作重点介绍。希望可以给读者以启发,本书也从本章节开始正式引领读者去实践QTP、实践自动化测试项目应用。

1.Add-in Manager & BHO Manager
Add-in和BHO相关的知识点表面看似和“录制”没直接联系,其实它不仅仅和“录制”有关联性,和很多知识点也同样都有关联,比如以后会介绍的对象库,可以说这两个一直伴随着QTP自动化测试项目。选择将这两个知识点放在“录制”这章节介绍更加妥当,毕竟无论是“录制”、“插件”、还是“BHO”都是学习QTP一开始就要接触的知识点。

在打开QTP之后,可以看到一个Add-in Manager 框(见图1-14)弹出来,这是一个QTP插件管理器,每次启动前需要选择对应的插件(在插件名称左侧打钩)才能进行测试。QTP默认自带3个插件,分别是ActiveX、Visual Basic以及Web,其中属Web插件最重要,使用率最高,也是本书所用到的重点插件。如果需要使用其他插件,可以向官方购买,或由用户自主定制自己的插件。加载新插件后,插件管理页面中就会显示新加载的QTP插件。

经常会在测试论坛上看到一些测试同行问“这个项目是用什么语言写的?应该选择哪个插件做自动化测试?”。其实提出这个问题足以证明大家并没有了解插件的真正含义和作用。

插件的含义与作用。

Add-in的选择是为了能够成功识别对应插件的测试对象控件,也就是说插件的选择是和被测对象控件有关的,以QTP应用最广泛的Web网页测试而言,它与项目具体使用的是哪种语言没有多大关系。但是对于Windows桌面应用程序而言,插件的选择是和开发语言有关系的。针对C++、Java和.NET程序,QTP都有相应的Add-in提供,分别用于对应的语言开发的Windows桌面应用程序。

一个实例:

需求:使用QTP的Spy识别“51Testing软件测试网”首页上的[登录]按钮(WebButton)控件,如图1-15所示。
注1:Spy功能是QTP重要的一个机制,在后续的章节“Object Spy”中会进行详解。这里,只给出该功能的位置及基本用法。

注2:Spy的位置:进入QTP→上方菜单栏→Tools→Object Spy→点击后弹出Spy框。

注3:Spy的基本用法:点击spy后会出现一个“手指头”并重新切换到之前的页面,用“手指头”点击被测对象控件即可。


27efa9769157a55ff3282f737ac7cf637822fd4c

“51Testing软件测试网”是一个B/S架构的Web网站,需要加载Web插件(见图1-14中的插件选择状况)才能够正确识别网站中的对象。下面看一下选择了正确的插件后,利用Spy定位“登录”这个WebButton对象控件的结果,如图1-16所示。

通过图1-16,可以很清楚地看到控件识别成功了。“登录”这个对象控件的所有属性尽在Spy的掌握中。

那么如果没有选择相对应的插件去进行识别会是什么情况呢?首先如图1-17所示,作者把Web插件的钩选去除,只选择Visual Basic插件。然后再次用Spy去定位“登录”这个控件。

操作完毕,结果如图1-18所示。

这就是选择错误插件后,Spy的识别图。由于没有选择对应的插件,“小手指”都没有办法具体定位到“登录”按钮这个WebButton控件对象,只能把整个浏览器识别为一个对象。


06a8f5a894c27af76c2a04c5b8e7e7902a98cd64

通过上述内容,相信读者已经对插件有了深刻的了解。但是内容还没有结束,你知道吗?即使选择正确的插件,有时仍然会出现图1-18中的情况。如果以后发生类似的问题,解决办法相当简单,只要关闭QTP和测试网页,然后先打开QTP,再打开测试网页即可解决!为什么会这样呢?说的简单点就是,QTP和BHO机制是挂钩的。因为安装完QTP之后,每次打开IE,浏览器会自动加载BHOManager,而QTP在IE中识别对象是依靠一个名为BHOManager Class的动态链接库来完成的,如果是先打开IE再打开QTP,QTP就不能成功读到BHOManager Class这个动态链接库,从而导致QTP识别对象失败。

<ahttps://yqfile.alicdn.com/0d11b1c1aa19bf5eaa8ecaf6d36268ffab7653c0.jpeg" >


f8dc7aa75262827c6a785db81f03dadc0af22856

What is "BHO"?—BHO(Browser Helper Object,浏览器辅助对象,简称BHO)。BHO是微软推出的作为浏览器对第三方程序员开放交互接口的业界标准,通过简单的代码就可以进入浏览器领域的“交互接口”(INTERACTIVED Interface)。BHO对象依托于浏览器主窗口。实际上,这意味着一旦一个浏览器窗口产生,一个新的BHO对象实例就要生成。任何BHO对象与浏览器实例的生命周期是一致的。其次,BHO仅存在于Internet Explorer 4.0及以后版本中。BHO是一个COM进程内服务,注册于注册表中某一键下。在启动时,Internet Explorer查询那个键并把该键下的所有对象预以加载。

所以,请每位读者要特别注意这里的小细节,别疏忽了它。

2.Record and Run Settings
它翻译后的中文是:录制与运行设置。即和录制有关系又和运行有关系,它们和“Add-in”及“BHO”一样,同样会一直伴随着QTP自动化测试项目。

这个知识点从界面就可以很直观地了解了,先看以下两张图(图1-19、图1-20)。


eaa153d85952f96db597fb0d943693da77a5bc96

注1:Record and Run Settings的位置:进入QTP→上方菜单栏→Automation→Record and Run Settings。

点击Record and Run Settings后,会弹出一个窗口,窗口中有两个选项卡,分别是Web选项卡(图1-19)以及Windows Applications选项卡(图1-20)。

先介绍最常用的Web选项卡,它用在B/S架构的系统中。作者已经在图1-19中对每个选项进行了编号,让我们对Web选项卡下的各选项进行全面的了解。

(1)Record and run test on any open browser。在任意打开的浏览器上录制和运行测试组件。

选中这个选项后,在录制的时候,这个选项需要手动打开浏览器,并且在录制的过程中可以随时暂停录制、修改、继续录制等。在回放的时候选择了这个选项就会引申出一个问题了。

举一个实例,假设当前计算机上同时开启了两个网页A和B,录制的脚本是网页A的,大家都知道网页只能同时看一个,如果此时网页定格在网页B(也就是说你在看网页B),你重新回到QTP并点击“F5”运行脚本,此时QTP其实是在网页B上运行脚本的,而脚本里的各个元素又是针对网页A的,然后理所当然QTP就会一直卡在那里不动直到等待时间超过后报错,原因很简单,QTP无法识别网页B上的控件。所以,读者以后千万要避免类似的问题发生,解决办法也很简单,最好是在做自动化测试运行工作时只开启一个网页,如果一定要开启多个网页,也请记得在运行前把网页重新激活定格到被测试网页中。

(2)Open the following address when a record on run session begins。当开始录制时打开下面输入的地址。

选中这个选项后,会同时激活网址输入框及图中的“3”、“4”、“5”,在网址输入框中输入需要的被测网页地址即可,此时QTP就会打开该网页。

(3)Open the following browser when a run session begins。当开始录制时以下面选择的浏览器类型打开。

在选中了图中的“2”后被激活,以下拉框形式选择浏览器类型,默认只有1个浏览器类型:Microsoft Internet Explorer。

(4)Do not record and run on browsers that are already open。在已经打开的浏览器上不录制和运行脚本。

在选中了图中的“2”后被激活,可选项,默认打钩,含义如上。

(5)Close the browser when the test closes。在测试组件关闭后同时关闭浏览器。

在选中了图中的“2”后被激活,可选项,默认打钩,含义如上。

在Web选项卡中最主要的选择就是Record and run test on any open browser和Open the following address when a record on run session begins了。后者自动打开浏览器,一般在初始录制的情况下使用。同时,自动打开浏览器也是为初级用户提供的,完全是为了配合“录制”这个功能而开发的。手工写脚本的情况下,一定是选择前者。在这里先预告下,在QTP脚本开发中,打开浏览器的函数是SystemUtil,在后续的章节中会详细讲解该函数,这个函数下的很多方法在实际项目应用中都相当实用。

接下来介绍Windows Applications选项卡,这个选项卡是关于QTP在录制应用程序时的应用设置。作者已经在图1-20中对每个选项进行了编号,下面对Windows Applications选项卡下的各选项进行全面的了解。

(1)Record and run test on any open Windows-based application。在任意打开的Windows底层程序上录制和运行测试组件。

原理和Web一致,不再重复阐述。

(2)Record and run only on。只在XX应用程序上录制和运行。

选中这个选项后会同时激活图中的“3”、“4”、“5”、“6”。

(3)Applications opened by Quick Test。被QTP打开的应用程序。

在选择了图中的“2”后被激活,可选项,默认打钩。在这里要说明一下,被QTP打开的应用程序可以是由“6”中手工添加程序的方式也可以是由代码的方式,代码函数仍然是SystemUtil。

(4)Applications opened via the Desktop (by the Windows shell)。通过快捷方式或快速启动栏打开的程序(包括开启录制之前、之后打开的)。

在选择了图中的“2”后被激活,可选项,默认不打勾。这里要注意一下,如果决定勾选这个选项,一定要勾选“5”(为什么一定要勾选“5”会在下面讲到),然后添加快捷方式或快速启动栏图标的实际路径。

(5)Applications specified below。在下方Applications details里指定程序路径。

在选择了图中的“2”后被激活,可选项,默认打钩。如果不打勾,则不会激活“6”,也就无法添加程序。在“4”里讲到必须勾选“5”就是因为这个原因,只有勾选了才能在下面的Application details space里添加程序实际路径、快捷方式实际路径或快速启动栏图标实际路径等。

(6)Applications details space。程序详情资料空间(space是作者自己加的)。

在选中图中的“2”并勾选“5”后被激活。这个区域被激活以后有新增、编辑、删除3个按钮,并且在添加程序完毕后以列表形式显示并排列,如图1-21所示。

下面看一下如何添加程序,点击添加按钮(绿色的+号)后的效果,如图1-22所示。


bb29856abe4c576ada5847ff1b3ef5b93f57ab4b

在点击添加按钮以后就会弹出图1-22中的界面。

Application:这里是添加程序具体路径的地方,可以手动输入,也可以通过右侧路径按钮进行选择。需要注意的是,这里的路径是需要定位到文件名的,比如flight4.exe,如果是QQ的话,就是QQ.exe。
Working folder:这里是添加工作文件夹的路径,不用具体定位到文件名。
Program arguments:简单的说就是输入一个程序变量的编辑框,平时就算是“录制”。
Launch application:可选项,默认勾选,勾选后的效果是,在录制的时候可以自动开启程序。
Include descendant processes:可选项,默认勾选,对于实际项目的应用同样做不了贡献,如果读者感兴趣,可以使用第2小章节中讲到的F1定位跟踪技术自行研究。
3.Web Event Recording Configuration
首先,公布下这个功能的入口处:进入QTP→上方菜单栏→Tools→Web Event Recording Configuration,点击进入后会出现如图1-23所示的界面:

该功能只能应用于B/S架构的系统,在录制时,对一些Web事件进行设置,这个设置究竟是怎么回事?设置后的效果是什么?稍后,作者会举一个例子,然后在51Testing网站上选择一个相对比较贴切的实际场景进行操作,让读者看明白。

先熟悉一下这个弹出的界面,首先了解一下Event configuration level的概念,QTP把它默认分成3级:Basic(最下面那格,也是默认的设置,图1-23的显示效果就是Basic效果)、Medium(中间那格)、High(最上面那格),要设置等级只需要将游标移动到相应位置即可。其次,可以看到有Custom Settings按钮,这个按钮就是用户的个性化定制,在QTP默认的3个等级都不符合场景需求时,可以使用该功能(下文会对这个功能的要点作讲解)。最后,Default Settings是恢复QTP默认设置功能。

对这个界面了解后,作者开始举第一个例子,事先提醒一下,现在的Event level是QTP默认的Basic等级(选了等级后,等级名称下会有些该等级的介绍,读者可以自行查看),大家设想这样一个场景(相信大家在项目中应该也碰到过类似的场景):有一个在线学习考试系统,在购买课程页面上显示了很多课程信息(如价格、有效期等),然后每个课程都有一个备注功能,要查看备注内容则需要将鼠标光标移上去并保持2秒钟后,会以popup形式弹出备注框后才能查看到。好了,有了这么个需求,那现在需要用QTP验证这个备注框的内容是否符合预期结果。首先肯定要做到的就是使其popup,手工操做是很简单的,放上去等2秒就好了,但是用QTP不一样,在Basic等级下,QTP在录制时是无法模拟到“放上去等2秒的操作的”。解决的办法就是需要把Event level提高到可以模拟这个操作的那个level。只有通过该解决方案才能解决项目应用的实际问题,不然这个自动化测试用例就没法实现成脚本!接下来,就从51Testing网站挑选一个相对比较适宜的场景,录一段脚本,一起来看看脚本效果。在这里先知会一下,作者找了很久,实在没找到51Testing网站上有popup形式的控件,所以,作者的实例不是以popup形式的,不过原理是一样的,而且还可以多了解不同的场景。先看看场景图1-35所示。

图1-24中作者用到的场景区域进行了标示,简单介绍一下,这块区域是一个信息公告区,不是静态的,是动态地从下到上滚动显示的。然后当将鼠标光标移动到某条信息上时,整个信息公告区就会变成静态的了,点击后就可以查看到那条信息。现在提出需求:成功将鼠标光标移动到[企业内训]下的第2条信息“圆满完成上海西门子医疗器械有限公...”上面,等待0.5秒,待信息公告区移动禁止后点击,这个需求很简单,(注:这里强调一下,等待0.5秒的需求是作者虚拟出来的,实际上鼠标光标只要放到信息公告栏里,信息就会变成静态的)。

现在开始分析,从手工操作的角度上来说,完成这个业务需求的时间不会大于2秒。步骤就是,鼠标光标→移动到信息上→等待信息公告区从动态变成静态→点击。但是从用QTP角度上来分析,就不会像手工操作那么简单了,难点就和popup例子一样,如何能使QTP模拟到鼠标光标停止在第2条信息上0.5秒的操作。其实就是将Event level提高或自定义至可以完成这个需求。Basic这个默认的等级完成不了这个需求,调高2级至High这个等级就可以了,反正这个实例只是为了给读者看看实际效果,原理之前就已经讲述了。大家只要知道,项目中遇到搞不定的需求只要把等级提高就行,如果QTP默认设定的几个等级都无法满足项目中的需求那就进行个性化定制(这方面有些重点内容等后面会讲解),即可完美搞定!实现的效果如图1-25所示。


04f7b7c111295ebabd90d1a1b0aee5788278d534

我们可以看到,用Basic等级录制出来的脚本根本无法实现鼠标光标停留在第2条信息上的需求,尽管在录制的时候鼠标光标是停留了0.5秒后再点击的,但是QTP无法录制到。但是用High等级就不同了,鼠标光标停留的动作就被录制到了,函数是FireEvent,参数是onmouseover,它就是传说中的“鼠标悬停”事件。预告下,在下面的“1.3.4小节”中会讲关于FireEvent函数结合该节内容做一个实例演示,这个函数事件的知识点还是比较常用的,敬请期待吧!

好了,现在讲一下如果用High等级都满足不了需求的情况下,就需要个性化定制了,点击Custom Settings按钮后进入如图1-26所示的界面。

图1-26所示左边是QTP的对象列表树,包含了Web中QTP所能识别的所有控件,可以通过Add Object添加Object控件。右边是与控件相对应的实例,包含了相对应的控件的鼠标光标录制属性,可以通过Add Event来添加Event类型,点击OK保存设置。个性化定制完毕后就可以开始录制脚本了。

4.脚本录制的一些良好建议和注意事项
上文中的1、2、3都是读者必须了解,并在项目实际应用中使用价值比较高的“录制”方面的知识点。最后,作者对“录制”进行总结,并根据实际经验给出一些意见。

在开始录制之前,应关闭录制会话不需要的所有浏览器、网页或应用程序,以免造成不必要的困扰,从而影响工作效率。
如果在网站上进行录制,应确定该网站的安全区域。当在Web浏览器中录制时,浏览器可能用安全警告对话框提醒,这样在脚本运行时就会由于对象库中没有事先添加安全警告对话框这个对象而导致脚本运行失败。解决方案有两个:一是选择禁用/启用这些对话框,二是将安全警告对话框添加进对象库。
事先明确好准备在录制和运行测试时,如何打开Web浏览器或应用程序。可以选择让QTP打开一个或多个指定的Web浏览器或应用程序,也可以在已经打开的Web浏览器或应用程序上录制和运行,但是务必事先明确,以免发生不必要的“意外”。
如果要对Web对象进行录制,必须对该对象的值进行更改或初始化还原,以便使QTP录制到该步骤。例如,要录制WebList对象的选择操作,如果页面上已经选择过某选项了,就必须单击该下拉列表,滚动到最初的那个默认选项(当然,这一步可别录进去啊!),然后再重新选择你准备选择的备选项(这叫还原)。如果不还原,可能会导致脚本在运行时无法通过。


c192f1a02fa5b4edd1aea3a0bd27db123e8961f0

1.3.2.2 为什么说录制是学习利器,有根有据,请听我细细道来
作者一直认为学习“录制”相关方面的知识绝大数时候不是为了今后能在实际项目中应用,而是能对QTP做一个整体的了解,包括QTP的一些原理、QTP的一些主要功能、用QTP进行自动化测试的基本业务操作流程等。可以这么说吧,“录制”只能说是用QTP做自动化测试项目的“启蒙老师”,有将“徒弟”引进门的功劳,但最多也就这点功劳了,因为做实际项目“录制”是不够用的,以后必须进行不断深造。

作者在这里还要给大家分享一个小小的经验和技巧。录制这个单项且独立的功能,在以后具体做项目写脚本的过程中是有辅助作用的,也可以说是小小的“投机取巧”吧。在前面的章节中就有这么一个理念,那就是“要以代码的方式写脚本,但不要硬记代码,有问题用F1查找”!首先,作者保证这个理念肯定是正确的,但是,有时候会遇到这么一个窘境,先让我们看图1-28所示。


55263176a4174c78fe60deb252481f9f32c26979

对[同意网站服务条款]这个WebCheckBox控件“打钩”或者“取消打钩”的代码分别是:

'勾选[同意]的代码如下:
Browser("51Testing软件测试论坛 软件测试 |").Page("51Testing软件测试论坛 软件测试 |").WebCheck Box("同意").Set"ON"
'取消勾选[同意]的代码如下:
Browser("51Testing软件测试论坛 软件测试 |").Page("51Testing软件测试论坛 软件测试 |").WebCheck Box("同意").Set"OFF"
很明显,需要“打钩”的话Set方法后面跟参数“ON”;如果需要“取消打钩”,Set方法后面跟参数“OFF”。在手写代码时,这个很好记住,参数ON是打钩、参数OFF是取消打钩。但是,参数后面的“ON”或者“OFF”是大小写就没那么好记了,经常容易忘记或混淆!如果在该写成大写的时候误写成小写,那么就相当于参数写错,最后运行脚本肯定是过不了!如果你有经验,能反应过来是大小写问题;如果没经验,估计需要折腾一阵子,说不定还发现不了到底是哪里出错了,象遇到类似的问题有什么办法应对呢?建议读者在以后的项目测试过程中,可以参考下面的小技巧。

如果遇到上述的情况,录制功能就可以帮上大忙了,录制下这个控件的操作,正确的代码就会显示在QTP中!录制出来的代码是不会出错的!

OK,这就是作者在做项目中的一些经验,在这里分享给读者,通过这个小技巧就可以在具体的脚本编写过程中无往不利!

俗话说,打铁要趁热!接下来再一起看第二个实例,先看一下图1-28所示。

图1-28是51Testing论坛的一个搜索功能,可以看到页面中有一个WebRadioGroup控件,这个控件内一共存在4个选项(所有选项都同属于一个控件)。默认选中的是第1个选项“帖子”,假设需求要求将所有选项从左到右全部点击一遍,从第2个选项开始点起,点完第4个选项以后再点击第1个选项。应该说,完成这个需求很简单,请看下面的代码:


53abe9f5c951a4ba4f71385239b2296e174259cd

'预告:作者强烈推荐在脚本的编写过程中尽量多使用With函数,益处良多,在以后的章节
'中会进行介绍,并且在本书中,With的使用率将会非常高!
With Browser("51Testing软件测试论坛 软件测试 |")._
Page("51Testing软件测试论坛 软件测试 |")
 .WebRadioGroup("st").Select "#1"  '选中“商品”按钮
 .WebRadioGroup("st").Select "#2"  '选中”奇虎全文“按钮
 .WebRadioGroup("st").Select "#3"  '选中“分类信息”按钮
 .WebRadioGroup("st").Select "#0"  '选中“帖子”按钮

End With
在写脚本的时候,WebRadioGroup控件下的选项可以简写,如“#0”等,可以说提供了相当大的方便。但是,新手往往由于不熟悉这些数字的规律,所以不敢乱用简写,在这种吃不准但又想使用简写,且不想花太多时间去研究的情况下,上面的“小技巧”又可以帮助我们达成目标并提高效率,只要简单的录制一下,QTP就会准确、快速地获得这些选项的编号。

1.3.3 录制时需注意模式的切换
1.3.3.1 3种录制模式的基本介绍
在这一小节中,将要介绍QTP中的3种录制模式:正常录制、模拟录制、低级录制。

1.正常录制模式
QTP默认的录制模式,这种录制模式是QTP最突出的特点,是直接对对象的操作,可以说此类模式继承了对象模型的所有优点,能够充分发挥对象库的威力。它通过识别程序中的对象来代替以前依赖识别屏幕坐标的形式。但是正常模式并不能保证识别程序中所有的对象,因此,仍然需要其他两种模式来补充。在录制完之后,不管再次打开的对象位置在哪(简单的说就是不具体记录对象控件的坐标,但是被测页面上必须存在该控件对象),它都能执行到。开启正常录制模式的方式。

(1)QTP上方菜单栏→Automation→Record。

(2)直接使用快捷键“F3”。

(3)在QTP界面上点击正常录制图标,如图1-29所示。


e5db49c793b4d4e1cf7fd59ea8c98861f8b1f6e2

2.模拟录制模式(Analog Recording)
此类模式录制了所有键盘和鼠标的精确操作,对于正常录制模式不能录制到的动作,可以使用模拟录制模式来弥补。例如,录制一个鼠标光标拖动的动作,正常录制模式无法录制这个业务操作,这时就可以考虑切换到模拟录制模式记录鼠标光标的轨迹。模拟录制模式录制下来的脚本文件比较大,而且依靠这种方式是不可以由QTP进行编辑的。选择模拟录制模式,如果在回放时,改变了屏幕的分辨率或者窗口/屏幕的位置, 回放就会失败。开启模拟录制模式的方式。

(1)前提是开启正常录制模式。

(2)QTP上方菜单栏→Automation→Analog recording。

(3)直接使用快捷键“Shift+Alt+F3”。

(4)在QTP界面上点击模拟录制图标,如图1-30所示。

3.低级录制模式(Low Level Recording)
此类模式是用来录制QTP不能识别的环境或对象。它不止录制了鼠标和键盘的所有操作,对对象的位置要求也非常严格。按此模式录制的对象都以Windows和WinObject的形式存在。QTP按照屏幕上的x坐标和y坐标录制该对象,将所有父类对象录制为Windows测试对象,将所有的其他对象录制为WinObject测试对象。它们在ActiveScreen中显示为标准Windows对象,并且在录制回放时,对象的坐标有任何一点改变就会失败。这类方式适用于QTP不能正常识别对象时的应用,主要是记录坐标的位置,可以对QTP不支持的对象进行坐标记录。但是不到万不得已的时候,不推荐使用此模式。开启低级录制模式的方式。

(1)前提是开启正常录制模式。

(2)QTP上方菜单栏→Automation→Low Level Recording。

(3)直接使用快捷键“Ctrl+Shift+F3”。

(4)在QTP界面上点击低级录制图标,如图1-31所示。


ced5a64054ef46be642527b98f9c316775d301ac

以上就是QTP的3种录制模式,读者可在进行录制时,根据实际的业务需求进行灵活地切换运用。只有在正常模式下不能录制自己想要的业务操作的时侯才可以使用模拟录制和低级录制,模拟录制和低级录制比正常录制需要占用更多的硬盘资源。一般先使用正常录制模式录制脚本,碰到正常模式不能录制到的脚本时再切换到模拟录制或低级录制来录制这些步骤,之后别忘记再切换回来。

实际上,遇到正常模式下无法录制的解决办法还有很多,比如在上一个小章节中提及的Web Event Recording Configuration实现一些鼠标事件,诸如onmouseover事件等。

1.3.3.2 Analog Recording和Low Level Recording的区别与规则
在1.3.3.1小节中,介绍了模拟录制模式和低级录制模式,细心的读者可以发现,这2个录制模式之间有很多的相似之处,容易产生混淆。其实,它们之间无论在功能还是实际用法上都有很大的区别。

1.Analog Recording(模拟录制)
将“模拟录制”应用于要在录制期间录制鼠标光标的实际移动的应用程序。这些可能包括绘制鼠标签名或者使用通过拖曳鼠标光标创建图像的绘图应用程序等。

模拟录制模式分为两种:一种是相对于指定窗口的录制,另一种是相对于屏幕的录制。

相对于指定窗口录制。选择相对于指定窗口录制,就会只录制鼠标、键盘的指定窗口内的所有动作,而不会录制在指定窗口外部执行的任何单击或鼠标光标移动。当使用这种模式时,QTP不会捕获任何Active Screen 图像。
相对于屏幕录制。可以录制在整个屏幕内所做的所有动作,包括点击Windows任务栏上的QTP图标,但在QTP窗口内所做的操作不会进行录制。当使用这种模式时,QTP将捕获你在其中进行录制的窗口的最终状态的Active Screen 图像。
使用“模拟录制”录制的步骤被保存在单独的数据文件中。该文件与在其中录制模拟步骤的操作或组件一起存储,并且在以“模拟录制”模式进行录制时,QTP将向测试或组件添加一个调用所录制的模拟文件的“RunAnalog”语句。相应的Active Screen 将显示在模拟录制会话期间执行的最后一个模拟步骤的结果。

2.Low Level Recording(低级录制)
将“低级录制”应用于在不受QTP支持的环境或对象上进行录制应用程序。或者当需要在应用程序屏幕上录制操作的精确位置时,也请使用“低级录制”。

当以正常模式录制时,不用关心对象控件具体在什么位置,即使该对象控件每次都移动到屏幕上的新位置也没关系。但是,如果对象控件的位置方位对于测试或组件非常重要,请切换到“低级录制”以使QTP能够按照屏幕上的x坐标和y坐标录制该对象。这样,在运行脚本的时候,该步骤只有在对象控件位于正确的位置时才能通过。

前一个小节中提到过,当使用“低级录制”时,QTP将所有父类对象录制为Windows测试对象,将所有其他对象录制为WinObject 测试对象。它们在Active Screen中显示为标准Windows对象。下面列举“低级录制”对每个测试对象支持的方法。

WinObject测试对象:Click、DblClick、Drag、Drop、Type 。
Windows测试对象:Click、DblClick、Drag、Drop、Type、Activate、Minimize、Restore、Maximize 。
以“低级录制”模式录制的每个步骤都显示在关键字视图和专家视图中,而“模拟录制”仅仅录制关键字视图中那个调用外部模拟数据文件的步骤。

总结。当选择“模拟录制”或“低级录制”时,需要参考一定的规则性,才能做到事半功倍的效果,在遇到实际问题时仔细考虑以下规则。

只有当QTP的正常录制模式不能准确录制和满足业务操作时,方可使用“模拟录制”或“低级录制”。
“模拟录制”和“低级录制”要求比正常录制模式更多的磁盘空间。
对于特定的业务步骤,可以在录制会话期间切换到“模拟录制”或“低级录制”。在以“模拟录制”或“低级录制”模式录制了必要的业务步骤之后,就可以返回到正常录制模式来完成录制会话的其余部分。
1.3.4 有必要让你掌握尤其重要的QTP回放机制
掌握了QTP录制的原理那就一定要掌握QTP的回放原理,后者的重要性远远胜于前者,因为在做实际项目的时候可以抛弃录制,但是脚本回放永远抛弃不了!QTP的脚本回放机制勤勤恳恳地服务于每一次自动化测试,如果失去它,自动化测试将不复存在!

那么QTP的回放机制大致是一个怎么样的概念呢?最简单的说法就是“回放机制是封装对象与真实对象的匹配”。

深化点讲就是,QTP根据脚本中记录下来的对象操作的顺序进行回放(再通俗点的说法就是,在没有特殊情况下是从上到下执行,一句一句执行的,特殊情况就是,比如遇到Function时会“跳”)。QTP从脚本中读取到该对象,并根据对象的层次和名称到对象库中寻找相同名称的测试对象,在对象库找到相应的测试对象并获得该测试对象的属性,然后根据这个测试对象的属性,在运行的网页或应用程序中进行匹配,寻找运行时对象。如果成功匹配上,再根据脚本中记录的该对象的方法、动作和参数值进行应用,如果未能匹配上,则在超出了等待时间后报错,脚本即宣布运行失败。

在这里公布一下QTP的回放功能怎么开启。

(1)QTP上方菜单栏→Automation→Run。

(2)直接使用快捷键“F5”。

(3)在QTP界面上点击Run图标,如图1-32所示。

了解了QTP回放机制的原理后,下面一起来掌握一些关于QTP回放机制的重要相关设置,并做一些深入扩展。作者总结和提炼了4个相对比较重要的设置,这些知识点在以后的实际项目应用中也经常会使用到。

1.File→Settings→Run
顺利进入设置页面后可以对运行相关方面进行各类不同的设置,页面效果如图1-33所示,这个页面下的所有设置在项目应用中都非常重要,下面对这些设置进行分解。


83d578590d7adf4e606f1dcce8f1590b8750f5c5

(1)Data Table iterations. QTP自带的数据表功能在运行时的迭代设置,如图1-34所示。

图1-34中一共有3行数据,QTP默认选中的是Run on all rows选项,这种情况下,在运行时,QTP则会根据行数来决定迭代运行多少次,如果有3行数据则运行3次。这里要注意一个情况,如果图1-34中有第4行数据,但是数据的值是空,则QTP会运行4次,只是参数的值是空值。

如果激活Run one iteration only选项,QTP在运行时只运行第1行数据,无论后面还存在多少行数据,它只执行第1行的数据且只运行1次。

最后,如果激活Run from row XX to XX选项(假设是3~5),QTP则读取第3~5行的数据并运行3次,从第3行开始执行直到第5行结束。


2a7590be47aff9d6bdec17eac7ea0a1c20952e19

(2)When error occurs during run session:当在运行期间发生错误时。

pop up message box (默认)QTP弹出一个错误信息提示框,并显示对应错误。必须去掉这个 错误提示框后才能继续运行脚本。

proceed to next action iteration 继续执行下一个业务行为迭代。举个例子,QTP自带数据表中有2行数据,当前执行的是第1行数据(即第一次迭代),运行期间遇到错误后,如果此时激活的是这个选项,那么QTP将直接跳过本次迭代,进入第二次迭代(执行第2行数据),如果第二次迭代又发生了错误,此时由于数据表中并没有第3行数据也就没有了后续的迭代操作,所以脚本运行结束。

stop run 这个相当直观,当发生错误,则停止脚本运行。

proceed to next step 当发生错误时,跳过本业务步骤,进入下一个业务步骤,即脚本代码的下一行。

(3)Object synchronization timeout:XX seconds. 同步的延时时长(默认20秒)。

(4)Disable Smart Identification during the run session. 默认不勾选,若勾选则在运行期间屏蔽智能识别功能,也就是说,即使测试对象开启智能识别功能,只要在运行时勾选这个选项,智能识别就不会生效,可以说这个功能是一个总阀门。关于智能识别功能会在后续的“对象库”章节中做介绍。

(5)Save image of desktop when error occurs (if test is run by the HP Business Process Monitor). 在出现错误时,截图并在QTP Report中反应。该功能只限于业务组件的脚本运行,关于业务组件脚本的位置如图1-35所示。


5c5dea9d2dbb711e2c6901eb84f6264a15650ca6

要新建或者打开一个业务组件的必须条件是QTP和QC联通,否则会弹出错误信息,如图1-36所示。

842ca253811c7a34063f4c4abb7cefc1a7617cba

另附QC中的业务组件模块初览(图1-37、图1-38、图1-39)所示。

6d9b7f72dc1be2ba62320256adc1d34b2ed846ce

上图就是QC9.0中的业务组件模块位置和业务组件概念介绍,在这里作者对这部分内容不多做阐述,如果有兴趣的读者可以自行研究,或问“百度大叔”或在51Testing论坛发帖等等。

2.File→Settings→Web
这个设置只针对B/S架构的系统,页面效果如图1-40所示,这个页面下只有图中的“区域1”相对重要。下面,作者对“区域1”进行讲解。

Browser navigation timeout:XX seconds:设置运行测试步骤之前等待网页加载时间的最大值(默认60秒)。这个时间具体有什么用呢?举个直观点的例子,假设有一个脚本,内容很简单,就两个步骤,“1、进入51Tesing首页,2、点击注册按钮”,而访问网站的宽带最近又出了点小问题,打开51Testing网站的首页每次都非常慢,至少需要2分钟(120秒),那么此时QTP脚本在运行时就会报错。为什么?因为默认等待网页打开的时间已经超过了60秒,此时QTP就会执行下一个步骤“点击注册”,但是由于网页还没有打开所以走到下一个步骤的时候在页面上找不到“注册”这个测试对象,最终导致运行失败并报错。所以,此时的解决方案就是打开这个选项,然后将超时时间设置得更大。读者以后如果在项目中遇到类似的问题请记得这个小小的实用设置。


2af8f6710c6109e215f660f1a9ccddd069b0cd24

这个设置在QTP 10.0的帮助文档内这样说明“The maximum time (in milliseconds) that QuickTest waits for a Web page to load before running a step”。请大家注意下划线部分,文档内标注的时间以毫秒为单位,但其实文档内写错了,实际情况是以秒为单位的,和QTP实际界面(图1-40)中的一样,实际界面中写的就是seconds而非milliseconds,请读者注意!

3.Tools→Options→Run
这是第二个关于脚本运行相关方面的设置,顺利进入界面后的效果如图1-41所示,这个页面下的大多数设置在项目应用中也经常会使用到,下面,对这些设置进行分解(没有标识区域的则说明不重要或基本不会使用)。

(1)Run mode (Normal or Fast):QTP在脚本运行时一共分两种运行模式。Normal模式是一种正常的运行模式,Fast则是一种快速运行模式。

先一起看一下正常运行模式,可以从图1-41中看到该模式下有这么一个设置“Delay each step execution by:XX milliseconds”,这是什么意思呢?其实很简单,实际效果就是在运行回放时每一个步骤之间停顿的时间,默认是0,那也就是没有停顿,如果将其设置成2000(这里是以毫秒为单位的),再回放时,那么第1个步骤结束后,QTP就会停顿2秒钟时间再执行下一个步骤。


ea1bb0855d3c7c3d538da047f2b55042a6937ec7

好了,再让我们看一下快速运行模式,这种模式肯定就不可能有停顿的可能了,除了这个之外,作者在这里还要扩展一下知识面,如果以QC调用QTP脚本并执行,默认且只可能是以Fast模式运行的。

最后,再给各位读者看一下两个模式间的一个区别,如图1-42所示。

作者收到过很多测友提出的一个相同的问题,就是为什么在运行时没有黄色的箭头,是不是QTP有Bug?时有时无的。其实,出现这个问题就是这个设置的问题,如果选择了Fast,在运行的时候是不会出现黄色箭头的,切记!很多新人将运行模式设置成Fast了,见没了黄色箭头也不会想到是这个设置引起的,还以为是QTP的Bug呢。


dd2e6a00de30778512ee3ea537c33c54c35c18fa

(2)Submit a defect to Quality Center for each failed step:任何一个步骤出错自动提交缺陷至QC。前提条件:QTP和QC连接成功,否则是灰色的。

(3)View results when run session ends. 默认勾选,当脚本运行结束后自动弹出Report报告。相反,把钩取消掉就不会弹出Report了。

(4)Stop command shortcut key. 停止运行的快捷键设置,默认是Ctrl+Alt+F5组合键,并可自行设置。别小看这个快捷键,如果在脚本运行的时候想使其停下来,一定要用快捷键,想靠点击图标是很有难度的,自己试试就知道了,特别是长脚本,这也算是个小经验吧。

4.QTP的两种回放模式设置
当在回放QTP的时候,是否注意过QTP在回放的时候鼠标光标是没有运动的,有些读者肯定会问,既然经常要进行Click各种对象的操作,那为什么鼠标光标没有动,而QTP回放的时候却可以成功的点击页面上不同方位的对象按钮呢?其实QTP有两种回放模式:

Event模式事件跟踪;
Mouse模式鼠标跟踪。
Event模式就是平时默认用的模式,也就是事件跟踪模式。实际上,QTP的Click方法只是触发了对象的Click事件,而并未真正通过鼠标光标来进行点击按钮。我们使用的是Mouse模式的话,我们会看到回放的时候,鼠标光标是跟着对象走的,也就是鼠标光标跟踪模式。

下面来具体看一下是如何切换回放模式的,切换回放模式有两种方法。

(1)修改QTP的Options设置。

我们进入到Tools→Options→Web→Advanced ,然后列表拖到最下面可以找到Run settings下的Replay type,如图1-43所示。


d037f0c1fb7a14ca04f41ffccab28f1045ca72b6

可以看到QTP默认的回放模式是Event,也就是事件跟踪。如果现在切换到Mouse,点击确认后,回放时鼠标光标就会进行跟踪,读者可以试一下。

(2)以代码控制(作者推荐该种方式)。

为什么推荐这种方式,因为这种方式可以在QTP运行时根据个性化需求来进行控制,随时可以进行开和关,使用第一种方式就不能够达到这种效果,代码如下:

Setting.WebPackage("ReplayType") = 2
这句程序的意思就是把回放模式设置为2。1代表事件跟踪模式,2代表鼠标光标跟踪模式,现在应该很清楚了吧,这样就可以在QTP运行时个性化定制回放模式了。

那讲到这里,肯定会有读者问,那鼠标模式有什么用,我们平时默认的事件和跟踪模式不是都够用了吗?

接下来就说一下,为什么以及何时要使用鼠标跟踪模式。举些实例,如QTP运行时触发了Click事件后,应该弹出页面,却被IE给拦截了。而手工点击可以成功;还有当需要操作鼠标右键时等这些情况都可以临时把回放模式从事件跟踪模式切换成鼠标跟踪模式,让我们来看下操作鼠标右键的实例演示吧。

需求:实现右键点击Baidu主页中“关于百度”的链接

(1)首先,我们把这个链接对象添加到QTP对象库中,如图1-44所示(对象库相关内容在后续章节介绍,这里不多做阐述)。


0c9bfa4c71aca92d7340d1367c49be41d4c5807b

(2)添加完之后,输入脚本,代码如下所示:

Setting.WebPackage("ReplayType") = 2 
Browser("百度一下,你就知道").Page("百度一下,你就知道").Link("关于百度")._
FireEvent "onclick",,,micRightBtn
(3)回放之后就可以看到已经成功点击了鼠标右键,如图1-45所示。


7981e38f505e04c6f9b4d26374c0010c7c2ad730

不知道还记不记得前面讲到要结合内容进行FireEvent这个方法的演示,在这个实例中,我们就用到了FireEvent这个方法,它是一个非常有用的方法,经常会在项目应用中使用到,在这里作者先附上一些关于这个方法的简单介绍,如图1-46所示。

49ce32b5467a2a9a0ec39e7784c8b07fda6d2480

总结:本小节讲述了QTP的回放原理和项目应用中的相关设置,希望读者能够吃透这些知识点,并能在以后做项目测试时举一反三。
1.3.5 总结
本章节的内容主要讲的是QTP的录制与回放,市面上,任何一本书都会有这部分的内容。但是,作者对这部分内容进行了提炼,把其他书里的那些几乎等于QTP工具介绍的内容全部剔除,因为那些内容在实际的项目应用中几乎不会用到,保留了能切实在项目中用到的内容,通过自己的实战经验配合大量案例、实例(几乎每一个知识点都有例子)进行细致地讲解,希望读者在学习了本章后,能对QTP这个自动化测试工具的操作,以及如何把工具融合实际项目上有个整体的把握。虽然剔除了很多不需要的内容,但是,由于介绍的是QTP的源头(就好比本章节标题一样“QTP的开关”)而且配合了大量的实例,图文并茂,所以在完成本章节的编写后才发现原来还是需要用到那么大的篇幅才能将重要的知识点讲清楚、讲透。

在设计练习题的方面,作者思虑许久,考虑到本章节内容的性质,决定在本章节的巩固练习题中不设置实际操作题,本章节的练习题如果要出成操作题,无非就是传统的“录制与回放”,这样就会不由自主地偏离作者的原有思想。所以,作者决定以选择题(单选和多选)、判断题、排列题等各类有趣的形式出一份类似Exam一样的概念理论题,这些所谓的理论题其实是对整个章节内容知识点的贯穿,希望能起到巩固与复习的作用。

知识点巩固和举一反三练习

一、知识加强巩固趣味题之过5关(注:选择题可能是单选也可能是多选)

1、<排列题> 请排列QTP业务操作及执行流程的顺序。 (  )

A、录制 B、打开浏览器 C、回放 D、打开QTP

2、<选择题> QTP的两种脚本运行模式分别是Normal和Fast,它们之间的区别是什么?请在下面4个选项中做出正确的选择。 (  )

A、以QC调用的方式执行脚本,运行模式是Fast。

B、脚本运行时,如果左侧有黄色箭头,则代表这种运行模式是Fast。

C、Normal运行模式的执行速度最快。

D、可以在Normal运行模式中设置间隔时间,单位是毫秒。

3、<选择题>请在以下4个选项中选择正确的选项。 (  )

A、QTP停止运行的快捷键是Ctrl+Alt+F5,但不提供个性化设置。

B、QTP具有Event和Mouse两种回放模式。

C、QTP具有Slow、Normal和Fast 3种运行模式。

D、QTP具有两种录制模式,它们是Analog Recording和Low Level Recording。

4、<选择题> 请在以下4个选项中选择错误的选项。 (  )

A、假设在运行设置中选择Run on all rows选项,在QTP的Data Table中建立4行数据,其中第2行的值为空,则QTP在执行两次迭代后运行结束。

B、如果激活Run one iteration only选项,QTP在运行时只运行1次

C、Browser navigation timeout:XX seconds就是设置运行测试步骤之前,等待网页加载时间的最大值,超出了该值后脚本直接退出并报错。

D、QTP的运行模式设置具体位置在:Tools→Options→Web→Advanced→Run settings下的Replay type。

5、<选择题> 正确开启模拟录制(Analog Recording)的方法是: (  )

A、QTP上方菜单栏→Automation→Analog recording。

B、直接使用快捷键“Shift+Alt+F3”。

C、在QTP界面上点击模拟录制的图标。

D、以上都是。

二、知识加强巩固趣味题之斩六将(读者有权审判它们的对错)

1、Setting.WebPackage("ReplayType") = 2,这段代码可以灵活控制QTP的回放模式,“2”代表Event跟踪模式,那么如果设置成“1”的话,QTP就会切换到Mouse跟踪模式。(  )

2、QTP在录制过程中,遇到部分Web事件无法模拟操作,此时的解决方案就是进入Web Event Recording Configuration设置框并将Event configuration level提升至最高的High等级即可解决所有问题。(  )

3、低级录制模式分两种:其中第一种是相对于指定窗口的录制,另一种是相对于屏幕的录制。(  )

4、在开始录制之前,应关闭录制会话不需要的所有浏览器、网页或应用程序。(  )

5、开启模拟录制模式前的必要条件是开启正常录制模式。(  )

6、使用低级录制前无须开启正常录制模式,直接使用快捷键Ctrl+Shift+F3即可。(  )

作者认为,必须连过5关连斩6将才算切实掌握了本章节的内容,QTP“录制与回放”的重点,有一点差错都算闯关失败!

本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享: