最近搞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()