標籤:ext 介面 tool htm 指令碼 流程 arch 運行 san
如何高效管理定位元素,這個是很有學問的問題,也是面試必問的[以下純屬個人觀點,勿噴!]。
- 有的人用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: 首頁 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-8import yamlimport os# 當前指令碼路徑basepath = os.path.dirname(os.path.realpath(__file__))# yaml檔案夾yamlPagesPath = os.path.join(basepath, "pageelement")def parseyaml(): ‘‘‘ 遍曆讀取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 pageElementsif __name__ == "__main__": a = parseyaml() print(a) for i in a["HomePage"][‘locators‘]: print(i)
運行結果:
下一篇講通過templetpage模板自動產生pageobject模式的代碼(用代碼去寫代碼)
appium+python自動化49-yaml管理定位元素