一。PageObject
1.定义:
是指UI界面上用于与用户进行交互的对象。它可以指整个页面,也可以指Page上的某个区域,是Selenium自动化测试项目开发实践的最佳设计模式之一。
- PageObject 页面对象。 会把某个网页(app页面)页面封装成对象。
- 对象
- 属性。 元素定位器, URL , 标题, (DOM)
- 方法。 元素定位,点击,(做了某个动作,执行了某步操作)
2.PageObject 原则
1)页面动作:使用到什么行为就封装什么行为。
2)封装的页面操作的返回值
-一般返回self,或者其他的页面对象
-如果需要获取某个元素或者属性,直接返回元素本身或者属性。
-如果一个操作可能有多个结果,根据结果封装成多个方法。
3.Pageobject优势
1)可维护性强。(页面的属性和方法分开写后,页面标签改变只需要修改元素值就成)
2)可读性强。(PO模式封装的函数名或者类名本身就是以具体操作命名的)
3)扩展性强。(有新功能需要实现时,po模式层级清晰新增更加方便)
4)可复用性强。(已经写过的方法可以重复使用)
5)页面操作和页面操作分离。
二。使用pageobject模式设计用例
1.用例编写
1)初始化页面
2)调用页面逻辑操作,目的是获取实际结果
3)结果
2.数据分组
使用parametrize做数据驱动用法:
@pyetst.mark.parametrize("这里自定义调用名称",“这里是需要数据驱动的数据”)
1)分组的依据:测试步骤的不一致
2)保存用例,不要通过excel去管理(pytest数据驱动模式引起的,后面详细解释)
3)用例保存:1.使用py文件;2.使用yaml文件
示例:这里我使用的是列表中嵌套字典保存数据,这里最好是使用元组进行管理数据,原因后续补充
3.locator分层
1)By -- 定位尽量使用 By 方式去定位 (find_element(By.CLASS_NAME,value))
1.使用方法:
#定位方法与对应的value
ele=(By.CLASS_NAME,"su")
find_element(*ele)
好处:
1.直接调用源码中的方法,避免转换的错误。
源码:
2。不使用By
方法:
#定位方法与value
ele={"by":"class name","value":"su"}
#调用
find_element(**ele)
缺陷:
1.需要注意类似于class_name的by值,中间需要空格才能转换成功 直接使用方法一比较直接不容易出错误
2)遇到tost提示时,不好定位使用断点的方式进行操作这样tost消息就不会消失了
3)web 自动化测试用例实现的流程
- 1, 准备前置后置, conftest
- 2, 编写测试步骤:测试用例的函数注解, docstring
- 3, 根据测试步骤封装页面行为。
- 4, 调用页面行为,获取实际结果
- 5, 断言
4)等待
显示等待的封装
与隐性等待(implicitly_wait(time))的区别:
1.隐性等待等待的是元素的加载
2.显示等待等待的是动态文本(也就是看的到的:比如text文本)
封装方法
#locator 是定位元素的方法与value
def wait_element_visible(self, locator, timeout=20, poll=0.5):
"""等待某个元素可见"""
el = WebDriverWait(self.driver, timeout=timeout, poll_frequency=poll).until(
expected_conditions.visibility_of_element_located(locator)
)
return el
5)截图 --未完待续