『心善淵』Selenium3.0基礎 — 19、使用Selenium操作檔案的上傳和下載

繁華似錦Fighting發表於2021-07-08

1、Selenium實現檔案上傳

(1)頁面中的檔案上傳說明

檔案上傳是Web頁面上很常見的一個功能,用指令碼去實現檔案上傳很簡單。

一般場景:在頁面中的上傳按鈕是一個<input>標籤,其中type屬性為type="file",這種可以用Selenium提供的send_keys()方法輕鬆解決。

(2)檔案上傳示例

頁面程式碼片段:

<!DOCTYPE html>
<html lang="zh-cn">
<head>
    <meta charset="UTF-8">
</head>
<body>
<fieldset>
    <legend>檔案上傳</legend>
    <form action="">
        <input type="file" name="upfile" value="">
    </form>
</fieldset>
</fieldset>
</body>
</html>

指令碼程式碼:

"""
1.學習目標:
    掌握檔案上傳功能操作
2.操作步驟
    此上傳方式適用大多數情況。
    上傳檔案標籤為input型別,並且type=file時可使用此方式上傳。
    使用send_keys(“需要上傳的檔案的路徑")
3.需求
    在頁面中,實現檔案上傳
4.總結
    4.1 在上傳檔案的時候,對檔案型別,大小等做充分驗證。
    4.2 在執行上傳檔案指令碼時,加一定的等待時間,sleep()。
    4.3 大多數上傳檔案都是input型別並且type=file。
    4.4 對於非input標籤的上傳檔案功能,使用Sendkeys庫來實現。
"""
# 1.匯入selenium
from selenium import webdriver
from time import sleep
import os

# 2.開啟瀏覽器
driver = webdriver.Chrome()

# 3.開啟註冊A頁面
url = "file:///" + os.path.abspath("./1.html")
driver.get(url)
sleep(2)

# 4.上傳檔案
# 4.1 定位上傳檔案按鈕
upfile = driver.find_element_by_name("upfile")

# 4.2 使用send_keys方法上傳檔案
upfile.send_keys(r"C:\Users\L\Desktop\測試上傳檔案.txt")
sleep(5)

# 5.關閉瀏覽器
driver.quit()

提示

另外一種非<input>標籤的上傳檔案按鈕,實現起來比較困難,可以藉助autoit工具或者SendKeys第三方庫來實現。

上傳過程一般要開啟一個系統的windows視窗,從視窗選擇本地檔案新增。所以,一般會卡在如何操作本地windows視窗。

(3)總結

其實上傳本地檔案沒我們想的那麼複雜,只要定位上傳按鈕,通send_keys()方法新增本地檔案路徑就可以了。絕對路徑和相對路徑都可以,關鍵是上傳的檔案存在。

小練習:使用郵箱給其他人傳送一封代附件的郵件。

即:新增附件,就是上傳檔案操作;郵件正文的操作就是操作iframe元素。

2、Selenium實現檔案下載

使用selenium.webdriver實現下載檔案功能,只需要配置一下瀏覽器的引數即可實現。

(1)Firefox瀏覽器檔案下載

1)操作步驟:

  1. 對於Firefox,需要我們設定其Profile:通過FirefoxProfile()方法建立一個Firefox自定義配置資訊例項。
  2. 設定Firefox瀏覽器下載相關的自定義配置資訊到Profile例項中。
  3. 啟動Firefox,並把自定義配置Profile例項儲存到瀏覽器物件中。
  4. 訪問下載網站,進行下載。

2)檔案下載示例:

需求:下載Firefox瀏覽器驅動檔案

"""
1.學習目標
    瞭解使用火狐瀏覽器實現檔案下載
2.操作步驟(語法)
    2.1 建立Firefox瀏覽器配置資訊物件
        webdriver.FirefoxProfile()
    2.2 設定Firefox瀏覽器下載相關的自定義配置資訊
    2.3 建立Firefox瀏覽器物件,並把自定義配置資訊儲存到瀏覽器物件中
    2.4 訪問下載網站
    2.5 進行下載
3.需求
    使用火狐瀏覽器實現檔案下載
"""
# 1.匯入selenium
from selenium import webdriver
from time import sleep

# 2.建立Firefox瀏覽器配置資訊物件,用於存放自定義配置
profile = webdriver.FirefoxProfile()

# 3. 配置profile下載相關資訊
"""
3.1 指定自定義下載路徑,預設只會自動建立一級目錄,
    如果指定了多級不存在的目錄,將會下載到預設路徑,
    如下就是定義了多級不存在的目錄,檔案就下載到了火狐瀏覽器的預設下載目錄中
    我的火狐預設下載路徑:C:\\Users\\L\\Downloads
"""
profile.set_preference('browser.download.dir', 'f:\\Download\\123\\456')

"""
3.2 將browser.download.folderList設定為:
    設定成 0 表示下載到桌面
    設定成 1 表示下載到瀏覽器預設下載路徑
    設定成 2 表示使用自定義下載路徑

    和上面browser.download.dir配合使用,如果設定成0和1
    上面的配置基本無用。
"""
profile.set_preference('browser.download.folderList', 2)

"""
3.3 browser.helperApps.alwaysAsk.force:
    對於未知的 MIME 型別檔案會彈出視窗讓使用者處理,
    預設值為true,設定為False,
    表示不會記錄開啟未知 MIME 型別檔案的方式
"""
profile.set_preference("browser.helperApps.alwaysAsk.force", False)

