QTP使用技巧

 

QTP使用技巧
1.runaction 後面能不能接變量(動態調用action,所以從數據庫取數據做action名字了,但是調用總是找不到)? 
   A:腳本中原有RunAction "testbase [case1]", oneIteration
把引號中的內容放到Global表中的第22行,然後將代碼修改爲:
datatable.getsheet("Global")
datatable.setcurrentrow(22)

strLogin=DataTable("ActionName","Global")
RunAction strLogin, oneIteration

help中也有相關幫助
如:
Syntax
RunAction ActionName, [IterationMode , IterationRange , Parameters]
ActionName : String : The name of the action


2.QTP8.2 中調用VB函數的問題(用VBscrīpt寫了一些測試腳本需要的幾個通用函數,有沒有辦法可以用類似include的方式進行調用,而不需要每次都把這些函數Copy到新的腳本中)?
   A:程序開頭加上ExecuteFile "..\..\..\project\DeVariable.vbs"


3.QTP 如何做迴歸測試(300多個TestCase,TD是否可以管理) ?
   A:TD可以實現,可以生成測試集,一個測試集可以包含若干個測試腳本
QTP8.2本身提供一個工具Test Batch Runner但是運行完沒有報告。
MI有另一個工具叫MTM(multitestmanager)


4.qtp 自動節圖功能

A: 具體可參考此帖:http://www.51testing.com/cgi-bin ... d=17663&fpage=1


5.在QTP中如何設置使用別的瀏覽器(XP系統,用IE訪問程序時,每次總提示屏蔽安裝ActiveX插件,需要手動安裝.但把這個過程錄製到QTP後,回放一次是成功的。當我給某個輸入框參數化了好多數據後,回放過程中,某些就會失敗.
可能有兩個方面可以解決這問題1、每個動作設置延遲時間 2、設置爲用別的瀏覽器。)
(失敗的提示信息是   object not visible)
   A:1.延遲可用WAIT X(X單位是秒)
2.可以安裝插件添加新的瀏覽器
   SystemUtil.Run "file” "params" "dir" "op'' "mode"
   QTP運行可執行文件的方法及其參數
    ps: 建議是用IE瀏覽器,或者IE內核瀏覽器做測試


6.checkpoint 檢查網頁,是否能實現只要網頁出現亂碼就返回錯誤報告?
   A:Text not displayed能解決問題
關於 Text Checkpoint 的總結。
1)Text Checkpoint 的檢查部分分爲三個部分。Checked Text 、Text Before 、Text After。在默認的情況下,Checked Text執行的是精確檢查,其餘兩個部分執行的是模糊檢查。Text Before(After)檢查的內容可以比實際的內容少。但是不能有和是實際內容不相符的地方,否則就失敗。
2) Exact match選項。如果選擇了這個選項,三部分完全都進行精確檢查。個人覺得和只檢查checked Text部分沒有區別。
3) Text not displayed。這個選項本質上就是一個結果取反的過程。就是把檢查的結果給反過來,把pass變成Fail,Fail變成pass。我覺得這樣就很容易理解。


7.WSH 的應用方法
   A:WSH 實際上是一個腳本語言的運行環境,它之所以具備強大的功能,是在於其充分挖掘了腳本語言的潛力。因此,如果拋開腳本語言而空談 WSH ,那實際上就沒有了意義。而如果再展開來講述腳本語言,顯然就離開了今天的主題。

在這種情況下,只好採取一種折衷的方法:給大家推薦幾個腳本文件利用 WSH 執行任務的實例,希望大家能通過這些例子對 WSH 的使用有一個初步的認識。

  腳本文件的編寫十分方便,你可以選用任意一個文字編輯軟件進行編寫,編寫完成後,只需將它保存爲 WSH 所支持的文件名就可以了(如.js 文件和.vbs 文件)。最常用的就是記事本編輯器,下面的實例都是以它作爲工具編寫的。

