Selenium дает имя файла при загрузке

Я работаю со скриптом selenium, где я пытаюсь загрузить файл Excel и дать ему определенное имя. Вот мой код:

есть ли в любом случае, что я могу дать загружаемому файлу определенное имя ?

код:

#!/usr/bin/python
from selenium import webdriver
from selenium.webdriver.firefox.firefox_profile import FirefoxProfile

profile = FirefoxProfile()
profile.set_preference("browser.helperApps.neverAsk.saveToDisk", "text/plain, application/vnd.ms-excel, text/csv, text/comma-separated-values, application/octet-stream")
profile.set_preference("browser.download.dir", "C:Downloads" )
browser = webdriver.Firefox(firefox_profile=profile)

browser.get('https://test.com/')
browser.find_element_by_partial_link_text("Excel").click() # Download file

4 ответов


вы не можете указать имя файла загрузки через selenium. Однако вы можете загрузить файл, найти последний файл в загруженной папке и переименовать его по своему усмотрению.

Примечание: заимствованные методы из поиска google могут иметь ошибки. но вы поняли идею.

import os
import shutil

filename = max([f for f in os.listdir('c:\downloads')], key=os.path.getctime)
shutil.move(os.path.join(dirpath,filename),newfilename)

есть что-то, что я бы исправил для ответа @parishodak:

имя файла здесь будет возвращать только относительный путь (здесь имя файла), а не абсолютный путь.

вот почему @FreshRamen получил следующую ошибку после:

File "/usr/local/Cellar/python/2.7.10_2/Frameworks/Python.framework/Versions/2.7/lib/‌​python2.7/genericpath.py", 
line 72, in getctime return os.stat(filename).st_ctime OSError: 
[Errno 2] No such file or directory: '.localized'

есть правильный код:

import os
import shutil

filepath = 'c:\downloads'
filename = max([filepath +"\"+ f for f in os.listdir(filepath)], key=os.path.getctime)
shutil.move(os.path.join(dirpath,filename),newfilename)

надеюсь, этот фрагмент не так запутан. Мне потребовалось некоторое время, чтобы создать это и действительно полезно, потому что не было четкого ответа на эту проблему, только с этой библиотекой.

import os
import time
def tiny_file_rename(newname, folder_of_download):
    filename = max([f for f in os.listdir(folder_of_download)], key=lambda xa :   os.path.getctime(os.path.join(folder_of_download,xa)))
    if '.part' in filename:
        time.sleep(1)
        os.rename(os.path.join(folder_of_download, filename), os.path.join(folder_of_download, newname))
    else:
        os.rename(os.path.join(folder_of_download, filename),os.path.join(folder_of_download,newname))

надеюсь, это спасет чей-то день, Ура.

EDIT: благодаря @Om Prakash редактированию моего кода, это заставило меня вспомнить, что я не объяснил код задумчиво.

С помощью max([]) функция может привести к состоянию гонки, оставив вас с пустым или поврежденным файлом (I знайте это по опыту). Вы хотите, чтобы проверить, если файл полностью загружен в первую очередь. Это связано с тем, что selenium не ждет завершения загрузки файла, поэтому при проверке последнего созданного файла в сгенерированном списке появится неполный файл, который попытается переместить этот файл. И даже тогда вам лучше немного подождать, пока файл будет свободен от Firefox.


вы можете загрузить файл и назвать его одновременно с помощью urlretrieve:

import urllib

url = browser.find_element_by_partial_link_text("Excel").get_attribute('href')
urllib.urlretrieve(url, "/choose/your/file_name.xlsx")