[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 是必要的,有些設計需求可以在很早期就知道,測試人員也可以幫忙檢查是否符合需求或是對於設計給一點建議。
繼續加油吧 ! 希望大家都能~好好睡覺~好好生活~好好工作 !
即將進入廣告,捲動後可繼續閱讀
為什麼會看到廣告
avatar-img
3會員
9內容數
Drunk Wis
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
Wis Vocus 的其他內容
幾年前,偶然的在某社群聽見 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 參考資料:
你可能也想看
Google News 追蹤
Thumbnail
在創作的路上真的很多人問我說 到底要怎麼做出符合自己期待 但又可以表現得很有美感的作品?🥹 這個問題真的應該是每個創作者都一直在學習的課題吧!
提問的內容越是清晰,強者、聰明人越能在短時間內做判斷、給出精準的建議,他們會對你產生「好印象」,認定你是「積極」的人,有機會、好人脈會不自覺地想引薦給你
偏偏今天身體不舒服,在去教室的路上都想過放棄。 但馬上開始學習 Python,錯過應該不得了,還是振作起來去了。 事實證明果然是相當充實的一天,熟悉了python的多項指令,老師很厲害(激推)!!! 用輕鬆簡單的方式讓大家了解程式的原理,且奇妙的在一心多用的情況下(?)吸收了很多東西。
Thumbnail
這篇文章介紹了面試時以及開始工作後可能會遇到的問題,包括物件導向OOP、SOLID 設計原則、測試方式,以及 Cookie、Session 與 Cache 的相似處與不同處。提供了豐富的相關資訊。
Thumbnail
Selenium 是一個範圍廣泛的工具和函式庫的總稱專案,用於啟用和支援網頁瀏覽器的自動化。Selenium WebDriver 提供了 C#、JavaScript、Java、Python、Ruby 等多種語言的 API,可以用於編寫自動化測試軟體。 在定位元素時,WebDriver 提供對這 8
在一次五天的年假中,我決定開始學習Python編程。雖然最初進展順利,但後來發現自己在解題和邏輯方面遇到了困難。經過思考後,我決定轉而學習C/C++,並且制定了一個計畫,希望成為一名後端工程師。這將需要挑戰我的時間管理能力。
Thumbnail
這一節談的是用物件導向程式設計(object-oriented programming, OOP)的方式來實作隨機漫步。
我不知道跟我有沒有關係,我剛出社會的時候剛好到一家還算蠻大的網站公司,那個時後公司很多技術很不成熟,所以他們問我我都是怎麽測試網站,總之呢!狗眼看人低,他們以為我只是點開每一個連結檢查網頁,所以他們覺得自己很厲害就開始寫一些只會點開網站的程式,事實上網站測試是一頁一頁全憑經驗預知道客戶是怎樣使用一頁
Thumbnail
初入IT產業的人士在學習Python語言後,IT證照如ITS Python認證是否值得考取?本文以ITS證照特點、實施建議和IT認證考試資訊為主,詳述證照的好處和準備時間。
上一篇主要在說如何做決定的,這篇就來寫寫面試前該做什麼準備。
Thumbnail
前文提到我按照某公司培訓營的指示自學了Scratch,並完成了一個不太理想的「半成品」程式。幾個月後,我參加了另一個課程,不同的是這次是使用PHP,為期三天(週三至週五),每天上課四小時,總計約12小時。課程內容包括基礎語法與環境架設、網路爬蟲、實際構建購物車並與資料庫進行串接。
Thumbnail
在創作的路上真的很多人問我說 到底要怎麼做出符合自己期待 但又可以表現得很有美感的作品?🥹 這個問題真的應該是每個創作者都一直在學習的課題吧!
提問的內容越是清晰,強者、聰明人越能在短時間內做判斷、給出精準的建議,他們會對你產生「好印象」,認定你是「積極」的人,有機會、好人脈會不自覺地想引薦給你
偏偏今天身體不舒服,在去教室的路上都想過放棄。 但馬上開始學習 Python,錯過應該不得了,還是振作起來去了。 事實證明果然是相當充實的一天,熟悉了python的多項指令,老師很厲害(激推)!!! 用輕鬆簡單的方式讓大家了解程式的原理,且奇妙的在一心多用的情況下(?)吸收了很多東西。
Thumbnail
這篇文章介紹了面試時以及開始工作後可能會遇到的問題,包括物件導向OOP、SOLID 設計原則、測試方式,以及 Cookie、Session 與 Cache 的相似處與不同處。提供了豐富的相關資訊。
Thumbnail
Selenium 是一個範圍廣泛的工具和函式庫的總稱專案,用於啟用和支援網頁瀏覽器的自動化。Selenium WebDriver 提供了 C#、JavaScript、Java、Python、Ruby 等多種語言的 API,可以用於編寫自動化測試軟體。 在定位元素時,WebDriver 提供對這 8
在一次五天的年假中,我決定開始學習Python編程。雖然最初進展順利,但後來發現自己在解題和邏輯方面遇到了困難。經過思考後,我決定轉而學習C/C++,並且制定了一個計畫,希望成為一名後端工程師。這將需要挑戰我的時間管理能力。
Thumbnail
這一節談的是用物件導向程式設計(object-oriented programming, OOP)的方式來實作隨機漫步。
我不知道跟我有沒有關係,我剛出社會的時候剛好到一家還算蠻大的網站公司,那個時後公司很多技術很不成熟,所以他們問我我都是怎麽測試網站,總之呢!狗眼看人低,他們以為我只是點開每一個連結檢查網頁,所以他們覺得自己很厲害就開始寫一些只會點開網站的程式,事實上網站測試是一頁一頁全憑經驗預知道客戶是怎樣使用一頁
Thumbnail
初入IT產業的人士在學習Python語言後,IT證照如ITS Python認證是否值得考取?本文以ITS證照特點、實施建議和IT認證考試資訊為主,詳述證照的好處和準備時間。
上一篇主要在說如何做決定的,這篇就來寫寫面試前該做什麼準備。
Thumbnail
前文提到我按照某公司培訓營的指示自學了Scratch,並完成了一個不太理想的「半成品」程式。幾個月後,我參加了另一個課程,不同的是這次是使用PHP,為期三天(週三至週五),每天上課四小時,總計約12小時。課程內容包括基礎語法與環境架設、網路爬蟲、實際構建購物車並與資料庫進行串接。