Playwright之录制脚本转Page Object类

Playwright之录制脚本转Page Object类

设计思路 : 我们今天UI自动化设计的时候,通常会遵循一些设计模式,例如Page Object模式。但是自己找元素再去填写有一些麻烦,所以我们可以通过拆解录制的脚本,将其中的元素提取出来,然后放到我们的页面中。

一、文件目录如下

在这里插入图片描述

  • auto_myself(名字瞎起的) : 执行文件,主要功能为获取我们脚本存放的地址,读取信息,然后将其写入py文件,创建object,并添加其属性。
  • page_template : 生成的类的模板,将录制的脚本转为这种格式。
  • scripts_record_file : 录制的脚本存放文件。

二、操作步骤

1.使用playwright脚本录制命令,启动脚本录制功能,进行操作,录制自动化脚本

playwright安装过程就不说了,都是一样的。

playwright codegen
2.将录制的脚本复制到txt文件中

直接用录制器自带的复制,复制粘贴就行啦,很方便。
在这里插入图片描述

3.修改auto_myself文件中的类名称和脚本地址

如果在同一个文件夹下,只修改类名和保存文件的信息就可以。
在这里插入图片描述

4. 执行auto_myself的方法

执行后我们可以得到一个文件名为playwright_element_page,类为class_name的py文件。
在这里插入图片描述

在这里插入图片描述

三、auto_myself文件代码

文件的逻辑如下:

  1. 定义好object的属性
  2. 获取录制的脚本文件
  3. 根据元素特点进行分离,将元素的定位方式保存并重命名
  4. 将获取到的元素进行到我们的模板文件中
  5. 文件替换和去重等处理
 -*- coding: utf-8 -*-
import os.path
from playwright_element_page.page_template import page_base_text
# 获取文件执行目录
root_path = os.path.dirname(os.path.abspath(__file__))
print(root_path)class AutoMyself(object):"""脚本自动创建类"""_button = 0_input = 0_select = 0_switch = 0_frame = 0_label = 0_link = 0_total = 0_deduplication = 0def __init__(self, record_scripts_base_path: str = '', output_file_path: str = '', output_file_name: str = ''):self.base_path = record_scripts_base_pathself.output_path = root_path + output_file_path + '/' + output_file_name + '.py'self.element_dict = {}def scripts_to_page(self, page_name: str):"""录制脚本转 page 结构文件:param page_name:创建文件名称:return:"""if self.__get_element_for_page():self.__set_element_to_page(page_name)def __get_element_for_page(self):"""获取文件内容:return:"""try:with open(self.base_path, 'r', encoding='gbk') as f:for line in f:line = line.strip().replace("\n", "")tags = ('page.', 'page1.')if any(tag if tag in line else False for tag in tags):self.__create_element_for_page(line)self._total += 1except UnicodeDecodeError as ude:print(f'*****文件读取失败!文件编码异常:{ude},请检查文件内容!*****')except Exception as e:print(f'*****执行异常:{e}*****')finally:print(f'***** 元素数量:{self._total} *****')return self.element_dictdef __set_element_to_page(self, page_name: str):"""保存元素信息到文件:return:"""# 元素去重self.__element_deduplication()try:with open(self.output_path, 'w', encoding='utf-8') as f:class_name = page_name.title()f.write(page_base_text.format(class_name.replace('_', '')))for name, locator in self.element_dict.items():f.write(f'\t\tself.{name} = {locator}\n')except UnicodeDecodeError as ude:print(f"***** __set_element_to_page文件写入异常,字符格式错误:{ude} *****")except Exception as e:print(f'***** 文件写入异常,{e} *****')finally:print(f'***** 已去除重复元素数量:{self._deduplication} *****')print('***** 文件写入操作完成! *****')def __create_element_for_page(self, element):"""创建页面元素:return:"""element_types = ('select_option',)if 'get_by_role' in element:self.__element_filter_by_role(element)elif any(element_type if element_type else False for element_type in element_types):self.__element_filter_by_type(element)else:self.__element_filter_by_operate(element)def __element_filter_by_role(self, element):"""根据元素角色的定位方式,添加元素信息:param element:元素信息:return:"""role = element.split('get_by_role("')[1].split('"')[0]if role == 'button':self.element_dict[f'button_{self._button}'] = element.split('.click')[0]self._button += 1elif role == 'label':self.element_dict[f'label_{self._label}'] = element.split('.click')[0]self._label += 1elif role == 'link':self.element_dict[f'link_{self._link}'] = element.split('.click')[0]self._link += 1else:self.__element_filter_by_operate(element)def __element_filter_by_type(self, element):"""根据元素角色的定位方式,添加元素信息:param element:元素信息:return:"""if 'select_option' in element.split('.')[-1]:self.element_dict[f'select_{self._select}'] = element.split('.click')[0]self._select += 1else:self.__element_filter_by_operate(element)def __element_filter_by_operate(self, element):"""根据操作方式,判断元素类型:param element::return:"""if '.click()' in element:self.element_dict[f'button_{self._button}'] = element.split('.click')[0]self._button += 1elif '.fill(' in element:self.element_dict[f'input_{self._input}'] = element.split('.fill')[0]self._input += 1else:print(f'当前元素识别方式未补充:{element}')def __element_deduplication(self):"""元素去重:return:"""new_dict = {value: key for key, value in self.element_dict.items()}self.element_dict = {value: key for key, value in new_dict.items()}self._deduplication = self._total - len(self.element_dict)if __name__ == '__main__':am = AutoMyself(record_scripts_base_path='scripts_record_file.txt', output_file_name='playwright_element_page')am.scripts_to_page('class_name')

