QTP的AOM模型想必大家都很熟悉了,平时常用的就是通过VBS脚本的方式编写启动程序(也是我现在用的方法)。其实,还有很多其他的方式,如Java,C#,JS,这些语言都是通过调用QTObjectModel.dll文件来实现AOM,该文件位于QTP安装目录bin文件夹下。

简单的启动代码

下面简单的介绍下通过JS的方式来调用AOM,主要工具是ActiveXObject对象。假设已完成自动化脚本编写并保存为D:\QTP\jsaom,代码如下

<html>
<head>
<title>JS启动QTP</title>
<meta http-equiv="Content-type" content="text/html" charset="utf-8">
</head>
<body>
<input type="button" value="运行脚本" onclick="run();">
<script type="text/javascript" language="javascript">
function run(){ // 创建AOM对象
var qtpauto=new ActiveXObject("QuickTest.Application");
//用于结束AOM进程
var task_kill=new ActiveXObject("WScript.Shell");
//启动QTP
qtpauto.Launch();
//设置可见
qtpauto.Visible=true;
//打开脚本文件
qtpauto.open('D:\\QTP\\jsaom');
//运行脚本
qtpauto.Test.Run();
//退出脚本
qtpauto.Quit();
//关闭AOM进程
task_kill.Run("taskkill /f /im QTAutomationAgent.exe");
}
</script>
</body>
</html>

WScript.Shell对象用于关闭QTAutomationAgent.exe进程,在调用AOM是系统会自动生成此进程在脚本运行运行完毕后并不会自动退出,当我们调试代码时有时会报错,为了方便每次执行完毕kill就好了。

我们还可以在代码中指定运行时的参数和结果文件的保存路径

 <html>
<head>
<title>JS启动QTP</title>
<meta http-equiv="Content-type" content="text/html" charset="utf-8">
</head>
<body>
<input type="button" value="运行脚本" onclick="run();">
<script type="text/javascript" language="javascript">
function run(){ // 创建AOM对象
var qtpauto=new ActiveXObject("QuickTest.Application");
//结果对象
var qtpresult=new ActiveXObject("QuickTest.RunResultsOptions");
//用于结束AOM进程
var task_kill=new ActiveXObject("WScript.Shell"); //启动QTP
qtpauto.Launch();
//设置可见
qtpauto.Visible=true;
//打开脚本文件
qtpauto.open('D:\\QTP\\jsaom');
//设置脚本只迭代一次
qtpauto.Test.Settings.Run.IterationMode = "oneIteration";
//设置等待对象出现的时间为20000毫秒即20秒
qtpauto.Test.Settings.Run.ObjectSyncTimeOut = "20000";
//出错时继续执行下一步
qtpauto.Test.Settings.Run.OnError = "NextStep";
//设置结果保存路径
qtpresult.ResultsLocation = "D:\\QTP\\Res"
//运行脚本
qtpauto.Test.Run(qtpresult);
//退出脚本
qtpauto.Quit();
//关闭AOM进程
task_kill.Run("taskkill /f /im QTAutomationAgent.exe");
}
</script>
</body>
</html>

有了这些功能就可以用复选框来选择每次想要运行的脚本,为此我写了一个简单的例子,界面没怎么调,请轻喷。

 <html>
<head>
<title> js启动QTP</title>
<meta http-equiv="Content-type" content="text/html" charset="utf-8">
<link rel="stylesheet" href="qtp.css" type="text/css" >
</head>
<body>
<h1>JavaScript启动QTP</h1> <div>
<form name="select_testscript" method="post" action="">
<table>
<tr style="background-color: #6fcf6f">
<td style="background-color: #0066CC;font-size:16px;color: #fff0f5;"><input type="checkbox" name="select_all" value="select_all" onclick="pick_all(this)">全选</td>
<th colspan="4">请选择回归脚本</th>
</tr>
<tr>
<td style="background-color: #6fcf6f"><input type="checkbox" name="test_normal_all" value="test_normal_all" onclick="line_pick_all(this)">测试脚本正常</td>
<td style="background-color: #6fc6ff"><input type="checkbox" name="normal" value="演示脚本_正常_1">演示脚本_正常_1</td>
<td style="background-color: #6fc6ff"><input type="checkbox" name="normal" value="演示脚本_正常_2">演示脚本_正常_2</td>
<td style="background-color: #6fc6ff"><input type="checkbox" name="normal" value="演示脚本_正常_3">演示脚本_正常_3</td>
<td style="background-color: #6fc6ff"><input type="checkbox" name="normal" value="演示脚本_正常_4">演示脚本_正常_4</td>
</tr>
<tr>
<td style="background-color: #6fcf6f" rowspan="2"><input type="checkbox" name="test_exception_all" value="test_exception_all" onclick="line_pick_all(this)">测试脚本异常</td>
<td style="background-color: #f6c6ff"><input type="checkbox" name="exception" value="演示脚本_异常_1">演示脚本_异常_1</td>
<td style="background-color: #f6c6ff"><input type="checkbox" name="exception" value="演示脚本_异常_2">演示脚本_异常_2</td>
<td style="background-color: #f6c6ff"><input type="checkbox" name="exception" value="演示脚本_异常_3">演示脚本_异常_3</td>
<td style="background-color: #f6c6ff"><input type="checkbox" name="exception" value="演示脚本_异常_4">演示脚本_异常_4</td>
</tr>
</table>
<br>
<input type="button" value="运行脚本" onclick="run();" class="button"> </form>
</div>
 <script type="text/javascript" language="javascript">
