Windows從web下載文件的幾種方式


最近搞app自動化測試,需要自動從網頁上下載apk用於測試,順便學習了幾種從web下載文件的方式。

一、PowerShell DownloadFile 命令

PowerShell 是一種winodws原生的腳本語言,使用很方便,可以實現很多復雜的功能。

首先啟動PowerShell,可以在cmd里執行 start powershell,也可以按住shift建右擊選擇打開powershell

啟動powershell后輸入如下命令:

$client = new-object System.Net.WebClient
$client.DownloadFile('url', 'file')

 這里的url是下載文件的地址,file是文件保存路徑(包括文件名)。如果出現報錯如下:使用“2”個參數調用“DownloadFile”時發生異常:“在 WebClient 請求期間發生異常。”

就是文件保存路徑沒有寫完整,一定要包括文件名。如:D:\app-release.apk

在Jenkins build step 中執行 PowerShell 命令

當然這是手動在powershell命令行執行的,並沒有實現自動化。我們需要把它放到Jenkins中去實現。

在Jenkins中執行powershell命令需要先安裝相應插件如下:

安裝完重啟,就可以在任務構建中添加執行powershell命令的操作:

填入上面的兩條命令,就可以執行文件下載操作了。

多個build step

如果有多個step呢?如果想要在下載文件失敗后進行其他操作呢?

上面的操作,無論怎么執行 PowerShell 命令,build step 的結束狀態都是 "成功"(包括一些命令執行失敗的情況)。這是因為PowerShell 執行的過程中沒有執行 exit 調用,Jenkins 無法判斷執行的命令是否成功退出,所以就默認是成功的了。實際上,當命令執行失敗或是滿足一些條件時,我們希望 build step 的結束狀態是 "失敗",后續的 build step 根據前面 step 的結束狀態決定是否執行。

這就需要在PowerShell 命令執行后執行 exit 調用:判斷腳本執行成功時調用 exit 0;判斷腳本執行失敗時調用 exit 1

也就是執行三條命令,例如:

$client = new-object System.Net.WebClient
$client.DownloadFile('url', 'file')
exit 1

二、python實現文件下載

利用python+selenium也可以實現從web上下載文件,首先要確保對應調用的瀏覽器安裝好driver,參考:https://www.cnblogs.com/Dahlia/p/10655573.html

chrome下載

對於Chrome瀏覽器,設置其options:

  • download.default_directory:設置下載路徑
  • profile.default_content_settings.popups:設置為 0 禁止彈出窗口

代碼示例:

# -*- coding: utf-8 -*-

from selenium import webdriver
from time import sleep

options = webdriver.ChromeOptions()
prefs = {'profile.default_content_settings.popups': 0, 'download.default_directory': 'd:\\'}
options.add_experimental_option('prefs', prefs)

driver = webdriver.Chrome(executable_path='D:\\chromedriver.exe', chrome_options=options)
driver.get('http://sahitest.com/demo/saveAs.htm')
driver.find_element_by_xpath('//a[text()="testsaveas.zip"]').click()
sleep(3)
driver.quit()

  

firefox下載

同樣,對於Firefox,需要我們設置其Profile:

  • browser.download.dir:指定下載路徑
  • browser.download.folderList:設置成2,表示使用自定義下載路徑;設置成0,表示下載到桌面;設置成1,表示下載到默認路徑
  • browser.download.manager.showWhenStarting:在開始下載時是否顯示下載管理器
  • browser.helperApps.neverAsk.saveToDisk:對所給出文件類型不再彈出框進行詢問

代碼示例:

# -*- coding: utf-8 -*-

from selenium import webdriver
from time import sleep

profile = webdriver.FirefoxProfile()
profile.set_preference('browser.download.dir', 'd:\\')
profile.set_preference('browser.download.folderList', 2)
profile.set_preference('browser.download.manager.showWhenStarting', False)
profile.set_preference('browser.helperApps.neverAsk.saveToDisk', 'application/zip')

driver = webdriver.Firefox(firefox_profile=profile)

driver.get('http://sahitest.com/demo/saveAs.htm')
driver.find_element_by_xpath('//a[text()="testsaveas.zip"]').click()
sleep(3)
driver.quit()

 firefox下載有個要注意的地方:

browser.helperApps.neverAsk.saveToDisk這個參數是對所給出文件類型不再彈出框進行詢問,需要明確一下對應文件的MIME類型,參考:http://www.w3school.com.cn/media/media_mimeref.asp

在實踐的時候下載的是apk文件,發現這里沒列出apk的MIME類型。查閱其他資料發現,apk對應:application/vnd.android.package-archive。

以上兩個方法稍微優化一下:

# -*- coding: utf-8 -*-

from selenium import webdriver
from time import sleep
import os

class WebDownload:

    chromedriver_path = 'E:\\chromedriver\\chromedriver.exe'
    down_dir = 'E:\\RED\\workspace\\appAuto\\apk\\Android10'
    file_name = 'app.apk'
    url = 'https://www.xxx'

    def chrome_download(self):

        list = os.listdir(self.down_dir) #列出目錄的下所有文件和文件夾
        if self.file_name in list:
            os.remove(os.path.join(self.down_dir,self.file_name))

        # download.default_directory:設置下載路徑
        # profile.default_content_settings.popups:設置為 0 禁止彈出窗口
        options = webdriver.ChromeOptions()
        prefs = {'profile.default_content_settings.popups': 0,
                 'download.default_directory': self.down_dir}
        options.add_experimental_option('prefs', prefs)

        driver = webdriver.Chrome(executable_path=self.chromedriver_path, chrome_options=options)

        driver.get(url=self.url)
        driver.find_element_by_id('down_load').click()

        sleep(20)

        driver.quit()

    def firefox_download(self):

        list = os.listdir(self.down_dir)  # 列出目錄的下所有文件和文件夾
        if self.file_name in list:
            os.remove(os.path.join(self.down_dir, self.file_name))

        # browser.download.dir:指定下載路徑
        # browser.download.folderList:設置成2,表示使用自定義下載路徑;設置成0,表示下載到桌面;設置成1,表示下載到默認路徑
        # browser.download.manager.showWhenStarting:在開始下載時是否顯示下載管理器
        # browser.helperApps.neverAsk.saveToDisk:對所給出文件類型不再彈出框進行詢問。apk:application/vnd.android.package-archive
        profile = webdriver.FirefoxProfile()
        profile.set_preference('browser.download.dir', self.down_dir)
        profile.set_preference('browser.download.folderList', 2)
        profile.set_preference('browser.download.manager.showWhenStarting', False)
        profile.set_preference('browser.helperApps.neverAsk.saveToDisk', 'application/vnd.android.package-archive')

        driver = webdriver.Firefox(firefox_profile=profile)

        driver.get(self.url)
        driver.find_element_by_id('down_load').click()

        sleep(20)

        driver.quit()

if __name__ == '__main__':
    # WebDownload().chrome_download()
    WebDownload().firefox_download()

  

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM