171361997dd184254b35eefdc8d376eeaeaa17ca.docx

上传人:b****6 文档编号:14143955 上传时间:2023-06-21 格式:DOCX 页数:152 大小:3.74MB
下载 相关 举报
171361997dd184254b35eefdc8d376eeaeaa17ca.docx_第1页
第1页 / 共152页
171361997dd184254b35eefdc8d376eeaeaa17ca.docx_第2页
第2页 / 共152页
171361997dd184254b35eefdc8d376eeaeaa17ca.docx_第3页
第3页 / 共152页
171361997dd184254b35eefdc8d376eeaeaa17ca.docx_第4页
第4页 / 共152页
171361997dd184254b35eefdc8d376eeaeaa17ca.docx_第5页
第5页 / 共152页
171361997dd184254b35eefdc8d376eeaeaa17ca.docx_第6页
第6页 / 共152页
171361997dd184254b35eefdc8d376eeaeaa17ca.docx_第7页
第7页 / 共152页
171361997dd184254b35eefdc8d376eeaeaa17ca.docx_第8页
第8页 / 共152页
171361997dd184254b35eefdc8d376eeaeaa17ca.docx_第9页
第9页 / 共152页
171361997dd184254b35eefdc8d376eeaeaa17ca.docx_第10页
第10页 / 共152页
171361997dd184254b35eefdc8d376eeaeaa17ca.docx_第11页
第11页 / 共152页
171361997dd184254b35eefdc8d376eeaeaa17ca.docx_第12页
第12页 / 共152页
171361997dd184254b35eefdc8d376eeaeaa17ca.docx_第13页
第13页 / 共152页
171361997dd184254b35eefdc8d376eeaeaa17ca.docx_第14页
第14页 / 共152页
171361997dd184254b35eefdc8d376eeaeaa17ca.docx_第15页
第15页 / 共152页
171361997dd184254b35eefdc8d376eeaeaa17ca.docx_第16页
第16页 / 共152页
171361997dd184254b35eefdc8d376eeaeaa17ca.docx_第17页
第17页 / 共152页
171361997dd184254b35eefdc8d376eeaeaa17ca.docx_第18页
第18页 / 共152页
171361997dd184254b35eefdc8d376eeaeaa17ca.docx_第19页
第19页 / 共152页
171361997dd184254b35eefdc8d376eeaeaa17ca.docx_第20页
第20页 / 共152页
亲,该文档总共152页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

171361997dd184254b35eefdc8d376eeaeaa17ca.docx

《171361997dd184254b35eefdc8d376eeaeaa17ca.docx》由会员分享,可在线阅读,更多相关《171361997dd184254b35eefdc8d376eeaeaa17ca.docx(152页珍藏版)》请在冰点文库上搜索。

171361997dd184254b35eefdc8d376eeaeaa17ca.docx

精通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和Fast3种运行模式。

  D、QTP具有两种录制模式,它们是AnalogRecording和LowLevelRecording。

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

 (  )

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

  B、如果激活Runoneiterationonly选项,QTP在运行时只运行1次

  C、Browsernavigationtimeout:

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

  D、QTP的运行模式设置具体位置在:

Tools→Options→Web→Advanced→Runsettings下的Replaytype。

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和Fast3种运行模式。

  D、QTP具有两种录制模式,它们是AnalogRecording和LowLevelRecording。

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

 (  )

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

  B、如果激活Runoneiterationonly选项,QTP在运行时只运行1次

  C、Browsernavigationtimeout:

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

  D、QTP的运行模式设置具体位置在:

Tools→Options→Web→Advanced→Runsettings下的Replaytype。

1.4 认清并请远离QTP的脚本录制模式

  阶段要点

  ●了解KeywordView结构。

  ●摆脱KeywordView。

  ●熟练掌握ExpertView的代码结构。

1.4.1 QTP的两种视图及思维转换

  从本章节开始,读者将真正开始彻底摆脱脚本录制,正式走向脚本开发的台阶。

