天天看点

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()