打開記事本編輯器,在上面編寫如下內容:
  Wscrīpt.Echo("走近 WSH")
  將它保存爲以 .vbs 或 .js 爲後綴名(千萬不要寫成了 .txt)的文件並退出記事本。雙擊執行這個文件。
  這一次,我們要利用 WSH 完成一次創建十個文件夾的工作。代碼如下:
  dim objdir
  set ōbjdir=wscrīpt.createobject("scrīpting.filesystemobject")
  for k=1 to 10
  anewfolder="c:\chapter" & k
  objdir.createfolder(anewfolder)
  next

同樣,將它存爲 .vbs 文件並退出。運行後,我們會發現,C 盤根目錄下一次性多出了十個新文件夾。

最後,再舉一個在服務器上的運用。下面的代碼將幫助你重新啓動指定的 IIS 服務:  ' define a constant for stopped services
  Const ADS_SERVICE_STOPPED = 1

' get an ADSI object for a computer
  Set ōbjComputer = GetObject("WinNT://MYCOMPUTER,computer")

' get an object for a service
  Set ōbjService = objComputer.GetObject("Service","MYSERVICE")

' check to see if the service is stopped
  If (objService.Status = ADS_SERVICE_STOPPED) Then

' if the service is stopped, then start it
  objService.Start

  End If

將它以 startsvc.vbs 爲名保存在 C: 盤根目錄。並通過如下命令執行:Cscrīpt C:\STARTSVC.VBS。運行後,經你指定的 IIS 服務項將被重新開啓。

其實,在 Windows 的 samples 目錄下,有個 WSH 文件夾,那裏面有不少很具代表性的 .vbs 和. js 腳本文件。

此外,利用 WSH 還可以自己編寫腳本文件來提高網絡管理方面的效率。


8.從 EXCEL 中導出數據進行測試

datatable.AddSheet("51sheet")
datatable.ImportSheet "f:\test.xls","testsheet","51sheet"

Dim i,RowCount ' 定義兩個變量
i=0
RowCount=datatable.GetSheet("51sheet").GetRowCount ' 設置 RowCount 等於 51sheet 中的行數。
msgbox RowCount
Do while i<rowcount
i=i+1 ' 第一次進入循環,執行這句後, i=1
'datatable.getsheet("51sheet").setcurrentrow(i)   這句話被我註釋掉了,正確的寫法應該是下面這樣,分開寫。

datatable.getsheet("51sheet")
datatable.setcurrentrow(i)

' 執行過上面兩句後, CurrentRow 是第一行。

tempData=DataTable.GetSheet("51sheet").GetParameter("Name").Value
              
' 現在,我們調用 msgbox 看看下面這種調用方法得到的是什麼值?沒錯,是第一行的值,下一次循環呢?
' 得到的是第二行的值麼?
msgbox "GetParameter-Name:"&tempData ' 這裏彈出我們要看的值。
' 下面我們用另外一種方法來得到。
msgbox "GetParameter-i:"&DataTable.GetSheet("51sheet").GetParameter(1).Value ' 這裏我用 GetParameter(1) 去得到 sheet 中第一列的值。
loop


9.關於 dtGlobalsheet 與 dtLocalsheet

1) dtGlobalsheet 只有一個,它的 index 值比較特殊,它有兩個 index 值,一個是 1 還有一個是內置的默認的 1000 。
你可以用 1 或者 1000 去引用它都是正確的。當然了,如果你用 dtGlobalsheet 來引用它也是正確的。這個 sheet 的 Name 叫做 "Global" 。注意: SheetName 是區分大小寫的。
2) dtLocalsheet 可以用 index:1001 來引用,當然,也可以用 2 來引用。至於其它自定義的 sheet 嘛,你就只能用 index:3 來引用了。
它沒有內置的默認的類似前兩個那樣的 index 值。
3) datatable 這個對象只有一個。就是所有 sheet 的集合。或許你把它理解爲 excel 文件比較好。
dtsheet 呢?就是其中的每個 sheet 。所不同的就是 MI 爲他們做了一些默認值。在我們的應用中,可能會有多個 action, 如: actiion1,actiion2,actiion3
這些 action 也分別對應有各自默認的 LoaclSheet. 即: actiion1 , actiion2 , actiion3 。

