想设计出 ios+web+android 一体的框架

我目前设计框架是 POM(project object model) 设计模式

然后阐述一下自己的设计思路

在 Page 木内一个 py 文件封装一个功能或者一个页面的操作元素 一些单独的操作元素,封装成方法,然后每个页面 page 内都会有个核心流程方法
然后说一下我为什么要封装成方法而不是变成类变量,因为我感觉封装好后,直接调用比较方便,然后也能保证元素唯一性 (有些元素可能是好几个页面的按钮)
维护元素时能很清楚。

我的框架目录

common:
封装元素,循环检测元素是否存在,定位不到抛出指定异常,并记录在 Allure 测试报告内

page 的封装

封装保证元素路径的唯一性, 进行设计测试用例时,可以灵活调用每个页面的每个元素。

testcases:
一个 py 对应一个业务流程

更新:重新修改元素操作方法

点击输入等操作内 融合 find_elements 和 find_elements 用元组传入

def find_elements(self, locate, img_doc, timeout=10, frequency=0.5):
    """
    检测定位元素是否存在 多个元素
    :param locate: 元素定位方式+路径
    :param img_doc: 截图说明
    :param timeout: 等待的超时时间
    :param frequency: 轮询频率
    :return:  WebElement元素地址 返回list类型
    """
    try:
        el = None
        wait = WebDriverWait(self.driver, timeout, frequency)
        if locate[0] == 'id':
            el = wait.until(lambda diver: self.driver.find_elements(By.ID, locate[1]), message='没找到该元素')
        elif locate[0] == 'xpath':
            el = wait.until(lambda diver: self.driver.find_elements(By.XPATH, locate[1]), message='没找到该元素')
        elif locate[0] == 'name':
            el = wait.until(lambda diver: self.driver.find_elements(By.NAME, locate[1]), message='没找到该元素')
        elif locate[0] == 'css_selector':
            el = wait.until(lambda diver: self.driver.find_elements(By.CSS_SELECTOR, locate[1]),
                            message='没找到该元素')
        elif locate[0] == 'tag_name':
            el = wait.until(lambda diver: self.driver.find_elements(By.TAG_NAME, locate[1]), message='没找到该元素')
        elif locate[0] == 'partial_link_text':
            el = wait.until(lambda diver: self.driver.find_elements(By.PARTIAL_LINK_TEXT, locate[1]),
                            message='没找到该元素')
        elif locate[0] == 'link_text':
            el = wait.until(lambda diver: self.driver.find_elements(By.LINK_TEXT, locate[1]), message='没找到该元素')
        elif locate[0] == 'class_name':
            el = wait.until(lambda diver: self.driver.find_elements(By.CLASS_NAME, locate[1]), message='没找到该元素')
        elif locate[0] == 'predicate':
            el = wait.until(lambda diver: self.driver.find_elements_by_ios_predicate(locate[1]), message='没找到该元素')
        elif locate[0] == 'accessibility_id':
            el = wait.until(lambda diver: self.driver.find_elements_by_accessibility_id(locate[1]), message='没找到该元素')
        if el is not None:
            return el
        self.logger.info("<{}>,元素<{}>定位成功".format(img_doc, locate[1]))
    except Exception as e:
        self.logger.error("<{}>元素<{}>定位失败!".format(img_doc, locate[1], ))
        raise e

def click(self, locate, img_doc):
    """
    点击按钮
    :param locate:  元素定位方式+路径  元组类型传入
    :param img_doc: 截图说明
    """
    try:
        if len(locate) == 2:
            el = self.find_element(locate, img_doc)
            el.click()
            self.logger.info("点击<{}>成功,元素和定位方式:{}".format(img_doc, locate))
        else:
            el = self.find_elements(locate, img_doc)
            el[locate[2]].click()
            self.logger.info("点击<{}>成功,元素和定位方式:{}".format(img_doc, locate))
    except Exception as e:
        self.logger.error("点击<{}>失败,元素和定位方式:{}".format(img_doc, locate))
        self.add_allure_attach(img_doc)
        raise e


↙↙↙阅读原文可查看相关链接,并与作者交流