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 = 0

    def __init__(self, record_scripts_base_path: str = '', output_file_path: str = '', output_file_name: str = ''):
        self.base_path = record_scripts_base_path
        self.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 += 1
        except UnicodeDecodeError as ude:
            print(f'*****文件读取失败!文件编码异常:{ude},请检查文件内容!*****')
        except Exception as e:
            print(f'*****执行异常:{e}*****')
        finally:
            print(f'***** 元素数量:{self._total} *****')
            return self.element_dict

    def __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 += 1
        elif role == 'label':
            self.element_dict[f'label_{self._label}'] = element.split('.click')[0]
            self._label += 1
        elif role == 'link':
            self.element_dict[f'link_{self._link}'] = element.split('.click')[0]
            self._link += 1
        else:
            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 += 1
        else:
            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 += 1
        elif '.fill(' in element:
            self.element_dict[f'input_{self._input}'] = element.split('.fill')[0]
            self._input += 1
        else:
            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 Page


class {}(BasePage):
\t"""
\t页面描述
\t"""

\tdef __init__(self, page: Page):
\t\tsuper().__init__(page)
'''

其他

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

  • 15
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Playwright 是一种现代化的浏览器自动化工具,它可以用来录制和执行自动化测试脚本。以下是使用 Playwright 录制脚本的步骤: 1. 安装 Node.js 和 Playwright: ``` npm install -g playwright ``` 2. 启动录制工具: ``` npx playwright codegen ``` 3. 选择要录制的浏览器和操作系统,并打开浏览器: ``` const { chromium } = require('playwright'); (async () => { const browser = await chromium.launch({ headless: false }); const context = await browser.newContext(); const page = await context.newPage(); await page.goto('https://example.com'); // 开始录制 })(); ``` 4. 在浏览器中进行操作,例如点击按钮或输入文本。 5. 停止录制并生成脚本,复制生成的代码并粘贴到测试脚本中。 6. 运行测试脚本: ``` node my-test.js ``` 这样就可以使用 Playwright 录制和执行自动化测试脚本了。 ### 回答2: Playwright是一个开源的自动化测试工具,它可以用于录制和执行浏览器自动化脚本。通过Playwright录制脚本,我们可以实现对Web应用程序的自动化操作和测试。 首先,我们需要安装Playwright。可以使用npm命令来安装Playwright的Node.js库,也可以使用pip命令来安装Python库。安装完成后,我们可以使用命令行或代码编辑器来编写脚本。 在开始录制脚本之前,需要先创建一个文件,比如script.js或者script.py。然后,我们可以使用Playwright提供的API来录制脚本。首先,需要导入Playwright库,并创建一个浏览器实例: const { webkit } = require('playwright'); (async () => { const browser = await webkit.launch(); const context = await browser.newContext(); const page = await context.newPage(); 接下来,我们可以在浏览器页面上执行各种操作,比如导航到指定的URL、填写表单、点击按钮、获取元素等等。我们可以使用page对象提供的方法来完成这些操作,比如: await page.goto('https://example.com'); await page.fill('input[name="username"]', 'myusername'); await page.click('button[type="submit"]'); const title = await page.title(); 在录制脚本期间,我们还可以使用Playwright开发者工具,来查看浏览器页面的DOM结构和CSS样式。这样可以更方便地定位元素和编写脚本。 完成录制脚本后,我们可以保存脚本并执行它。执行脚本的方式取决于我们的需求,可以使用命令行工具传入脚本文件执行,也可以编写一个Node.js或Python程序来执行脚本。 总之,通过Playwright录制脚本,我们可以方便地实现对Web应用程序的自动化操作和测试。这样可以提高工作效率,减少人工操作的工作量,并确保应用程序的质量和稳定性。 ### 回答3: Playwright是一个强大的开源工具,用于录制、回放和调试Web应用程序的自动化脚本。使用Playwright录制脚本可以极大地提高开发人员的生产效率和测试质量。 首先,开发人员可以使用Playwright录制功能来快速生成自动化测试脚本。通过在浏览器中手动操作网页,Playwright能够记录下每一步操作,如点击、输入、滚动等。录制下来的脚本可以直接在后续的回放中使用,省去了开发人员手动编写脚本的时间和精力。 其次,Playwright录制脚本可以轻松地进行编辑和自定义。开发人员可以通过添加断言和条件语句来验证页面的正确性和功能的完整性。这样可以确保应用程序在各种场景下的稳定性和可靠性。 另外,Playwright还支持多种编程语言,包括JavaScript、TypeScript和Python等,这使得开发人员可以使用自己熟悉的语言编写和管理测试脚本。这种灵活性使得团队成员可以更好地合作,并且可以根据项目需要进行定制和扩展。 最后,Playwright还提供了丰富的调试工具,使得开发人员能够更好地跟踪和排查自动化测试脚本中的错误和问题。通过使用这些调试工具,开发人员可以检查每一步操作的执行结果、输入的准确性和页面的状态,从而更好地了解脚本的执行流程和问题所在。 总之,Playwright录制脚本是一种高效且灵活的方式,可用于自动化测试和测试驱动开发。它能够大大提高开发人员的效率和测试质量,同时也提供了强大的调试功能,帮助开发人员更好地解决问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值