|
本帖最后由 qianqiwen 于 2011-7-28 10:54 编辑
有一两年没上过这个论坛了,也从来没有发过技术帖子,今天发一个前年写的一个学习总结!幸好这篇总结在我的个人在线文档中还存在,今天就在这里发一下。
最近在想看看QTP中是否可以引入C#的DLL,结果找遍了网络,最后还是令我失望了。在网上看到的是用DotNetFactory.CreateInstance(),但按照网上所说的怎么做都不行,后来才明白你要引用的DLL不能是一般的DLL要是COM组件才行,但网上的却是一般的写法并不是COM,所以怎么处理都不行。我想这到底是别人乱写呢,还是我自己真的太笨,所以下面我就用笨人的方法来写一编属于自己探索出来的文章,与大家一起讨论一下QTP中引用C#的DLL。其实在QTP的说明文档中都提到了要用COM,但它的代码示例却不是COM的形式,所以我想就因为这样才有人照搬,导致失败的原因。当然也有可能是我真的太笨,不会用,但无论如何我也用我认为正确的方法写了出来,并在公司的总结会议中成功演示了整个过程,还是那句话,能交功课就成了,管他呢!
下面是我使用QTP对我们公司的商务平台作一次自动化测试。总共分两部分。一部分是QTP自动测试脚本,另一部分是自动测试脚本调用的一个用C#写的一个COM DLL。这两个东东都很简单,行内人士都能看懂。 因为这个是一边调试一边做的,所以有些语句中会带有注释符,这个要注意区分。
因为我已经辞职也,不想给以前的公司打广告,所以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#写的一个COM DLL
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();
// }
//}
[Guid("62E53D49-D447-455c-9565-719842D98CBC"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
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);
}
[Guid("8E18D0FA-2148-4708-B035-C3F1CAFCBB5F")]
public partial class qtpdll : IObjectSafety
{
public qtpdll()
{
}
public double qtptest(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,只是讨个彩头! |
|