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")