首页 > 其他分享 >PlayWright(十二)- PO模式

PlayWright(十二)- PO模式

时间:2023-07-04 18:44:40浏览次数:37  
标签:search PlayWright self 十二 element playwright 搜索 PO page

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框架来管理用例会更方便  

标签:search,PlayWright,self,十二,element,playwright,搜索,PO,page
From: https://www.cnblogs.com/nuomituan/p/17526724.html

相关文章

  • powershell profile
    functionwelcome{echo"________|||||||||/_|||||_____|||________......
  • docker命令、容器挂载、镜像制作、docker compose、docker私有仓库
    服务相关命令--开启dockersystemctlstartdocker--关闭dockersystemctlstopdocker--查看docker状态systemctlstatusdocker--重启systemctlrestartdocker--开机启动dockersystemctlenabledocker镜像相关命令--查看镜像dockerimages--搜索镜像以......
  • HikariPool-1 - Connection is not available
       在springboot项目中出现一个问题,该问题从字面意思上说是数据链池链接资源已全部使用完毕,没有可用的链接使用排查问题发现原因是:sql由于参数填写错误,进行了全表扫描,由于返回数据量过大导致数据卡在映射层,导致资源卡死的情况,每调用一次就会损失一个链接资源,当所有链......
  • typora编辑
    下载typora,桌面新建一个文件夹markdown用于保存笔记或图片资料,进入markdown文件夹新建文本文档,将txt后缀改为md,双击打开就是一个typora文本编辑器,点击视图中的大纲就可看到大纲结构,更加直观。开始接下来的语法吧:标题:#表示一级标题##表示二级标题###表示三级标题........
  • Jetpack Compose:开始使用组件
    接上篇https://www.cnblogs.com/develon/p/17417599.htmlTabRowimportandroidx.compose.foundation.layout.Columnimportandroidx.compose.foundation.layout.Spacerimportandroidx.compose.foundation.layout.heightimportandroidx.compose.material3.Tabimportandr......
  • oh-my-posh
    先安装Windowsterminal用Microsoft.WindowsTerminal_1.17.11461.0_8wekyb3d8bbwe.msixbundle安装 安装oh-my-poshSet-ExecutionPolicyBypass-ScopeProcess-Force;Invoke-Expression((New-ObjectSystem.Net.WebClient).DownloadString('https://ohmyposh.dev/install.......
  • 数据库内核:PostgreSQL 事务
    事务处理事务简介事务是一个应用层面的操作,通过一系列的数据库操作执行。一个事务会影响数据库的状态。对于事务来说,会有很多限制,这些限制实质上是保障整个数据库的状态是合乎标准的,但是在执行事务期间,可能会有一部分限制被打破,但是如果该事务是合法的,那么在完成或放弃当前......
  • AI_MindSpore_先学走路再开跑—开动起来
    AI模型本质是“参数估计”(Learningisparameterestimation梯度消失和梯度爆炸梯度消失和梯度爆炸的产生原因源于神经网络的串联式结构和反向传播优化方法。源于反向传播中梯度的累乘影响,从而导致了浅层网络的参数发生了变化微弱或者震荡较大的问题解决方案一个是从神经......
  • 【十二】JavaScript之BOM
    【十二】JavaScript之BOM【1】什么是BOMBOM(BrowerObjectModel,浏览器对象模型),主要是浏览器中js解释器提供给开发者调用浏览器功能的对象或接口方法因为旧版本浏览器厂商实现不一样,所以有可能存在同一段代码在不同旧浏览器下的结果不一致的兼容问题。当然现代浏览器几乎......
  • PowerShell系列四:容器操作
    容器容器是一个很通用的概念。比如文件、文件夹、注册表、磁盘分区、数组、hash表、命名空间、用户组、OU、数据库、数据表等等,它们的共同点就是包含了数据。在PowerShell中一切都是从"PSDrive"开始的,您熟悉了操作PSDrive,基本就涵盖了对资源的操作。Get-PSDrive#输出Name......