四、page_template文件代码

其实这个文件不用py用txt也可以,只要可以获取到我们想要的类结构,然后按行写入文件就能满足我们的需求。

# -*- coding: utf-8 -*-
# page模板内容
page_base_text = '''# -*- coding: utf-8 -*-
from serve.base_page import BasePage
from playwright.sync_api import Pageclass {}(BasePage):
\t"""
\t页面描述
\t"""\tdef __init__(self, page: Page):
\t\tsuper().__init__(page)
'''

其他

转换的思路其实比较简单,就是将元素提取出来,然后将其写入另一个文件。脚本内容还有很多需要完善的地方,大家可以提出修改意见,我会根据大家的意见进行完善。大家有其他问题也可以提出一起修改~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/40764.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vscode 保存代码,代码自动格式化

我这里使用的插件是Prettier-Code formatter:自动缩进整理代码的格式,使用方法如下: 先在vscode商店找到插件并安装:安装插件之后,随便找到一个项目文件,右键选择格式化文档:选中我们安装的插件…

spring6框架解析(by尚硅谷)

文章目录 spring61. 一些基本的概念、优势2. 入门案例实现maven聚合工程创建步骤分析实现过程 3. IoC(Inversion of Control)基于xml的bean环境搭建获取bean获取接口创建实现类依赖注入 setter注入 和 构造器注入原生方式的setter注入原生方式的构造器注…

PyPDF2合并PDF文件的高级应用:指定合并方式

本文目录 前言一、合并PDF的高级应用1、逻辑讲解2、合并效果图3、完整代码二、异常校验1、合并过程中的错误校验前言 本文我们主要来讲解一下PyPDF2合并PDF文件的高级应用,就是指定合并方式进行合并,构建函数支持模式选择,主要不管咋折腾,其实就是不想去付费买那个PDF编辑…

PDF怎么分割成一页一页的?原来可以这么轻松

PDF怎么分割成一页一页的?PDF文档因其跨平台兼容性和可打印性而被广泛使用,但有时为了便于发送电子邮件、管理文档或保护敏感信息,我们需要将一个大型的PDF文件分割成多个小文件。幸运的是,分割PDF文件并不复杂。下文中就介绍了三…

webp2jpg网页在线图片格式转换源码

源码介绍 webp2jpg-免费在线图片格式转化器, 可将jpeg、jpg、png、gif、 webp、svg、ico、bmp文件转化为jpeg、png、webp、webp动画、gif文件。 无需上传文件,本地即可完成转换! 源码特点: 无需上传,使用浏览器自身进行转换批量转换输出we…

easyexcel使用小结-未完待续

官网&#xff1a;https://easyexcel.opensource.alibaba.com/docs/current/ <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>4.0.1</version></dependency>一、读 1.1简单读 Getter…

鸿蒙小案例-自定义键盘

一个自定义键盘 效果 完成简单的26键中英文输入 使用&#xff1a; Entry Component struct IndexInput {State text: string inputController: TextInputController new TextInputController()//自定义键盘关闭事件hideClick(){this.inputController.stopEditing()}//自定义…

软件测评机构:关于软件验收测试作用与实施步骤全解析

软件验收测试是指在软件项目交付给用户之前进行的一系列测试活动&#xff0c;其主要目的是验证软件是否符合用户需求和设计规范&#xff0c;以确保软件的质量和稳定性。 软件验收测试在软件开发生命周期的最后阶段进行&#xff0c;起到了至关重要的作用。它能够帮助客户确认软…

c++:动态内存变量

典型的C面向对象编程 元素 (1)头文件hpp中类的定义 (2)源文件cpp中类的实现&#xff08;构造函数、析构函数、方法&#xff09; (3)主程序 案例 (1)用C来编程“人一天的生活” (2)“人”的属性&#xff1a;name、age、male (3)“人”的方法&#xff1a;eat、work(coding/shop…

