前言
如何高效管理定位元素,這個是很有學問的問題,也是面試必問的[以下純屬個人觀點,勿噴!]。
- 有的人用xml管理頁面定位元素,這種逼格略高,但是小編認為學習成本大,賊麻煩。
- 有的人提到用excel管理頁面定位元素,這種略顯逼格,至少做到了數據分離,但是讀取excel太慢,不夠高效,還得在excel里面維護,忒麻煩。
- 有的人說把定位元素放數據庫管理,這種除了裝逼,沒覺得有多高效,當然有小伙伴提到接口測試數據量比較大的時候,這種方法還可以。
- 有的人用pageobject模式,直接在page類寫定位方法,雖然這種沒直接把定位獨立出來,但這種非常直觀,也易於閱讀
那么有沒有一種方法,既高效,直觀,方便,又能裝逼,還能迎合面試官口味呢?接下來就是要講的這種yaml文件管理
對yaml不了解的可以看我之前發的這篇python筆記14-讀取yaml配置文件
環境:
python 3.6
appium 1.8
美團app
yaml包安裝:pip install pyyaml
PageObject
1.先回顧一下PageObject模式定位元素的寫法,如下這種:
class HomePage:
'''dec: 首頁'''
# name: 城市選擇
city_loc = ("id", "com.sankuai.meituan:id/city_button")
# name: 首頁搜索
home_loc = ("id", "com.sankuai.meituan:id/search_edit")
yaml管理定位
1.把定位方法放到yaml文件管理,美團app首頁元素定位如下:
HomePage:
dec: 首頁
# 作者:上海-悠悠 QQ交流群:330467341
locators:
-
name: 城市選擇
type: id
value: com.sankuai.meituan:id/city_button
-
name: 首頁搜索
type: id
value: com.sankuai.meituan:id/search_edit
2.app上[我的]菜單頁定位
MyPage:
dec: 我的
locators:
-
name: 我的
type: accessibility_id
value: 我的
-
name: 請點擊登錄
type: id
value: com.sankuai.meituan:id/user_name
3.登錄頁面定位,這里我把登錄的幾個流程頁合並到一起了
---
LoginPage:
dec: 登錄頁
locators:
-
name: 微信登錄
type: id
value: com.sankuai.meituan:id/passport_button_wechat
-
name: 手機號登錄
type: id
value: com.sankuai.meituan:id/passport_button_meituan
-
name: 其它登錄
type: id
value: com.sankuai.meituan:id/passport_button_other
-
name: QQ
type: xpath
value: //*[@text='QQ']
-
name: 微博
type: xpath
value: //*[@text='微博']
-
name: 賬號密碼
type: xpath
value: //*[@text='賬號密碼']
-
name: 輸入賬號
type: id
value: com.sankuai.meituan:id/edit_account
-
name: 輸入密碼
type: id
value: com.sankuai.meituan:id/edit_password
-
name: 登錄按鈕
type: id
value: com.sankuai.meituan:id/login_button
遍歷讀取os.walk()
1.把不同頁面的元素放到對應的頁面.yaml文件里,放到同一個目錄下,方便一次性遍歷讀取
- 在page總目錄下,建一個pageelement的文件夾(這里是文件夾,里面不要有__init__.py文件),里面放頁面元素的定位,不同的頁面定義不同的namepage.yaml.
- templetpage放一個自動生成用例的模板(這個模板是沒后綴的文件),接下來會講
- tools.py 用於運行代碼后自動生成pages.py腳本
- pages.py 運行tools里面代碼后生成的
2.os.walk()遍歷讀取文件,之前有一篇專門講過了python筆記4-遍歷文件夾目錄os.walk()
# coding:utf-8
import yaml
import os
# 當前腳本路徑
basepath = os.path.dirname(os.path.realpath(__file__))
# yaml文件夾
yamlPagesPath = os.path.join(basepath, "pageelement")
def parseyaml():
'''
# 作者:上海-悠悠 QQ交流群:330467341
遍歷讀取yaml文件
'''
pageElements = {}
# 遍歷讀取yaml文件
for fpath, dirname, fnames in os.walk(yamlPagesPath):
for name in fnames:
# yaml文件絕對路徑
yaml_file_path = os.path.join(fpath, name)
# 排除一些非.yaml的文件
if ".yaml" in str(yaml_file_path):
with open(yaml_file_path, 'r', encoding='utf-8') as f:
page = yaml.load(f)
pageElements.update(page)
return pageElements
if __name__ == "__main__":
a = parseyaml()
print(a)
for i in a["HomePage"]['locators']:
print(i)
運行結果:
下一篇講通過templetpage模板自動生成pageobject模式的代碼(用代碼去寫代碼)
上海-悠悠 QQ交流群:330467341