如果每個 action 中,我們都只用到一個 sheet ,那就好辦了,在每個 action 中都可以用 localsheet 來引用,但是如果我們有兩個及兩個以上的 sheet. 那麼就比較容易亂套了。


10.移動當前位置的行

For i=1   to 3
datatable.getsheet("Global")
datatable.setcurrentrow(i)
DataTable("C","Global") = DataTable("nodename","Global") ‘把表Global中的nodename字段中的內容取出來。
Next
 

11.如何能記錄到頁面的校驗碼?(Output value能不能得到web頁面的校驗碼,一般的校驗碼是由圖片隨即生成的 ,用QTP怎麼錄腳本在登陸前得到校驗碼並輸入到校驗碼一欄)
A:1)一個很簡單的方法:測試時叫開發屏蔽掉檢驗碼的功能後,再錄製腳本。檢驗碼的功能可以手工很簡單測試出來。
    2)想得到圖片的校驗碼,唯一的方法就是跟程序員拿程序,然後自己在腳本里面寫FUCNTION!
      其它就要手動輸入了!


12.QTP 正則表達式的幫助
 


13. 自動測試實施計劃
1)分析實施自動化測試可能存在的風險:就是決定是否實施, 用成本 時間 效果 。。
2)制定實施的時機:也就是在什麼階段
3)研究所要測試的功能 性能
4)分析在測試中可能遇到的問題 和困難
5)預估所需要的人時和相應的硬件
7)確定負責人員和相關測試人員
6)制定詳細的測試計劃 方案
7)最後是執行計劃


14. 一個Action裏如何調用在另一個Action中定義的函數、過程(或變量、常量)
例如:
-----------------------------------
'Action_A
   Public strURL
       ...... ......
Function QueryList()
       ...... ......
       ...... ...... 
End Function
------------------------------------
'Action_B
'如何調用 QueryList函數和strURL
A:1)可以把這些變量和Function放在vbs文件作爲resource文件共享,在每個Action中添加該文件.      

如果function中出現控件調用,那麼必須確保該控件在相應的Action的object repository中是存在的.
  2)定義一個可被調用的ACTION裏面唯一的放一個FUNCTION


15.如何管理QTP的源代碼?(QTP生成的源代碼比較多,而且和環境控件都有關,假如需要多人同時開發, 請問如何管理源代碼?)
A: 一個是代碼你可以通過vss,cvs等來進行管理
   一個是通過td或者qc的基於用例的代碼管理   

其實第一種方法是基於版本控制來進行的,第二種方法是基於用例管理進行的
   角度不同,管理方法也不同,不過團隊協作需要的大家分工明確,進度控制。代碼管理可以借鑑開發的方法。


16: 腳本不能回放,IE中的AtiveX設置有問題??
A: TOOL---OPTIONS----Ative screen
   然後點開advanced..,把LOAD   ACTIVEX CONTROLS打勾
    TOOL---OPTIONS----Ative screen
   然後點開advanced..,run scrīpts-->disabled!


17 .如何參數化link

Browser("Browser").Page("Page").Sync
Browser("Browser").Navigate "http://www.51testing.com/cgi-bin/index.php"
Browser("Browser").Page("51Testing 軟件測試論壇---軟件測試,軟件質量工程師").Sync

Set tags=Browser("Browser").Page("51Testing軟件測試論壇---軟件測試,軟件質量工程師").Object.links
Dim i,j, arr()
i=0
For Each element in tags
If Ucase(element.tagname)="A" and left(element.InnerText,1)="[" Then
ReDim Preserve arr(i+1)
       arr(i)=element.InnerText
i=i+1
end if
Next

 

For j=0 to i
Browser("Browser").Page("51Testing軟件測試論壇---軟件測試,軟件質量工程師").Link("[ 版主討論區 ]").SetTOProperty "Text",arr(j)
         Browser("Browser").Page("51Testing軟件測試論壇---軟件測試,軟件質量工程師").Link("[ 版主討論區 ]").Click
