app端自动化POM

本文介绍了POM(页面对象模型)在UI自动化测试中的应用,阐述了POM的设计原理,并通过实例展示了如何分层实现POM模型,包括BasePage、PageObject、TestCase和TestData四个层次。此外,还探讨了使用YAML文件优化配置和数据驱动测试的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一:POM及POM设计原理
 POM(page object model)页面对象模型,主要应用于UI自动化测试框架的搭建,主流设计模式之一,页面对象模型:结合面向对象编程思路:把项目的每个页面当做一个对象进行编程

 python基础:什么对象

python中对象= 属性+行为       通过类定义=具有相同属性+相同行为对象集合

二:POM一版分为四层
 第一层:basepage层:描述每个页面相同的属性及行为
第二层:pageobject层(每个的独有特征及独有的行为)
第三层:testcase层(用例层,描述项目业务流程)
第四层:testdata(数据层)

三:代码实现
3.1:非po模型(夜神中qq登录)
from appium import webdriver
caps = {}
caps["platformName"] = "Android"
caps["deviceName"] = "127.0.0.1:62001"
caps["appPackage"] = "com.tencent.mobileqq"
caps["appActivity"] = "com.tencent.mobileqq.activity.LoginActivity"
driver = webdriver.Remote("http://localhost:4723/wd/hub", caps)
driver.implicitly_wait(30)
#导航界面
el2 = driver.find_element_by_id("com.tencent.mobileqq:id/btn_login")
el2.click()
#登录界面
el3 = driver.find_element_by_accessibility_id("请输入QQ号码或手机或邮箱")
el3.clear()
el3.send_keys("766603163")
el4 = driver.find_element_by_accessibility_id("密码 安全")
el4.clear()
el4.send_keys("lly19891024lly")
el5 = driver.find_element_by_accessibility_id("登 录")
el5.click()
3.2:po模型操作
3.2.1: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 click(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)
 3.2.2:业务页代码

3.2.2.1:daohang_page.py(导航模块)

from day02.base.basepage import BasePages
from appium.webdriver.common.mobileby import MobileBy
#导航页面= base层属性赫行为+当前界面的特有的属性行为
class DaoHangPage(BasePages):
    def __init__(self,driver):
        BasePages.__init__(self,driver)
    def click_login(self):
        self.click(MobileBy.ID,"com.tencent.mobileqq:id/btn_login")
3.2.3:单元测试模块

from day02.pageobjects.daohang_page import DaoHangPage
from day02.pageobjects.login_page import LoginPage
from appium import  webdriver
import pytest
import time
class TestClass():
    @classmethod
    def setup_class(cls) -> None:
        caps = {}
        caps["platformName"] = "Android"
        caps["deviceName"] = "127.0.0.1:62001"
        caps["appPackage"] = "com.tencent.mobileqq"
        caps["appActivity"] = "com.tencent.mobileqq.activity.LoginActivity"
        cls.driver = webdriver.Remote("http://localhost:4723/wd/hub", caps)
        cls.driver.implicitly_wait(30)
    def test_01_daohang(self):
        daohang = DaoHangPage(self.driver)
        daohang.click_login()
    def test_02(self):
        login  = LoginPage(self.driver)
        login.clear_name()
        login.input_name("766603163")
        login.clear_pass()
        login.input_pass("lly19891024lly")
        login.click_dl_button()
    @classmethod
    def teardown_class(cls) -> None:
        time.sleep(20)
        cls.driver.quit()
if __name__ == '__main__':
    pytest.main()
 

四:引入yuml文件
yaml文件:数据层次清晰,可以跨平台,支持多种语言使用(可以适用于别的app)

优化代码:提取basepage中的配置客户端数据(将配置的数据放在yaml中) 创建config--config.yaml

import yaml,os
def readYaml(path):
    with open(path,"r",encoding="utf-8") as file:
        data = yaml.load(stream=file,Loader=yaml.FullLoader)
        return data
if __name__ == '__main__':
    #os.path.dirname(__file__)当前文件的上一级目录
    #os.path.abspath(path)找到路径的绝对路径
    rootpath = os.path.abspath(os.path.dirname(os.path.dirname(__file__)))
    dd = os.path.join(rootpath , "config\config.yaml")
    print(dd)
    print(readYaml(dd))python
修改单元测试模块代码

import os
from day02.common.read_yaml import readYaml
from day02.pageobjects.daohang_page import DaoHangPage
from day02.pageobjects.login_page import LoginPage
from appium import  webdriver
import pytest
import time
class TestClass():
    @classmethod
    def setup_class(cls) -> None:
        # caps = {}
        # caps["platformName"] = "Android"
        # caps["deviceName"] = "127.0.0.1:62001"
        # caps["appPackage"] = "com.tencent.mobileqq"
        # caps["appActivity"] = "com.tencent.mobileqq.activity.LoginActivity"
        rootpath = os.path.abspath(os.path.dirname(os.path.dirname(__file__)))
        dd = os.path.join(rootpath,"config\config.yaml")
        data = readYaml(dd)
        cls.driver = webdriver.Remote("http://localhost:4723/wd/hub", data["caps"])
        cls.driver.implicitly_wait(30)
    def test_01_daohang(self):
        daohang = DaoHangPage(self.driver)
        daohang.click_login()
    def test_02(self):
        login  = LoginPage(self.driver)
        login.clear_name()
        login.input_name("766603163")
        login.clear_pass()
        login.input_pass("lly19891024lly")
        login.click_dl_button()
    @classmethod
    def teardown_class(cls) -> None:
        time.sleep(20)
        cls.driver.quit()
if __name__ == '__main__':
    pytest.main()
五:数据驱动
在pytest中使用@pytest.mark.parametrize()修饰器

import os
from day02.common.read_yaml import readYaml
from day02.pageobjects.daohang_page import DaoHangPage
from day02.pageobjects.login_page import LoginPage
from appium import  webdriver
import pytest
import time
class TestClass():
    @classmethod
    def setup_class(cls) -> None:
        rootpath = os.path.abspath(os.path.dirname(os.path.dirname(__file__)))
        dd = os.path.join(rootpath,"config\config.yaml")
        data = readYaml(dd)
        cls.driver = webdriver.Remote("http://localhost:4723/wd/hub", data["caps"])
        cls.driver.implicitly_wait(30)
    def test_01_daohang(self):
        daohang = DaoHangPage(self.driver)
        daohang.click_login()
    @pytest.mark.parametrize("user,password",[("766603161","lly19891024lly")])
    def test_02(self,user,password):
        login  = LoginPage(self.driver)
        login.clear_name()
        login.input_name(user)
        login.clear_pass()
        login.input_pass(password)
        login.click_dl_button()
    @classmethod
    def teardown_class(cls) -> None:
        time.sleep(20)
        cls.driver.quit()
if __name__ == '__main__':
    pytest.main()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值