在QTP中调用C# DLL COM组件实例,原创!
本帖最后由 qianqiwen 于 2011-7-28 10:54 编辑有一两年没上过这个论坛了,也从来没有发过技术帖子,今天发一个前年写的一个学习总结!幸好这篇总结在我的个人在线文档中还存在,今天就在这里发一下。
最近在想看看QTP中是否可以引入C#的DLL,结果找遍了网络,最后还是令我失望了。在网上看到的是用DotNetFactory.CreateInstance(),但按照网上所说的怎么做都不行,后来才明白你要引用的DLL不能是一般的DLL要是COM组件才行,但网上的却是一般的写法并不是COM,所以怎么处理都不行。我想这到底是别人乱写呢,还是我自己真的太笨,所以下面我就用笨人的方法来写一编属于自己探索出来的文章,与大家一起讨论一下QTP中引用C#的DLL。其实在QTP的说明文档中都提到了要用COM,但它的代码示例却不是COM的形式,所以我想就因为这样才有人照搬,导致失败的原因。当然也有可能是我真的太笨,不会用,但无论如何我也用我认为正确的方法写了出来,并在公司的总结会议中成功演示了整个过程,还是那句话,能交功课就成了,管他呢!
下面是我使用QTP对我们公司的商务平台作一次自动化测试。总共分两部分。一部分是QTP自动测试脚本,另一部分是自动测试脚本调用的一个用C#写的一个COMDLL。这两个东东都很简单,行内人士都能看懂。 因为这个是一边调试一边做的,所以有些语句中会带有注释符,这个要注意区分。
因为我已经辞职也,不想给以前的公司打广告,所以QTP脚本中涉及公司名称的页面标题就用****来代替。
第一部分:QTP自动测试脚本
Browser("******").Page("商城首页-******").Image("购买衣服").ClickBrowser("******").Page("购物车-******").WebEdit("RptShoppingCart$ctl01$TxtProdu").Set "5"
Browser("******").Page("购物车-******").WebButton("调整购物车").Click
Dim numgoods
Dim truePrice
Dim subTotal
numgoods=5
Dim res
truePrice=CDbl(Browser("******").Page("购物车-******").WebElement("html id:=truePrice").getroproperty("innertext"))
subTotal=CDbl(Browser("******").Page("******").WebElement("html id:=subTotal").getroproperty("innertext"))
'numgoods=Browser("******").Page("******").WebElement("html tag:=input id:=RptShoppingCart_ctl01_TxtProductAmount").value
Set obj = DotNetFactory.CreateInstance("qtp.qtpdll","E:\qtpdll\qtp\qtp\bin\Debug\qtp.dll")
res=CDbl(obj.qtptest(truePrice,5))
If subTotal <> res Then
msgbox "价格不正确"
Else
msgbox "价格正确"
End If
Browser("******").Page("购物车-******").Sync
Browser("******络").Close
第二部分:C#写的一个COMDLL
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.IO;
namespace qtp
{
//public partial class qtp : UserControl
//{
// public qtp()
// {
// InitializeComponent();
// }
//}
public interface IObjectSafety
{
// methods
void GetInterfacceSafyOptions(
System.Int32 riid,
out System.Int32 pdwSupportedOptions,
out System.Int32 pdwEnabledOptions);
void SetInterfaceSafetyOptions(
System.Int32 riid,
System.Int32 dwOptionsSetMask,
System.Int32 dwEnabledOptions);
}
public partial class qtpdll : IObjectSafety
{
public qtpdll()
{
}
public doubleqtptest(double a,double b)
{
double c;
c = a * b;
return c ;
}
#region IObjectSafety 成员
public void GetInterfacceSafyOptions(Int32 riid, out Int32 pdwSupportedOptions, out Int32 pdwEnabledOptions)
{
// TODO:添加 WebCamControl.GetInterfacceSafyOptions 实现
pdwSupportedOptions = 1;
pdwEnabledOptions = 2;
}
public void SetInterfaceSafetyOptions(Int32 riid, Int32 dwOptionsSetMask, Int32 dwEnabledOptions)
{
// TODO:添加 WebCamControl.SetInterfaceSafetyOptions 实现
}
#endregion
}
}
总结:总体上的思路是在QTP的VBS脚本中调用QTP.dll的qtptest方法,并计算出用户在购物车中应该付的资金总额。如果页面中的应付资金总额与qtptest方法得出的总额一样的话,Qtp中的VBS脚本就会提示正确,否则提示错误。 C#部分的代码我是在VS2008下写的,至于你用什么工具写这个由各人,至于COM组件怎么写,这个我不详细说了,网上有很多资料
希望对其他朋友有所帮助! 看了多多回复呀!哈哈! 售价为1,只是讨个彩头! 本帖最后由 lanbingkafei 于 2011-7-26 10:04 编辑
回复 1# qianqiwen
再给你一个如何开发com组件的例子,当然里面有QTP调用COM组件的方法……注意:是免费的
http://www.automationqa.com/automation-view/tibexpertcolumns/item/94-simple-com-development.html 支持一下,虽然我不买 这种东西网上多的是,不说别的,我的博客就用好几种。有vb.net 和C#这种非标准动态库。 也就是要开放com的,熟称com组件。 这种东西网上多的是,不说别的,我的博客就用好几种。有vb.net 和C#这种非标准动态库。 也就是要开放com的,熟称com组件。 VBS不支持数组的传递能否通过C# 实现将数组作为参数传递或者其他方式 将数组传递成功
页:
[1]