Appium Appium+Python Remote 多次连接问题

小左呀 · August 01, 2022 · Last by nennhui replied at August 05, 2022 · 6188 hits

软件版本信息:
Appium-Python-Client 2.6.0
Python 3.10
问题描述:
我把 appium 常用的方法进行的简单的封装,添加了一些自定义日志信息例如以下代码:
这样可以提供给功能测试人员使用我们工具在 xml 中调用当前的方法传入所需参数即可实现自动化.

@classmethod
    def clickElementById(cls, serial: str, element: str):
        """
        根据元素id查找元素并点击

        :param serial: 执行操作的设备名称
        :param element: 元素名
        :return: status PASS or FAIL
        """
        status = "FAIL"
        driver = None
        try:
            driver = cls.__driver(serial)
            el = driver.find_element(ID, element)
            if el:
                el.click()
                status = "PASS"
                print(f"Method {def_name()} execute success, return: {status}")
        except NoSuchElementException as e:
            print(f"Method {def_name()} throw exception as blow:")
            print(f"Can't find element {element}")
        except MaxRetryError as e:
            # TODO: 是否可以在这里做appium server处理
            print("Server has been destroyed,please restart!!!")
        finally:
            driver.quit()
        return status

问题点:
每一次调用都存在重新 webdriver.Remote(url, caps) 一次,非常影响测试效率
直接调用:

import os
import time

from appium import webdriver


class GlobalMethods(object):
    def __init__(self):
        self.cmd = f"start appium -p 4726"
        self.url = "http://127.0.0.1:4726/wd/hub"
        self.__server()

    def __server(self):
        os.system(self.cmd)

    def driver(self):
        caps = dict()
        caps['platformName'] = 'Android'
        caps['automationName'] = 'UiAutomator2'
        caps['udid'] = "R1J57L11c09345"
        return webdriver.Remote(self.url, caps)

if __name__ == '__main__':
    s_time = time.time()
    app = GlobalMethods().driver()
    app.press_keycode(3)
    app.back()

    c_time = time.time()
    ss_time = c_time - s_time
    print(ss_time)
    print('%s 秒' % ss_time)

请问各位大佬有没有什么方式可以解决这样的问题? ps:我司目前大部分属于功能测试,所以提供出公共方法是有必要的

共收到 3 条回复 时间 点赞

学习成本最低的办法:用 pytest,写一个 session 层级的 fixture 初始化 driver 用来给每个用例使用,这样一次测试过程中只会执行一次

余good' 回复

谢谢 我尝试一下

使用单例,比 pytest 更简单

需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up