使用Selenium Webdriver下载时命名文件

时间:2012-11-09 23:20:41

标签: python selenium webdriver selenium-webdriver

我看到您可以通过Webdriver设置下载文件的位置,如下所示:

fp = webdriver.FirefoxProfile()

fp.set_preference("browser.download.folderList",2)
fp.set_preference("browser.download.manager.showWhenStarting",False)
fp.set_preference("browser.download.dir",getcwd())
fp.set_preference("browser.helperApps.neverAsk.saveToDisk","text/csv")

browser = webdriver.Firefox(firefox_profile=fp)

但是,我想知道在下载文件时是否有类似的方法给文件命名?最好,可能不是与配置文件相关的东西,因为我将通过一个浏览器实例下载~6000个文件,并且不希望每次下载都需要重新启动驱动程序。


编辑:使用所选答案建议的代码解决方案。下载完每个文件后重命名该文件。

import os
os.chdir(SAVE_TO_DIRECTORY)
files = filter(os.path.isfile, os.listdir(SAVE_TO_DIRECTORY))
files = [os.path.join(SAVE_TO_DIRECTORY, f) for f in files] # add path to each file
files.sort(key=lambda x: os.path.getmtime(x))
newest_file = files[-1]
os.rename(newest_file, docName+".pdf")

2 个答案:

答案 0 :(得分:4)

我建议有点奇怪的方法:如果可能的话,不要使用Selenium下载文件。

我的意思是获取文件URL并使用urllib库来下载文件并以“手动”方式将其保存到磁盘。问题是selenium没有处理Windows对话框的工具,例如“另存为”对话框。我不确定,但我怀疑它可以处理任何操作系统对话框,请纠正我,我错了。 :)

这是一个很小的例子:

import urllib
urllib.urlretrieve( "http://www.yourhost.com/yourfile.ext", "your-file-name.ext")

我们这里唯一的工作就是确保我们处理所有的urllib异常。有关详细信息,请参阅http://docs.python.org/2/library/urllib.html#urllib.urlretrieve

答案 1 :(得分:3)

我不知道是否有一个纯粹的Selenium处理程序,但这是我在需要对下载的文件做一些事情时所做的。

  1. 设置一个循环,轮询您的下载目录,查找具有.part扩展名的最新文件(这表示部分下载,如果不是,则会偶尔绊倒对此进行计时,以确保在超时/其他错误导致下载无法完成的情况下不进入无限循环。我在Linux中使用了ls -t <dirname>命令的输出(我的旧代码使用commands,这是不推荐的,所以我不会在这里显示:))并使用

    获得第一个文件
    # result = output of ls -t
    result = result.split('\n')[1].split(' ')[-1]
    
  2. 如果while循环成功退出,则目录中最顶层的文件将成为您的文件,然后您可以使用os.rename(或您喜欢的任何其他内容)修改该文件。

  3. 可能不是你想要的答案,但希望它指出你正确的方向。