2016-01-20 130 views
1

我在使用selenium和python中的webdriver從站點下載csv文件。該文件被下載到指定的下載目錄中。這裏是我的代碼如何閱讀在python中由selenium 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",'xx/yy') 
fp.set_preference('browser.helperApps.neverAsk.saveToDisk', "text/plain, application/vnd.ms-excel, text/csv, text/comma-separated-values, application/octet-stream") 
driver = webdriver.Firefox(fp) 
driver.get('url') 

概述我需要把這個CSV內容print到終端。許多類似的隨機名稱文件將被下載到同一個文件夾,因此通過文件名訪問文件將無法正常工作,因爲我不知道它會提前

+0

不能打開並閱讀與硒csv文件,你需要使用文件閱讀器庫。 – Guy

+0

你能發佈html嗎?也許你可以從那裏提取文件名 – Guy

+0

該文件名不存在於HTML中的任何地方。對不起,但它的敏感信息,所以我不能發佈它。我已經徹底檢查過了。我有一種感覺,我可能需要使用文件庫來讀取文件,但我仍然需要文件名。有沒有辦法在driver.get()中查看文件名,或者是否有方法將響應中的文件內容打印到屏幕上? – Keegan

回答

1

這個答案是從組合形成以前的堆棧溢出問題,答案以及在這篇文章中的評論,所以謝謝大家。

我爲此解決方案組合了selenium webdriver和python requests模塊。我基本上使用硒登錄到網站,從webdriver會話複製cookie,然後使用requests.get(url,cookies = webdriver_cookies)來獲取文件。

這裏是我的解決方案

fp = webdriver.FirefoxProfile() 
fp.set_preference("browser.download.folderList", 2) 
fp.set_preference("browser.download.manager.showWhenStarting", False) 
fp.set_preference("browser.download.dir",'xx/yy') 
fp.set_preference('browser.helperApps.neverAsk.saveToDisk', "text/plain, application/vnd.ms-excel, text/csv, text/comma-separated-values, application/octet-stream") 
driver = webdriver.Firefox(fp) 

# selenium login code ... 

driver_cookies = driver.get_cookies() 
cookies_copy = {} 
for driver_cookie in driver_cookies: 
    cookies_copy[driver_cookie["name"]] = driver_cookie["value"] 
r = requests.get('url',cookies = cookies_copy) 
print r.text 

的要點,我希望這可以幫助別人

1

在Selenium中下載文件絕不是一個好主意。你無法控制下載文件的位置和文件名,如果你想知道,那麼你必須使用骯髒的黑客。這取決於瀏覽器及其設置,以及是否已經下載過相同的文件。

另外,下載後必須小心刪除文件,否則,同一文件的大量副本會將您的硬盤驅動器發送垃圾郵件,直到它完全滿了爲止。

如果可能的話,你應該叫像

string downloadUrl = ButtonDownloadPdf.GetAttribute("href"); 

,然後處理自己下載,使用傳統的方法,而不是硒。

+0

它不是我的第一選擇。它是最後的手段 – Keegan

+1

@Kimmy你會麻煩解釋爲什麼它不是一個好主意,或者你寧願冒險反對票?如果測試用例要求下載和檢查文件,那麼爲什麼不使用Selenium將其自動化呢? –

+1

@Kimmy謝謝你的闡述。我仍然不同意有三個原因1)您可以控制下載文件的位置(瀏覽器設置),並且文件至少有一個默認名稱; 2)如果測試失敗,您不應刪除_after_下載文件以便能夠檢查文件。您應該刪除運行自動化測試的舊文件以清理。有什麼問題呢? 3)即使您的聲明不低於測試**每個可能的瀏覽器都會自動**,但其他人可能會滿足於僅使用一個瀏覽器運行一些奇特的測試 - 而不是手動或不測試 –

3

你可以從該位置的最後一個下載的文件,然後讀取文件:

path = /path to folder 
list = os.listdir(path) 
time_sorted_list = sorted(list, key=os.path.getmtime) 
file_name = time_sorted_list[len(time_sorted_list)-1] 

,然後ü可以從這個文件中讀取。希望沒有多個文件通過並行進程到達那裏。

編輯: 剛纔看到評論說,多個實例均達到下載,所以其他方式,你可以使用urllib而使用它的URL下載文件:

import urllib 
urllib.urlretrieve("http://www.example.com/yourfile.ext", "your-file-name.ext") // you can provide unique-id to your file name 
+1

由於我下載文件的網站需要登錄,因此會話數據由selenium完成,因此無法正常工作。會話數據與webdriver對象相關聯。所以一個簡單的urlretrieve()給了我一個IOError :('http error',401,'Unauthorized') – Keegan