軟件測試工具中QTP操作xml文件的方法及擴展QTP的.NET插件的問(wèn)題
目前,企業(yè)中對XML的應用越來(lái)越廣泛,作為自動(dòng)化測試的測試工程師,也應該掌握XML的讀寫(xiě)操作。
以下我使用XML DOM技術(shù)演示一個(gè)例子,用以讀取XML指定節點(diǎn)的節點(diǎn)內容值。
讀取函數原型 GetXml strXmlPath,nodeName
這個(gè)函數的第一個(gè)參數表示xml文件所在路徑,第二個(gè)參數表示希望獲取到的xml節點(diǎn)名,請結合下列例子看
首先,新建一個(gè)vbs文件(取個(gè)名字叫readXml.vbs),輸入代碼:
Dim strXML
GetXml "c:search.xml","TestResult" '這個(gè)函數的第一個(gè)參數表示xml文件所在路徑,第二個(gè)參數表示希望獲取到的xml節點(diǎn)名,請結合下列例子看
MsgBox strXML
Function GetXml (ByVal strXmlFilePath,ByVal xmlNodeName)
Dim xmlDoc,xmlRoot
Set xmlDoc = CreateObject("Microsoft.XMLDOM") '創(chuàng )建XML DOM對象
xmlDoc.async = False '控制加載模式為同步模式(xml樹(shù)加載完畢后再執行后續代碼)
xmlDoc.load strXmlFilePath '載入xml文件
If xmlDoc.parseError.errorCode <> 0 Then
MsgBox "XML文件格式不對,原因是:" & Chr(13) & xmlDoc.parseError.reason
Exit Function
End If
Set xmlRoot = xmlDoc.documentElement
xmlRecursion xmlRoot,xmlNodeName '調用xml遞歸函數傳入指定的根和節點(diǎn)名
GetXml = True 'xmlRecursion (xmlRoot)
End Function
Function xmlRecursion(byval xmlNode,byval strNodeName)
If xmlNode.nodeName = strNodeName And xmlNode.hasChildNodes Then
If xmlNode.childNodes.item(0).nodeName = "#text" Then
strXML = strXML & xmlNode.nodeName & ":" & xmlNode.childNodes.item(0).nodeValue & Chr(13)
End If
End If
If xmlNode.hasChildNodes Then
For Each childNodeItem In xmlNode.ChildNodes
If childNodeItem.hasChildNodes Then
xmlRecursion childNodeItem,strNodeName
End If
Next
End If
End Function
問(wèn)題:
haschildnodes()這個(gè)方法好奇怪,明明已經(jīng)沒(méi)有子節點(diǎn)了,卻仍然返回true,
比如<TestResult>1</TestResult>這個(gè)節點(diǎn),它的childNodes.item(0).nodeName竟然是“#text”,但是根據例子來(lái)看TestResult已經(jīng)沒(méi)有子節點(diǎn)了阿
回答:
因為在xml有一個(gè)特殊的“子節點(diǎn)”——文本節點(diǎn)。比如 <TestResult>100</TestResult>
這個(gè)節點(diǎn)TestResult下并不是沒(méi)有子節點(diǎn),而是有一個(gè)文本節點(diǎn),這個(gè)節點(diǎn)的nodeName就是“#text”,而nodeValue是100.如果是 <TestResult/> 這種節點(diǎn)的話(huà),那么用hasChildNodes則返回False
遍歷xml的代碼:
Option Explicit
Dim xmlDoc,myErr,strXML
Set xmlDoc = CreateObject("Microsoft.XMLDOM")
xmlDoc.async = False
xmlDoc.load "c:calc1.xml"
If xmlDoc.parseError.errorCode <> 0 Then
Set myErr = xmlDoc.parseError
MsgBox("XML Loads Failed. " & myErr.reason)
Else
Set rootNode = xmlDoc.documentElement
Call rTravel(rootNode)
MsgBox strXML
End If
Sub rTravel (rNode)
Dim blnTwo,intTestCase,
blnTwo = False
iLen = rNode.childNodes.length
If iLen > 0 Then
For i = 0 To rNode.childNodes.length -1
Set child = rNode.childNodes.item(i)
Call rTravel(child)
childtext = child.nodeValue
strXML = strXML & childtext & chr(13)
Next
Else
Exit Sub
End If
End Sub
方法二:
Option Explicit
Dim xmlDoc,myErr,strXML
Set xmlDoc = CreateObject("Microsoft.XMLDOM")
xmlDoc.async = False
xmlDoc.load "c:calc1.xml"
If xmlDoc.parseError.errorCode <> 0 Then
Set myErr = xmlDoc.parseError
MsgBox("XML Loads Failed. " & myErr.reason)
Else
Set rootNode = xmlDoc.documentElement
Call rTravel(rootNode)
MsgBox strXML
End If
Sub rTravel (rNode)
Dim blnTwo,intTestCase,
blnTwo = False
iLen = rNode.childNodes.length
If iLen > 0 Then
For i = 0 To rNode.childNodes.length -1
Set child = rNode.childNodes.item(i)
Call rTravel(child)
childtext = child.nodeValue
strXML = strXML & childtext & chr(13)
Next
Else
Exit Sub
End If
End Sub
以下是我今天試用QTP插件時(shí)的一些過(guò)程,大家可以看一下
今天我試了一下QTP的.NET插件,QTP的.NET插件對于解決.NET控件識別和測試問(wèn)題非常重要,是測試.NET平臺程序必不可少的條件(包括測試.NET Windows Forms、.NET Web Forms、WPF控件)。.NET第三方控件或自定義的個(gè)性化控件的識別和測試問(wèn)題可通過(guò)QTP的.NET插件提供的擴展模塊來(lái)解決。
QTP的.NET插件主要提供了兩種方式的擴展來(lái)支持個(gè)性化控件的測試:
(1).NET DLL:使用其為VS.NET提供的Custom Server模板來(lái)創(chuàng )建用C#寫(xiě)的DLL來(lái)支持個(gè)性化控件的測試。
(2)XML:使用XML文件來(lái)描述擴展。
第一種方法的好處是可以充分利用開(kāi)發(fā)工具的優(yōu)勢,第二種方法則相對更便捷,可隨時(shí)進(jìn)行擴展,但是今天試用的結果是可實(shí)現錄制方面的擴展,在回放方面的擴展不能實(shí)現,不知道是不是還有什么訣竅沒(méi)掌握,QTP提供的幫助文檔在這方面也比較有限。
在SwfConfig.xml文件中的擴展描述如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<Controls>
<Control Type="MyWindowsControlLibrary1.UserControl1">
<Settings>
<Parameter Name="ConfigPath">D:\Program Files\Mercury Interactive\QuickTest Professional\dat\ControlDefineXMLSample.XML
</Parameter>
</Settings>
<CustomRecord>
<Component>
<Context>AUT-XML</Context>
</Component>
</CustomRecord>
<CustomReplay>
<Component>
<Context>AUT-XML</Context>
</Component>
</CustomReplay>
</Control>
</Controls>
ControlDefineXMLSample.XML的定義如下:
<?xml version="1.0" encoding="UTF-8"?>
<Customization>
<Record>
<Events>
<Event name="MouseDown" enabled="true">
<RecordedCommand name="MouseMove">
<Parameter>
EventArgs.X
</Parameter>
<Parameter lang="C#">
Parameter = EventArgs.Y;
</Parameter>
</RecordedCommand>
</Event>
</Events>
</Record>
<Replay>
<Methods>
<Method name="SetValue">
<Parameters>
<Parameter type="int" name="X"/>
<Parameter type="int" name="Y"/>
</Parameters>
<MethodBody>
System.Windows.Forms.MessageBox.Show("Mouse Position at Record Time");
</MethodBody>
</Method>
</Methods>
</Replay>
</Customization>
基本上是按QTP的幫助文檔描述,以及它提供的一個(gè)小例子來(lái)寫(xiě)的。如果完全按其在NETExtensibility.chm文件中的“Example of a Control Definition XML File”這一節的例子來(lái)寫(xiě)則完全不能進(jìn)行錄制方面的擴展,它的例子如下:
文章來(lái)源于領(lǐng)測軟件測試網(wǎng) http://kjueaiud.com/