[Python][Selenium] WebDriver Page Object Model Design Pattern 的一些想法

閱讀時間約 7 分鐘
Selenium WebDriver Page Object Model (POM) 設計模式,若是有開發過 UI 自動化測試或是寫網路爬蟲的多少都有聽過或是看過吧! 
最近剛好有幸接觸到某外商的 SDET 面試考試,題目要求使用 POM 設計 UI 自動化測試,又再度幫自己複習一遍。
想了一下,我從開始接觸 Selenium 約莫是5年吧! 
從一開始的各種未知 > 新手入門 Selenium IDE > Selenium 2.0 > Selenium 3.0 一直到現在...經歷了踩過無數次的坑,算是能有一點自己的想法的吧 :D

Why?

人生總是因為這個 Why? 變的生活無法自理...
你一定會跟我一樣的問著: Python + Selenium 直接寫就好啦! 為什麼要這麼麻煩呢? 我還要學習物件導向 !? 為什麼不 function call 一 call 就好啦!
這些疑問隨著維護的程式越來越龐大搞到自己差點生活無法自理,當自己製造一堆技術債後,對工作會越來越不起勁,然後大崩潰...接著想離開公司...然後到另一間公司繼續製造技術債... ( 把自己的屎留給別人吃最棒了 XD

What?

先來想一下,假如我們不考慮其他狀況,直接果斷開始寫會如何 ?
有些痛苦,還是必須自己體會與承受 !
先設定一個目標,就把 Instagram 登入頁面當作待測頁面吧!
在不考慮註冊,忘記密碼,App Store 下載等方式...
寫個自動化測試程式來測試這個登入頁面吧!

How?

該怎麼開始? 當你接到這個要求到完成測試程式需要考量那些問題?
我想還是先把 Test Case 列下來吧 !
1. 使用者成功登入IG
2. 使用者使用不同瀏覽器登入
3. 轉跳至Facebook登入頁面
4. 使用者輸入錯誤的帳號
5. 使用者輸入錯誤的密碼
先以簡單的考量為主,列出了五個測試案例,接著開始用 Python + Selenium 實現吧!
首先會先遇到一個問題,My God! 我要下載瀏覽器的 Driver ...
(好麻煩... 算了先不解釋... 有興趣看一下這篇~~~
不管什麼設計了 ! 通通加再一起做成撒尿牛丸吧 !
如果全部參在一起,不考慮任何設計結構,程式的長相大概會像上面那個樣子。各自有各自的 driver instance 與各自的 function,然而當你遇到快速變化的使用者介面或是多變的使用者需求,這樣的設計結構會產生幾個問題 ( 當然 ! 我也曾經寫過類似的設計 Q_Q ) :
1. 程式龐大起來難以維護
2. 很難有個統一的 webdriver driver wait timeout
3. element locator 難以被 reuse
4. 提高下一個維護者離職的機率 XD

So?

如果使用了 Page Object Model Design Pattern 會是什麼樣的美好人生? 還是會是另一個大災難 ? 想像一下架構大概會是這個樣子:
將 Test Case 的位階拉到最高,成為一個可執行的 Spec,再以 Web 頁面拆分,每個頁面會是一個獨立的 Page Object 搭配 Locator 所組成。透過繼承 Base Page 的基本 Web 操作,由 Page Object 執行頁面的特定操作,例如: click_login_button, input_username ... 之類的 ( 如果做到極致,必須保持 Clean Code 的單一原則 ),Page Locator 的職責就很簡單,負責管理網頁元件的定位器,ID、NAME、XPATH ... 或是 Alert message 之類的。
來看 Code 吧 ! 先從 Test case 開始 !
至於...為什麼要這樣寫 ? 可以參考這篇。
將 Test Case 以 Gherkin 語法寫成連普通人都可以讀的懂的方式,然而它也是一個可以執行的 Spec,如此一來對所有專案相關人都有一致的溝通文件,產出測試報告時,也能夠以大家都看得懂的方式呈現。

Base Page

base_page.py 則是制定一系列的 Selenium 的 Web 基本操作,如上面所見的 methods 與統一的參數設定 ,好處有以下幾種:
1. Project 規格統一(timeout, wait...)
2. Selenium 版本更新時,改變時也不需要改動太大 (統一介面)
3. 模組化的架構能夠輕易的被重複使用,進而減少重複的程式片段
4. 透過從外部傳入的 driver 參數 僅使用一個 driver instance

Locators

Page Object

繼承 Base Page 而來的 Instagram Login Page Object 擁有一樣的基礎 Web 操作,也把 Locators 倒入至 Login Page 物件內,接著細分 Login Page 所需要的各種操作,以上面程式為例,拆分為登入、輸入、點擊、驗證...等幾個細部動作。有這些細部動作之後,再到 Test Case Step 去把每個動作串聯起來~就大功告成啦!
完整專案就到 GitHub 參考吧!

Then?

結論的部分,目前已經將 Page Object Model 導入幾個 Legacy Project,早期的專案不太注重 Unit Test 以至於需要大量的 End to End Test 去維護專案的品質。近幾年維護下來,還算是可以接受的! 不過 UI test 只要一多,自動化測試不穩定的狀況也會跟著多,可能每天都花時間在看 Fail Case 就飽了! 最根本的方式還是要把基底打好吧! 就像各類書上說的 Unit Test > Integration Test (API) > UI Test。
喔對了! 整個研發團隊的合作還是很重要的,需要有好的軟體品質,還是需要不斷的討論,藉著每次的討論,都可以有一些收穫。如果可以 QA or SDET 一起加入 Product Code Review 或是前期的 Design 是必要的,有些設計需求可以在很早期就知道,測試人員也可以幫忙檢查是否符合需求或是對於設計給一點建議。
繼續加油吧 ! 希望大家都能~好好睡覺~好好生活~好好工作 !
為什麼會看到廣告
1會員
9Content count
留言0
查看全部
發表第一個留言支持創作者!
Wis Chang的沙龍 的其他內容
幾年前,偶然的在某社群聽見 Robot Framework 這套開源框架,起初抱持著好奇的心情簡單的玩了一下,不過當時完全不理解,用這種 Keyword 方式去撰寫自動化測試的好處在哪? ( 不過就是…我知識不足罷了XD ) 。 接下來,我就可以跑測試拉~! 接著看 log.html:
人生只有一次,在不斷的做選擇之中,不一定都是馬上可以得到解答,常常是一段時間或是幾年後,回過頭來審視自己才能知道答案。看看自己成長了多少?看看自己是不是又犯下後悔不已的事?看看自己是不是改變了? 人生是一台單程高鐵,不能回頭,但可回首。 學生時代的揮霍人生 - 盡情享樂吧 ! 還記得,當年我還是個愛
畢竟~我是一個懶人嘛... 估狗之後,大部分的做法就是手動的去下載當前瀏覽器對應版本的 Driver,放到一個特定位置,將 Driver Binary 位置指向它。 在 Google Chrome About Page 你可以看到版本 接著去下載對應的 Chrome Driver ↓ 解決方案:
前言 隨著越來越多公司導入 DevOps 、Agile、Scrum 開發模式,作為基礎設施的 CI / CD Pipeline 也越來越被需要。但是導入的過程中, 總會遇到一些問題: CI / CD Pipeline 該怎麼建 !? Pipeline 工具該怎麼選擇 !? 老天 : 去看書 ! …
某天收到一封來自 Google TW - Test Engineer, Android 的面試邀請,於是開始請HR幫忙安排後續一切事情,首先要先感謝 HR Jenny 很用心、很細心的跟我說明接下來面試的流程,也提供我許多面試相關的參考文件,真的是萬般感謝,讓我感到備受尊重。當然! 面試不外乎還是要
什麼是Pytest? Pytest是一款強大的Python測試工具,支援平行化測試,使用上簡單方便,適合用在各種不同類型的軟體架構,也適用於RD、QA或獨立測試小組,也適合正要導入TDD的公司。 來寫測試吧! 先用pip安裝pytest: libs\module.py 參考資料:
幾年前,偶然的在某社群聽見 Robot Framework 這套開源框架,起初抱持著好奇的心情簡單的玩了一下,不過當時完全不理解,用這種 Keyword 方式去撰寫自動化測試的好處在哪? ( 不過就是…我知識不足罷了XD ) 。 接下來,我就可以跑測試拉~! 接著看 log.html:
人生只有一次,在不斷的做選擇之中,不一定都是馬上可以得到解答,常常是一段時間或是幾年後,回過頭來審視自己才能知道答案。看看自己成長了多少?看看自己是不是又犯下後悔不已的事?看看自己是不是改變了? 人生是一台單程高鐵,不能回頭,但可回首。 學生時代的揮霍人生 - 盡情享樂吧 ! 還記得,當年我還是個愛
畢竟~我是一個懶人嘛... 估狗之後,大部分的做法就是手動的去下載當前瀏覽器對應版本的 Driver,放到一個特定位置,將 Driver Binary 位置指向它。 在 Google Chrome About Page 你可以看到版本 接著去下載對應的 Chrome Driver ↓ 解決方案:
前言 隨著越來越多公司導入 DevOps 、Agile、Scrum 開發模式,作為基礎設施的 CI / CD Pipeline 也越來越被需要。但是導入的過程中, 總會遇到一些問題: CI / CD Pipeline 該怎麼建 !? Pipeline 工具該怎麼選擇 !? 老天 : 去看書 ! …
某天收到一封來自 Google TW - Test Engineer, Android 的面試邀請,於是開始請HR幫忙安排後續一切事情,首先要先感謝 HR Jenny 很用心、很細心的跟我說明接下來面試的流程,也提供我許多面試相關的參考文件,真的是萬般感謝,讓我感到備受尊重。當然! 面試不外乎還是要
什麼是Pytest? Pytest是一款強大的Python測試工具,支援平行化測試,使用上簡單方便,適合用在各種不同類型的軟體架構,也適用於RD、QA或獨立測試小組,也適合正要導入TDD的公司。 來寫測試吧! 先用pip安裝pytest: libs\module.py 參考資料:
你可能也想看
Thumbnail
1.加權指數與櫃買指數 週五的加權指數在非農就業數據開出來後,雖稍微低於預期,但指數仍向上噴出,在美股開盤後於21500形成一個爆量假突破後急轉直下,就一路收至最低。 台股方面走勢需觀察週一在斷頭潮出現後,週二或週三開始有無買單進場支撐,在沒有明確的反轉訊號形成前,小夥伴盡量不要貿然抄底,或是追空
Thumbnail
重點摘要: 1.9 月降息 2 碼、進一步暗示年內還有 50 bp 降息 2.SEP 上修失業率預期,但快速的降息速率將有助失業率觸頂 3.未來幾個月經濟數據將繼續轉弱,經濟復甦的時點或是 1Q25 季底附近
Thumbnail
近期的「貼文發佈流程 & 版型大更新」功能大家使用了嗎? 新版式整體視覺上「更加凸顯圖片」,為了搭配這次的更新,我們推出首次貼文策展 ❤️ 使用貼文功能並完成這次的指定任務,還有機會獲得富士即可拍,讓你的美好回憶都可以用即可拍珍藏!
Thumbnail
在讀取檔案時,最怕路徑的問題,常常會有路徑錯誤造成的異常報錯。 為了避免諸如此類的問題發生,明白程式的當前目錄與檔案的路徑是很重要的。 可以利用os 模組是 Python 中的一個標準庫,提供了許多與操作系統的功能。 以下是一些常用的 os 模組基本操作及其範例: 1. os.getcwd
解讀JSON 字串 首先,你需要使用 Python 的 json 模組來解讀JSON 字串。 JSON的基本結構: 由花括號 {} 包圍,內部是鍵值對的集合,每個鍵值對之間用逗號分隔。 鍵是字串類型,值可以是任何JSON支持的資料類型(字串、數字、布林值、陣列、物件或 null)。 {
Thumbnail
在我們正式開始Python串接LINE Bot的教程之前,有必要先為大家準備好所需的工具。實際上,製作LINE Bot的工具有很多選擇,我將會介紹我在製作過程中所使用的具體工具有哪些,以及如何進行事前的準備工作。讓我們一起走進這個有趣的製作過程吧!
Thumbnail
每當要研究投資標的時,你是否也會覺得A網站的財報資料完整,又覺得B網站的選股條件完善,又覺得C網站的新聞比較重要,有時身邊又沒有隨身攜帶筆電怎麼好查詢呢?這時可能就在想怎麼沒有人開發一個程式能完成符合我想要的功能啊~~與其求助於人,不如自己動手做最好,有相同煩惱的人,LINE Bot超適合你!!
Thumbnail
在看官網文件時,看到一份文件:PEP 8 -- Style Guide for Python Code。這份文件是關於Python程式碼風格的指引和建議。
Thumbnail
我希望透過在好學校開設「Python 的 50+ 練習:資料科學學習手冊」,讓學生一步步完成這門課程所有的觀念講解、範例實作以及練習之後,扎實地將 Python 程式設計與資料科學應用納入自己的技能組,成為一位擅長寫程式處理資料的分析師,大幅提升工作掌握度與職涯發展性!
Thumbnail
1.加權指數與櫃買指數 週五的加權指數在非農就業數據開出來後,雖稍微低於預期,但指數仍向上噴出,在美股開盤後於21500形成一個爆量假突破後急轉直下,就一路收至最低。 台股方面走勢需觀察週一在斷頭潮出現後,週二或週三開始有無買單進場支撐,在沒有明確的反轉訊號形成前,小夥伴盡量不要貿然抄底,或是追空
Thumbnail
重點摘要: 1.9 月降息 2 碼、進一步暗示年內還有 50 bp 降息 2.SEP 上修失業率預期,但快速的降息速率將有助失業率觸頂 3.未來幾個月經濟數據將繼續轉弱,經濟復甦的時點或是 1Q25 季底附近
Thumbnail
近期的「貼文發佈流程 & 版型大更新」功能大家使用了嗎? 新版式整體視覺上「更加凸顯圖片」,為了搭配這次的更新,我們推出首次貼文策展 ❤️ 使用貼文功能並完成這次的指定任務,還有機會獲得富士即可拍,讓你的美好回憶都可以用即可拍珍藏!
Thumbnail
在讀取檔案時,最怕路徑的問題,常常會有路徑錯誤造成的異常報錯。 為了避免諸如此類的問題發生,明白程式的當前目錄與檔案的路徑是很重要的。 可以利用os 模組是 Python 中的一個標準庫,提供了許多與操作系統的功能。 以下是一些常用的 os 模組基本操作及其範例: 1. os.getcwd
解讀JSON 字串 首先,你需要使用 Python 的 json 模組來解讀JSON 字串。 JSON的基本結構: 由花括號 {} 包圍,內部是鍵值對的集合,每個鍵值對之間用逗號分隔。 鍵是字串類型,值可以是任何JSON支持的資料類型(字串、數字、布林值、陣列、物件或 null)。 {
Thumbnail
在我們正式開始Python串接LINE Bot的教程之前,有必要先為大家準備好所需的工具。實際上,製作LINE Bot的工具有很多選擇,我將會介紹我在製作過程中所使用的具體工具有哪些,以及如何進行事前的準備工作。讓我們一起走進這個有趣的製作過程吧!
Thumbnail
每當要研究投資標的時,你是否也會覺得A網站的財報資料完整,又覺得B網站的選股條件完善,又覺得C網站的新聞比較重要,有時身邊又沒有隨身攜帶筆電怎麼好查詢呢?這時可能就在想怎麼沒有人開發一個程式能完成符合我想要的功能啊~~與其求助於人,不如自己動手做最好,有相同煩惱的人,LINE Bot超適合你!!
Thumbnail
在看官網文件時,看到一份文件:PEP 8 -- Style Guide for Python Code。這份文件是關於Python程式碼風格的指引和建議。
Thumbnail
我希望透過在好學校開設「Python 的 50+ 練習:資料科學學習手冊」,讓學生一步步完成這門課程所有的觀念講解、範例實作以及練習之後,扎實地將 Python 程式設計與資料科學應用納入自己的技能組,成為一位擅長寫程式處理資料的分析師,大幅提升工作掌握度與職涯發展性!