【网络安全学习】漏洞利用:BurpSuite的使用-03-枚举攻击案例

如何使用BurpSuite进行枚举攻击 1.靶场选择 BurpSuite官方也是有渗透的教学与靶场的&#xff0c;这次就使用BurpSuite的靶场进行练习。 靶场地址&#xff1a;https://portswigger.net/web-security 登录后如下图所示&#xff0c;选择**【VIEW ALL PATHS】**&#xff1a; 找…

PHP基础教程——总结W3school

1、<?php ?> 2、$ 声明变量 3、变量大小写敏感 关键字&#xff08;if、else、echo&#xff09;和用户定义的类、函数大小写不敏感 4、三种注释 // # /* */ 5、echo "<br>"; 换行 6、global(关键字) 函数内访问全局变量 $GLOBALS[index] …

经典链表算法题:找到环的入口。清晰图示推导出来

Leetcode题目链接 原理 重画链表如下所示&#xff0c;线上有若干个节点。记蓝色慢指针为 slow&#xff0c;红色快指针为 fast。初始时 slow 和 fast 均在头节点处。 使 slow 和 fast 同时前进&#xff0c;fast 的速度是 slow 的两倍。当 slow 抵达环的入口处时&#xff0c;如…

【公益案例展】四川农担x中电金信——大数据智能风控平台建设

‍ 中电金信公益案例 本项目案例由中电金信投递并参与数据猿与上海大数据联盟联合推出的 #榜样的力量# 《2024中国数据智能产业最具社会责任感企业》榜单/奖项”评选。 大数据产业创新服务媒体 ——聚焦数据 改变商业 1、外部经济环境带来的挑战 近几年经济发展和市场需求的挑…

【C语言】—— 文件操作(下)

【C语言】—— 文件操作&#xff08;下&#xff09; 前言&#xff1a;五、文件的顺序读写5.1、 顺序读写函数介绍5.2、 f p u t c fputc fputc 函数5.3、 f g e t c fgetc fgetc 函数5.4、 f p u t s fputs fputs 函数5.5、 f g e t s fgets fgets 函数5.6、 f p r i n t f…

2024 年 亚太赛 APMCM (C题)中文赛道国际大学生数学建模挑战赛 | 量子计算的物流配送 | 数学建模完整代码+建模过程全解全析

当大家面临着复杂的数学建模问题时&#xff0c;你是否曾经感到茫然无措&#xff1f;作为2022年美国大学生数学建模比赛的O奖得主&#xff0c;我为大家提供了一套优秀的解题思路&#xff0c;让你轻松应对各种难题&#xff01; 完整内容可以在文章末尾领取&#xff01; 该段文字…

C++内存管理(候捷)第一讲 笔记

内存分配的每一层面 applications可以调用STL&#xff0c;里面会有allocator进行内存分配&#xff1b;也可以使用C 基本工具primitives&#xff0c;比如new, new[], new(), ::operator new()&#xff1b;还可以使用更底层的malloc和free分配和释放内存。最底层的是系统调用&…

Maven Archetype 自定义项目模板:高效开发的最佳实践

文章目录 前言一、Maven Archetype二、创建自定义 Maven Archetype三、定制 Archetype 模板四、手动创建 Archetype 模板项目五、FAQ5.1 如何删除自定义的模板5.2 是否可以在模板中使用空文件夹 六、小结推荐阅读 前言 在软件开发中&#xff0c;标准化和快速初始化项目结构能够…

14-20 Vision Transformer用AI的画笔描绘新世界

概述 毫无疑问,目前最受关注且不断发展的最重要的主题之一是使用人工智能生成图像、视频和文本。大型语言模型 (LLM) 已展示出其在文本生成方面的卓越能力。它们在文本生成方面的许多问题已得到解决。然而,LLM 面临的一个主要挑战是它们有时会产生幻觉反应。 最近推出的新模…

分布式计算、异构计算与算力共享

目录 算力 算力共享的技术支撑 云计算技术 边缘计算技术 区块链技术 分布式计算、异构计算与算力共享 分布式计算:计算力的“集团军作战” 异构计算:计算力的“多兵种协同” 算力共享:计算力的“共享经济” 深入融合,共创计算新纪元 算力共享对科研领域的影响 …

openmetadata1.3.1 自定义连接器 开发教程

openmetadata自定义连接器开发教程 一、开发通用自定义连接器教程 官网教程链接&#xff1a; 1.https://docs.open-metadata.org/v1.3.x/connectors/custom-connectors 2.https://github.com/open-metadata/openmetadata-demo/tree/main/custom-connector &#xff08;一&…