Hi, I have a win32com application need to get IE HTML DOM events. I searched web for a few days, and I have found 4 methods to approach that.
Sorry about this long text, because I want to give more hint. 1. method 1 #---------------------------------------------------------------------- # method 1 # Make an instant of DocEvents(subclass of HTMLDocumentEvents2) # It will take a long time(about tens of seconds) to generate / compile # 3050F1C5-98B5-11CF-BB82-00AA00BDCE0Bx0x4x0.py in directory gen_py # when execute code 'EnsureModule(...)' if this file did not exist. #---------------------------------------------------------------------- from win32com.client import gencache, Dispatch import time docmod = gencache.EnsureModule('{3050F1C5-98B5-11CF-BB82-00AA00BDCE0B}', 0, 4, 0) class DocEvents(docmod.HTMLDocumentEvents2): def __init__(self, doc): docmod.HTMLDocumentEvents2.__init__(self, doc) def Ononclick(self, event): print 'onclick' ev = gencache.EnsureDispatch(event) elem = ev.srcElement print 'tagName' , elem.tagName print 'id' , elem.id print 'innerText' , elem.innerText print 'clientX' , ev.clientX print 'clientY' , ev.clientY print 'body text' , doc.body.createTextRange().text ie = Dispatch("InternetExplorer.Application") ie.Navigate('http://www.google.com') ie.Visible = 1 while ie.Busy: time.sleep(0.1) doc = ie.Document d = DocEvents(doc) #---------------------------------------------------------------------- # end of method 1 #---------------------------------------------------------------------- #---------------------------------------------------------------------- # output of method 1 #---------------------------------------------------------------------- """ onclick tagName B id innerText Web clientX 172 clientY 182 body textpythoncom error: Python error invoking COM method. Traceback (most recent call last): File "C:\Python24\Lib\site-packages\win32com\server\policy.py", line 285, in _Invoke_ return self._invoke_(dispid, lcid, wFlags, args) File "C:\Python24\Lib\site-packages\win32com\server\policy.py", line 290, in _invoke_ return S_OK, -1, self._invokeex_(dispid, lcid, wFlags, args, None, None) File "C:\Python24\Lib\site-packages\win32com\server\policy.py", line 588, in _invokeex_ return func(*args) File "D:\project\python\Test\ie-event-method-1.py", line 29, in Ononclick print 'body text' , doc.body.createTextRange().text File "C:\Python24\Lib\site-packages\win32com\client\__init__.py", line 454, in __getattr__ raise AttributeError, "'%s' object has no attribute '%s'" % (repr(self), attr) exceptions.AttributeError: '<win32com.gen_py.Microsoft HTML Object Library.IHTMLElement instance at 0x37223760>' object has no attribute 'createTextRange' """ #---------------------------------------------------------------------- # end of output 1 #---------------------------------------------------------------------- 2. method 2 #---------------------------------------------------------------------- # method 2 # Dispatch ie.Document with DocEvents(subclass of HTMLDocumentEvents2) # It will take a long time(about tens of seconds) to generate / compile # 3050F1C5-98B5-11CF-BB82-00AA00BDCE0Bx0x4x0.py in directory gen_py # when execute code 'EnsureModule(...)' if this file did not exist. #---------------------------------------------------------------------- from win32com.client import gencache, Dispatch, DispatchWithEvents import time docmod = gencache.EnsureModule('{3050F1C5-98B5-11CF-BB82-00AA00BDCE0B}' ,0 ,4, 0) class DocEvents(docmod.HTMLDocumentEvents2): def Ononclick(self): print 'onclick' ev = doc.parentWindow.event elem = ev.srcElement print 'tagName' , elem.tagName print 'id' , elem.id print 'innerText' , elem.innerText print 'clientX' , ev.clientX print 'clientY' , ev.clientY print 'body text' , doc.body.createTextRange().text ie = Dispatch('InternetExplorer.Application') ie.Visible = 1 ie.Navigate('http://www.google.com') while ie.Busy: time.sleep(0.1) doc = ie.Document d = DispatchWithEvents(doc, DocEvents) #---------------------------------------------------------------------- # end of code 2 #---------------------------------------------------------------------- #---------------------------------------------------------------------- # output of method 2 #---------------------------------------------------------------------- """ onclick tagName B id innerText Web clientX 171 clientY 176 body textpythoncom error: Python error invoking COM method. Traceback (most recent call last): File "C:\Python24\Lib\site-packages\win32com\server\policy.py", line 285, in _Invoke_ return self._invoke_(dispid, lcid, wFlags, args) File "C:\Python24\Lib\site-packages\win32com\server\policy.py", line 290, in _invoke_ return S_OK, -1, self._invokeex_(dispid, lcid, wFlags, args, None, None) File "C:\Python24\Lib\site-packages\win32com\server\policy.py", line 588, in _invokeex_ return func(*args) File "D:\project\python\Test\ie-event-method-2.py", line 27, in Ononclick print 'body text' , doc.body.createTextRange().text File "C:\Python24\Lib\site-packages\win32com\client\__init__.py", line 454, in __getattr__ raise AttributeError, "'%s' object has no attribute '%s'" % (repr(self), attr) exceptions.AttributeError: '<win32com.gen_py.Microsoft HTML Object Library.IHTMLElement instance at 0x37223880>' object has no attribute 'createTextRange' """ #---------------------------------------------------------------------- # end of output 2 #---------------------------------------------------------------------- 3. method 3 #---------------------------------------------------------------------- # method 3 # Use WithEvents(not a subclass of HTMLDocumentEvents2) # This method will also take a long time to generate / compile # 3050F1C5-98B5-11CF-BB82-00AA00BDCE0Bx0x4x0.py in directory gen_py # when execute code 'WithEvents(...)' if this file did not exist. #---------------------------------------------------------------------- from win32com.client import Dispatch, WithEvents import time class DocEvents: def Ononclick(self): print 'onclick' ev = doc.parentWindow.event elem = ev.srcElement print 'tagName' , elem.tagName print 'id' , elem.id print 'innerText' , elem.innerText print 'clientX' , ev.clientX print 'clientY' , ev.clientY print 'body text' , doc.body.createTextRange().text ie = Dispatch("InternetExplorer.Application") ie.Visible = 1 ie.Navigate('http://www.google.com') while ie.Busy: time.sleep(0.1) doc = ie.Document d = WithEvents(doc, DocEvents) #---------------------------------------------------------------------- # end of code 3 #---------------------------------------------------------------------- #---------------------------------------------------------------------- # output of method 3 (when this code run first time, # ie, 3050F1C5-98B5-11CF-BB82-00AA00BDCE0Bx0x4x0.py *NOT* exist) #---------------------------------------------------------------------- """ onclick tagName B id innerText Web clientX 168 clientY 182 body text Personalized Home | Sign in Web Images VideoNew! News Maps more ?Books Froogle Groups even more ? Advanced Search Preferences Language Tools Advertising Programs - Business Solutions - About Google Make Google Your Homepage! ?2006 Google """ #---------------------------------------------------------------------- # end of output 3 # (3050F1C5-98B5-11CF-BB82-00AA00BDCE0Bx0x4x0.py *NOT* exist) #---------------------------------------------------------------------- #---------------------------------------------------------------------- # output of method 3 (when this code run another time, # ie, 3050F1C5-98B5-11CF-BB82-00AA00BDCE0Bx0x4x0.py *DO* exist) #---------------------------------------------------------------------- """ onclick tagName B id innerText Web clientX 172 clientY 182 body textpythoncom error: Python error invoking COM method. Traceback (most recent call last): File "C:\Python24\Lib\site-packages\win32com\server\policy.py", line 285, in _Invoke_ return self._invoke_(dispid, lcid, wFlags, args) File "C:\Python24\Lib\site-packages\win32com\server\policy.py", line 290, in _invoke_ return S_OK, -1, self._invokeex_(dispid, lcid, wFlags, args, None, None) File "C:\Python24\Lib\site-packages\win32com\server\policy.py", line 588, in _invokeex_ return func(*args) File "D:\project\python\Test\ie-event-method-3.py", line 24, in Ononclick print 'body text' , doc.body.createTextRange().text File "C:\Python24\Lib\site-packages\win32com\client\__init__.py", line 454, in __getattr__ raise AttributeError, "'%s' object has no attribute '%s'" % (repr(self), attr) exceptions.AttributeError: '<win32com.gen_py.Microsoft HTML Object Library.IHTMLElement instance at 0x43431616>' object has no attribute 'createTextRange' """ #---------------------------------------------------------------------- # end of output 3 # (3050F1C5-98B5-11CF-BB82-00AA00BDCE0Bx0x4x0.py *DO* exist) #---------------------------------------------------------------------- 4. method 4 #---------------------------------------------------------------------- # method 4 # Try to use attachEvent, but never worked #---------------------------------------------------------------------- from win32com.client import Dispatch import time class DocEvents: def Ononclick(self): print 'onclick' ev = doc.parentWindow.event elem = ev.srcElement print 'tagName' , elem.tagName print 'id' , elem.id print 'innerText' , elem.innerText print 'clientX' , ev.clientX print 'clientY' , ev.clientY print 'body text' , doc.body.createTextRange().text ie = Dispatch("InternetExplorer.Application") ie.Visible = 1 ie.Navigate('http://www.google.com') while ie.Busy: time.sleep(0.1) doc = ie.Document #doc.attachEvent('onclick',DocEvents.Ononclick) doc.attachEvent('onclick',DocEvents) #---------------------------------------------------------------------- # end of code 4 #---------------------------------------------------------------------- #---------------------------------------------------------------------- # output of method 4 #---------------------------------------------------------------------- """ Traceback (most recent call last): File "C:\Python24\Lib\site-packages\pythonwin\pywin\framework\scriptutils.py", line 310, in RunScript exec codeObject in __main__.__dict__ File "D:\project\python\Test\ie-event-method-4.py", line 31, in ? doc.attachEvent('onclick',DocEvents) File "C:\Python24\lib\site-packages\win32com\gen_py\3050F1C5-98B5-11CF-BB82-00AA00BDCE0Bx0x4x0.py", line 9518, in attachEvent , pdisp) ValueError: argument is not a COM object """ #---------------------------------------------------------------------- # end of output 4 #---------------------------------------------------------------------- 5. method 5 #---------------------------------------------------------------------- # method 5 # Don't handle DOM events, always works right # when 3050F1C5-98B5-11CF-BB82-00AA00BDCE0Bx0x4x0.py not exist #---------------------------------------------------------------------- from win32com.client import Dispatch import time ie = Dispatch("InternetExplorer.Application") ie.Visible = 1 ie.Navigate('http://www.google.com') while ie.Busy: time.sleep(0.1) doc = ie.Document print doc.body.createTextRange().text #---------------------------------------------------------------------- # end of code 5 #---------------------------------------------------------------------- #---------------------------------------------------------------------- # output of method 5 # (3050F1C5-98B5-11CF-BB82-00AA00BDCE0Bx0x4x0.py not exist) #---------------------------------------------------------------------- """ Personalized Home | Sign in Web Images VideoNew! News Maps more ?Books Froogle Groups even more ? Advanced Search Preferences Language Tools Advertising Programs - Business Solutions - About Google Make Google Your Homepage! ?2006 Google """ #---------------------------------------------------------------------- # end of output 5 # (3050F1C5-98B5-11CF-BB82-00AA00BDCE0Bx0x4x0.py not exist) #---------------------------------------------------------------------- #---------------------------------------------------------------------- # output of method 5 # (3050F1C5-98B5-11CF-BB82-00AA00BDCE0Bx0x4x0.py DO exist) #---------------------------------------------------------------------- """ Traceback (most recent call last): File "C:\Python24\Lib\site-packages\pythonwin\pywin\framework\scriptutils.py", line 310, in RunScript exec codeObject in __main__.__dict__ File "D:\project\python\Test\ie-event-method-5.py", line 19, in ? print doc.body.createTextRange().text File "C:\Python24\Lib\site-packages\win32com\client\__init__.py", line 454, in __getattr__ raise AttributeError, "'%s' object has no attribute '%s'" % (repr(self), attr) AttributeError: '<win32com.gen_py.Microsoft HTML Object Library.IHTMLElement instance at 0x37747768>' object has no attribute 'createTextRange' """ #---------------------------------------------------------------------- # end of output 5 # (3050F1C5-98B5-11CF-BB82-00AA00BDCE0Bx0x4x0.py DO exist) #---------------------------------------------------------------------- method 1,2,3,5 can work, not method 4. My result is: method 1,2 works right when try 'elem.tagName', 'elem.id', 'elem.innerText', 'ev.clientX', but never works when try 'doc.body.createTextRange()' whether file '3050F1C5-98B5-11CF-BB82-00AA00BDCE0Bx0x4x0.py' exist. *** method 3 works right when '3050F1C5-98B5-11CF-BB82-00AA00BDCE0Bx0x4x0.py' do NOT exist ***, but works like method 1,2 when file '3050F1C5-98B5-11CF-BB82-00AA00BDCE0Bx0x4x0.py' exist. method 4 never get works, just I think may be works. method 5 can always works when file '3050F1C5-98B5-11CF-BB82-00AA00BDCE0Bx0x4x0.py' NOT exist, but never works when file '3050F1C5-98B5-11CF-BB82-00AA00BDCE0Bx0x4x0.py' DO exist. These code run under: Windows XP SP2 Internet Explorer 6.0.2900.2180.xpsp_sp2_rtm.040803-2158 PythonWin 2.4.3 (#69, Apr 11 2006, 15:32:42) [MSC v.1310 32 bit (Intel)] on win32. pywin32 build 209 My question: It looks like that: 'doc.body.createTextRange()' never works right, whenever makepy.py generate {3050F1C5-98B5-11CF-BB82-00AA00BDCE0B} python wrapper before run these code, Noticed that in method 3, 'd = WithEvents(doc, DocEvents)' will generate this wrapper, but works right at first time when this wrapper not generate before. But works wrong when this wrapper already exist. I don't know why this wrapper effect method 5, since method 5 never handle {3050F1C5-98B5-11CF-BB82-00AA00BDCE0B}. Method 1,2 always generate this wrapper file, and never works right whether this wrapper exist. And I notice that, when generate this wrapper file, my application memory consumption will grow up to 180MB, and 60MB when do not generate it. Any advice will be appreciated. Thanks, Richard _______________________________________________ Python-win32 mailing list Python-win32@python.org http://mail.python.org/mailman/listinfo/python-win32