1、PO模式是什么?

PO,即Page Object,直译为页面对象,代表 Web 应用程序的一部分
 
具体什么意思呢,通俗来讲,一个页面有输入、点击、搜索功能,而且有很多页面,这时候我们就采用每个页面作为一个单独的page对象来维护编写,避免重复代码,层级也清晰,便于维护
 

2、以百度首页搜索为实例

我们以百度首页的搜索功能为例:
看下百度首页的搜索:
我们之前会这样写:打开百度页面,输入内容,点击搜索
from playwright.sync_api import sync_playwright

with sync_playwright() as playwright:  # 省略了start启动
browser = playwright.chromium.launch(headless=False, slow_mo=1000) # 设置了每步等待时间为3s
page = browser.new_page() # 打开一个页面 page.goto('https://www.baidu.com/') # 打开百度地址
page.fill('#kw', 'test') # 搜索框输入内容
page.click('#su') # 点击搜索
browser.close() # 省略了关闭playwright对象
 
那么使用PO模式我们怎么做呢?
 

01.目录结构

首先先创建一个项目,看下项目的目录结构
element目录:
  • search_element:搜索页的定位元素
page目录:封装的全部页面
  • search_page:搜索页面
result_image目录:截图的结果
testcase目录:用例部分
  • test_search:搜索功能的测试用例
tools目录:工具包
  • conftest:这里我们封装前置和后置代码
 
 

02.element层

element代码层先来封装search_element.py
"""
封装百度搜索框元素
""" input_element = '#kw' # 输入框元素
click_element = '#su' # 点击搜索元素

03.tool层

