2016-11-02 135 views
0

我想刮一個網頁,點擊一個鏈接導致一個新的窗口彈出打開,立即下載CSV文件。我一直無法找出url的格式,因爲它的javascript相當密集(並且通過onClick屬性調用了一個函數,而另一個函數是href屬性的一部分。我之前沒有和Selenium一起工作過,所以我希望在開始之前確認我想要做的事情是可能的我曾經在某處讀過通過新的彈出窗口下載文件並不一定是我可以用Selenium做的事情使用硒通過window.open下載文件

任何意見都將不勝感激A this is possible將會很有幫助,就像here's how you'd do it甚至可以詳細描述一樣。非常感謝!

很明顯,我的困難主要來自於我無法弄清楚生成下載文件的URL。即使查看Google chrome網絡調用,我也沒有看到它的位置,並且可能需要幾個小時才能跟蹤此問題,因此我正在尋找一種解決方案,它依靠單擊瀏覽器中的特定文本,而不是解開幕後操作繁瑣。

回答

0

下面是我如何使用Firefox webdriver下載文件。它本質上是創建一個瀏覽器配置文件,以便設置某些文件類型的默認下載位置。然後您可以驗證文件是否存在於該位置。

import os 
from selenium import webdriver 

browser_profile = webdriver.FirefoxProfile() 

# add the file_formats to download 
file_formats = ','.join(["text/plain", 
         "application/pdf", 
         "application/x-pdf", 
         "application/force-download"]) 

preferences = { 
    "browser.download.folderList": 2, 
    "browser.download.manager.showWhenStarting": False, 
    "browser.download.dir": os.getcwd(), # will download to current directory 
    "browser.download.alertOnEXEOpen": False, 
    "browser.helperApps.neverAsk.saveToDisk": file_formats, 
    "browser.download.manager.focusWhenStarting": False, 
    "browser.helperApps.alwaysAsk.force": False, 
    "browser.download.manager.showAlertOnComplete": False, 
    "browser.download.manager.useWindow": False, 
    "services.sync.prefs.sync.browser.download.manager.showWhenStarting": False, 
    "pdfjs.disabled": True 
} 

for pref, val in preferences.items(): 
    browser_profile.set_preference(pref, val) 

browser_binary = webdriver.firefox.firefox_binary.FirefoxBinary() 
browser = webdriver.Firefox(firefox_binary=browser_binary, 
          firefox_profile=browser_profile) 

# set the file name that will be saved as when you download is complete 
file_name = 'ABC.txt' 

# goto the link to download the file from it will be automatically 
# downloaded to the current directory 
file_url = 'http://yourfiledownloadurl.com' 
browser.get(file_url) 

# verify if the expected file name exists in the current directory 
path = os.path.join(os.getcwd(), file_name) 
assert os.path.isfile(path) 
+0

謝謝基蘭。這對你來說是非常慷慨的分享代碼。我意識到自己的帖子並不清楚,我很難找出正在下載文件的URL,這是呈現我的困難的一部分。是否可以修改你的代碼來選擇我想要點擊的文本來下載文件? – helloB

+0

@helloB您可以用'browser.find_element_by_xpath(xpath).click()'替換'browser.get',它仍然會將它下載到默認目錄。 –

+0

真棒,要試試這個,謝謝你Kiran! – helloB