在开始讲解QTP脚本开发之前,首先需要详加介绍ExpertView这个视图,这个视图是QTP官方指定的脚本开发唯一认可的视图。

那么,以何为出发点以及如何介绍ExpertView这个视图呢?

决定以抛砖引玉的方式,利用脚本录制视图KeywordView形象地引出脚本开发视图ExpertView。

  相信只要稍许接触过QTP的读者就一定知道QTP提供两种视图,一种是KeywordView(关键字视图),另一种是ExpertView(专家视图)。

Mercury公司开发两种视图的本意是想让不同类型的人使用不同类型的视图。

接下来分别对这两个视图进行讲解,并开始抛砖,直到引出一块良田美玉。

  1.KeywordView(关键字视图)

  通过关键字视图(一种图形化的视图),QTP提供了一种模块化的表格格式,创建和查看测试或组件的步骤。

在录制脚本的过程中,用户在应用程序上执行的每个步骤,在关键字视图中记录为一行,这样用户就可以轻松地修改任何一部分业务步骤。

在这里拿“XX”的首页举一个例子,业务操作分3个步骤:

  点击“图片”链接;

  在图片搜索栏中输入“凤姐”;

  点击“XX一下”。

  在完成了这3个步骤后,关键字视图将包含下列行,如图1-47所示。

图1-47

  图1-47中可以看到关键字视图非常直观有效,使用的用户可以很清晰地看到被录制对象的录制层次及运行步骤。

但是,如果想自动化完成一些复杂的业务操作,在这张视图里是绝对不可能的,那就必须切换到专家视图里才行。

专家视图等一切事宜就暂且搁置一下。

先掌握关键字视图的界面、原理和工作机制。

  在关键字视图中,一共分4列:

Item、Operation、Value和Documentation。

  Item:

记录了所有对象。

  Operation:

该对象的操作。

  Value:

对象操作所用到的值。

  Documentation:

QTP自动生成的描述语句,描述了是什么对象,做了什么,怎么做。

  关键字视图的介绍马上就要结束了,最后作者分解这个视图(语句会很随意)后会直接进入专家试图的解说。

前面说过“在录制脚本的过程中,用户在应用程序上执行的每个步骤在关键字视图中记录为一行”,在本例中一共记录到6个步骤,如下:

  ●打开浏览器;

  ●进入XX首页;

  ●点击[图片]链接;

  ●进入图片页面;

  ●在[搜索框]输入“凤姐”;

  ●点击[XX一下]。

2.ExpertView(专家视图)

  瞬移成功,首先肯定是要讲专家视图的工作原理,“QTP在关键字视图中的每个节点在专家视图中对应一行脚本”。

读者可能一下子不明白这句话,那先来看两段代码,第一段代码是将关键字视图的工作原理用在专家视图上的错误代码,转换后的脚本如下:

Browser("XX一下,你就知道")

'图1-47中页面1部分

Page("XX一下,你就知道")

Link("图 片").Click

'图1-47中页面2部分

Page("XX图片—全球最大中文图片库")

WebEdit("word").Set "凤姐"

WebButton("XX一下").Click

  再看一下专家视图中正确的代码:

'图1-47中页面1部分

Browser("XX一下,你就知道").Page("XX一下,你就知道").Link("图 片").Click '句1

'图1-47中页面2部分

Browser("XX一下,你就知道")._

Page("XX图片—全球最大中文图片库").WebEdit("word").Set "凤姐" '句2

Browser("XX一下,你就知道")._

Page("XX图片—全球最大中文图片库").WebButton("XX一下").Click '句3

  看完这两段代码以后,再回过头来理解专家视图的工作原理,专家视图和关键字视图是完全不同的,用通俗点的讲,专家视图并不像关键字视图那样,每个步骤都在视图中记录成一行,在专家视图中,必须定位到业务操作最终的对象,并且每一句的结束,以及最终的对象的业务行完毕为基准。

在这里,最终的对象就是节点,专家视图中的一句代码是关键字视图中好多个步骤的结合。