我们接着封装tools层
conftest.py写什么呢,我们可以把初始化浏览器的操作封装下,还有关闭浏览器的操作,截图等操作封装成函数
"""
前置后置操作:初始化操作
""" from playwright.sync_api import sync_playwright class SetupTeardown:
"""
启动浏览器
""" def __init__(self):
self.p = sync_playwright().start() # 创建playwright对象
self.browser = self.p.chromium.launch(headless=False, slow_mo=1000) # 启动谷歌浏览器赋值给对象
self.page = self.browser.new_page() # 打开一个页面 """
关闭浏览器
""" def close(self):
self.browser.close() # 关闭浏览器对象
self.p.stop() # 关闭playwright对象释放资源 """
截图操作保存到result_image目录下
""" def screenshot(self, element, file_name):
self.page.locator(element).screenshot(path=f"../result_image/{file_name}.png")

04.page层

我们接着封装page层
搜索页我们继承conftest,在search_page.py页中首先初始化定位元素、封装输入、点击、搜索操作,完善截图操作
"""
封装搜索页:初始化定位元素、重写输入操作、点击操作,截图操作
"""
from tools.conftest import SetupTeardown class SearchPage(SetupTeardown):
"""
封装定位元素
""" def __init__(self):
super().__init__() # 调用基础页面的构造函数,完成浏览器启动和页面打开 """
去往搜索页
""" def navigate(self):
self.page.goto('https://www.baidu.com/') """
输入操作
""" def input_element(self, element, keyword):
self.page.fill(element, keyword) """
点击操作
""" def click_element(self, element):
self.page.click(element) """
截图搜索结果页
"""

05.testcase层

我们接着封装testcase层,编写test_search.py代码
这里我们直接写实际用例
"""
搜索页的测试用例
""" from element.search_element import * # 导入搜索页的所有定位元素
from page.search_page import SearchPage # 导入搜索页对象 search_page = SearchPage() # 初始化搜索页对象
search_page.navigate() # 去往搜索页
search_page.input_element(input_search_element, 'playwright') # 搜索框输入内容
search_page.click_element(click_search_element) # 点击搜索
search_page.screenshot('result_search_page') # 截图保存
search_page.close() # 关闭浏览器
运行一下,看下是否正常运行,我这里看的搜索结果截图已经生成了
 

3、总结

PO模式看着非常麻烦,但是在较多页面使用时,是便于我们理解代码便于维护的,比如上边如果定位元素有变动,我们就去element层修改对应的定位元素,如果操作有变动,我们就去page层修改对应的页面操作。而我们只需要在对应的testcase用例层编写对应的用例即可,后续结合上pytest框架来管理用例会更方便
 

PlayWright(十二)- PO模式的更多相关文章

  1. Java设计模式偷跑系列(十二)组合模式建模和实现

    转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/39828653 组合模式(Composite):组合模式有时又叫部分-总体模式.将对象组合成 ...

  2. C#设计模式之二十二访问者模式(Visitor Pattern)【行为型】

    一.引言   今天我们开始讲"行为型"设计模式的第九个模式,该模式是[访问者模式],英文名称是:Visitor Pattern.如果按老规矩,先从名称上来看看这个模式,我根本不能获 ...

  3. C#设计模式之二十二备忘录模式(Memeto Pattern)【行为型】

    一.引言   今天我们开始讲"行为型"设计模式的第十个模式,该模式是[备忘录模式],英文名称是:Memento Pattern.按老规矩,先从名称上来看看这个模式,个人的最初理解就 ...

  4. C#设计模式之二十二备忘录模式(Memento Pattern)【行为型】

    一.引言 今天我们开始讲“行为型”设计模式的第十个模式,该模式是[备忘录模式],英文名称是:Memento Pattern.按老规矩,先从名称上来看看这个模式,个人的最初理解就是对某个对象的状态进行保 ...

  5. C#设计模式之十二代理模式(Proxy Pattern)【结构型】

    一.引言 今天我们要讲[结构型]设计模式的第七个模式,也是“结构型”设计模式中的最后一个模式,该模式是[代理模式],英文名称是:Proxy Pattern.还是老套路,先从名字上来看看.“代理”可以理 ...

  6. JavaScript学习笔记(十二) 回调模式(Callback Pattern)

    函数就是对象,所以他们可以作为一个参数传递给其它函数: 当你将introduceBugs()作为一个参数传递给writeCode(),然后在某个时间点,writeCode()有可能执行(调用)intr ...

  7. JavaWeb学习记录(二十二)——模式字符串与占位符

    一.Java代码案例 @Test    public void test10(){        int planet=7;        String event="a disturban ...

  8. Java进阶篇设计模式之十二 ---- 备忘录模式和状态模式

    前言 在上一篇中我们学习了行为型模式的策略模式(Strategy Pattern)和模板模式(Template Pattern).本篇则来学习下行为型模式的两个模式,备忘录模式(Memento Pat ...

  9. Java设计模式之十二 ---- 备忘录模式和状态模式

    前言 在上一篇中我们学习了行为型模式的策略模式(Strategy Pattern)和模板模式(Template Pattern).本篇则来学习下行为型模式的两个模式,备忘录模式(Memento Pat ...

  10. Java设计模式(十二) 策略模式

    原创文章,同步发自作者个人博客,http://www.jasongj.com/design_pattern/strategy/ 策略模式介绍 策略模式定义 策略模式(Strategy Pattern) ...

随机推荐

  1. [JavaScript]JS屏蔽浏览器右键菜单/粘贴/复制/剪切/选中 [转载]

    前两天在解决一个项目缺陷时,突发感兴趣,了解一下~ 1 JS事件 document.oncontextmenu // 右键菜单 document.onpaste //粘贴 document.oncop ...

  2. Semantic Kernel 入门系列:💬Semantic Function

    如果把提示词也算作一种代码的话,那么语义技能所带来的将会是全新编程方式,自然语言编程. 通常情况下一段prompt就可以构成一个Semantic Function,如此这般简单,如果我们提前可以组织好 ...

  3. ubutn在线服务器python Package安装到离线服务器

    1.在线服务器导出requirement.txt pip freeze > requirement.txt 该文件生成完毕后,需要做些修改,去掉不需要的库,否则下载的时候会出错. 2.下载whl ...

  4. 操作系统实验 & bochs 环境配置

    wsl2 - Ubuntu 22.04 + VSCode + bochs + xfce4 + VcXsrv 笔者环境 wsl2 - Ubuntu 22.04 0. 安装WSL2 & VSCod ...

  5. 如果你项目使用了MyBatis-Plus你一定要用它

    还是先举个例子,魂斗罗小游戏应该很多90后都玩过,那个时代没有Iphone,没有各种电子产品(小学初中时代),这种小游戏应该就是很多90后的青春,反正那个时候只要放假就白天黑夜得玩.它就是那种2个好基 ...

  6. java Stack(栈)类、Queue和Deque队列

    1. java Stack类 特性是:LIFO(后进先出)先进后出,最先进入的在栈底. Stack底层也是通过数组实现的,同时也是线程安全的 Stack stack=new Stack(); //添加 ...

  7. 机器视觉基本理论(opencv)

    1. 什么是图像采样 采样是按照某种时间间隔或空间间隔,将空间上连续的图像变换成离散点的操作称为图像采样 2. 什么是图像分变率 采样 得到的离散图像的尺寸称为图像分辨率.分辨率是数字图像可辨别的最小 ...

  8. Protobuf: 高效数据传输的秘密武器

    当涉及到网络通信和数据存储时,数据序列化一直都是一个重要的话题:特别是现在很多公司都在推行微服务,数据序列化更是重中之重,通常会选择使用 JSON 作为数据交换格式,且 JSON 已经成为业界的主流. ...

  9. 2023-02-14:魔物了占领若干据点,这些据点被若干条道路相连接, roads[i] = [x, y] 表示编号 x、y 的两个据点通过一条道路连接。 现在勇者要将按照以下原则将这些据点逐一夺回:

    2023-02-14:魔物了占领若干据点,这些据点被若干条道路相连接, roads[i] = [x, y] 表示编号 x.y 的两个据点通过一条道路连接. 现在勇者要将按照以下原则将这些据点逐一夺回: ...

  10. 2022-12-12:有n个城市,城市从0到n-1进行编号。小美最初住在k号城市中 在接下来的m天里,小美每天会收到一个任务 她可以选择完成当天的任务或者放弃该任务 第i天的任务需要在ci号城市完成,

    2022-12-12:有n个城市,城市从0到n-1进行编号.小美最初住在k号城市中 在接下来的m天里,小美每天会收到一个任务 她可以选择完成当天的任务或者放弃该任务 第i天的任务需要在ci号城市完成, ...