[Python-de] Internet Explorer über Python/COM "fernsteuern"

Oliver Schaefer SchaeferFFM at gmx.de
Thu Feb 20 23:33:50 EST 2003


Florian Fredegar Haftmann wrote:
> Hi ihr alle!

Hi,

> 
> Suche nach einer Möglichkeit, den Internet Explorer fernzusteuern (über 
> COM mittels Python). Wer kennt eine Online-Dokumentation der 
> COM-Schnittstelle des IEXP? (bei www.microsoft.com habe ich außer ein 
> paar obskuren Seiten nichts gefünden)!?

Die MS-interne Suche ist ziemlich schlecht, Google hilft hier weiter, 
z.B. 'MSDN IE COM interface' sollte schnell zum Ziel führen (ungetestet, 
weil in Eile).

Da ich mit dem IE normalerweise nichts mehr zu tun habe, habe ich nur 
einige alte Module aus der Zeit von Python 1.5.2/2.0 als Beispiele.
Eins davon (nach Ideen von Dave Brueck in comp.lang.python):

---%<---%<---%<---%<---%<---%<---%<---%<---%<---%<---%<---%<
# ie_tools.py

def ie_create_instance(visible):
     """Return a copy of MS Internet Explorer ready to use.

     Usage:
         >>> ie = ie_create_instance(visible=True)
         >>> doc = ie_navigate(ie, 'http://www.google.com')
         >>> doc.f.q.Value = 'python'
         >>> doc.f.Submit()
         >>> links = ie_wait_for_doc(doc).Links
     """
     from win32com.client import DispatchEx

     ie  = DispatchEx('InternetExplorer.Application.1')
     doc = ie_navigate(ie, 'about:blank')

     if visible:
         import pywintypes
         from win32gui import FindWindow, SetForegroundWindow

         ie.Visible = visible

         try:
             hwnd = FindWindow(None,
                 'about:blank - Microsoft Internet Explorer')
             if hwnd:
                 SetForegroundWindow(hwnd)
         except pywintypes.error, err_msg:
             print '%s: %s' % (pywintypes.error, err_msg)

     return ie


def ie_navigate(ie, url):
     from time import sleep

     ie.Navigate(url)

     while ie.Busy:
         sleep(0.05)

     return ie_wait_for_doc(ie.Document)


def ie_wait_for_doc(doc, extra_delay=0):
     from time import sleep

     if extra_delay:
         sleep(extra_delay)

     while 1:
         try:
             if doc.readyState == 'complete':
                 return doc
         except AttributeError:
             sleep(0.1)


def ie_get_link(obj, pattern, failobj=None):
     from fnmatch import fnmatch

     try:
         links = obj.Links
     except AttributeError:
         links = obj.all.tags('a')   # works for non-doc objs

     for i in range(links.length):
         link = links[i]

         if fnmatch(link.href.lower(), pattern.lower()):
             return link
     else:
         return failobj


def ie_click_link(obj, pattern, delay=0):
     link = ie_get_link(obj, pattern)
     if link is None:
         raise ValueError('link matching %r not found in %r' % (
                          pattern, obj))

     link.Click()

     try:
         doc = obj.document
     except AttributeError:
         doc = obj

     return ie_wait_for_doc(doc, delay)

---%<---%<---%<---%<---%<---%<---%<---%<---%<---%<---%<---%<

Für die meisten Fragen lohnt sich übrigens eine Suche mit Google Groups:
http://groups.google.de/groups?hl=de&lr=&ie=UTF-8&group=comp.lang.python


Gruß, Oliver





More information about the Python-de mailing list