Python 使用 Selenium 控制瀏覽器進行自動化測試

覺得我們的內容實用嗎?MyApollo 電子報讀者募集中!歡迎訂閱電子報!

現今很多程式系統是採用 Web 架構進行開發,使得瀏覽器也成為進行系統測試的一環,因此如何自動化的操控瀏覽器進行 Web 系統測試,成為必要的測試技術(畢竟人工太過耗時、也不具效率)。

自動化的瀏覽器測試方案很多,例如 PhantomJS, CasperJS, Zombie.js, Selenium 等,比比皆是。

其中,Selenium 提供的是利用瀏覽器進行測試的解決方案,整體而言會比較接近真正的使用者使用的情況,而且 Selenium 能夠透過所謂的 Selenium RC(Selenium Remote Control, 或稱 Selenium 1)進行遠端測試。簡而言之,Selenium RC 整體運作其實就像代理伺服器,負責接受來自遠端的測試請求,然後代為進行測試後回傳結果,如下圖所示。

Python 使用 Selenium 控制瀏覽器進行自動化測試

  • Selenium RC, 轉錄自 http://docs.seleniumhq.org/docs/05_selenium_rc.jsp

若要進行一般的自動化瀏覽器測試,其實並不需要如此,可以選擇較為方便的 Selenium IDE(Selenium’s Integrated Development Environment) ,也就是使用 Selenium 所開發的瀏覽器外掛程式,該外掛程式可以紀錄(record)使用者的操作過程,轉換成 Selenium 的相關指令,我們可以把這些指令存成腳本(script),測試時可以選擇腳本執行,詳細可以閱讀 Selenium IDE 的使用文件(連結)。

不過 Selenium IDE 僅限於瀏覽器上使用,如果需要使用自動化操控 Chrome, IE 等瀏覽器,就得使用 Selenium RC(Selenium Remote Control, 或稱 Selenium 1) 或 Selenium WebDriver (或者可稱為 Selenium 2)。

請直接選擇使用 Selenium WebDriver ,因為 Selenium WebDriver 已經整合原有的 Selenium RC 功能,在功能、效能上也增進許多,而官方也已經將 Selenium RC 視為舊時代的產物(legacy),因此建議使用 Selenium WebDriver 。

以下示範如何使用 Python Selenium WebDriver 控制 Chrome 進行自動化測試。

本文環境#

  • Python 3
  • Docker 20.10
  • macOS

本文是在 macOS 系統中以 Python 示範如何控制 Chrome 瀏覽器(Windows 平台上大同小異)。

安裝 Selenium 套件#

請先安裝 Python 2.7 以上的執行環境(本文使用 Python 3),並利用以下指令安裝 Python Selenium 套件:

$ pip install selenium

利用 Docker 下載 Selenium Server#

現在 Selenium 提供各種 Docker image 方便大家使用,可以節省自行架設的時間成本。

各種瀏覽器的 Docker image 可以在 Seleium GitHub 查看。

Selenium 官方提供的 Docker image 分為 2 種執行模式:

  1. Standalone
  2. Hub & Nodes

Hub & Nodes 模式會由一台機器執行 Selenium Hub 的功能,負責控制底下的多個 Selenium Node, 每個測試會送給 Selenium Hub 之後,由 Selenium Hub 派送到各個 Selenium Node 執行,適合有多種瀏覽器要進行測試的情境,每種瀏覽器可以獨立成單一個 Selenium Node 執行。

如果沒有什麼特殊需求,其實使用 Standalone 版本就足夠了,也就是 Selenium Hub 與 Selenium Node 會在同一個環境。

以下用 Docker 指令下載 Chrome Selenium Server 的指令:

$ docker run -d -p 4444:4444 -p 5900:5900 selenium/standalone-chrome:4.7.2-20221219

上述指令代表將 localhost 的通訊埠(port) 4444 導向 docker container 的通訊埠 4444 給,所以我們連 localhost:4444 就會連到 Selenium Server 。

此時可以用瀏覽器打開網址 http://localhost:4444/ui, 就能看到 Selenium Web UI 的畫面,並有一台 Linux 版本的 Chrome 正等待執行工作:

Python 使用 Selenium 控制瀏覽器進行自動化測試

5900 則是 VNC server 的通訊埠,因為 Selenium Node 在 Docker 內執行,我們無法輕易看到裡面瀏覽器執行的畫面,當測試有問題時,很難立馬知道在哪一個步驟出現問題,因此可以用 VNC client 連到 localhost:5900 查看執行畫面, Selenium 為 VNC 預設的密碼為 secret , 登入成功的話可以看到以下畫面:

Python 使用 Selenium 控制瀏覽器進行自動化測試

接著,可以撰寫透過 Selenium 控制瀏覽器的 Python 程式了。

撰寫 Python 程式#

最簡單的啟動 Chrome 範例程式碼

# run_selenium.py
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Remote(
   command_executor='http://127.0.0.1:4444/wd/hub',
   options=webdriver.ChromeOptions(),
)
driver.get('https://www.google.com')
try:
    element = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.NAME, 'q')) # 取得搜尋框
    )
    element.send_keys('Python') # 在搜尋框內輸入 'Python'
    element.submit() # 令 chrome driver 按下 submit
    time.sleep(5)
finally:
    driver.quit() # 關閉 chromedriver
$ python3 run_selenium.py

以上,就是一個簡單的使用範例。

如果需要更進階的使用方法,例如取得網頁上的控制項、輸入框等等,可以自行參閱以下文件:

此外,只要搭配 Python 單元測試(unittest)模組,就能夠撰寫各個網頁功能的單元測試,達到自動化測試的目標!

覺得內容實用嗎?

MyApollo 電子報讀者募集中!新文章與技術新知會直接寄到你的信箱。

訂閱電子報

對抗久坐職業傷害

研究指出每天增加 2 小時坐著的時間,會增加大腸癌、心臟疾病、肺癌的風險,也造成肩頸、腰背疼痛等常見問題。

然而對抗這些問題,卻只需要工作時定期休息跟伸展身體即可!

你想輕鬆改變現狀嗎?試試看我們的 PomodoRoll 番茄鐘吧!PomodoRoll 番茄鐘會根據你所設定的專注時間,定期建議你 1 項辦公族適用的伸展運動,幫助你打敗久坐所帶來的傷害!

馬上試用 PomodoRoll

贊助我們的創作

看完這篇文章了嗎? 休息一下,喝杯咖啡吧!

如果你覺得 MyApollo 有讓你獲得實用的資訊,希望能看到更多的技術分享,邀請你贊助我們一杯咖啡,讓我們有更多的動力與精力繼續提供高品質的文章,感謝你的支持!

Buy me a coffee

輸入關鍵字開始搜尋