Page Object设计模式实战(3)

PO模式
po其实就是封装的概念
优点:清晰稳定
页面发生变化的时候,只需要改变细节就好了,对外暴露接口其实是没有变的
六大原则:
1.公共方法应该对应页面提供的服务
2.不要暴露过多页面细节
3.断言不要放在pageobject中,混在一起写会引起混乱,页面改动的时候容易混乱;让断言去调封装的细节就好了
4.应该尽量返回一个页面,点击按钮可能会弹出一个新的页面
5.只对关键元素建模
6.不同的结果可以返回不同的方法 
企业微信实战
具体代码如下:git地址:https://github.com/zhaitiantian1/Enterprise-WeChat
其中需要注意的是:⚠️⚠️❗️
1.注意:隐式等待是全局的,因此在初始化driver的时候设置的
2.  而显式等待则可以特殊对象特殊对待
3.po设计模式下: 如果页面变了,不需要在test _case中修改代码
4. basepage通常用来封装driver有关的设置,封装定位元素(查找元素)
5.  代码中的reuse让一个类告诉我们,如果reuse为True,就说明使用浏览器的复用,如果为false,就初始化一个新的浏览器
6.把driver提取出来,把driver变成私有变量_driver,不对外暴露具体的细节,符合po原则
7.为什么进行封装
   1)  把driver集中在basepage中是为了以后 便于统一修改,以后用appium也可以进行这样的封装,频繁的换底层的时候比较方便
   2) 将driver变成私有的变量,封装find后,不会被子类随便改造,只会让basepage进行改造
    3)想再里面加日志什么的,就可以直接在find ()中加入日志,不需要改变页面上其他引用find()函数的地方修改了
   4)也是为了便于管理
   5)使用封装,以后万一做框架,要有一个核心就是basepage,以后无论测知乎、简书还是其他网站,都可以使用这套核心,其他定位判断assert等都是皮毛
 
8. basepage为什么要和test_case分开呢?
如果页面变了,不需要在test _case中修改代码
9. 显式等待
 
pasepage.py
wait_for 逻辑
#显式等待
 def wait_for(self, fun): # 如果fun返回了true,那么就退出显式等待 
       WebDriverWait(self._driver, 10).until(fun)
wait逻辑
def wait(driver): ele_len = len(self.finds(By.ID, "username")) if ele_len < 1: self.find(By.CSS_SELECTOR, ".js_has_member>div:nth-child(1) .js_add_member").click() # 如果username存在,就返回true return ele_len >= 1

坑2:wait(x)中一定要加上参数x,尽管没有被使用,因为until调用waitr()的时候把self.driver传给了wait()中的x参数(之前介绍显示等待中有讲到,给忘了。。。)

until源码: 源码:死循环,直到返回true或者返回超时,退出循环,如下图所示:

我们也可以不用自己定义wait函数,而是用selenium自带的 也可以用expected_condition方法,但是 也可以自己写,selenium自带的函数是不可以这么实现显式等待的,而自己写可以定制,想怎么写就怎么写,可以参考expected_condition源码方法
企业微信中的定位元素小总结:
1.

你可能感兴趣的:(Page Object设计模式实战(3))