"""
3.4 在開始下載時是否顯示下載管理器
    設定為true,則在使用者啟動下載的時候顯示Firefox瀏覽器的檔案下載視窗
    否則不顯示檔案下載視窗。
"""
profile.set_preference('browser.download.manager.showWhenStarting', False)

"""
3.5 設定為 False 會把下載框進行隱藏
"""
profile.set_preference("browser.download.manager.useWindow", False)

"""
3.6 預設值為 true,設定為 False 表示不獲取焦點
"""
profile.set_preference("browser.download.manager. focusWhenStarting", False)

"""
3.7 下載.exe檔案彈出警告,
    預設值是 true,設定為False 則不會彈出警告框
"""
profile.set_preference("browser.download.manager.alertOnEXEOpen", False)

"""
3.8 browser.helperApps.neverAsk.openFile:
    表示直接開啟下載檔案,不顯示確認框
    預設值為空字串,下行程式碼行設定了多種檔案的 MIME型別.
    例如:
        application/exe,表示.exe型別的檔案,
        application/excel表示 Excel 型別的檔案
"""
profile.set_preference("browser.helperApps.neverAsk.openFile", "application/zip")

"""
3.9 對所給出檔案型別不再彈出框進行詢問,直接儲存到本地磁碟
"""
profile.set_preference('browser.helperApps.neverAsk.saveToDisk', 'application/zip, application/octet-stream')
"""
其他可選檔案型別:
    application/a-gzip
    application/x-gzip,
    application/zip,
    application/x-gtar,
    text/plain,
    application/x-compressed,
    application/octet-stream,
    application/pdf
"""

"""
3.10 browser.download.manager.showAlertOnComplete:
    設定下載檔案結束後是否顯示下載完成提示框,
    預設為true,設定為False,
    表示下載完成後不顯示下載完成提示框
"""
profile.set_preference("browser.download.manager. showAlertOnComplete", False)

"""
3.11 browser.download.manager.closeWhenDone:
    設定下載結束後是否自動關閉下載框,
    預設值為true,設定為False,
    表示不關閉下載管理器.
"""
profile.set_preference("browser.download.manager.closeWhenDone", False)

# 4. 建立瀏覽器物件
# 啟動瀏覽器時,通過firefox_profile引數
# 將自動以配置新增到FirefoxProfile物件中
driver = webdriver.Firefox(firefox_profile=profile)

# 5. 訪問Firefox瀏覽器驅動檔案下載網址
driver.get("https://npm.taobao.org/mirrors/geckodriver/v0.20.0/")
sleep(3)

# 6. 定位下載連結,並點選下載
file = driver.find_element_by_link_text("geckodriver-v0.20.0-win64.zip")
file.click()
sleep(3)

# 7.關閉瀏覽器
driver.quit()

(2)Chrome瀏覽器檔案下載

1)示例

Chrome瀏覽器,設定其options

  1. download.default_directory:設定下載路徑。
  2. profile.default_content_settings.popups:設定為0禁止彈出視窗。
"""
1.學習目標
    瞭解使用谷歌瀏覽器實現檔案下載
2.操作步驟(
    2.1 建立谷歌瀏覽器載入項物件
        webdriver.ChromeOptions()
    2.2 定義Chrome瀏覽器載入項引數
    2.3 將載入項引數新增到谷歌瀏覽器載入項物件中
        options.add_experimental_option('prefs', prefs)
    2.4 建立Chrome瀏覽器物件,並把自定義載入項物件儲存到瀏覽器物件中
    2.5 訪問下載網站
    2.6 進行下載
3.需求
    使用谷歌瀏覽器實現檔案下載
"""
# 1.匯入selenium
from selenium import webdriver
from time import sleep

# 2. 建立谷歌瀏覽器載入項物件
options = webdriver.ChromeOptions()

# 3. 定義載入項引數
prefs = {'profile.default_content_settings.popups': 0,
         'download.default_directory': 'f:\\'}

# 4.將載入項引數新增到谷歌瀏覽器載入項物件中
options.add_experimental_option('prefs', prefs)

# 5. 建立瀏覽器物件,並新增載入項物件
driver = webdriver.Chrome(options=options)

# 6. 方位下載頁面
driver.get('https://npm.taobao.org/mirrors/chromedriver/80.0.3987.106/')

# 7. 點選下載
driver.find_element_by_link_text("chromedriver_win32.zip").click()
sleep(3)

# 8.關閉瀏覽器
driver.quit()

2)說明:Chrome其他常用啟動引數

需要用的時候直接新增到配置資訊中。

  1. 取消瀏覽器下載時儲存路徑彈框
    "download.prompt_for_download": False,
    "download.directory_upgrade": True,
    
    """
    'profile.default_content_settings.popups': 0
    是禁止彈出所有視窗
    """
    
  2. 是否提示安全警告
    # 下載xml檔案時,會彈出“此檔案型別可能會損害您的計算機”的提示。
    # 而不顯示訊息警告,需要新增下面配置,使用Selenium chromedriver禁用此彈出視窗。
    "safebrowsing.enabled": True
    

提示:以上說明的都是Selenium操作元素的基礎操作,在實際工作中需要對這些操作進行封裝,來解決實際工作中的問題。

相關文章