介紹如何在 Windows 環境下,使用 Python 的 Selenium 模組,撰寫自動控制瀏覽器的指令稿。
在開始之前,請先確認自己的 Windows 系統中有安裝 Python 的環境,如果沒有的話,請依照 Windows 安裝 Python 程式開發環境的步驟,在自己的 Windows 系統中安裝好 Python 的程式開發環境。
正常來說在安裝完 Python 的環境之後,也會一併安裝好 pip
這個 Python 套件管理工具,如果自己的 Python 環境沒有附帶 pip
的話,亦可依循安裝 Python 的 pip 套件管理工具的步驟,自己另外安裝。
開啟 Windows 的「命令提示字元」,使用 pip
安裝 Python 的 Selenium 套件:
pip install selenium
執行這一行 pip
的指令之後,就會自動從網路上下載並安裝 selenium
套件,所有相依性套件也會自動安裝起來。
Selenium 需要透過特殊的 WebDriver 才能跟瀏覽器溝通,進行各種控制,而不同的瀏覽器所對應的 WebDriver 也不同,以下是各種瀏覽器的 WebDriver 下載點:
瀏覽器 | WebDriver |
---|---|
Chrome | ChromeDriver |
Edge | Microsoft WebDriver |
Firefox | geckodriver |
Safari | WebDriver Support in Safari 10 |
請依照想要控制的瀏覽器,下載對應的 WebDriver 程式,同時請注意瀏覽器與 WebDriver 的版本,如果兩者的版本不同,是不能用的。
下載下來的瀏覽器 WebDriver 不需要安裝,但隨後要跟使用 Selenium 的 Python 指令稿(*.py
)放在一起執行,下面有詳細的操作教學。
準備好 Python 環境與 WebDriver 程式之後,就可以開始撰寫 Python 的指令稿,自動操控瀏覽器了,以下是一個 Hello World 範例,其使用 WebDriver 來控制 Chrome 瀏覽器,打開 Google 首頁:
from selenium import webdriver # 使用 Chrome 的 WebDriver browser = webdriver.Chrome() # 開啟 Google 首頁 browser.get('https://www.google.com/') # 關閉瀏覽器 # browser.close()
將這段 Python 指令稿儲存至 hello.py
,然後跟 Chrome 的 WebDriver 程式放在同一個目錄之下,這樣就可以執行了。
執行時可能會出現 Windows 防火牆的警告訊息,請選擇「允許存取」。
執行之後,會開啟一個新的 Chrome 瀏覽器視窗,這個視窗是由 Python 程式所控制的,在網址列下方會有一行受控制的提示訊息。
如果可以正常開啟這樣的 Chrome 瀏覽器視窗,就表示 Selenium 可以正常運作了,接下來就可以利用 Python 進行各種自動化的操作與測試了。
至於 Edge 與 Firefox 等瀏覽器的 WebDriver 使用方式也都大同小異,只要下載之後跟 Python 指令稿放在一起即可使用。
Selenium 可以控制瀏覽器進行各種動作,以下是在 Google 搜尋網頁中輸入關鍵字,進行搜尋的範例:
from selenium import webdriver from selenium.common.exceptions import TimeoutException from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By # 使用 Chrome 的 WebDriver browser = webdriver.Chrome() # 開啟 Google 首頁 browser.get("https://www.google.com") # 尋找網頁中的搜尋框 inputElement = browser.find_element_by_name("q") # 在搜尋框中輸入文字 inputElement.send_keys("Selenium") # 送出搜尋 inputElement.submit() # Google 搜尋結果的 XPath resultLocator = "//a/h3/div" try: # 等待網頁搜尋結果 WebDriverWait(browser, 10).until(EC.visibility_of_element_located((By.XPATH, resultLocator))) # 取得第一頁搜尋結果 page1_results = browser.find_elements_by_xpath(resultLocator) # 輸出搜尋結果 for item in page1_results: print(item.text) except TimeoutException: print('等待逾時!')
如果要使用 Google Chrome 中既有的 Profile 來進行測試,只要在建立 Chrome 的 WebDriver 時加入一些額外的參數,指定要使用的 Profile 即可:
from selenium import webdriver # 設定參數 options = webdriver.ChromeOptions() options.add_argument("--user-data-dir=C:UsersOfficeGuideAppDataLocalGoogleChromeUser Data") options.add_argument("--profile-directory=Profile 1") # 使用自訂參數的 WebDriver browser = webdriver.Chrome(options=options) # ...