PlayWright(十二)- PO模式


(资料图)

1、PO模式是什么?PO,即Page Object,直译为页面对象,代表 Web 应用程序的一部分具体什么意思呢,通俗来讲,一个页面有输入、点击、搜索功能,而且有很多页面,这时候我们就采用每个页面作为一个单独的page对象来维护编写,避免重复代码,层级也清晰,便于维护2、以百度首页搜索为实例我们以百度首页的搜索功能为例:看下百度首页的搜索:我们之前会这样写:打开百度页面,输入内容,点击搜索
from playwright.sync_api import sync_playwrightwith 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_playwrightclass 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 SetupTeardownclass 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框架来管理用例会更方便

关键词:

下一篇: 最后一页

相关新闻

精彩推送