Appium 利用 PageObject 的方式解耦 Appium 中的页面元素跟操作逻辑

李雷雷 · 2018年09月30日 · 982 次阅读

看过一些Page Object的封装,做的都不彻底,在这里分享下我的做法

一.效果展示

页面:

class URLHome(object):

    @By.id("delay", ctx="web")
    def delay_btn(self): pass

    @By.id("schema", ctx="web")
    def schema_btn(self): pass

class AndroidLoadingViewPage(object):

    @By.id("com.**.android.webview.test:id/host")
    def host_input_box(self): pass

    @By.id("com.**.android.webview.test:id/path")
    def path_input_box(self): pass

class IOSLoadingViewPage(object):

    @By.id("loadingViewHostTextField")
    def host_input_box(self): pass

    @By.id("loadingViewPathField")
    def path_input_box(self): pass

操作逻辑

class Operates(object):
    def __init__(self, platform, wd):
        self.platform = platform
        self.wd = wd
        if platform == "Android":
            self.url_home = URLHome()
            self.loading_view_page = AndroidLoadingViewPage()
        else:
            self.url_home = URLHome()
            self.loading_view_page = IOSLoadingViewPage()

    def set_loading_style(self, host, path=None, style=1):
        self.home.set_loading_view().click()
        self.loading_view_page.host_input_box().clear().send_keys(host)

这样做的好处是,以后如果页面元素修改了,直接改page中的元素就好,如果页面操作行为修改了,那就改操作相关的类,从而实现真正的解耦。

二.实现

具体怎么实现的呢

class By(object):
    wd = None

    @classmethod
    def set_wd(cls, wd):
        cls.wd = wd

    @classmethod
    def id(cls, id, ctx="native"):
        def decorator(func):
            def wrapper(*args, **kwargs):
                try:
                    func(*args, **kwargs)
                    source = cls.wd.page_source
                    if id in source:
                        if ctx == "web":
                            return cls.wd.find_element_by_id(id)
                        if "com." in id:
                            return cls.wd.find_element_by_id(id)
                        else:
                            return cls.wd.find_element_by_accessibility_id(id)
                    else:
                        time.sleep(2)
                        return cls.wd.find_element_by_id(id)
                except Exception as e:
                    raise Exception("当前id:" + id + "\n" + str(e))
            return wrapper
        return decorator

一个简单的装饰器就行了。而且一个@By.id可以同时识别android native,ios native,h5上的元素,用起来简单明了。

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册