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