POM设计原理
POM(page object model)
页面对象模型,主要应用于
UI
自动化测试框架的搭建,主流设计模式之
一,页面对象模型:结合面向对象编程思路:把项目的每个页面当做一个对象进行编程
POM的版层
第一层
:basepage
层
:
描述每个页面相同的属性及行为
第二层:
pageobject
层
(
每个的独有特征及独有的行为
)
第三层:
testcase
层
(
用例层,描述项目业务流程
)
第四层:
testdata(
数据层
)
代码实现
非
po
模型(风车动漫)
from appium import webdriver
from appium.webdriver.common.touch_action import TouchAction
caps = {}
caps["deviceName"] = "emulator-5554"
caps["platformName"] = "Android"
caps["appPackage"] = "fengchedongman.apps.com"
caps["appActivity"] = "com.Stub.App"
driver = webdriver.Remote("http://localhost:4723/wd/hub", caps)
driver.implicitly_wait(60)
a1=driver.find_element_by_xpath('//*[contains(@text,"进入软件")]')
a1.click()
a1=driver.find_element_by_xpath('//*[contains(@text,"进入软件")]')
a1.click()
a2=driver.find_element_by_id('com.android.packageinstaller:id/permission_allow_button')
a2.click()
a2=driver.find_element_by_id('com.android.packageinstaller:id/permission_allow_button')
a2.click()
a2=driver.find_element_by_id('com.android.packageinstaller:id/permission_allow_button')
a2.click()
a3=driver.find_element_by_xpath('/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.view.ViewGroup/android.view.ViewGroup[1]/android.view.View')
a3.click()
a4=driver.find_element_by_id('fengchedongman.apps.com:id/xo')
a4.click()
a4=driver.find_element_by_xpath('/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/androidx.viewpager.widget.ViewPager/android.widget.LinearLayout/android.widget.LinearLayout/android.view.ViewGroup/android.view.View')
a4.click()
a4=driver.find_element_by_id('fengchedongman.apps.com:id/a0o')
a4.send_keys('冒险')
a4=driver.find_element_by_id('fengchedongman.apps.com:id/a0j')
a4.click()
a5=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/androidx.viewpager.widget.ViewPager/android.widget.RelativeLayout/android.widget.LinearLayout[2]/android.view.ViewGroup/androidx.recyclerview.widget.RecyclerView/android.widget.LinearLayout[1]/android.widget.ImageView')
a5.click()
a5=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.RelativeLayout/android.widget.ScrollView/android.widget.LinearLayout/android.widget.LinearLayout[3]/android.widget.FrameLayout[2]/android.widget.LinearLayout/androidx.recyclerview.widget.RecyclerView/android.widget.LinearLayout[2]/android.widget.LinearLayout/android.widget.LinearLayout/android.widget.LinearLayout[1]/android.widget.TextView')
a5.click()
po
模型操作
basepage
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 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)
datayaml
caps:
deviceName : "emulator-5554"
platformName : "Android"
appPackage : "fengchedongman.apps.com"
appActivity : "com.Stub.App"
reradyaml
import yaml,os
class ReadYaml():
def readyaml(self,a):
path = os.path.abspath(os.path.dirname(os.path.dirname(__file__)))
dd = os.path.join(path, a)
with open(dd,'r',encoding='utf-8') as f :
data=yaml.load(stream=f,Loader=yaml.FullLoader)
return data
pages
page1
from base.basepage import BasePages
from appium.webdriver.common.mobileby import MobileBy
class Page1(BasePages):
def __init__(self,driver):
BasePages.__init__(self,driver)
def join1(self):
self.click(MobileBy.XPATH,"//*[contains(@text,'进入软件')]")
def join2(self):
self.click(MobileBy.XPATH,"//*[contains(@text,'进入软件')]")
page2
from base.basepage import BasePages
from appium.webdriver.common.mobileby import MobileBy
class Page2(BasePages):
def __init__(self,driver):
BasePages.__init__(self,driver)
def qx1(self):
self.click(MobileBy.ID,'com.android.packageinstaller:id/permission_allow_button')
def qx2(self):
self.click(MobileBy.ID,'com.android.packageinstaller:id/permission_allow_button')
def qx3(self):
self.click(MobileBy.ID,'com.android.packageinstaller:id/permission_allow_button')
page3
from base.basepage import BasePages
from appium.webdriver.common.mobileby import MobileBy
class Page3(BasePages):
def __init__(self,driver):
BasePages.__init__(self,driver)
def book_list(self):
self.click(MobileBy.XPATH,'/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.view.ViewGroup/android.view.ViewGroup[1]/android.view.View')
page4
from base.basepage import BasePages
from appium.webdriver.common.mobileby import MobileBy
class Page4(BasePages):
def __init__(self,driver):
BasePages.__init__(self,driver)
def tips(self):
self.click(MobileBy.ID,'fengchedongman.apps.com:id/xo')
def search1(self):
self.click(MobileBy.XPATH,'/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/androidx.viewpager.widget.ViewPager/android.widget.LinearLayout/android.widget.LinearLayout/android.view.ViewGroup/android.view.View')
def search2(self,text):
self.input(text,MobileBy.ID,'fengchedongman.apps.com:id/a0o')
def search3(self):
self.click(MobileBy.ID,'fengchedongman.apps.com:id/a0j')
page5
from base.basepage import BasePages
from appium.webdriver.common.mobileby import MobileBy
class Page5(BasePages):
def __init__(self,driver):
BasePages.__init__(self,driver)
def dianjimanhua(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/androidx.viewpager.widget.ViewPager/android.widget.RelativeLayout/android.widget.LinearLayout[2]/android.view.ViewGroup/androidx.recyclerview.widget.RecyclerView/android.widget.LinearLayout[1]/android.widget.ImageView')
def addshuoc(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.RelativeLayout/android.widget.ScrollView/android.widget.LinearLayout/android.widget.LinearLayout[3]/android.widget.FrameLayout[2]/android.widget.LinearLayout/androidx.recyclerview.widget.RecyclerView/android.widget.LinearLayout[2]/android.widget.LinearLayout/android.widget.LinearLayout/android.widget.LinearLayout[1]/android.widget.TextView')
单元测试
import unittest
from appium import webdriver
from readdata.readyaml import ReadYaml
from pages.page1 import Page1
from pages.page2 import Page2
from pages.page3 import Page3
from pages.page4 import Page4
from pages.page5 import Page5
a=ReadYaml()
r=a.readyaml('data/datayaml.yaml')
class AppTest(unittest.TestCase):
@classmethod
def setUpClass(cls) -> None:
cls.driver=webdriver.Remote("http://localhost:4723/wd/hub",r['caps'])
cls.driver.implicitly_wait(60)
def test_001(self):
x=Page1(self.driver)
x.join1()
x.join2()
def test_002(self):
x=Page2(self.driver)
x.qx1()
x.qx2()
x.qx3()
def test_003(self):
x=Page3(self.driver)
x.book_list()
def test_004(self):
x=Page4(self.driver)
x.tips()
x.search1()
x.search2('冒险')
x.search3()
def test_005(self):
x=Page5(self.driver)
x.dianjimanhua()
x.addshuoc()
@classmethod
def tearDownClass(cls) -> None:
cls.driver.quit
if __name__ == '__main__':
unittest.main()