appium+python自動化49-yaml管理定位元素
阿新 • • 發佈:2018-05-17
絕對路徑 ech alt 生成 join http mar _file__ OS
如何高效管理定位元素,這個是很有學問的問題,也是面試必問的[以下純屬個人觀點,勿噴!]。
- 有的人用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-8 import yaml import 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 pageElements if __name__ == "__main__": a = parseyaml() print(a) for i in a["HomePage"][‘locators‘]: print(i)
運行結果:
下一篇講通過templetpage模板自動生成pageobject模式的代碼(用代碼去寫代碼)
appium+python自動化49-yaml管理定位元素