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