Python Appium-将页面对象设计为与iOS和Android重复使用相同的功能

Python Appium-将页面对象设计为与iOS和Android重复使用相同的功能,python,appium,python-appium,Python,Appium,Python Appium,我目前正在使用Appium和Python项目中的页面对象仅在iOS平台上运行测试。现在我需要为Android实现相同的测试(应用程序是相同的) 我知道每个平台的定位器是不同的,但是我创建的函数可以用于两个平台 在java中,@iosxguitfindby和@AndroidFindBy注释使设计更容易实现这一目的,但到目前为止,我还没有发现与Appium和Python类似的东西 我可以使用什么策略为两个平台(Android和iOS)重用相同的功能 如果您正在使用,您可以使用-|将iOS和Andro

我目前正在使用Appium和Python项目中的页面对象仅在iOS平台上运行测试。现在我需要为Android实现相同的测试(应用程序是相同的)

我知道每个平台的定位器是不同的,但是我创建的函数可以用于两个平台

在java中,
@iosxguitfindby
@AndroidFindBy
注释使设计更容易实现这一目的,但到目前为止,我还没有发现与Appium和Python类似的东西

我可以使用什么策略为两个平台(Android和iOS)重用相同的功能

  • 如果您正在使用,您可以使用-
    |
    将iOS和Android定位器组合成一个表达式:

    def click_some_button(driver):
        element = driver.find_element_by_xpath("//ios/locator/here | //android/locator/here")
        element.click()
    
  • 根据
    platformName
    值,您可以动态返回该值或该值:

  • 我使用RobotFramework(python)创建测试套件,用于测试iOS和Android应用程序的开发。同一个应用程序同时启动。自动化是在sprint中完成的。应用程序开发过程中的自动化测试

    最初,我们同时为两个平台创建了自动化测试。与上述类似的想法…如果/否则等。。。 几个月后我们遇到了一些问题。我不是那么简单。在开发过程中,跨两个移动平台的同一应用程序的功能发生了变化。在iOS和Android平台上可以做什么(开发/技术方面)的差异在某些方面有所不同

    它们本质上是同一个应用程序,但由于一些技术限制,它们之间存在差异。测试分配根本不适用于这两个平台,需要分配精力和难看的测试才能将它们固定下来

    然后,一个平台成为了优先于另一个平台的平台。但是,为两个平台的测试功能奠定基础会带来业务部门不希望/不需要的开销,因为一个平台是一个优先事项(另一个平台可以在以后成为优先事项)

    六个月后放弃了双重测试套件,转而支持与iOS测试套件分离的Android测试套件

    当然有一些重叠,但它变得更容易管理

    如果我重新开始,我会在一开始就把它们分开


    tldr:)将它们分开(文件夹/套件结构和功能方面)。

    我还在使用Appium和Python自动化Android和iOS应用程序,我遇到了同样的问题,应用程序是相同的,但定位程序当然不同

    为了重用相同的方法,但使用不同的定位器,我提出了以下解决方案,例如:

    class Header(Page):
        def __init__(self, driver):
            super(Header, self).__init__(driver)
            self.os = str(self.driver.desired_capabilities['platformName']).lower()
    
        # Android
        login_button_android = (MobileBy.ID, 'com.matchbook.client:id/loginButton')
    
        #iOS
        login_button_ios = (MobileBy.ACCESSIBILITY_ID, 'LOGIN')
    
        def open_login_page() 
            self.driver.find_element(*getattr(self, 'login_button_' + self.os)).click() 
    
    
    现在,当你在课外调用
    open\u login\u page
    时,它将知道在我们检索操作系统时使用哪个定位器(Android或iOS)

    self.os=str(self.driver.required_功能['platformName'])。lower()

    \uuuu init\uuu
    方法中

    执行时,
    “登录按钮”+self.os
    将变为
    “登录按钮”
    “登录按钮”


    这样,对于任意数量的操作系统版本,您只需要一个方法,唯一的区别在于定位器变量的名称,它们需要有相同的名称,除了末尾的后缀应该是
    \u android
    \u ios

    答案似乎不错。你也可以参考这个博客:,嗯Explained@dmitri-Don’谢谢你的回答。我们都知道选项1是不好的做法,它使测试速度降低了10倍。我在选项2中认为这是一种策略,但是想象一下,如果我的测试有500多个函数,我是否需要对所有函数执行
    if/else
    ?我认为这是不可能的。我想创建一个通用函数(我可以在两个平台上使用),只是替换定位器,但我仍然不知道如何实现。
    class Header(Page):
        def __init__(self, driver):
            super(Header, self).__init__(driver)
            self.os = str(self.driver.desired_capabilities['platformName']).lower()
    
        # Android
        login_button_android = (MobileBy.ID, 'com.matchbook.client:id/loginButton')
    
        #iOS
        login_button_ios = (MobileBy.ACCESSIBILITY_ID, 'LOGIN')
    
        def open_login_page() 
            self.driver.find_element(*getattr(self, 'login_button_' + self.os)).click()