而那段作者自己伪造的代码就不是,每一句都不完整,要么有头没尾,要么无头有尾,这就是KeywordView和ExpertView最根本的区别,下面,一句句看专家视图中的代码构成,先以“句1”来说,“句1”中集合了3个对象。

  Browser—该对象如果出现必定是第一层,可以把它想象成打开的一个指定浏览器,具体哪个浏览器那么就由后面括号里的参数决定,如:

Browser("XX一下,你就知道"),这样QTP就能很准确地识别到底打开的是哪个浏览器了。

  Page—浏览器下肯定有各种各样的网页。

那要定位这个对象也就很简单了,和上面一样,在后面的括号内加参数,如:

Page("XX一下,你就知道"),这样QTP就知道了,原来是要定位一个叫“XX一下,你就知道”的网页,然后其他网页会一概不理!

  Link—在定位了前两个对象后,终于可以定位到要进行业务操作的对象了。

可是,页面上如果有好多Link呢,怎么办?

只能和之前一样,在后面的括号内写进参数,如Link("图片"),这样QTP就不会乱了!

好了,在最终找对了要操作的对象后,就可以给出指令,命令它做事情了,如需要它进行点击操作,那就给Link对象来个Click方法,到此,整个语句就可以完毕了。

  分析:

“句1”已经被拆解,作者在这里用最通俗的语言方式连贯地叙述一遍“句1”,希望能让新人听明白。

→在一个叫做“XX一下,你就知道”的浏览器下的一个名曰“XX一下,你就知道”的网页页面上找到一个叫“图片”的链接,找到后,点击它。

小提示:

  在上面的例子中,是以Browser().Page().Link()的结构出现的,但实际上,在Web测试中并不只有这一种固定形式,除了Browser必定是在第一层以外,Page以及Link(或其他所有对象控件,如WebEdit等)都不是固定必须要接在前面那层的后面的,比如:

  

(2)Browser().Page().Frame().Link():

Link对象跟在Frame对象后面而没有跟在Page后面。

  

(2)Browser().Dialog().Page().WebElement():

Page对象跟在Dialog对象后面的一个例子。

  接下来再看看“句2”,这句代码中需要注意Page已经变化了,变成了Page?

("XX图片—全球最大中文图片库"),然后在该页面中找到对象WebEdit("word"),最后给这个对象一个Set的操作方法并在后面写入参数,使得QTP在该页面上找到关键字搜索框,输入“凤姐”。

  最后的“句3”唯一和前者的变化就是最终操作的对象不同了,Browser不变,页面仍然是Page("XX图片—全球最大中文图片库"),最后在前面输入好参数的前提下对WebButton?

("XX一下")这个控件进行一个点击的操作,使得XX图片搜索引擎能够搜索到一些凤姐的照片

************************************终极分析************************************

  以上可以看到Browser对象一直使用的是同一个,随着Page对象的改变而分成了2个分支,在不同的分支上定位到不同的最终目标并赋予“动作”。

所以,现在应该知道关键字视图中的代码结构了。

就是通过这样的一层层定位,直到定位到最后的待操作对象,从而在ExpertView下完美地组成一句脚本代码。

  注:

需要引出下一层对象用“.”,直到定位到最后一个待操作对象,然后仍然用“.”赋予其动作(各种不同的方法)。

  小提示:

在QTP中,要找到具体对象,如“图片”这个Link,规则就是在对象大类(Link类)后面以括号+引号的形式具体定位到那个Link控件,比如Link("图片")。

需要注意的是,输入括号和引号乃至其他任何符号都必须是在英文状态下。

切记!

很容易出现类似的问题,在中文状态的输入法下打引号,结果QTP报错,自己找了好长时间也找不出问题。

  概括&小结:

  对于QTP来说,绝大部分的复杂操作都无法在关键字视图中实现,例如,要处理动态对象、需要定制个性化测试结果、获取对象运行时的属性值(Run-timeValue)等。

  QTP的核心编码语言是VisualBasicScript,因此,如果读者熟悉VBScript,就可以运用自如地通过编程方式在专家视图中设计复杂的测试脚本。

