Get IHTMLDocument2 for UI Automation in Python

Some software embed ie control in win32 window as the User Interface, such as Internet Explorer_Server. We can hardly identify the html control inner Internet Explorer_Server through Spy++. So it takes a great pain to ui automation. This post, I will introduce a way for Internet Explorer_Server automation.

Get IHTMLDocument2 interface

Also see:

Here is my python implentment:

#!/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(windowclasswindowtitle)     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()


IHTMLDocument2 is thread safe, we can not use it in any other thread except the main thread by default. If you want to use it in multi threads, write these code at the top of your file, and remenber do not explicit call pythoncom.CoInitializeEx(0) and pythoncom.CoUninitialize() :

# Important for multithreading sys.coinit_flags = 0 # pythoncom.COINIT_MULTITHREADED

Also see:


IHTMLDocument2 for UI Automation

Also see :

Now, you can write your own UI Automation framework by IHTMLDocument2.



微信关注:hacker-thinking (一个程序员的思考)