zoukankan      html  css  js  c++  java
  • 移动端测试——PO模式 (8)

    一、PO简介

    PO 说明
    PO模式

    Page Object Model
    测试页面和测试脚本分离

    即页面封装成类,供测试脚本进行调用
    优点 ➢ 提高测试用例的可读性

    ➢ 减少了代码的重复

    ➢ 提高测试用例的可维护性,特别是针对UI频繁变动的项目
    缺点 ➢结构复杂

    基于流程做了模块化的拆分

    1. 1 Appium方法二次封装

    减少过多使用类似方法,更方便管理定位元素,尽量将函数方法简洁化、统一化

    1.1.1 定位方法

    名称 系统提供的定位方法 系统已封装的定位方法
    单个
    元素
    driver.find_element_by_id()

    driver.find_element_by_class_name()

    driver.find_element_by_xpath()
    find_element(by=By.XX, value=None)



    find_element(By.XX, value)
    一组
    元素
    driver.find_elements_by_id()

    driver.find_elements_by_class_name()

    driver.find_elements_by_xpath()
    find_elements(by=By.XX, value=None)



    find_elements(By.XX, value)
    • 封装的定位方法
      使用统一的方法来完成元素的定位
    参数 说明
    by 定位类型 By.ID

    By.CLASS_NAME

    By.XPATH
    value 定位元素的属性值

    1.1.2 点击元素与输入内容

    参数 说明
    location 定位类型
    location_vlaue 定位元素属性值
    text 需要输入的值

    第一种封装方法

    # 点击元素
    def click_element(self, location,location_vlaue):
        self.find_element(location,location_vlaue).click()
    # 输入内容
    def input_element(self, location,location_vlaue,text):
        self.find_element(location,location_vlaue).send_keys(text)
    

    问题:
    没有简化参数的传递,仅仅将点击和输入做了封装.

    第二种封装方法推荐

    • location类型为元祖
      格式:
      (By.ID,value),(By.CLASS_NAME,value),(By.XPATH,value)

    其中*location将元祖类型的值进行了一次解包操作,来满足find_element的参数传递要求

    # 点击元素
    def click_element(self, location):
        self.find_element(*location).click() 
    # 输入内容
    def input_element(self, location,text):
        self.fm = self.find_element(*location)
        self.fm.clear() # 需要先清空输入框,防止有默认内容
        self.fm.send_keys(text)
    

    eg:

    进入设置,点击搜索框,输入123后,然后点击搜索框返回按钮

    封装代码:Base.py

    from selenium.webdriver.support.wait import WebDriverWait
    
    
    class Base(object):
        def __init__(self,driver):
            self.driver = driver
        def find_element(self,loc,timeout=10):
            # 封装称为智能等待方法
            # loc:类型为元祖,格式(By.ID,value),(By.CLASS_NAME,value),(By.XPATH,value)
            # timeout:搜索超时时间
            return WebDriverWait(self.driver, timeout).until(lambda x: x.find_element(*loc))
        def click_element(self,loc):
            # 封装点击操作
            self.find_element(loc).click()
        def input_text(self,loc,text):
            # 封装输入操作
            self.fm = self.find_element(loc)
            self.fm.clear() # 需要先清空输入框,防止有默认内容
            self.fm.send_keys(text)
    

    测试代码:test.py

    from appium import webdriver
    from selenium.webdriver.common.by import By
    
    # 导入已封装的类 Base.py
    from Base import Base
    
    
    class Test_Base:
        def __init__(self):
            desired_caps = {}
            # 手机 系统信息
            desired_caps['platformName'] = 'Android'
            desired_caps['platformVersion'] = '5.1'
            # 设备号
            desired_caps['deviceName'] = '192.168.56.101:5555'
            # 包名
            desired_caps['appPackage'] = 'com.android.settings'
            # 启动名
            desired_caps['appActivity'] = '.Settings'
            # 允许输入中文
            desired_caps['unicodeKeyboard'] = True
            desired_caps['resetKeyboard'] = True
            # 手机驱动对象
            self.driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", desired_caps)
    
        def test(self):
            # 搜索按钮
            search_button = (By.ID,"com.android.settings:id/search")
            # 搜索输入框
            search_text = (By.ID,"android:id/search_src_text")
            # 搜索框返回按钮
            search_return_button = (By.CLASS_NAME,"android.widget.ImageButton")
            # 实例化二次封装的Base类
            base_object = Base(self.driver)
            # 点击搜索输入框
            base_object.click_element(search_button)
            # 搜索框内输入123
            base_object.input_text(search_text,123)
            # 点击搜索框返回按钮
            base_object.click_element(search_return_button)
            # 退出driver对象
            self.driver.quit()
    
            
    if __name__ == "__main__":
        Test_Base().test()
    

    更新中......


  • 相关阅读:
    Java的并发编程:创建线程的多种方式
    va_end (Variadic functions) – C 中文开发手册
    PHP headers_sent() 函数
    Java面试题:你用过的网站前端优化的技术有哪些?
    space-before-keywords (Rules) – Eslint 中文开发手册
    JavaScript 数据类型
    C 库函数 – free()
    屏幕 | screen (screen) – Electron 中文开发手册
    lrint (Numerics) – C 中文开发手册
    《《数据化风控》读书笔记分享》
  • 原文地址:https://www.cnblogs.com/ricsy/p/11581713.html
Copyright © 2011-2022 走看看