同样,QTP本身的对象库编程(ObjectProgramming)和描述性编程(DescriptiveProgramming),这一切也都必须在专家视图中才能完成。

  关于对象库编程、描述性编程、VBScript编程、Run-timeValue、处理动态对象等一系列知识都会在后面的章节中逐步向读者呈现。

1.4.2 总结

  不知道有些读者会不会有这样的疑问,本书既然一向有“彻底抛弃脚本录制”的理念,那为什么还要写KeywordView(关键字视图)的内容呢,就算要写只一句话带过不就得了!

作者由衷地希望有这些疑问的读者越多越好,这说明广大读者就是冲着“抛弃录制”的思想购买这本书的。

现在听作者解释一下吧。

  作者这么做就是因为想抛出一块好砖引出更好的玉,在抛砖的时刻(笼统、重点配合一个实例介绍关键字视图)如果能做,越有声色,后面引出的玉一定就能更好(将关键字视图中的步骤“画面”,一条一条转进专家视图使其成为脚本代码的一个解读过程)。

另外,请重新回顾下这个小章节标题的后半部分“思维转换”。

作者觉得更应该引导读者转换的是思想、思维,绝对不该是两个视图间的转换那么简单与粗糙。

读者要从思想上去认识ExpertView,如果光从操作上直接转向ExpertView(直接在关键字视图敲击代码),表面上看很简单很轻松,但其实忽略了对专家视图的认识,也忽略了对QTP两个视图原理以及之间关系和不同点上的认识,如果这样走下去,作者觉得在今后脚本开发的学习道路上挫折会越来越多,地基打好的关键性大家都很明白。

相信,本书的这一个小章节内容虽少,但是对今后的帮助不一定少!

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

  一、大家来找茬(结合图1-48找出代码片中的错误)

图1-48

  代码片如下:

Browser("XX一下,你就知道").Page("XX一下,你就知道").Link("知 道").Click

Browser("XX百科—全球最大中文百科全书")._

Page("XX百科—全球最大中文百科全书").WebEdit("word").Click

Browser(XX一下,你就知道)._ 

Page("XX百科—全球最大中文百科全书").WebButton("进入词条").Set "51testing"

  二、请根据图1-49中关键字视图的结构与步骤转化成专家视图中的代码。

图1-49

1.5 QTP精华—对象库(上)之基础攻略篇

  阶段要点

  ●初步了解QTP中的测试对象模型。

  ●明确ObjectIdentification是管理对象模型的长官。

  ●掌握智能识别原理、机制和各项设置。

  ●对象库基本操作之添加、更新、对象闪烁、副对象库(AssociateRepositorys)。

  ●一个有趣的实验证明,做项目时手工添加对象的好处与效率。

  ●ExportLocalObjects与ExportandReplaceLocalObjects。

  ●掌握并熟练运用ObjectSpy。

  ●明确使用公共对象库的必要与优点。

  ●熟练驾驭对象库指挥官ObjectRepositoryManager。

  ●ObjectRepositoryManager的两个王牌级辅助工具初体验。

1.5.1 引言

  如果说,上一章节是彻底摆脱脚本录制的一个良好的开端,是带领读者逐步走向QTP自动化测试项目开发的台阶,那么从本章节开始,读者将跨出巨大的一步,真正开始走进QTP脚本开发的世界。

  在QTP这个自动化测试工具中,存在着两种脚本开发模式,第一种开发模式就是从本章节开始要逐步具体、深入、详细讲解的“对象库编程”。

当然,本书的一贯原则是“实用原则”,所以无论是在上篇(本章节)还是下篇(1.6章节)都绝对不会详细地讲解在实际项目运用中用不到或很少会用到的知识点。

想要精通对象库编程这个开发模式,并驾轻就熟地运用到自动化测试项目中,首当其冲就是要先“精通”QTP的对象库,作者讲的对象库其实是一个总称和概括,从大的方面包含对象库本身的功能、对象库的机制与原理、对象库编程知识、如何在实际项目中运用对象库编程等。

  在上面作者主要针对QTP对象库的机制与原理以及对象库本身的功能做深入讲解,而对象库编程的部分则会在下篇中精彩解读。

