Как закрыть не реагирующий Win32 Internet Explorer COM интерфейс? - PullRequest
0 голосов
/ 09 ноября 2009

на самом деле это не состояние зависания, я имею в виду .. это медленный ответ,
так что в этом случае, я хотел бы закрыть IE и хочу перезагрузить с самого начала.
так что закрытие не проблема, проблема в том, как установить тайм-аут, например, если я установил 15сек,
, если веб-страница не открыта менее чем за 15 сек, я хочу закрыть ее и перезапустить со старта.
это возможно использовать с интерфейсом IE com?
очень трудно найти решение Пол,

Я привык следовать коду, чтобы проверить, полностью ли открыта веб-страница или нет. Но, как я уже говорил, он не работает должным образом, потому что IE.navigate выглядит так, как будто он зависает или не отвечает.

        while ie.ReadyState != 4: 
              time.sleep(0.5)

1 Ответ

0 голосов
/ 09 ноября 2009

Чтобы избежать проблем с блокировкой, используйте IE COM-объект в потоке.

Вот простой, но мощный пример, демонстрирующий, как вы можете использовать thread и IE com объект вместе. Вы можете улучшить его для своих целей.

В этом примере запускается поток, использующий очередь для связи с основным потоком, в основном потоке пользователь может добавлять URL-адреса в очередь, и поток IE посещает их один за другим, после того как он заканчивает один URL, IE посещает следующий. Поскольку IE COM-объект используется в потоке, вам нужно вызвать Coinitialize

from threading import Thread
from Queue import Queue
from win32com.client import Dispatch
import pythoncom
import time

class IEThread(Thread):
    def __init__(self):
        Thread.__init__(self)
        self.queue = Queue()

    def run(self):
        ie = None
        # as IE Com object will be used in thread, do CoInitialize
        pythoncom.CoInitialize()
        try:
            ie = Dispatch("InternetExplorer.Application")
            ie.Visible = 1
            while 1:
                url = self.queue.get()
                print "Visiting...",url
                ie.Navigate(url)
                while ie.Busy:
                    time.sleep(0.1)
        except Exception,e:
            print "Error in IEThread:",e

        if ie is not None:
            ie.Quit()


ieThread = IEThread()
ieThread.start()
while 1:
    url = raw_input("enter url to visit:")
    if url == 'q':
        break
    ieThread.queue.put(url)
...