2009-12-27 46 views
2

请帮助我使用Python 2.6和win32com。Python:检查IE状态时出错

我是一个新手到Python,我得到了错误 当我开始下一个节目:

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) 
.......................... 

但是当我改变的URL,例如“yahoo.com” - 没有错误。
检查ReadyState的结果可能依赖于url?

+0

难道这是因为hotfile。 com是一个有效的url(结果代码200),yahoo.com给HTTP 302重定向? – Kimvais

+0

http://hotfile.com是一个有效的网站。 这就是yahoo.com,当然... –

回答

1

睡眠技巧将无法使用IE浏览器。您在等待时确实需要抽出信息。顺便说一下,我认为一个线程不会工作,因为IE不喜欢GUI线程。

这是一个基于ctypes的消息泵,使用该消息泵,我可以为“hotfile.com”和“yahoo.com”获得4个ReadyState。它会取出当前队列中的所有消息,并在运行检查之前处理它们。

(是的,这是非常毛茸茸的,但你可以妥善保存该走成“pump_messages”功能,所以你至少不必看它!)

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

谢谢你,我会试试你的代码。 但奇怪的事情(对我来说)是睡觉(1)与IE浏览器, 浏览其他网址时,不包括hotfile.com ... –

+0

这可能是一个时间问题,并不是一个好主意,依靠时机的问题。 –