有些軟體的介面採用Win32視窗嵌套一個IE控制項,用Spy++只能識別出一個Internet Explorer_Server控制項。常用的幾個API函數無法取到IE控制項裡面的內容,更無法對裡面的控制項進行操作,所以這給自動化帶來了麻煩。本文將講述如何使用Python擷取IHTMLDocument2介面,用於自動化測試。
擷取IHTMLDocument2介面
參考:http://support.microsoft.com/kb/249232
相應的Python實現代碼如下:#!/usr/bin/env python
#coding:utf-8
__author__ = 'CoderZh'
import sys
# Important for multithreading
sys.coinit_flags = 0 # pythoncom.COINIT_MULTITHREADED
import win32com
import win32com.client
import win32gui
import win32con
import pythoncom
def getIEServer(hwnd, ieServer):
if win32gui.GetClassName(hwnd) == 'Internet Explorer_Server':
ieServer.append(hwnd)
if __name__ == '__main__':
#pythoncom.CoInitializeEx(0) # not use this for multithreading
mainHwnd = win32gui.FindWindow('windowclass', 'windowtitle')
if mainHwnd:
ieServers = []
win32gui.EnumChildWindows(mainHwnd, getIEServer, ieServers)
if len(ieServers) > 0:
ieServer = ieServers[0]
msg = win32gui.RegisterWindowMessage('WM_HTML_GETOBJECT')
ret, result = win32gui.SendMessageTimeout(ieServer, msg, 0, 0, win32con.SMTO_ABORTIFHUNG, 1000)
ob = pythoncom.ObjectFromLresult(result, pythoncom.IID_IDispatch, 0)
doc = win32com.client.dynamic.Dispatch(ob)
print doc.url
doc.all['id'].click()
#pythoncom.CoUninitialize()多線程操作
IHTMLDocument2是安全執行緒的,預設情況下不能在多線程中使用,否則會拋異常。但是在具體使用過程中,又必須使用多線程。解決辦法就是上面的代碼中的:# Important for multithreading
sys.coinit_flags = 0 # pythoncom.COINIT_MULTITHREADED
這句必須在開頭的時候設定,同時,不要再顯示調用pythoncom.CoInitializeEx(0)和 pythoncom.CoUninitialize()。
參考:http://bytes.com/topic/python/answers/26897-multithreaded-com-server-problem
IHTMLDocument2 介面
IHTMLDocument2介面有哪些方法,可以查詢http://msdn.microsoft.com/en-us/library/aa752574%28VS.85%29.aspx
基本能夠滿足自動化測試的需要,可以在此基礎上封裝出更易使用的自動化UI測試架構。
作者:CoderZh(CoderZh的技術部落格 - 部落格園)
微博:http://t.sina.com.cn/coderzh
出處:http://coderzh.cnblogs.com
文章著作權歸本人所有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文串連,否則保留追究法律責任的權利。
有些軟體的介面採用Win32視窗嵌套一個IE控制項,用Spy++只能識別出一個Internet Explorer_Server控制項。常用的幾個API函數無法取到IE控制項裡面的內容,更無法對裡面的控制項進行操作,所以這給自動化帶來了麻煩。本文將講述如何使用Python擷取IHTMLDocument2介面,用於自動化測試。
擷取IHTMLDocument2介面
參考:http://support.microsoft.com/kb/249232
相應的Python實現代碼如下:#!/usr/bin/env python
#coding:utf-8
__author__ = 'CoderZh'
import sys
# Important for multithreading
sys.coinit_flags = 0 # pythoncom.COINIT_MULTITHREADED
import win32com
import win32com.client
import win32gui
import win32con
import pythoncom
def getIEServer(hwnd, ieServer):
if win32gui.GetClassName(hwnd) == 'Internet Explorer_Server':
ieServer.append(hwnd)
if __name__ == '__main__':
#pythoncom.CoInitializeEx(0) # not use this for multithreading
mainHwnd = win32gui.FindWindow('windowclass', 'windowtitle')
if mainHwnd:
ieServers = []
win32gui.EnumChildWindows(mainHwnd, getIEServer, ieServers)
if len(ieServers) > 0:
ieServer = ieServers[0]
msg = win32gui.RegisterWindowMessage('WM_HTML_GETOBJECT')
ret, result = win32gui.SendMessageTimeout(ieServer, msg, 0, 0, win32con.SMTO_ABORTIFHUNG, 1000)
ob = pythoncom.ObjectFromLresult(result, pythoncom.IID_IDispatch, 0)
doc = win32com.client.dynamic.Dispatch(ob)
print doc.url
doc.all['id'].click()
#pythoncom.CoUninitialize()多線程操作
IHTMLDocument2是安全執行緒的,預設情況下不能在多線程中使用,否則會拋異常。但是在具體使用過程中,又必須使用多線程。解決辦法就是上面的代碼中的:# Important for multithreading
sys.coinit_flags = 0 # pythoncom.COINIT_MULTITHREADED
這句必須在開頭的時候設定,同時,不要再顯示調用pythoncom.CoInitializeEx(0)和 pythoncom.CoUninitialize()。
參考:http://bytes.com/topic/python/answers/26897-multithreaded-com-server-problem
IHTMLDocument2 介面
IHTMLDocument2介面有哪些方法,可以查詢http://msdn.microsoft.com/en-us/library/aa752574%28VS.85%29.aspx
基本能夠滿足自動化測試的需要,可以在此基礎上封裝出更易使用的自動化UI測試架構。