如何提取Playwright錄制文件中的元素定位信息
引言
最近組內(nèi)推行Playwright進(jìn)行自動(dòng)化測試,由我封裝了一個(gè)簡單的框架供大家使用。本意是想讓大家使用Page Object模式來編寫自動(dòng)化代碼的,可是不知道是因?yàn)榇蠹蚁勇闊€是Playwright自帶的錄制工具太好用,基本上都是先錄制,再把錄制好的腳本放到框架中執(zhí)行,結(jié)果就是Page Object的優(yōu)勢完全沒有享受到,另外我在頁面操作中加入了自動(dòng)等待、重試等優(yōu)化機(jī)制也是,還得在腳本里面一個(gè)個(gè)處理。由此,我分析大家不愿意用Page Object的一個(gè)原因是自己編寫元素定位比較麻煩,而錄制下來的腳本里面已經(jīng)包含了定位信息,那么我是不是可以將錄制腳本中的定位信息解析出來,在轉(zhuǎn)換成我框架里的頁面基類,就可以直接使用了。
方法研究
首先我想到使用讀取python文件配合正則表達(dá)式的方式進(jìn)行解析,但是仔細(xì)一想,如果一個(gè)表達(dá)式有多行的話就很難處理了,還需要分析語法進(jìn)行拼接。后來查詢到可以使用python自帶的ast庫將python文件轉(zhuǎn)化為抽象語法樹進(jìn)行解析,一下子就豁然開朗了。
元素定位是元素交互的前提條件,也是自動(dòng)化測試最重要的步驟之一。元素” 存在 “頁面”中 ,要定位元素,就是調(diào)用“頁面”的方法:
- querySelector(engine=body) # 選擇單個(gè)元素
- querySelectorAll(engine=body) # 選擇多個(gè)元素
- waitForSelector(engine=body) # 選擇單個(gè)元素,并且自動(dòng)等待到元素可見、可操作
提取代碼
我這里主要用到了ast的 parse walk dump 三個(gè)方法, parse 方法將腳本轉(zhuǎn)化為抽象語法樹, walk 用來遍歷整個(gè)抽象語法樹(類似xml遍歷), dump 用于調(diào)試和將無法解析的內(nèi)容直接輸出,其實(shí)這里可以使用 unparse 或通過 lineno col_offset end_lineno end_col_offset 這四個(gè)屬性定位到源碼,但是這些都需要較高的python版本才有,我現(xiàn)在項(xiàng)目中使用的python 3.7版本中還沒有這些,只能先用 dump 代替(當(dāng)然,也是我比較偷懶)。代碼如下:
import ast from inspect import signature from playwright.sync_api import Page import_num = 0 dup_num = 0 result = [] with open('<playwright錄制腳本>', 'rb') as f: root = ast.parse(f.read()) parse_methods = set() for i in dir(Page): if not i.startswith('_'): attr = getattr(Page, i) if callable(attr): sign = signature(attr).parameters if 'selector' in sign: parse_methods.add(i) for node in ast.walk(root): if isinstance(node, ast.Call): if isinstance(node.func, ast.Attribute) and \ node.func.attr in parse_methods: if len(node.args) == 0: continue selector = node.args[0] if isinstance(selector, ast.Str): selector = selector.s elif isinstance(selector, ast.Name): selector = f'變量: {selector.id}' else: selector = f'無法解析: {ast.dump(selector, False)}' frame_locator = None if isinstance(node.func.value, ast.Call) and \ isinstance(node.func.value.func, ast.Attribute) and \ node.func.value.func.attr == 'frame': if len(node.func.value.args) > 0: frame_locator = str(node.func.value.args[0]) else: frame_node = node.func.value.keywords[0].value if isinstance(frame_node, ast.Str): frame_locator = frame_node.s elif isinstance(frame_node, ast.Name): frame_locator = f'變量: {frame_node.id}' else: frame_locator = f'無法解析: {ast.dump(frame_node, False)}' for i in result: if selector == i[0] and frame_locator == i[1]: dup_num += 1 break else: result.append((selector, frame_locator)) print(f"{selector}, {frame_locator} {node.func.attr == 'query_selector_all'}") import_num += 1 print(f'成功解析{import_num}條定位信息, 跳過{dup_num}條重復(fù)信息')
代碼解析
代碼中很多地方用到了 isinstance 方法來判斷節(jié)點(diǎn)是什么類型,因?yàn)樾枰馕龅膬?nèi)容都是 page.click('...')或 page.frame('...').click('...')形式,所以大多數(shù)時(shí)候需要提取 Call對(duì)象的 func的 attr屬性即為所需要的定位信息。另外使用了 inspect 庫來提取可能需要解析的方法,如 click fill等,直接從Playwright中提取,就不需要一個(gè)一個(gè)去找了。再加上一些重復(fù)判斷,即為上述代碼。
希望有了將錄制腳本轉(zhuǎn)換Page Object的方法之后,可以將Page Object的模式在組內(nèi)推廣起來吧。
到此這篇關(guān)于如何提取Playwright錄制文件中的元素定位信息的文章就介紹到這了,更多相關(guān)提取Playwright元素定位內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Playwright中如何保持登錄狀態(tài)
- python中playwright結(jié)合pytest執(zhí)行用例的實(shí)現(xiàn)
- Playwright快速上手指南(入門教程)
- Python開源自動(dòng)化工具Playwright安裝及介紹使用
- python playwright 自動(dòng)等待和斷言詳解
- python+playwright微軟自動(dòng)化工具的使用
- 如何使用Playwright對(duì)Java API實(shí)現(xiàn)自動(dòng)視覺測試
- 微軟開源最強(qiáng)Python自動(dòng)化神器Playwright(不用寫一行代碼)
相關(guān)文章
Python+Appium實(shí)現(xiàn)自動(dòng)搶微信紅包
不知從何時(shí)開始微信紅包橫空出世,對(duì)于網(wǎng)速和手速慢的人只能在一旁觀望,做為python的學(xué)習(xí)者就是要運(yùn)用編程解決生活和工作上的事情。于是我用python解決我們的手速問題python實(shí)現(xiàn)自動(dòng)搶微信紅包,至于網(wǎng)速慢得那就只能自己花錢提升了。2021-05-05python實(shí)現(xiàn)復(fù)制大量文件功能
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)復(fù)制大量文件功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-08-08Python使用os.listdir和os.walk獲取文件路徑
這篇文章主要介紹了Python使用os.listdir和os.walk獲取文件路徑,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05Python開發(fā)技巧之海象運(yùn)算符的三種運(yùn)用方式
這篇文章主要介紹了Python開發(fā)技巧之海象運(yùn)算符的三種運(yùn)用方式,海象運(yùn)算符是在 PEP 572 被提出的,直到 3.8 版本合入發(fā)布,感興趣的同學(xué)可以參考學(xué)習(xí)下2021-10-10