我们为QTP开发了一个自定义插件,以自动化Extjs应用程序。最近我们开始知道我们开发插件的方法是不可靠的。我们使用DOM树中显示的CSS类来帮助QTP识别ExtJS应用程序中的每个对象。最近我们的开发人员告诉我们,这种依赖CSS类的方式是一个问题,因为这些CSS类不断变化。对于Ex:在ExtJS Web应用程序中,Login按钮控件的DOM在浏览器中看起来像这样(只是一个轮廓,不完全像下面这样)
<a class = x-btn x-box-item x-btn-default-small id=button-1086 unselectable = on style = margin>
<span class = x-something>
<span class = y-something>Login</span>
所以,在自定义插件的工具箱配置xml中,我们为这个按钮写了标识
<Conditions type="IdentifyIfPropMatch">
<Condition prop_name="classname" expected_value="x-btn" is_reg_exp="true" />
我们使用Javascript提取上方span标记中的标签 Login ,并将其分配给自定义 Extjsbutton 控件的title属性。所以当我使用QTP录制时,生成的VBScript代码是
Browser("..").Page("..").Extjsbutton("Login").Click
在该应用程序的最新版本中,按钮类名称在DOM中从 x-btn 更改为 x-fastbutton 。因为QTP无法识别按钮对象。
我们要求应用程序开发人员为应用程序中的每个控件提供一些新属性,这些属性是常量,以便QTP可以使用它们来识别应用程序中的每个对象。应用程序开发人员为我们提供了三个新属性,新属性看起来像这样
<a id = 'button-123', class = 'x-button' , uft-xtype = Button, uft-isComponent = true,
uft-extclass = Ext.button.Button>
我的问题是,我们可以直接在工具箱配置xml中的Condition元素中使用这些新属性及其值,如
<Conditions type="IdentifyIfPropMatch">
<Condition prop_name="uft-xtype" expected_value="button" is_reg_exp="true" />
或者我是否应该只使用在本机DOM中注册的那些属性,例如html id,classname,tagname,在toolkit config xml的Condition元素中。
我们的一个加载项开发人员使用了工具包config xml中的下面的外部函数调用来演示应用程序开发人员给出的那些新属性的使用。
<Identification function="isExtjsButton">
但是我从QTP帮助文件中了解到,在toolkit config xml中使用这样的外部函数调用会影响加载项的性能,应该避免使用。我让开发人员检查是否可以直接在condition元素中使用这些自定义属性,并避免进行外部函数调用。但我们无法破解它。如何做到这一点的帮助将不胜感激
此致
SRINIVAS
答案 0 :(得分:2)
最后联系了HP QTP支持。他们告诉我,app开发人员提供的自定义属性应该是本机DOM属性的一部分,以便直接在toolkit config xml的Condition元素中使用。由于自定义属性不是本机DOM的一部分,唯一的出路是使用外部函数调用。因此外部函数调用是不可避免的。
答案 1 :(得分:0)
你尝试过使用Xpath -axis吗?我的意思是使用父元素的稳定ID并在运行时获取所需对象的动态id。在我们的例子中,我们发现某个级别的每个对象都包含在一个具有稳定id的表中。您可以根据对象层次结构开发类似的逻辑。
逻辑如下:
Set objTableName=Description.Create() ' Creating description object for Web Table
' Setting the Web Table object properties to navigate to parent and then to child
objTableName("micclass").value = "WebTable"
objTableName("class").Value="some-stable- part-in-the-table -class.*"
objTableName("name").Value=strParentTableName
' Check for the object existency and fetch the exact html ID for Dropdown List at run time
If Browser("B").Page("P").Webtable(objTableName).Exist(gMaxTimeout)=True Then
strTableText = Browser("B").Page("P").Webtable(objTableName).GetROProperty("outerhtml")
Set objRegEx = New RegExp ' Create a regular expression.
objRegEx.Pattern = "ext-gen[0-9]+"
objRegEx.IgnoreCase = True ' Set case insensitivity.
objRegEx.Global = True ' Set global applicability.
Set objMatches = objRegEx.Execute(strTableText) ' Execute search.
For Each objMatch in objMatches ' Iterate Matches collection.
strComboHtmlID = objMatch.Value
Next
Browser("B").Page("P").WebElement("html id:=" & strComboHtmlID ).Click ' Click on the Dropdown List
'Check for Web element existency and performing click operation
If Browser("B").Page("P").WebElement("innerhtml:=" & strValuetoBeSelected,"index:=1","class:=x-nowrap-combo-item").Exist(gMinTimeout) Then
Browser("B").Page("P").WebElement("innerhtml:=" & strValuetoBeSelected,"index:=1","class:=x-nowrap-combo-item").Click