PageObject 模式
- 無法適應(yīng) UI 變化,UI 變化會(huì)導(dǎo)致大量的 case 需要修改
- 大量的樣板代碼 driver find click
- 一旦出現(xiàn)非預(yù)期的彈框阻擋就會(huì)失敗
- 無法清晰表達(dá)業(yè)務(wù)用例場(chǎng)景
- 做法
- 以頁面為單位獨(dú)立建模
- 隱藏實(shí)現(xiàn)細(xì)節(jié)
-本質(zhì)是面向接口編程
- 優(yōu)點(diǎn)
- 減少重復(fù) find click 樣板代碼
- 易讀性提高
- 頁面修改不影響測(cè)試用例
PageObject 模式原則解讀
- 方法意義
- 用公共方法代表 UI 所提供的功能
- 方法應(yīng)該返回其他的 PageObject 或者返回用于斷言的數(shù)據(jù)
- 同樣的行為不同的結(jié)果可以建模為不同的方法
- 不要在方法內(nèi)斷言
- 字段意義
- 不要暴露頁面內(nèi)部的元素給外部
- 不需要建模 UI 內(nèi)的所有元素
登錄場(chǎng)景
- 登錄頁面提供 login findPassword 功能
- Login 類 + login findPassword 方法
- 登錄頁面內(nèi)的元素有多少并不關(guān)心,隱藏內(nèi)部界面控件
- 登錄成功和失敗會(huì)分別返回不同的頁面
- findPassword
- loginSuccess
- loginFail
- 通過方法返回值判斷登錄是否符合預(yù)期
基于 POM 的用例組織結(jié)構(gòu)
- page:完成對(duì)頁面的封裝
- testcase:調(diào)用各類 page 完成業(yè)務(wù)流程并進(jìn)行斷言
- data:配置文件和數(shù)據(jù)驅(qū)動(dòng)
- utils:其他邊界的功能封裝,可選
編寫用例順序
- 根據(jù)界面封裝 po 類與方法,實(shí)現(xiàn)暫時(shí)設(shè)置為空
- 編寫用例,明確 po 里方法的入?yún)?、返回值、斷?/li>
- 實(shí)現(xiàn) po 內(nèi)的方法,與自動(dòng)化框架開始結(jié)合
- 調(diào)試
- 整體類似 TDD 風(fēng)格
框架默認(rèn) po 定位策略的不足
- UI 的控件定位有復(fù)雜性,需要自定義
- 動(dòng)態(tài)加載的 UI,可以找到但是位置可能發(fā)生變動(dòng)
- 動(dòng)態(tài)加載的控件可能會(huì)獲取到最早的默認(rèn)值
- 動(dòng)態(tài)出現(xiàn)的一些 tips 需要特殊處理
- 改進(jìn)
- 自定義 find 方法,更靈活的 find 行為定義封裝
- 改進(jìn)默認(rèn)的注解
console.log(document.cookie)
echo 'cna=zc0GHlCIP20CAbcOhRwxKLSQ; munb=2212215434282; login_aliyunid_pk=1540126140801737; login_current_pk=1540126140801737; aliyun_lang=zh; ak_user_locale=zh_CN; ak_user_locale=zh_CN; _tb_token_=ee07b575475a1; csg=c8128c7e; t=d29cf1ba5a04a4a3cb850b64c58966cd; aliyun_country=CN; aliyun_site=CN; login_aliyunid_pks=BG+BX25ceeCsvL3k5eEuHYU3buoeLRmlp7TZ0CjwueXDfw=; login_aliyunid=dingtalk_no****; isg=BOvrvvXlCrhFYFaZklVKIZwregnVAP-CGyf5511oxiqB_Ate5dDW08rdUjySXFd6; l=fBMFB7sPPBWpl7FiBOfZFurza779sIRAguPzaNbMi9fP_L5B5hoFW1CN4GT6CnGVFsKwR3knvJt2BeYBc7F-nxv9JQZjEYkmndLHR35..; tfstk=eluM5gDPoJ6SRd7S9AU6RKTrMaKK1OabixQYHre2YJyB1Vp_WZomNJd_kcIOum2nhRET7xHcnAHLQrUtWEmmYx4x6GFtmDDsalHmGCN43xk0HcKpyfG_lrJ-oUL-1FtCbYpJpZWXmra2epLJyfG_lYcuuKjHnsQUww3esowlaehU2QY708laQfht85W8UfyFuZygslqn_JbVu2jPkMSza8_bTI3FciZaOW2RA9-3HGiKmIOHtg5bbWNaeBAhc1raOW4etBjPBlPQsp1..' | awk 'BEGIN{RS="; ";FS="="}{print "driver.manage().addCookie(new Cookie(\""$1"\",\""$2$3"\"));"}'
echo 'cna=zc0GHlCIP20CAbcOhRwxKLSQ; munb=2212215434282; login_aliyunid_pk=1540126140801737; login_current_pk=1540126140801737; aliyun_lang=zh; ak_user_locale=zh_CN; ak_user_locale=zh_CN; _tb_token_=ee07b575475a1; csg=c8128c7e; t=d29cf1ba5a04a4a3cb850b64c58966cd; aliyun_country=CN; aliyun_site=CN; login_aliyunid_pks=BG+BX25ceeCsvL3k5eEuHYU3buoeLRmlp7TZ0CjwueXDfw=; login_aliyunid=dingtalk_no****; isg=BOvrvvXlCrhFYFaZklVKIZwregnVAP-CGyf5511oxiqB_Ate5dDW08rdUjySXFd6; l=fBMFB7sPPBWpl7FiBOfZFurza779sIRAguPzaNbMi9fP_L5B5hoFW1CN4GT6CnGVFsKwR3knvJt2BeYBc7F-nxv9JQZjEYkmndLHR35..; tfstk=eluM5gDPoJ6SRd7S9AU6RKTrMaKK1OabixQYHre2YJyB1Vp_WZomNJd_kcIOum2nhRET7xHcnAHLQrUtWEmmYx4x6GFtmDDsalHmGCN43xk0HcKpyfG_lrJ-oUL-1FtCbYpJpZWXmra2epLJyfG_lYcuuKjHnsQUww3esowlaehU2QY708laQfht85W8UfyFuZygslqn_JbVu2jPkMSza8_bTI3FciZaOW2RA9-3HGiKmIOHtg5bbWNaeBAhc1raOW4etBjPBlPQsp1..' | awk 'BEGIN{RS="; ";}{print $0}' | grep "=.*=.*"
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。