QTP 11.0 中的 Web 可扩展性加载项故障排除

Posted

技术标签:

【中文标题】QTP 11.0 中的 Web 可扩展性加载项故障排除【英文标题】:Troubleshooting Web Extensibility Add-Ins In QTP 11.0 【发布时间】:2013-08-14 19:55:23 【问题描述】:

我正在尝试使用 QTP 11.0 Web Extensibility Add-Ins 让自定义 Web 元素类型显示在对象标识下。

我的扩展中有四个文件,如问题末尾所示。我的问题是Object Identification 窗口中没有显示任何对象。我想我可能做错了什么,所以我加载了 SDK 附带的 GWT 示例,但它也没有在对象识别中显示任何内容!

QTP 是否保留有关我可能遇到的错误类型的日志或任何类型的调试信息,或者它是否按预期工作并且这些自定义对象甚至应该显示在“对象识别”窗口中?如果是,为什么?

$INSTALLDIR\dat\Extensibility\Web\HiddenTestObjects.xml

<?xml version="1.0" encoding="UTF-8"?>
<TypeInformation Load="true" AddinName="Web" PackageName="Hidden" DevelopmentMode="true" priority="1">
    <ClassInfo Name="Hidden" BaseClassInfoName="WebElement" GenericTypeID="object" DefaultOperationName="Set" FilterLevel="0">
        <Description>Input field of type="hidden".</Description>
        <TypeInfo>
            <Operation ExposureLevel="CommonUsed" Name="Set" PropertyType="Method">
                <Description>Sets the content of the value attribute.</Description>
                <Documentation><![CDATA[Enter %a1 in the %l hidden field.]]></Documentation>
                <!-- The text to enter in the box. If this argument is not provided, the box is cleared. -->
                <Argument Name="text" IsMandatory="false" Direction="In">
                    <Type VariantType="String"/>
                </Argument>
            </Operation>
        </TypeInfo>
        <IdentificationProperties>
            <IdentificationProperty ForDefaultVerification="true" ForVerification="true" ForDescription="true" Name="value"/>
            <IdentificationProperty ForDefaultVerification="false" ForVerification="false" ForDescription="true" Name="html tag" ForOptionalSmartID="true" OptionalSmartIDPropertyValue="1"/>
            <IdentificationProperty Name="html id" ForDefaultVerification="false" ForVerification="false" ForDescription="false"/>
            <IdentificationProperty Name="innerhtml" ForDefaultVerification="false" ForVerification="false" ForDescription="false"/>
            <IdentificationProperty Name="innertext" ForDefaultVerification="false" ForVerification="false" ForDescription="false" ForOptionalSmartID="true" OptionalSmartIDPropertyValue="2"/>
            <IdentificationProperty Name="outerhtml" ForDefaultVerification="false" ForVerification="false" ForDescription="false"/>
            <IdentificationProperty Name="outertext" ForDefaultVerification="false" ForVerification="false" ForDescription="false"/>
        </IdentificationProperties>
    </ClassInfo>
</TypeInformation>

$INSTALLDIR\dat\Extensibility\Web\Toolkits\Hidden\Hidden.xml

<?xml version="1.0" encoding="UTF-8"?>
<Controls xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <Settings>
        <Variable name="common_file" value="HiddenCommon.js"/>
    </Settings>
    <JSLibrariesToInject>
        <JSLibrary path="INSTALLDIR\bin\JSFiles\jQuery-1.3.2.js" />
        <JSLibrary path="INSTALLDIR\bin\JSFiles\jQuery.simulate.js" />
    </JSLibrariesToInject>
    <Control TestObjectClass="Hidden">
        <Settings>
            <Variable name="default_imp_file" value="Hidden.js"/>
        </Settings>
        <Identification>
      <Browser name="*">
        <HTMLTags>
          <Tag name="input"/>
        </HTMLTags>
        <Conditions type="IdentifyIfPropMatch">
          <Condition prop_name="type" expected_value="hidden" is_reg_exp="false" equal="true"/>
        </Conditions>
      </Browser>
        </Identification>
        <Record>
            <EventListening use_default_event_handling_for_children="true" use_default_event_handling="true" type="javascript" function="ListenToEvents"/>
        </Record>
        <Run>
            <Methods>
                <Method name="Set" function="Set"/>
            </Methods>
        </Run>
        <Filter>
            <Spy is_control_spyable="Yes"/>
            <Learn learn_children="No" learn_control="Yes"/>
        </Filter>
    </Control>
