使用Selenium能否知道Firefox下载了哪个文件

3 投票
4 回答
1064 浏览
提问于 2025-04-16 06:30

首先,我为我的英语不好而感到抱歉。

我正在用Python和Selenium RC写一些脚本。我的目标是访问一些网站,并下载一些文件。我想知道,在脚本结束时,具体下载了哪些文件。

目前,我的方法有点简单,就是检查Firefox的下载目录中出现的新文件,这个方法有效,但如果同时启动多个客户端,它们就无法知道自己下载了哪些文件等等。

所以我在尝试找到解决这个问题的方法。如果能处理Firefox的下载,准确知道什么时候下载发生,以及下载了什么文件,那就太好了,但到目前为止,我还没有找到相关的信息。

谢谢你的帮助。

4 个回答

0

我自己还没有尝试过,但我觉得可以设置多个Firefox的用户配置文件,每个配置文件设置不同的下载目录。然后可以让每个Firefox实例使用这些不同的配置文件(或者如果你在用Selenium2的话,可能可以通过编程的方式来设置配置文件的值——我不太确定能不能改变下载目录)。这样你就可以持续监控每个目录,查看每个会话下载了什么。

0

我找到了一些东西来解决我的问题(仅限Firefox),代码很容易理解(你应该参考Firefox API中的moz_downloads里的state和target)。

def check_download(self):
    isDownloading = False
    t = 0
    while t != 60 or isDownloading:
        shutil.copy(os.path.join(self.finalFolder, "downloads.sqlite"), os.path.join(self.log_dir, self.sessionId+"downloads.sqlite"))
        conn = sqlite3.connect(os.path.join(self.log_dir, self.sessionId+"downloads.sqlite"))
        c = conn.cursor()
        c.execute("select state, target from moz_downloads")
        print '<waiting for download>'
        for row in c:
            dlState = row[0]
            dlTarget = row[1]
            if dlState == 0 or dlState == 7 or dlState == -1:
                isDownloading = True
            if self.verbose:
                print "status: {0} | target: {1}".format(dlState, dlTarget)
            if dlState == 1:
                filenameExpected = os.path.join(self.download_dir, os.path.split(dlTarget)[1])
                self.writeline_log("FILE;" + filenameExpected + ';')
                return
        c.close()
        conn.close()
        time.sleep(1)
        t = t + 1
0

如果你在用Python和Selenium RC工作,为什么不创建一个叫做lastdownload.txt的文件呢?在里面记录你下载的文件的日期和文件名。

这样每次你的脚本运行时,它就会检查文件服务器和你的日志文件,看看哪些文件是新的,哪些文件你已经下载过了。(如果文件名相同,你可以通过检查文件的最后更新时间或者文件大小来进行比较)

然后你只需要下载新的文件……这样一来,你就能通过查找这个txt文件来简单地实现一个增量下载的机制。

撰写回答