虽然需要掌握那么多知识的确很烦,也需要一个过程,但是作者认为上篇和下篇中的所有内容已经是最精简的了,所以,请读者务必对这些知识点做到“精通”,它们都是经常在实际项目中使用的,可以说是QTP脚本开发的必备技能!

如果不能精通QTP的对象库,那一定不会是一名合格的QTP自动化测试工程师!

1.5.2 对象库的出现改写了软件测试历史

  QTP的对象库是这个强大的自动化测试工具的核心,也是其精华所在!

有了对象库这一整套功能、机制,QTP才可以在那么多的自动化测试工具中脱颖而出!

QTP的整套对象库功能与对象识别机制给自动化测试人员带来了前所未有的体验,它的成熟、上手度、良好的使用感受都是市面上其他任何自动化测试工具无法给予的。

对象库是QTP在实际项目应用中的枢纽,读者一旦精通了它,会感觉到在项目应用、QTP各项功能中都会和对象库产生必要联系。

本章节的内容会结合大量仿真项目的应用来引导读者逐步精通对象库,希望读者能够做到举一反三,细细去品味对象库带来的不同感受(针对之前使用过其他自动化测试工具的读者效果更佳)!

  小小的总结一下,可以说QTP在实际项目中的应用开发(特别是自动化测试项目做成功的案例)绝大部分都基于对象库编程模式,所以,对象库的出现改写了自动化测试领域的历史,也推动了这个技术领域走向更高的台阶!

另外,先预告下,本章节以及下一章节的篇幅会很大,因为这两个章节的内容是QTP最精华的部分,也是整个第一章的最重要的一块,务必耐心学习。

1.5.3 一个简单的实例介绍对象库原理、机制及操作流程

1.5.3.1 对象模型的老大ObjectIdentification和对象库的暧昧关系

  在介绍对象库的原理与机制之前,首先说一下QTP自动化测试的原理,分以下3个步骤。

  

(1)封装真实被测对象并转化为QTP对象到对象库。

  

(2)对比对象库里的对象鉴别属性和运行时的真实被测对象的鉴别属性。

  (3)对比后如果一致,则说明对象成功匹配并可以继续对该真实被测对象进行后续操作,如果两者不一致则报错,提示为对象无法识别。

我们可以看到,QTP自动化测试的原理其第一步就和对象库产生了联系,具体到底是如何联系起来的呢?

其实很简单,在QTP里有测试对象模型这一个概念,它把各种对象都分门别类起来,建立出一个个对象模型,然后用这些对象模型来表示Web页面中的对象,比如WebButton、WebList、WebElement等各种各样的对象。

每个对象模型都有一个可以唯一标识对象的关键属性列表,我们将前面这些连起来一块说,就是在添加对象至对象库后,QTP自动建立被添加对象的对象模型,并给出一个默认识别标识。

然后,每个对象模型都有一个可以唯一标识对象的属性列表,这个属性列表是可以设置的,它就是ObjectIdentification,先认识一下它,如图1-50所示。

图1-50

  如图1-50所示,可以看到这就是ObjectIdentification的界面,开启它的方法是:

  QTP上方菜单栏→Tools→ObjectIdentification。

  在ObjectIdentification对话框中设置的属性在添加完对象后就可以在对象库中查看到。

如果觉得这些默认显示的属性还不够或者有的默认的属性是多余的,可以进行手工设置,看一下实例,通过实例来看最终效果,需要再一次借用XX的搜索框,如图1-51所示。

图1-51

  这是一个WebEdit控件,也就是一个WebEdit对象模型,等会作者把这个对象添加到对象库中,添加两次,第一次不改ObjectIdentification中WebEdit对象模型的默认属性,第二次剔除其中一个属性,然后一起看看它在对象库中的属性列表显示情况。

先来看默认的情

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 法律资料

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2