qianqiwen 发表于 2011-7-23 02:08:31

在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:03:43

本帖最后由 lanbingkafei 于 2011-7-26 10:04 编辑

回复 1# qianqiwen


    再给你一个如何开发com组件的例子,当然里面有QTP调用COM组件的方法……注意:是免费的
http://www.automationqa.com/automation-view/tibexpertcolumns/item/94-simple-com-development.html

lyscser 发表于 2011-7-26 10:07:45

支持一下,虽然我不买

17800455 发表于 2011-7-30 22:59:23

这种东西网上多的是,不说别的,我的博客就用好几种。有vb.net 和C#这种非标准动态库。 也就是要开放com的,熟称com组件。

17800455 发表于 2011-7-30 22:59:29

这种东西网上多的是,不说别的,我的博客就用好几种。有vb.net 和C#这种非标准动态库。 也就是要开放com的,熟称com组件。

fsweicaixia 发表于 2014-4-14 16:26:52

VBS不支持数组的传递能否通过C# 实现将数组作为参数传递或者其他方式 将数组传递成功
页: [1]
查看完整版本: 在QTP中调用C# DLL COM组件实例,原创!