天天看點

app端自動化POM模型

POM模型

POM(page object model) 頁面對象模型,主要應用于 UI 自動化測試架構的搭建,主流設計模式之一,頁面對象模型:結合面向對象程式設計思路:把項目的每個頁面當做一個對象進行程式設計

PO模型 一般分為四層

第一層 :basepage 層 : 描述每個頁面相同的屬性及行為 第二層: pageobject 層 ( 每個的獨有特征及獨有的行為 ) 第三層: testcase 層 ( 用例層,描述項目業務流程 ) 第四層: testdata( 資料層 )

非po模型(在夜神中測試七貓小說)

from appium import webdriver
import time
caps = {}
caps["deviceName"] = "127.0.0.1:62001"
caps["platformName"] = "Android"
caps["appPackage"] = "com.kmxs.reader"
caps["appActivity"] = "com.kmxs.reader.home.ui.HomeActivity"
driver = webdriver.Remote("http://localhost:4723/wd/hub", caps)
driver.implicitly_wait(60)
# 點選搜尋
ssbutton = driver.find_element_by_id('com.kmxs.reader:id/book_store_strip_title_search')
ssbutton.click()

# 點選搜尋框
ssk = driver.find_element_by_id('com.kmxs.reader:id/search_text')
ssk.send_keys('系統')
#點選搜尋
ss = driver.find_element_by_id('com.kmxs.reader:id/search_tv')
ss.click()
# 點選系統
xt = driver.find_element_by_xpath('/hierarchy/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.RelativeLayout/android.support.v7.widget.RecyclerView/android.view.ViewGroup')
xt.click()

# 點選科幻
kh = driver.find_element_by_xpath("//*[contains(@text,'科幻')]")
kh.click()
# 點選完結
wj = driver.find_element_by_xpath("//*[contains(@text,'完結')]")
wj.click()
# 點選50萬字一下
zs = driver.find_element_by_xpath("//*[contains(@text,'50萬字以下')]")
zs.click()
#點選小說
xs = driver.find_element_by_xpath("/hierarchy/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.support.v7.widget.RecyclerView/android.view.ViewGroup[1]")
xs.click()

# 點選加書架
jsj  = driver.find_element_by_id("com.kmxs.reader:id/book_detail_foot_iv_book_status")
jsj.click()
           

po模型

basepage

from appium.webdriver.common.touch_action import TouchAction
class BasePages:
    def __init__(self,driver):
        self.driver = driver
    #元素定位
    def locator(self,*loc):
        return self.driver.find_element(*loc)
    #清空
    def clear(self,*loc):
        self.locator(*loc).clear()
    #輸入
    def input(self,test,*loc):
        self.locator(*loc).send_keys(test)
    #點選
    def click(self,*loc):
        self.locator(*loc).click()
    #點選坐标軸
    def clickxy(self,n,m):
        TouchAction(self.driver).tap(x =n,y = m).perform()
    #滑動(上下左右滑動)
    def swipe(self,start_x,start_y,end_x,end_y,duration=0):
        #擷取螢幕的尺寸
        window_size = self.driver.get_window_size()
        x = window_size["width"]
        y = window_size["height"]
        self.driver.swipe(start_x=x*start_x,
                          start_y=y*start_y,
                          end_x= x*end_x,
                          end_y=y*end_y,
                          duration=duration)
           

page1

from basepagedemo.basepage import BasePages
from appium.webdriver.common.mobileby import MobileBy
class Page1(BasePages):
    def __init__(self,driver):
        BasePages.__init__(self,driver)
    # 點選搜尋
    def click_seach(self):
        self.click(MobileBy.ID,'com.kmxs.reader:id/book_store_strip_title_search')
           

page2

from basepagedemo.basepage import BasePages
from appium.webdriver.common.mobileby import MobileBy
class Page2(BasePages):
    def __init__(self,driver):
        BasePages.__init__(self,driver)
    # 輸入系統
    def send_text(self,text):
        self.input(text,MobileBy.ID,"com.kmxs.reader:id/search_text")
    # 點選搜尋
    def click_search(self):
        self.click(MobileBy.ID,"com.kmxs.reader:id/search_tv")
    # 點選系統
    def click_system(self):
        self.click(MobileBy.XPATH,"/hierarchy/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.RelativeLayout/android.support.v7.widget.RecyclerView/android.view.ViewGroup")
           

page3

