QTP問與答(轉)

wzdoxu88發表於2008-06-30

1.Q: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函式的問題(用VBScript寫了一些測試指令碼需要的幾個通用函式,有沒有辦法可以用類似include

的方式進行呼叫,而不需要每次都把這些函式Copy到新的指令碼中)?
A:程式開頭加上ExecuteFile "......projectDeVariable.vbs"

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

5.Q: 在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.Q: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.Q:WSH 的應用方法
A:WSH 實際上是一個指令碼語言的執行環境,它之所以具備強大的功能,是在於其充分挖掘了指令碼語言的潛力。

因此,如果拋開指令碼語言而空談 WSH ,那實際上就沒有了意義。而如果再展開來講述指令碼語言,顯然就離開了

今天的主題。

在這種情況下,只好採取一種折衷的方法:給大家推薦幾個指令碼檔案利用 WSH 執行任務的例項,希望大家能通

過這些例子對 WSH 的使用有一個初步的認識。

  指令碼檔案的編寫十分方便,你可以選用任意一個文字編輯軟體進行編寫,編寫完成後,只需將它儲存為

WSH 所支援的檔名就可以了(如.js 檔案和.vbs 檔案)。最常用的就是記事本編輯器,下面的例項都是以它作

為工具編寫的。

開啟記事本編輯器,在上面編寫如下內容:
  WScript.Echo("走近 WSH")
  將它儲存為以 .vbs 或 .js 為字尾名(千萬不要寫成了 .txt)的檔案並退出記事本。雙擊執行這個檔案。
  這一次,我們要利用 WSH 完成一次建立十個資料夾的工作。程式碼如下:
  dim objdir
  set objdir=wscript.createobject("scripting.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 objComputer = GetObject("WinNT://MYCOMPUTER,computer")

' get an object for a service
  Set objService = 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: 盤根目錄。並透過如下命令執行:CSCRIPT C:STARTSVC.VBS。執行後,經

你指定的 IIS 服務項將被重新開啟。

其實,在 Windows 的 samples 目錄下,有個 WSH 資料夾,那裡面有不少很具代表性的 .vbs 和. js 指令碼檔案。

此外,利用 WSH 還可以自己編寫指令碼檔案來提高網路管理方面的效率。


8.Q; 從 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 ii=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.Q: 關於 dtGlobalsheet 與 dtGlobalsheet

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.Q: 移動當前位置的行

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

11.Q: 如何能記錄到頁面的校驗碼?(Output value能不能得到web頁面的校驗碼,一般的校驗碼是由圖片隨即生成

的 ,用QTP怎麼錄指令碼在登陸前得到校驗碼並輸入到校驗碼一欄)
A:1)一個很簡單的方法:測試時叫開發遮蔽掉檢驗碼的功能後,再錄製指令碼。檢驗碼的功能可以手工很簡單測

試出來。
2)想得到圖片的校驗碼,唯一的方法就是跟程式設計師拿程式,然後自己在指令碼里面寫FUCNTION!
其它就要手動輸入了!

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

14.Q: 一個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.Q: 如何管理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 scripts--&gtdisabled!

17 .Q: 如何引數化link

Browser("Browser").Page("age").Sync
Browser("Browser").Navigate ""
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 .Q: 動態變化值如何獲取

A:VAL=Browser("歡迎使用我的工作臺").Page("歡迎使用我的工作臺").Frame

("managePlace_7").WebRadioGroup("userAccountId_0").GetROProperty("Value")
Browser("歡迎使用我的工作臺").Page("歡迎使用我的工作臺").Frame("managePlace_7").WebRadioGroup

("userAccountId_0").select val


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

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


//////////////////////////////////////////////////////////////////////////////////////
Browser("Login").Page("age").Frame("contents").ViewLink("treeview").Image("Tplus").Click
Browser("Login").Page("age").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 .Q:網頁下拉框的選擇

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 oDesc = Description.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 .Q: 將測試資料單獨拿出來

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 .Q:和TD連線

A:在QTP中不是有個Quality Center Connection,選擇伺服器連線,伺服器處輸入類似,其

中computer_name為伺服器的名字,連線後在測試結果中新增defect就可以與TD相連了。

24 :Q:處理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 .Q:查詢結果的比較

這是查詢一個欄位的,對查詢結果多頁的情況也涉及了,其實應該把所有查詢欄位聯合起來的,也就是改改sql語

句和判斷條件。

Set Conn = CreateObject("ADODB.Connection")
Set Rs = CreateObject("ADODB.Recordset")
Conn.Open "Description=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

http://blog.csdn.net/blue_scorpi/archive/2008/06/01/2390733.aspx

[@more@]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/9294812/viewspace-1006321/,如需轉載,請註明出處,否則將追究法律責任。

相關文章