/*全选函数*/
function pick_all(obj){
var em_number=document.forms.select_testscript.elements;
for(var i=0;i<em_number.length;i++){
if(em_number[i].type=="checkbox"){
if(obj.checked==true)
em_number[i].checked=true;
else
em_number[i].checked=false;
}
}
}
/*每个类型全选函数*/
function line_pick_all(obj){
var objvalue=obj.value;
objvalue=objvalue.substring(0,objvalue.length-4);
var objname=document.getElementsByName(objvalue);
if(obj.checked==true){
for(var i=0;i<objname.length;i++)
objname[i].checked=true;
}else{
for(var i=0;i<objname.length;i++)
objname[i].checked=false;
}
}
/*运行所选脚本*/
function run(){ var em_number=document.forms.select_testscript.elements;
var script_name=new Array();
var qtpauto=new ActiveXObject("QuickTest.Application");
var qtpresult=new ActiveXObject("QuickTest.RunResultsOptions");
// 获取已选中的复选框
for(var i=0;i<em_number.length;i++){
if(em_number[i].type=="checkbox"){
if(em_number[i].checked==true && em_number[i].value.indexOf("_all")<0)
script_name.push(em_number[i].value)
}
}
qtpauto.Launch();
qtpauto.Visible=true;
// 运行选中脚本
for(var j=0;j<script_name.length;j++){
try{
//打开脚本文件
qtpauto.open('D:\\QTP\\'+script_name[j]);
//设置脚本只迭代一次
qtpauto.Test.Settings.Run.IterationMode = "oneIteration";
//设置等待对象出现的时间为20000毫秒即20秒
qtpauto.Test.Settings.Run.ObjectSyncTimeOut = "20000";
//出错时继续执行下一步
qtpauto.Test.Settings.Run.OnError = "NextStep";
//设置结果保存路径
qtpresult.ResultsLocation = "D:\\QTP\\Res"+script_name[j];
qtpauto.Test.Run(qtpauto);
}catch(err){
alert("err.description");
}
}
// 关闭QTPAOM进程
qtpauto.Quit();
var task_kill=new ActiveXObject("WScript.Shell");
task_kill.Run("taskkill /f /im QTAutomationAgent.exe");
} </script>
</body>
</html>

CSS文件

 body{
text-align: center;
margin:;
padding:;
font-family: Verdana, Geneva, sans-serif;
background-color:#FFF;
background-size: 100% 100%; }
table{
padding:;
margin:0 auto;
font-size: 16px;
font-weight: bold;
line-height: 1.4em;
font-style: normal;
border-collapse:separate;
}
table th{
padding:12px;
border:1px solid #93CE37;
border-bottom:3px solid #9ED929;
font-size:20px;
}
td{
background: #fff;
font-size:14px;
font-family: "微软雅黑",sans-serif;
color: black;
padding:8px;
text-align:left;
border: .5px solid #E7EFE0;
border-radius:2px;
text-shadow:1px 1px 1px #fff;
}
.button {
background-color: #6fcf6f;
border: none;
border-radius: .25em;
color: #444;
cursor: pointer;
display: inline-block;
font-family: "微软雅黑",sans-serif;
font-size: 1.25em;
font-weight: bold;
line-height: 1.5;
margin: 0 -21.5em 5em;
padding: .5em .3em .5em;
position: relative;
text-decoration: none;
vertical-align: middle;
}
.button:hover {
outline: none;
}
h1 {
background-color: #333;
color: #fff0f5;
font-size: 3em;
font-weight: bold;
line-height:;
margin:;
padding: 0.5em;
text-align: center;
}
.attribution {
color: #888;
margin-top: 1em;
text-align: right;
width: 100%;
}

