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.pswp.cn/diannao/40764.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/40764.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/40764.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

DALL-E、Stable Diffusion 等 20+ 圖像生成模型綜述

二、任務場景 2.1. 無條件生成 無條件生成是指生成模型在生成圖像時不受任何額外條件或約束的影響。模型從學習的數據分布中生成圖像,而不需要關注輸入條件。 2.2. 有條件生成 有條件生成是指生成模型在生成圖像時受到額外條件或上下文的影響。這些條件可以是類別…

Vscode 保存代碼,代碼自動格式化

我這里使用的插件是Prettier-Code formatter:自動縮進整理代碼的格式,使用方法如下: 先在vscode商店找到插件并安裝:安裝插件之后,隨便找到一個項目文件,右鍵選擇格式化文檔:選中我們安裝的插件…

掌握Vim的會話之道:深度解析會話管理功能

掌握Vim的會話之道:深度解析會話管理功能 在高效的文本編輯工作流中,能夠保存和恢復編輯會話是極其重要的。Vim,作為一個功能強大的文本編輯器,提供了會話管理功能,允許用戶保存當前的工作狀態,并在之后重…

spring6框架解析(by尚硅谷)

文章目錄 spring61. 一些基本的概念、優勢2. 入門案例實現maven聚合工程創建步驟分析實現過程 3. IoC(Inversion of Control)基于xml的bean環境搭建獲取bean獲取接口創建實現類依賴注入 setter注入 和 構造器注入原生方式的setter注入原生方式的構造器注…

Java 多線程stream流按行讀取文件

stream并行流快&#xff08;文件11g&#xff09; try (Stream<String> lines Files.lines(filePath)) {lines.parallel().forEach(str -> operatePartData(str, allDataList)); } catch (IOException e) {throw new RuntimeException(e); }線程池慢&#xff08;文件…

PyPDF2合并PDF文件的高級應用:指定合并方式

本文目錄 前言一、合并PDF的高級應用1、邏輯講解2、合并效果圖3、完整代碼二、異常校驗1、合并過程中的錯誤校驗前言 本文我們主要來講解一下PyPDF2合并PDF文件的高級應用,就是指定合并方式進行合并,構建函數支持模式選擇,主要不管咋折騰,其實就是不想去付費買那個PDF編輯…

PDF怎么分割成一頁一頁的?原來可以這么輕松

PDF怎么分割成一頁一頁的&#xff1f;PDF文檔因其跨平臺兼容性和可打印性而被廣泛使用&#xff0c;但有時為了便于發送電子郵件、管理文檔或保護敏感信息&#xff0c;我們需要將一個大型的PDF文件分割成多個小文件。幸運的是&#xff0c;分割PDF文件并不復雜。下文中就介紹了三…

webp2jpg網頁在線圖片格式轉換源碼

源碼介紹 webp2jpg-免費在線圖片格式轉化器, 可將jpeg、jpg、png、gif、 webp、svg、ico、bmp文件轉化為jpeg、png、webp、webp動畫、gif文件。 無需上傳文件&#xff0c;本地即可完成轉換! 源碼特點&#xff1a; 無需上傳&#xff0c;使用瀏覽器自身進行轉換批量轉換輸出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…

系統安全體系架構規劃框架

安全技術體系架構是對組織機構信息技術系統的安全體系結構的整體描述。安全技術體系架構框架是擁有信息技術系統的組織機構根據其策略的要求和風險評估的結果&#xff0c;參考相關技術體系構架的標準和最佳實踐&#xff0c;結合組織機構信息技術系統的具體現狀和需求&#xff0…

鴻蒙小案例-自定義鍵盤

一個自定義鍵盤 效果 完成簡單的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;如…

FFmpeg引用計數數據緩沖區相關的結構體:AVBuffer、AVBufferRef簡介

一、AVBuffer結構體的聲明 AVBuffer是一個用于引用計數數據緩沖區的應用程序編程接口&#xff0c;它表示數據緩沖區本身。它是不透明的&#xff0c;不能被直接訪問調用&#xff0c;只能通過AVBufferRef間接訪問它。但是可以通過比較兩個AVBuffer指針來檢查是否兩個不同的引用都…

MySQL——三大范式

為什么需要數據規范化&#xff1f; 信息重復 更新異常 插入異常&#xff1a;無法正常顯示信息 刪除異常&#xff1a;丟失有效的信息 三大范式 1. 第一范式&#xff08;1NF&#xff09; 原子性&#xff1a;保證每一列不可再分 2. 第二范式&#xff08;2NF&#xf…

【公益案例展】四川農擔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…