2

我正在编写一些测试,我正在使用Firefox webdriverwith aFirefoxProfile从外部 url 下载文件,但我需要在下载完成后立即读取此类文件以检索一些特定数据。

我这样设置我的个人资料和驱动程序:

fp = webdriver.FirefoxProfile()
fp.set_preference("browser.download.folderList", 2)
fp.set_preference("browser.download.manager.showWhenStarting", False)
fp.set_preference("browser.download.dir", '/some/path/')
fp.set_preference("browser.helperApps.neverAsk.saveToDisk", "text/plain, application/vnd.ms-excel, text/csv, text/comma-separated-values, application/octet-stream")

ff = webdriver.Firefox(firefox_profile=fp)

有什么方法可以知道文件何时完成下载,以便我知道何时调用阅读器函数,而无需轮询下载目录、等待time.sleep或使用任何 Firefox 插件?

谢谢你的帮助 :)

4

2 回答 2

1

您可以尝试在下载文件时将文件连接到文件对象以像流缓冲区一样使用它,在下载时轮询它以获取您需要的数据,直接监控下载完成(通过等待文件如果在一定时间内没有添加新数据,则假设它是完整的)。

编辑:

您可以尝试查看此处引用的配置文件文件夹中的下载跟踪数据库。看起来您可以等待文件的状态为 1。

于 2013-01-07T17:30:43.537 回答
0

我喜欢使用 inotify 来监视这类事件。一些示例代码,

from pyinotify import (
    EventsCodes,
    ProcessEvent,
    Notifier,
    WatchManager,
)

class EventManager(ProcessEvent):

    def process_IN_CLOSE_WRITE(self, event):
        file_path = os.path.join(event.path, event.name)
        # do something to file, you might want to wait a second here and 
        # also test for existence because ff might be making temp files 

wm = WatchManager()
notifier = Notifier(wm, EventManager())
wdd = wm.add_watch('/some/path', EventsCodes.ALL_FLAGS['IN_CLOSE_WRITE'], rec=True)

While True:
    try:
        notifier.process_events()
        if notifier.check_events():
            notifier.read_events()
    except:
        notifier.stop()
        raise

通知程序根据事件的名称决定在事件管理器上调用哪个方法。所以在这种情况下,我们只关注IN_CLOSE_WRITE事件

于 2013-01-07T17:41:07.480 回答