先看个定义:
Page Object模式是使用Selenium的广大同行最为公认的一种设计模式。在设计测试时,把元素和方法按照页面抽象出来,分离成一定的对象,然后再进行组织。
前几天发了篇文告别那个教你Page Objects教得懵逼的人 然后就有人直接微信催我:直接分析下源码呗。
好吧,直接上文,对Page Objects的源码进行一通简单的分析说明,免得路上被碰到了打我一顿就不划算了,总感觉有人要害朕!!!
先看下如何安装Page Objects,命令如下:
> pip install page_objects
再看下Page Objects的github
看着好像很多文件是不是很复杂的样子?其实一点都不复杂,请忽略所有的文件,只看page_objects/__init__.py这个文件就够了,因为其他的都是不需要的,核心代码就这一个文件。
没错,核心代码就在__init__.py里,一共定义了三个类实现了整个Page Object的思想。
PageObject类,实现了Page Object模式的核心封装
PageElement类,实现了Page元素的封装实现
MultiPageElement类,类PageElement类,但可以返回多个结果,可以理解为PageElement的进一步升华。
下面从头开始看源码,进行一一的大体说明。
导入异常和定位依赖,重定义了定位,避免与selenium webdriver的产生冲突
实现Page Object模式核心思想
__init__函数参数说明:
webdriver - 传入初始化了的webdriver实例对象, 必须传入
root_uri - 目标uri,可以不传入
get函数,用于访问目标uri
uri - 目标uri
这个源码很简单了,不需要过多的说明。
PageElement类源码实现
这个稍微多点,我把源码进行了折叠,方便查阅看代码,PageElement类中定义了四个函数:
- __init__ 用于初始化
- find 用于元素定位,并返回定位结果
大家必须知道的前后双下划线的,为内部成员,这两个大家可以不用理解
- __get__
- __set__
MultiPageElement源码
这个就不解释了,参照PageElement类的说明,请注意与PageElement的区别,在find函数中:
PageElement调用的是: find_element
MultiPageElement调用的是: find_elements
一个没有s ,一个有s,这就是最大的区别
有s的代表可以定位N个元素
最后看一个官方基础实例: