美文网首页
PageObject设计模式(appium)

PageObject设计模式(appium)

作者: 清水秋香 | 来源:发表于2020-03-08 22:31 被阅读0次
    • PO设计原理:
      将页面封装成对象
      页面对象内封装业务方法
      元素定位方法可存放到其他配置文件


      PO.png

      PO设计是一种思想,任何UI自动化测试都可以套用这种思想,不仅限于selenium的webUI模式

    PO设计规范
    • 页面对象化
      1.每个页面封装成对象
      例如:登录页面可以设计成LoginPage类
      2.封装具体业务方法
      例如:登陆页面的登陆方法有 login(username,password)
      3.不保存具体的元素定位
      例如:定位用户名和密码框的表达式不写在代码里,放在外部配置文件当中

    • 页面元素属性化
      1.只涉及到要操作的元素名称
      2.具体的定位方式方法不写在代码里

    • 元素定位可配置化
      1.配置以键值对形式存在
      2.区分出不同的页面
      3.保存元素配置的文件形式没有限制文本文件、excel、数据库等

    页面类的设计
    • 页面类的层级抽象
      1.构造页面对象
      创建页面基类,封装基本操作方法,由其他业务类继承
      2.封装相关业务方法
      业务页面对象中封装常用的业务操作
      3.抽取元素定位
      抽取具体的元素定位方法存放到配置文件
      4.测试案例构成
      结合页面对象编写具体的业务流

    • Yaml格式配置文件特点
      1.YAML 的数据组织主要依赖的是空白,缩进,分行等结构,可读性好。
      2.YAML 实现简单,解析成本很低,和脚本语言的交互性好。
      3.YAML 使用实现语言的数据类型
      4.YAML 表达能力强,扩展性好
      5.安装方法 --pip install pyyaml

    书写PO模式建议:
    1.先写出具体的业务逻辑--比如登录
    2.再将写好的逻辑封装到类里面
    3.继续构造其他的页面类
    4.将这些类共同的功能抽象化父类,被其他业务类继承
    5.可以将代码内部的具体元素抽离出来用外部的配置文件进行管理

    • base类:封装元素定位方法
    from appium import webdriver
    class BasePage:
        def __init__(self, desiredCaps):
            self.driver = webdriver.Remote("http://localhost:4723/wd/hub", desiredCaps)
            self.driver.implicitly_wait(10)
    
        def click_element(self, locator):
            self.driver.find_element(locator[0], locator[1]).click()
    
        def text(self, locator):
            return self.driver.find_element(locator[0], locator[1]).text
    
    • 页面类:封装各个页面
    class HomePage(BasePage):
        def __init__(self, desiredCaps):
            BasePage.__init__(self, desiredCaps)
            homePage = conf_read('conf.yml')['homePage']
            self.three = homePage['three']
            self.add = homePage['add']
            self.nine = homePage['nine']
            self.equal = homePage['equal']
            self.take = homePage['take']
            self.five = homePage['five']
            self.clickResult = homePage['clickResult']
            self.result = homePage['result']
    
        def calculate(self):
            time.sleep(10)
            self.click_element(self.three)
            self.click_element(self.add)
            self.click_element(self.nine)
            self.click_element(self.equal)
            self.click_element(self.take)
            self.click_element(self.five)
            self.click_element(self.equal)
            self.click_element(self.clickResult)
            assert self.text(self.result) != 60, '计算有误'
    
        def driver_quit(self):
            self.driver.quit()
    
    • 此函数用于读取yaml文件
    import yaml
    
    
    def conf_read(conf_file):
        with open(conf_file, 'r') as f:
            file = f.read()
            conf = yaml.load(file)
            return conf
    
    
    if __name__ == '__main__':
        print(conf_read('xxx.yml')['desired_caps'])
    
    
    • Yaml 文件存储个页面的具体定位方式
    desiredCaps:
      automationName: "UiAutomator2"
      platformName: "Android"
      plathformVersion: "8"
      deviceName: "test0106"
      appPackage: "com.ibox.calculators"
      appActivity: ".SplashActivity"
      noReset: True
      newCommandTimeout: 6000
    
    
    homePage:
      three: ['xpath','//*[@resource-id="com.ibox.calculators:id/digit3"]']
      add: ['xpath','//*[@resource-id="com.ibox.calculators:id/plus"]']
      nine: ['xpath','//*[@resource-id="com.ibox.calculators:id/digit9"]']
      equal: ['xpath','//*[@resource-id="com.ibox.calculators:id/equal"]']
      take: ['xpath','//*[@resource-id="com.ibox.calculators:id/mul"]']
      five: ['xpath','//*[@resource-id="com.ibox.calculators:id/digit5"]']
      clickResult: ['xpath','//*[@resource-id="com.ibox.calculators:id/relativeLayout_top"]']
      result: ['xpath','//*[@resource-id="com.ibox.calculators:id/cv"]/android.widget.TextView[2]']
    

    相关文章

      网友评论

          本文标题:PageObject设计模式(appium)

          本文链接:https://www.haomeiwen.com/subject/oqrsdhtx.html