Blog Cover Image

Inspire you to have New thinking, Walk out your unique Road.

有的時候,你無意間遇到的一些故事,會激發你的靈感,改變你的想法,接下來你會用與之前全然不同的觀念去創造屬於你獨特的故事。

Sign @MinaYu.

[QA] 初次學習自動測試 - Selenuim (Python + Chrome)

Posted on

從我的名片英文名字印錯,Back-end -> QA Engineer,我從產品開發的角色定位,原先是開發主要功能,一直到最近都是撰寫及維護核心程式的單元測試,然後公司主要的QA工程師離職後,我被賦予的新任務就是要接下QA的工作,測試產品。

直到最近,同事都會偷偷調侃我,名片印錯是在預言XD,以及本身是開發還兼做營運,所以是DevOps (You are Developer but do operation, so DevOps!)

這個分類還要叫 後端工程師 嗎? 我都快變QA 惹XD,從求學到現在,我從前端起家,不小心出社會變成後端,結果又要不小心變QA測試工程師了嗎XD

我覺得挺有趣的,說不定下份工作會是 DevOps工程師,哈哈!但無論如何,我覺得多學習都是好事情,有得學就很開心!


在不久的未來,我即將要使用Selenium撰寫產品的測試,身為一個後端的Junior 出社會不到一年,由於產品的核心演算法無法參與開發,加上團隊們要很趕的急速開發。作為一個小後端Junior,最好的角色就是跟在大家的屁股後面,撿各位資深前輩的丟下的臭蟲(Bugs)。

也就是看懂前輩們的程式碼,並製作成單元測試(測試後端),以及學使用Selenium 自動化測試前端!幫他們抓出臭蟲(有的時候會幫忙修臭蟲) (錯,是Always…)


學習QA測試 - Selenium

工作設備: MacBook Pro

一開始以為Selenium 是一個額外的軟體,他需要載一包執行檔像是 Chrome 那種應用程式來做執行。

後來我才發現,他其實很像是單元測試,在Python的運用中就是 pytest, unittest 的存在,而Selenium,其實就是Python的套件(Package),用一般安裝python套件的指令就能安裝。

也就是說運用上,不用像是載個新的應用程式適應,而是直接 import selenuim 就能運用,對於我這個常寫單元測試的人,我想 Selenium 我應該很快就能上手

Selenium 可以用很多種程式語言撰寫,但這篇我是介紹用python寫,而且也還是剛開始學習,所以只會教一點點(結果前面廢話超多QQ),之後有學習更多,在更新上來,也許不會只有這篇。

Selenium 套件內的功能來看,大致功能為:

  • 可以用很多程式語言撰寫自動化程式碼
  • 可以運用在不同的環境測試(各種瀏覽器, 手機, …)

這麼好用的東西居然不是應用程式,我也覺得很驚訝的

首先先來安裝 selenium,打開Terminal,輸入下列指令

# 安裝python,當然是用pip install啦,下指令後就可以去泡杯咖啡了
pip install selenium

安裝好selenium後,我們要來安裝自動化測試的環境,這邊我是裝google

也就是說可能要測試不同的環境,需要環境的驅動才能測試,畢竟 自動化,就是利用selenium打開環境開始自動操控執行。

這邊以google為範例,利用mac的套件管理系統 homebrew 來安裝google的驅動程式

# 用這兩個指令都能安裝,第一個跑不動的話,就用第二個吧!
brew install chromedriver

brew cask install chromedriver

安裝好惹,就開始我們基礎第一支簡單執行selenium的程式吧XD

參考網站

打開你的IDE (我是PyCharm)

將下列程式碼複製上去XD,跑一下就會開始自動執行Chrome了

# 結合單元測試的selenium! 原來我早已經是QA XD
# 只要向一般的python套件一樣import就能用!!
import unittest
from selenium import webdriver
from selenium.webdriver.common.by import By


class WebDriverPythonBasics(unittest.TestCase):


    def setUp(self):
        self.browser = webdriver.Chrome()


    def test_saucelabs_homepage_header_displayed(self):
        self.browser.get("https://www.saucelabs.com")
        element = self.browser.find_element(By.XPATH, '//a[text()="Platforms"]');
        self.assertTrue(element.is_displayed());
        element.click();
        pricing_link = self.browser.find_element(By.XPATH, '//a[text()="Pricing"]');
        self.assertTrue(pricing_link.is_displayed());
        pricing_link.click();


    def tearDown(self):
        self.browser.close()


if __name__ == '__main__':
        unittest.main()

執行完後,能看到 Selenium 自己打開Chrome 並自動到指定網站 https://www.saucelabs.com,自動點擊 網站內的 PlatformsPricing 並驗證(assertTrue)畫面有無正確。

我先前寫的單元測試都是用 unittest 去寫測試後端核心程式,而現在可以加上Selenium 來自動化測試前端,這讓我的測試功能更進一步,使產品程式碼更完善,讓我有一種技能樹又多點一分的感覺XDD,真的有一種從後端學習測試並有可能會晉升為 DevOps 的感覺xD


簡單講解幾段Code

和單元測試的 假設 » 驗證,相似,用 Selenium 做自動化測試時,也許要 assert 各種條件來驗證功能是否有達到標準。

去到指定網址

# 這行Code 主要讓Selenium自動去到 get(url) 內的網址
self.browser.get("https://www.saucelabs.com")

抓取網頁上的屬性,並執行

element = self.browser.find_element(By.XPATH, '//a[text()="Platforms"]');
element.click();

這段Code 主要功用是 利用抓取XPATH 的方法 來抓到要執行的那個功能 (有可能是按鈕,可能是textbox)

Selenium 有具備很多種抓取網頁屬性的方法,可以by_css, by_id,有興趣可以直接去看套件內的程式函式

.click(), 就是執行 按下去find_element 只是找到要執行的元素(某個按鈕,某個輸入框)

如何操控 google 的 pop-out 視窗,自動輸入值

這是我多加的功能,因為我有去找這方面的需求,簡單來說就是有時候進去網站或api,chrome會跳出視窗,請你輸入帳號密碼(所以通常是驗證用帳號密碼),他也不算在網頁內的元素,那麼要怎麼自動化這個部分呢?

# 在要前往該網頁/該api時,帶上驗證要求的資訊
# 假設帳號是admin, 密碼是pass123
self.browser = webdriver.Chrome()
self.browser.get("http://admin:pass123@120.88.xxx.ooo/")

http:// 後面打上 帳號資訊 : 密碼資訊 @ 網址

在執行測試自動化時,就會直接輸入帳號密碼登進去囉!

那麼第一堂幼幼班QA 程式紀錄就到這,後續有學習或更新再來紀錄!