1. 程式人生 > >appium+python自動化49-yaml管理定位元素

appium+python自動化49-yaml管理定位元素

絕對路徑 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管理定位元素