Browser("Browser").Back
Next

這段代碼先是打開一個空的頁面,然後輸入url.
到達論壇首頁。

然後得到所有版面的名稱,也就是link的名稱。
存到數組裏面。
然後使用SetTOProperty更換錄製時候錄下的link的屬性。
這時候再click

 

18. QTP 在Debug狀態,在Export View 區域不能寫入任何東西

A: 如果你的目的是在debug過程中修改已執行過的命令,可以在Debug view的Command中執行命令,如重新執行已經執行過的命令,修改變量的值等等。

如:Window("Flight Reservation").WinEdit("Name:").Set "51testing"
已經執行,如果現在想修改“51testing”爲“testing”,可以在command中執行
Window("Flight Reservation").WinEdit("Name:").Set "testing"


19 . 動態變化值如何獲取

A:VAL=Browser("歡迎使用我的工作臺").Page("歡迎使用我的工作臺").Frame("managePlace_7").WebRadioGroup("userAccountId_0").GetROProperty("Value")
Browser("歡迎使用我的工作臺").Page("歡迎使用我的工作臺").Frame("managePlace_7").WebRadioGroup("userAccountId_0").select val


20 .如何一一獲得Table中 某欄 link 的 text?

A:通過上面link 的學習. 我終於融會貫通,完成了我的問題: 與大家共享:


//////////////////////////////////////////////////////////////////////////////////////
Browser("Login").Page("Page").Frame("contents").ViewLink("treeview").Image("Tplus").Click
Browser("Login").Page("Page").Frame("contents").ViewLink("treeview").Image("Tplus_2").Click
Browser("Login").Page("Page").Frame("contents").ViewLink("treeview").Link("開課設置").Click
Browser("Login").Page("Page").Frame("main").WebList("drpStatus").Select "任意"
Browser("Login").Page("Page").Frame("main").WebButton("查找").Click
Browser("Login").Page("Page").Sync

Dim finded,findCode,Nowout
'define a constrat for find
findCode = 110901
finded = false

Function MaxPage(pageString)
'msgbox pageString
Dim ilen,i,j
ilen = len(pageString)
i=ilen
While i>0
       j = mid(pageString,i,1)
   'msgbox j
   If instr("123456789",j)>0 Then
          MaxPage = j
   'msgbox MaxPage
   Exit function
   End If
   i=i-1
Wend
End Function

 
Dim trowcount,maxp
trowcount = Browser("Login").Page("Page").Frame("main_8").WebTable("開課代碼").RowCount
msgbox "Rowcount: "&trowcount
Nowout = Browser("Login").Page("Page").Frame("main_8").WebTable("開課代碼").GetCellData(trowcount,1)
Nowout = trim(Nowout)
maxp = MaxPage(Nowout)
msgbox "max page: "& maxp

Dim nowPage,checkid
For nowPage = 1 to maxp
If   finded Then
   Exit for
End If
   ' link to the 當前所需page
   If nowpage>1 Then
Browser("Login").Page("Page").Frame("main_8").Link("[2]").SetTOProperty "Text","["&nowpage&"]"
Browser("Login").Page("Page").Frame("main_8").Link("[2]").Click
Browser("Login").Page("Page").Sync
end if

   ' Get the rowcount of table in now page
trowcount = Browser("Login").Page("Page").Frame("main_8").WebTable("開課代碼").RowCount
msgbox "Rowcount: "&trowcount

   'link every record in the table of the page
for i = 2 to trowcount   - 2
Nowout = Browser("Login").Page("Page").Frame("main_8").WebTable("開課代碼").GetCellData(i,2)
'msgbox i&": "&Nowout

checkid = "dgCourse:_ctl" &(i+1)& ":_ctl0"
Browser("Login").Page("Page").Frame("main_8").WebCheckBox("dgCourse:_ctl3:_ctl0").SetTOProperty "name",checkid
Browser("Login").Page("Page").Frame("main_8").WebCheckBox("dgCourse:_ctl3:_ctl0").Set "ON"

