2009-12-27 2 views
2

S'il vous plaît, aidez-moi avec Python 2.6 et win32com.Python: erreur lors de la vérification de l'état IE

Je suis un débutant à Python et je suis erreur quand je commence le prochain programme:

import pywintypes 
from win32com.client import Dispatch 
from time import sleep 

ie = Dispatch("InternetExplorer.Application") 
ie.visible=1 
url='hotfile.com' 

ie.navigate(url) 
while ie.ReadyState !=4: 
    sleep(1) 
print 'OK' 
.......................... 
Error message: 
while ie.ReadyState !=4: 
... 

pywintypes.com_error: 
(-2147023179, 'Unknown interface.', None, None) 
.......................... 

Mais quand je change URL pour, par exemple, « yahoo.com » - il n'y a pas les erreurs.
Comment le résultat de la vérification de ReadyState peut-il dépendre de l'URL?

+0

Serait-ce parce que Hotfile. com est une URL valide (code de résultat 200) telle quelle et yahoo.com redirige HTTP 302? – Kimvais

+0

http://hotfile.com est un site valide. Et tel est yahoo.com, bien sûr ... –

Répondre

1

L'astuce de sommeil ne fonctionnera pas avec IE. Vous avez réellement besoin de pomper des messages pendant que vous attendez. Soit dit en passant, je ne pense pas qu'un thread va fonctionner, car IE déteste ne pas être dans le fil de l'interface graphique.

Voici une pompe de message basée sur ctypes, avec laquelle j'ai pu obtenir un 4 ReadyState pour "hotfile.com" et "yahoo.com". Il récupère tous les messages actuellement dans la file d'attente et les traite avant d'exécuter la vérification.

(Oui, cela est assez poilu, mais vous pouvez rentrer cette distance en fonction « pump_messages » de sorte que vous au moins ne devez pas regarder!)

from ctypes import Structure, pointer, windll 
from ctypes import c_int, c_long, c_uint 
import win32con 
import pywintypes 
from win32com.client import Dispatch 

class POINT(Structure): 
    _fields_ = [('x', c_long), 
       ('y', c_long)] 
    def __init__(self, x=0, y=0): 
     self.x = x 
     self.y = y 

class MSG(Structure): 
    _fields_ = [('hwnd', c_int), 
       ('message', c_uint), 
       ('wParam', c_int), 
       ('lParam', c_int), 
       ('time', c_int), 
       ('pt', POINT)] 

msg = MSG() 
pMsg = pointer(msg) 
NULL = c_int(win32con.NULL) 

ie = Dispatch("InternetExplorer.Application") 
ie.visible=1 
url='hotfile.com' 
ie.navigate(url) 

while True: 

    while windll.user32.PeekMessageW(pMsg, NULL, 0, 0, win32con.PM_REMOVE) != 0: 
     windll.user32.TranslateMessage(pMsg) 
     windll.user32.DispatchMessageW(pMsg) 

    if ie.ReadyState == 4: 
     print "Gotcha!" 
     break 
+0

Merci, je vais essayer votre code. Mais la chose étrange (pour moi) est que sleep (1) fonctionne avec IE, lors de la navigation vers d'autres URL, à l'exclusion hotfile.com ... –

+0

C'est probablement un problème de synchronisation, et ce n'est jamais une bonne idée de compter sur le calendrier problèmes. –

Questions connexes