Appium UI 自动化,两个页面的跳转与调用,该怎么设计

Ju-87C · 2021年05月10日 · 最后由 Ju-87C 回复于 2021年05月10日 · 3582 次阅读

我现在有两个页面,PageA Page,两个都是独自的 object 了, PageA 可以跳转至 PageB,这是前提
需求 1:PageA 中有一个方法,可以跳转 PageB 页面,并帮 PageB 完成实例化,返回的也是 PageB 的一个实例
这样,我只要在 goToPageB 方法中 return 一个 PageB 实例

#PageA.py
def goToPageB(self):
  self.click(XXX)
  return PageB()

需求 2:PageB 的 init 方法,我想也赋予它单独实例化自己的能力,如果当前不在 B 页面,就自动从 A 跳转 ,于是就有下面:

#PageB.py
def __init__(self):
  PageA().goToPageB()

这俩个需求我想同时满足怎么实现呢?现在我在两个文件里都要将彼此导入,就报错了

共收到 8 条回复 时间 点赞

感觉本身就是一个伪命题。
哪有一个 page 的初始化方法是调用其他 page 类的方法的。

你这个设计的有问题吧。

木月 回复

啊这,这俩需求就是无法同时满足的吗?我知道我的方法肯定是不成熟的,也想了很久怎么兼得。。没想到本就是不可能的。
可以不在 PageB 中的 init 方法里调 A 吗?
或者有没有什么类似访问者模式的设计,accept,visitor 那样?

咸鱼菜鸡 回复

是的,我才新手,有好些的设计参考一下吗

针对这个场景而言,这个设计有一些问题:

1、需求 1 看起来还比较正常。虽然返回 pageB 有点怪怪的,但实际上如果确实简便一些倒问题不大。
2、需求 2 本身有问题,怎么确保不在 B 页面就一定在 A 页面 ?如果用户实例化 B 页面只是为了判定当前是否在 B 页面,而非跳转到 B 页面呢?这个绑定太死了。

如果针对单纯技术而言,这个应该就是引起循环依赖了。解决也很简单,
1、抽离相互依赖的部分到一个第三方类里( a->b,b->a 变为 a->c,b->c )
2、干掉其中一个方向的依赖(比如 PageA 就别返回 PageB 了)
3、引入依赖的时机从全局改为局部(比如 pageA 里面只有 goPageB 方法里才特别加上 import pageB )
第三种可能比较适合,不过治标不治本。

核心还是设计问题,为了一个特定场景的简便,把每个类的边界搞得很模糊,想把这些类变成 “万能类” 是很危险的。跨类的操作尽量还是放到用例层级,而非 page 级别吧,虽然写起来代码稍微多一点,但逻辑清晰很多。组合才是最灵活的。

陈恒捷 回复

明白了明白了,多谢老师点拔
需求 1,本意是想流式调用
PageA().goToPageB().B 的操作
需求 2,我是想 PageB 随时能够实例使用,比如如果当前在 PageA 的话,我 PageB 实例化能直接从 A 到 B,是这个初衷
不过现在一想,B 也并非一定是由 A 跳转过来的。。。设计确实不对
那针对我第二个初衷,有好办法吗?多谢老师

Ju-87C 回复

先根据业务看 pageB 是否可以随时直接跳转,有些界面依赖上一级界面或操作的数据,不一定能这么操作。

如果确认可以直接跳转,web 的话可以直接用 url 跳转,app 可以用 deeplink 或者手动启动指定 activity(android)等方式。

陈恒捷 回复

activity 启发到我了,多谢多谢!

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册