2009-12-27 77 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

這可能是一個時間問題,並不是一個好主意,依靠時機的問題。 –