QTP关于AOM的Javascript启动方式的更多相关文章

  1. Redis的三种启动方式

    转载:http://www.tuicool.com/articles/aQbQ3u Part I. 直接启动 下载 官网下载 安装 tar zxvf redis-2.8.9.tar.gz cd red ...

  2. spring有三种启动方式

    spring有三种启动方式,使用ContextLoaderServlet,ContextLoaderListener和ContextLoaderPlugIn spring3.0及以后版本中已经删除Co ...

  3. android service两种启动方式

    android service的启动方式有以下两种: 1.Context.startService()方式启动,生命周期如下所示,启动时,startService->onCreate()-> ...

  4. Redis的三种启动方式【转】

    Part I. 直接启动 下载 官网下载 安装 tar zxvf redis-2.8.9.tar.gz cd redis-2.8.9 #直接make 编译 make #可使用root用户执行`make ...

  5. android activity的启动方式

    1.Standard正常启动,默认的启动方式,没什么说头 2.SingleTop 意思就是在栈顶只能存在一个相同的activity 不能叠加,如果再A上继续启动A的话,只会调用A的onNewInten ...

  6. android服务之启动方式

    服务有两种启动方式 通过startService方法来启动 通过bindService来开启服务 布局文件 在布局文件中我们定义了四个按键来测试这两种方式来开启服务的不同 <?xml versi ...

  7. Android service介绍和启动方式

    1.Android service的作用: service通常是用来处理一些耗时操作,或后台执行不提供用户交互界面的操作,例如:下载.播放音乐. 2.Android service的生命周期: ser ...

  8. 第一章 Mybtais的两种启动方式

    Mybatis的两种启动方式如下: 1.xml实现: xml的实现方式中,主要是通过手动创建SqlSession,然后调用session.selectOne()方法实现来实现. 首先是创建Config ...

  9. mysql 4种启动方式

    mysql 4种启动方式 都是去调用mysqld文件 1. mysqld 启动 进入mysqld文件所在目录(/../libexec/mysqld) ./mysqld --defaults-file= ...

随机推荐

  1. Android开发中用友盟做分享的一些坑

    仅限于用5.1.4版本的 按照友盟分享的API在自己的代码中修改: 1.微信分享需要打包APK文件,数字签名与微信开发申请的要一致 2.此name中属性不能修改 value为友盟的申请的appkey ...

  2. 安卓工程修改包名后 Failed to find provider info for...问题

    安卓工程修改包名后 Failed to find provider info for com.android...provider问题 原因: 1. 多处含包名文件须同时更改 2. Manifest里 ...

  3. Android开发手记(30) 触摸及手势操作

    触摸操作在现在智能手机系统中起到举足轻重的作用,本文将对安卓中的触摸以及一些简单手势的操作进行简单的介绍. 1.触摸 首先是关于触摸的判断,有两种方法可以判断的触摸操作. (1)setOnTouchL ...

  4. 内容替换Filter

    有时候需要对网站进行控制,防止输出非法内容或者敏感信息.这时我们可以使用filter来进行内容替换,其工作原理为,在Servlet将内容输出到response时,response将内容缓存起来,在Fi ...

  5. 【POJ1823】【线段树】Hotel

    Description The "Informatics" hotel is one of the most luxurious hotels from Galaciuc. A l ...

  6. 【HOJ2430】【贪心+树状数组】 Counting the algorithms

    As most of the ACMers, wy's next target is algorithms, too. wy is clever, so he can learn most of th ...

  7. php文件加锁 lock_sh ,lock_ex

    文件锁有两种:共享锁和排他锁,也就是读锁(LOCK_SH)和写锁(LOCK_EX) 文件的锁一般这么使用: $fp = fopen("filename", "a" ...

  8. C /CLI思辨录[阅读记录]

    C /CLI思辨录之拷贝构造函数(避免多个实例在相同的堆对象的错误处理) http://west263.com/info/html/chengxusheji/C-C--/20080224/9247.h ...

  9. ICE学习第二步-----从第一个程序了解ICE(HelloWorld)

    ICE(Internet Communications Engine)是一种面向对象的中间件平台,主要用于网络通讯.它为面向对象的“客户端-服务器”模型的应用提供了一组很好的工具和API接口.目前在全 ...

  10. php之利用递归写无限极分类

    <?php //无限极分类 //parent 的值,是该栏目的父栏目的id 反之是 /*0 安徽 合肥 北京 海淀 中关村 上地 河北 石家庄 */ $area = array( array(' ...