qileilove

          blog已經轉移至github,大家請訪問 http://qaseven.github.io/

          QTP自動化測試權威指南 連載(五)

            微軟Windows應用編程接口(API)為開發Windows應用程序提供了很多構建好的模塊。它提供各種操作方法,比如獲取鼠標坐標,窗口句柄,顏色等。QTP支持調用動態鏈接庫內定義的這些方法,但是由于VBScript的限制,只有有限的一部分API可以在QTP中使用。

            本章使用的API的更多細節和信息可以從MSDN或者Visual Studio的API Viewer工具查詢獲得。

            Extern對象

            QTP提供一個Extern功能對象用來聲明和調用API。

            語法

          Extern.Declare (RetType, MethodName, LibName, Alias [, ArgType(s)])

            更多細節可參考QTP用戶手冊。

            VB API定義語法

          Private Declare Function GetForegroundWindow Lib "user32.dll" () As Long

            對以上API,我們需要使用QTP的Declare方法確定使用的合適參數:

            RetType = micLong(函數返回類型)

            MethodName = "GetForegroudWindow" (我們可以使用任何其他名字,但是比較好的做法是使用實際API的名字)

            LibName = "user32.dll" (如果不是使用Windows系統自帶的DLL,那么文件名必須使用絕對路徑,例如"C:\MyApp\Lib\mylib.dll")

            Alias = "" 或者"GetForegroudWindow"(如果MethodName跟Alias相同,則Alias可以為空值。

            ArgType(s) =  本例中不需要傳入參數)。

            QTP API定義

          Extern.Declare micLong,"GetForegroundWindow","user32.dll","GetForegroundWindow"

            以下用一些用例來演示使用API解決通常遇到的問題。

            問題 17-1.如何判斷當前桌面最上面的為瀏覽器窗口

          '聲明GetForeGroundWindow API
          extern.Declare micLong,"GetForegroundWindow","user32.dll","GetForegroundWindow"

          '獲取最前面窗口的句柄
          hwnd = extern.GetForegroundWindow()

          '判斷是否有包含此句柄的瀏覽器窗口
          isBrowser = Browser("hwnd:=" &hwnd).Exist()
           
          If isBrowser then
          Msgbox "The top most window is a browser"
          End if

            問題 17-2.如何獲得Windows的環境變量 (注意不是QTP環境變量)

          '變量聲明
          Dim s_EnvValue

          '聲明 API "GetEnvironmentVariable"
          Extern.Declare micLong,"GetEnvironmentVariable","kernel32.dll","GetEnvironmentVariableA", _
          micString,micString+micByRef,micLong

          '獲取全局變量 "TEMP" 值
          Extern.GetEnvironmentVariable "TEMP",s_EnvValue,255 '會得到臨時目錄路徑
          MsgBoxs_EnvValue

            問題 17-3.如何使用Windwos API選中Listbox里的選項(item)

          ' 聲明API
          Extern.Declare micLong,"SendMessage","user32.dll","SendMessageA",micLong,micLong,micLong,micLong

          ' 設置Listbox選項item的消息
          Const LB_SETSEL = &H185

          '方法:根據index選中復選框
          Function CheckListBox(hwnd, index)
          extern.SendMessagehwnd, LB_SETSEL, True, index
          end function

          '方法:根據index取消選中復選框
          Function UnCheckListBox(hwnd, index)
          extern.SendMessagehwnd, LB_SETSEL, False, index
          end function

           問題 17-4.如何取到一個文本框的背景色 (當驗證必填項跟可選項底色不同時可用到)

          '聲明需要的 API
          Extern.Declare micLong,"GetPixel","gdi32","GetPixel",micLong,micLong,micLong
          Extern.Declare micLong,"GetWindowDC","user32","GetWindowDC",micLong
          Extern.Declare micLong,"ReleaseDC","user32","ReleaseDC",micLong,micLong
          Extern.Declare micLong,"GetDC","user32","GetDC",micLong
          Extern.Declare micLong,"SetForegroundWindow","user32","SetForegroundWindow",micLong

          Dim hDCSource
          Dim hWndSource
          Dim backColor
          '取得控件的句柄
          hWndSource = Window("Window").WinEdit("MandatoryField1").GetROProperty("hwnd")

          '將窗口置于最上面,因為GetPixel方法只能針對可見像素使用
          extern.SetForegroundWindowhWndSource

          '取得設備上下文句柄
          hDCSource = Clng(Extern.GetDC(hWndSource))

          '取得相關控件的像素(1,1)點的背景色
          backColor = Clng(Extern.GetPixel(hDCSource, Clng(1),Clng(1)))
          MsgBoxbackColor

          '釋放設備上下文句柄
          Extern.ReleaseDChWndSource, hDCSource

            問題 17-5.如何使用Windows API模擬鍵盤操作

          '聲明API:鍵盤事件keybd_event
          extern.Declare micVoid,"keybd_event","user32" ,"keybd_event", _
          micbyte,micbyte,miclong,miclon
          '聲明API:虛擬按鍵碼映射MapVirtualKey
          extern.Declare micLong,"MapVirtualKey","user32","MapVirtualKeyA", _
          micLong, micLong

          Const KEYEVENTF_EXTENDEDKEY = &H1
          Const KEYEVENTF_KEYUP = &H2
          Const KEYEVENTF_KEYDOWN = &H0

          Sub KeyDown(KeyAscii)
          keyCode = extern.MapVirtualKey(KeyAscii, 0)
            '觸發按鍵按下事件
          extern.keybd_eventKeyAscii, keyCode, KEYEVENTF_KEYDOWN, 0
          End Sub

          Sub KeyUp(KeyAscii)
          keyCode = extern.MapVirtualKey(KeyAscii, 0)
           '觸發按鍵抬起事件
          extern.keybd_eventKeyAscii, keyCode, KEYEVENTF_KEYUP, 0
          End Sub

          Sub KeyPress(KeyAscii)
          KeyDownKeyAscii
          KeyUpKeyAscii
          End Sub

            對“計算器”使用以上代碼

          '聲明鍵值常量
          Const vbKey1 = 49
          Const vbKey2 = 50
          ConstvbKeyAdd = 107
          ConstvbKeyReturn = 13

          SystemUtil.Run"calc.exe"
          Window("title:=Calculator").Activate
          Call KeyPress(vbKey1)
          Call KeyPress(vbKeyAdd)
          Call KeyPress(vbKey2)
          Call KeyPress(vbKeyReturn)

            使用以上代碼模擬CTRL+ALT+S

          '聲明鍵值常量
          ConstvbKeyControl = 17
          ConstvbKeyAlt = 18
          ConstvbKeyS = 83

          Call KeyDown(vbKeyControl)
          Call KeyDown(vbKeyAlt)
          Call KeyDown(vbKeyS)
          Call KeyUp(vbKeyS)
          Call KeyUp(vbKeyAlt)
          Call KeyUp(vbKeyControl)

           問題 17-4.如何取到一個文本框的背景色 (當驗證必填項跟可選項底色不同時可用到)

          '聲明需要的 API
          Extern.Declare micLong,"GetPixel","gdi32","GetPixel",micLong,micLong,micLong
          Extern.Declare micLong,"GetWindowDC","user32","GetWindowDC",micLong
          Extern.Declare micLong,"ReleaseDC","user32","ReleaseDC",micLong,micLong
          Extern.Declare micLong,"GetDC","user32","GetDC",micLong
          Extern.Declare micLong,"SetForegroundWindow","user32","SetForegroundWindow",micLong

          Dim hDCSource
          Dim hWndSource
          Dim backColor
          '取得控件的句柄
          hWndSource = Window("Window").WinEdit("MandatoryField1").GetROProperty("hwnd")

          '將窗口置于最上面,因為GetPixel方法只能針對可見像素使用
          extern.SetForegroundWindowhWndSource

          '取得設備上下文句柄
          hDCSource = Clng(Extern.GetDC(hWndSource))

          '取得相關控件的像素(1,1)點的背景色
          backColor = Clng(Extern.GetPixel(hDCSource, Clng(1),Clng(1)))
          MsgBoxbackColor

          '釋放設備上下文句柄
          Extern.ReleaseDChWndSource, hDCSource

            問題 17-5.如何使用Windows API模擬鍵盤操作

          '聲明API:鍵盤事件keybd_event
          extern.Declare micVoid,"keybd_event","user32" ,"keybd_event", _
          micbyte,micbyte,miclong,miclon
          '聲明API:虛擬按鍵碼映射MapVirtualKey
          extern.Declare micLong,"MapVirtualKey","user32","MapVirtualKeyA", _
          micLong, micLong

          Const KEYEVENTF_EXTENDEDKEY = &H1
          Const KEYEVENTF_KEYUP = &H2
          Const KEYEVENTF_KEYDOWN = &H0

          Sub KeyDown(KeyAscii)
          keyCode = extern.MapVirtualKey(KeyAscii, 0)
            '觸發按鍵按下事件
          extern.keybd_eventKeyAscii, keyCode, KEYEVENTF_KEYDOWN, 0
          End Sub

          Sub KeyUp(KeyAscii)
          keyCode = extern.MapVirtualKey(KeyAscii, 0)
           '觸發按鍵抬起事件
          extern.keybd_eventKeyAscii, keyCode, KEYEVENTF_KEYUP, 0
          End Sub

          Sub KeyPress(KeyAscii)
          KeyDownKeyAscii
          KeyUpKeyAscii
          End Sub

            對“計算器”使用以上代碼

          '聲明鍵值常量
          Const vbKey1 = 49
          Const vbKey2 = 50
          ConstvbKeyAdd = 107
          ConstvbKeyReturn = 13

          SystemUtil.Run"calc.exe"
          Window("title:=Calculator").Activate
          Call KeyPress(vbKey1)
          Call KeyPress(vbKeyAdd)
          Call KeyPress(vbKey2)
          Call KeyPress(vbKeyReturn)

            使用以上代碼模擬CTRL+ALT+S

          '聲明鍵值常量
          ConstvbKeyControl = 17
          ConstvbKeyAlt = 18
          ConstvbKeyS = 83

          Call KeyDown(vbKeyControl)
          Call KeyDown(vbKeyAlt)
          Call KeyDown(vbKeyS)
          Call KeyUp(vbKeyS)
          Call KeyUp(vbKeyAlt)
          Call KeyUp(vbKeyControl)

          posted on 2013-06-20 10:57 順其自然EVO 閱讀(699) 評論(0)  編輯  收藏 所屬分類: qtp

          <2013年6月>
          2627282930311
          2345678
          9101112131415
          16171819202122
          23242526272829
          30123456

          導航

          統計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 贺州市| 游戏| 汨罗市| 鄂托克前旗| 徐汇区| 阿尔山市| 本溪| 西峡县| 收藏| 榆社县| 通海县| 山丹县| 苏尼特左旗| 宜川县| 眉山市| 贵阳市| 监利县| 合江县| 崇阳县| 郧西县| 婺源县| 杭锦后旗| 容城县| 祁阳县| 通河县| 萨嘎县| 蓬莱市| 高雄市| 景德镇市| 渭南市| 香河县| 互助| 鄱阳县| 西贡区| 古田县| 沙洋县| 白银市| 集安市| 南靖县| 淄博市| 信宜市|