Browser("Login").Page("Page").Frame("main_8").Link("0901").SetTOProperty "Text",Nowout
Browser("Login").Page("Page").Frame("main_8").Link("0901").Click
Browser("開課設置詳細信息").Page("開課設置詳細信息").Sync
'wait(1)
msgbox "begun"
msgbox findCode
msgbox Nowout
msgbox "finished"
If   trim(findCode) = trim(Nowout) Then
       finded = true
msgbox "find is ok!"
wait(2)
Exit for
End If
Browser("開課設置詳細信息").Close
Browser("Login").Page("Page").Sync
   next

Next


21 .網頁下拉框的選擇

A:For i =1 to 10
Randomize
IndexNum=Int((10 - 5 + 1) * Rnd + 5)
Browser("Mercury Tours").Page("Find Flights_2").WebList("arrive").Select "#"&IndexNum
wait(3)
Next


Sub ChildObjects_Example()
'The following example uses the ChildObjects method to find all the
'list objects on a Web page, and then to select an item in each list.

Set ōDesc = Descrīption.Create()
oDesc("micclass").Value = "WebList"
Set Lists = Browser("Mercury Interactive").Page("Mercury Interactive").ChildObjects(oDesc)
NumberOfLists = Lists.Count()
For i = 0 To NumberOfLists - 1
Lists(i).Select i + 1
Next


End Sub


22 .將測試數據單獨拿出來

A: 取得一個
Browser("Browser").Page("").WebList("fid").GetItem (1)
取得全部
Browser("Browser").Page("").WebList("fid").GetROProperty("all items")


以下可以在自帶的例子中實現
Window("Flight Reservation").WinComboBox("Fly From:").Select "Frankfurt"
a=window("Flight Reservation").wincombobox("Fly From:").GetItem(1)
reporter.ReportEvent 2,"下拉列表的值",a


23 .和TD連接

A:在QTP中不是有個Quality Center Connection,選擇服務器連接,服務器處輸入類似http://computer_name/tdbin,其中computer_name爲服務器的名字,連接後在測試結果中添加defect就可以與TD相連了。

24 處理Windows彈出窗口

A:IF Not Window("Flight Reservation").Exist(1) Then
'Calling   open flight
            If not Dialog("Login").Exist(1)   Then
       Browser("管理系統").Dialog("Microsoft Internet Explorer").WinButton("確定").Click

    End If


25 .查詢結果的比較

這是查詢一個字段的,對查詢結果多頁的情況也涉及了,其實應該把所有查詢字段聯合起來的,也就是改改sql語句和判斷條件。

[i]Set Conn = CreateObject("ADODB.Connection")
Set Rs = CreateObject("ADODB.Recordset")
Conn.Open "Descrīption=kml-it;DRIVER=SQL Server;SERVER=KML-IT;UID=sa;PWD=password;APP=QuickTest Professional;WSID=KML-MICHELLE;DATABASE=kml_db"
sql="select distinct grn_no from grn_dtl where grn_no like '%"&grnNo&"%' order by grn_no DESC"
Rs.open sql,Conn,1,3
Dim i,j,cell
i=1
j=2 'j=2 的原因是因爲頁面上table是的數據是隔一行一條,不知 道怎麼回事,開發人員弄的怪把
Do while not rs.eof
If i=13 Then   '13是每頁顯示出的最大行數,是個常數
i=1
j=2
    Browser("::").Page("::").Frame("mainFrm_5").Link("下一頁").Click
end if
cell=Browser("::").Page("::").Frame("mainFrm_5").WebTable("收貨單號").GetCellData(j,2)
If cell<>rs("grn_no") Then
            Reporter.ReportEvent 1, "查詢功能"&cell, "查詢結果錯誤."
Exit do
else
Reporter.ReportEvent 0, "查詢功能"&cell, "查詢結果正確."
End If
rs.movenext
j=j+2
i=i+1
Loop
rs.close
conn.close
set conn=nothing[/i]
 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章