2015-12-31 16 views
5

Pracuję ze skryptem selenowym, w którym próbuję pobrać plik Excel i nadać mu konkretną nazwę. To jest mój kod:Selen podaje nazwę pliku podczas pobierania

Czy mimo to mogę nadać pobieranemu plikowi określoną nazwę?

Kod:

#!/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 
+0

Dlaczego nie zmienić nazwy po pobraniu Za pomocą modułu [Shutil] (https://docs.python.org/2/library/shutil.html#module-shutil)? –

+0

Ponieważ nazwa pliku zawsze zawiera losową nazwę, chcę ją nazwać podczas pobierania. Łatwiej więc będzie go zlokalizować później. – user3580316

Odpowiedz

3

Nie można podać nazwę pliku do pobrania za pośrednictwem selenu. Możesz jednak pobrać plik, znaleźć najnowszy plik w pobranym folderze i zmienić nazwę według własnego uznania.

Uwaga: wypróbowane metody wyszukiwania w wyszukiwarce Google mogą zawierać błędy. ale masz pomysł.

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) 
+2

To daje mi 'Plik" /usr/local/Cellar/python/2.7.10_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/genericpath.py ", wiersz 72, w getctime return os. stat (nazwa pliku) .st_ctime OSError: [Errno 2] Brak takiego pliku lub katalogu: '.localized'' – altabq

0

Możesz pobrać plik i nazwać go w tym samym czasie za pomocą urlretrieve:

import urllib 

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

Jest coś chciałbym skorygować @parishodak odpowiedź:

tutaj nazwa pliku będzie tylko powrót ścieżka względna (tutaj nazwa pliku), a nie ścieżka bezwzględna.

Dlatego @FreshRamen uzyskałem następujący błąd po:

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' 

Jest poprawny kod:

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) 
+0

Zainstalował 'dirpath' w python3, ale pojawiła się kolejna zależność' cached'. Nie można go znaleźć. Jakieś alternatywne rozwiązanie? –

0

Nadzieja ten fragment nie jest mylące. Utworzenie tego zajęło mi trochę czasu i jest naprawdę użyteczne, ponieważ nie ma jasnej odpowiedzi na ten problem, z samą biblioteką.

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

Mam nadzieję, że to uratuje czyjś dzień, okrzyki.

EDYCJA: Dzięki @Om Prakash edycji mojego kodu, to mnie pamiętam, że nie wyjaśniłem kodu.

Używanie funkcji max([]) może prowadzić do stanu wyścigowego, pozostawiając Cię z pustym lub uszkodzonym plikiem (wiem o tym z doświadczenia). Chcesz sprawdzić, czy plik jest w całości pobrany. Wynika to z faktu, że selen nie czeka na zakończenie pobierania pliku, więc po sprawdzeniu ostatniego utworzonego pliku na wygenerowanej liście pojawi się niekompletny plik, który spróbuje przenieść ten plik. A nawet wtedy lepiej jest poczekać, aż plik będzie wolny od Firefoksa.

Powiązane problemy