</Controls>

$INSTALLDIR\dat\Extensibility\Web\Toolkits\Hidden\Hidden.js

/////////////////////////////////////////////////////////////////////////
// Hidden.js
//
// This file contains the implementation of the support for Hidden input controls.
//
/////////////////////////////////////////////////////////////////////////

var HIDDEN_CATEGORY = 7;

function get_property_value(property) 
    if (property == "logical name") 
        return "Hidden";
    
    if (property == "type") 
        return "hidden";
    

    if (property == "value") 
        return window.$(_elem).value;
    

    if (property == "disabled") 
        return false;
    


function Set(text) 
    preventReplayOnDisabledControl("Set");
    // NULL or empty text string can be used to clear the text area.
    // Convert both to an empty string.
    window.$(_elem).value = (text != null? text : "");

    var reportParams = new Array(text);
    _util.Report(micDone, "Set", toSafeArray(reportParams), "Set the following text:" + text);
    return true;


function ListenToEvents(elem) 

    return true;

$INSTALLDIR\dat\Extensibility\Web\Toolkits\Hidden\HiddenCommon.js

/////////////////////////////////////////////////////////////////////////////////
// HiddenCommon.js
//
// This file contains shared JavaScript functions that can be called by functions  
// in other JavaScript files in the Hidden toolkit support set. 
// 
/////////////////////////////////////////////////////////////////////////////////

function HTMLElemArrayToString(HTMLElemArray) 

    var ElemArrayAsString = new Array();
    for (var i = 0; i < HTMLElemArray.length; i++)
    
        ElemArrayAsString.push(window.$(HTMLElemArray[i]).text());
    
    return ElemArrayAsString.join(";");


function preventReplayOnDisabledControl(action) 
    if (get_property_value("disabled")) 
        _util.Report(micFail, action, toSafeArray(new Array()), "Cannot Replay On Disabled Control");
        throw "Cannot Replay On Disabled Control";
    


function shouldIgnoreEvent(eventObj) 
    if (get_property_value("disabled")) 
        return true;
    
    if (eventObj.button && eventObj.button != QtpConstants.LEFT_BUTTON()) 
        return true;
    

    return false;

【问题讨论】:

【参考方案1】:

QTP 从您的 HiddenTestObjects.xml 文件中获取要在对象识别中使用的属性。在那里您可以指定哪个属性是 ForDescription 和智能识别(查看架构或文档了解更多详细信息)。

如果 QTP 允许通过对象识别对话框在机器对机器的基础上覆盖这些设置会很好,但 AFAIK 的假设是 Web 可扩展性作者最清楚应该使用哪些属性。

如果您认为让用户覆盖您在 HiddenTestObjects.xml 中规定的对象识别规则很重要,您应该向 HP 提出增强请求。否则我知道的唯一方法是指示用户在本地编辑 HiddenTestObjects.xml

【讨论】:

所以您是说Web 可扩展性测试类只是不会 出现在对象标识中,但是它们会在您捕获共享对象存储库时出现?我只需要它们出现在 SOR 中,我不需要让用户自定义选择了哪些属性。我认为有一个错误,因为它们没有出现在对象识别中。 @somequixotic,是的,这就是我要说的(当然我可能错了)。你试过学习它们吗?

以上是关于QTP 11.0 中的 Web 可扩展性加载项故障排除的主要内容,如果未能解决你的问题,请参考以下文章

使用QTP测试Web对象

如何诊断 dnx 中缺少的依赖项(或其他加载程序故障)?

IE浏览网页flash.ocx控件加载失败 怎么办啊啊?

QTP之web常用对象

qtp动态加载宏

robot framework和qtp的区别