from basepagedemo.basepage import BasePages
from appium.webdriver.common.mobileby import MobileBy
class Page3(BasePages):
    def __init__(self,driver):
        BasePages.__init__(self,driver)
    # 點選科幻
    def click_kh(self):
        self.click(MobileBy.XPATH,"//*[contains(@text,'科幻')]")
    # 點選完結
    def click_wj(self):
        self.click(MobileBy.XPATH,"//*[contains(@text,'完結')]")
    # 點選50萬字以下
    def click_zs(self):
        self.click(MobileBy.XPATH,"//*[contains(@text,'50萬字以下')]")
    # 點選小說
    def click_xs(self):
        self.click(MobileBy.XPATH,"/hierarchy/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.support.v7.widget.RecyclerView/android.view.ViewGroup[1]")
           

page4

from basepagedemo.basepage import BasePages
from appium.webdriver.common.mobileby import MobileBy
class Page4(BasePages):
    def __init__(self,driver):
        BasePages.__init__(self,driver)
    # 點選加書架
    def click_jsj(self):
        self.click(MobileBy.ID,"com.kmxs.reader:id/book_detail_foot_iv_book_status")
           

測試用例

import unittest,time
from appium import webdriver
from pages.page1 import Page1
from pages.page2 import Page2
from pages.page3 import Page3
from pages.page4 import Page4

class TestClass(unittest.TestCase):
    @classmethod
    def setUpClass(cls) -> None:
        caps = {}
        caps["deviceName"] = "127.0.0.1:62001"
        caps["platformName"] = "Android"
        caps["appPackage"] = "com.kmxs.reader"
        caps["appActivity"] = "com.kmxs.reader.home.ui.HomeActivity"
        cls.driver = webdriver.Remote("http://localhost:4723/wd/hub", caps)
        cls.driver.implicitly_wait(60)
    def test_001(self):
        p1 = Page1(self.driver)
        p1.click_seach()
    def test_002(self):
        p2 = Page2(self.driver)
        p2.send_text('系統')
        p2.click_search()
        p2.click_system()
    def test_003(self):
        p3 = Page3(self.driver)
        p3.click_kh()
        p3.click_wj()
        p3.click_zs()
        p3.click_xs()
    def test_004(self):
        p4 = Page4(self.driver)
        p4.click_jsj()
    @classmethod
    def tearDownClass(cls) -> None:
        time.sleep(5)
        cls.driver.quit()
if __name__ == '__main__':
    unittest.main()
           

yaml檔案 優化po模型

data

caps:
  deviceName: 127.0.0.1:62001
  platformName: "Android"
  appPackage: com.kmxs.reader
  appActivity: com.kmxs.reader.home.ui.HomeActivity
           

readyaml

import yaml
def readyaml(path):
    with open(path,"r",encoding="utf-8") as f:
        data = yaml.load(stream=f,Loader=yaml.FullLoader)
        return data
           

優化的測試用例

import unittest,time,os
from appium import webdriver
from pages.page1 import Page1
from pages.page2 import Page2
from pages.page3 import Page3
from pages.page4 import Page4
from readdata.readyaml import readyaml
qwe = os.path.abspath(os.path.dirname(os.path.dirname(__file__)))
ff = os.path.join(qwe,"data\conf.yaml")
key = readyaml(ff)
class TestClass(unittest.TestCase):
    @classmethod
    def setUpClass(cls) -> None:
        # caps = {}
        # caps["deviceName"] = "127.0.0.1:62001"
        # caps["platformName"] = "Android"
        # caps["appPackage"] = "com.kmxs.reader"
        # caps["appActivity"] = "com.kmxs.reader.home.ui.HomeActivity"
        cls.driver = webdriver.Remote("http://localhost:4723/wd/hub", key['caps'])
        cls.driver.implicitly_wait(60)
    def test_001(self):
        p1 = Page1(self.driver)
        p1.click_seach()
    def test_002(self):
        p2 = Page2(self.driver)
        p2.send_text('系統')
        p2.click_search()
        p2.click_system()
    def test_003(self):
        p3 = Page3(self.driver)
        p3.click_kh()
        p3.click_wj()
        p3.click_zs()
        p3.click_xs()
    def test_004(self):
        p4 = Page4(self.driver)
        p4.click_jsj()
    @classmethod
    def tearDownClass(cls) -> None:
        time.sleep(5)
        cls.driver.quit()
if __name__ == '__main__':
    unittest.main()