51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 3296|回复: 5
打印 上一主题 下一主题

[原创] 在QTP中调用C# DLL COM组件实例,原创!

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2011-7-23 02:08:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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,只是讨个彩头!
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

该用户从未签到

2#
发表于 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
回复 支持 反对

使用道具 举报

该用户从未签到

3#
发表于 2011-7-26 10:07:45 | 只看该作者
支持一下,虽然我不买
回复 支持 反对

使用道具 举报

  • TA的每日心情
    开心
    2018-7-13 14:04
  • 签到天数: 6 天

    连续签到: 1 天

    [LV.2]测试排长

    4#
    发表于 2011-7-30 22:59:23 | 只看该作者
    这种东西网上多的是,不说别的,我的博客就用好几种。有vb.net 和C#这种非标准动态库。 也就是要开放com的,熟称com组件。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2018-7-13 14:04
  • 签到天数: 6 天

    连续签到: 1 天

    [LV.2]测试排长

    5#
    发表于 2011-7-30 22:59:29 | 只看该作者
    这种东西网上多的是,不说别的,我的博客就用好几种。有vb.net 和C#这种非标准动态库。 也就是要开放com的,熟称com组件。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2015-3-30 15:24
  • 签到天数: 3 天

    连续签到: 1 天

    [LV.2]测试排长

    6#
    发表于 2014-4-14 16:26:52 | 只看该作者
    VBS不支持数组的传递  能否通过C# 实现将数组作为参数传递  或者其他方式 将数组传递成功
    回复 支持 反对

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-11-26 13:12 , Processed in 0.069125 second(s), 28 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表