最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

如何提取Playwright錄制文件中的元素定位信息

 更新時(shí)間:2021年12月12日 10:33:50   作者:凌空摘星  
最近在學(xué)習(xí)Playwright自動(dòng)化測(cè)試,本文主要介紹了如何提取Playwright錄制文件中的元素定位信息,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

引言

最近組內(nèi)推行Playwright進(jìn)行自動(dòng)化測(cè)試,由我封裝了一個(gè)簡(jiǎn)單的框架供大家使用。本意是想讓大家使用Page Object模式來(lái)編寫(xiě)自動(dòng)化代碼的,可是不知道是因?yàn)榇蠹蚁勇闊?,還是Playwright自帶的錄制工具太好用,基本上都是先錄制,再把錄制好的腳本放到框架中執(zhí)行,結(jié)果就是Page Object的優(yōu)勢(shì)完全沒(méi)有享受到,另外我在頁(yè)面操作中加入了自動(dòng)等待、重試等優(yōu)化機(jī)制也是,還得在腳本里面一個(gè)個(gè)處理。由此,我分析大家不愿意用Page Object的一個(gè)原因是自己編寫(xiě)元素定位比較麻煩,而錄制下來(lái)的腳本里面已經(jīng)包含了定位信息,那么我是不是可以將錄制腳本中的定位信息解析出來(lái),在轉(zhuǎn)換成我框架里的頁(yè)面基類(lèi),就可以直接使用了。

方法研究

首先我想到使用讀取python文件配合正則表達(dá)式的方式進(jìn)行解析,但是仔細(xì)一想,如果一個(gè)表達(dá)式有多行的話就很難處理了,還需要分析語(yǔ)法進(jìn)行拼接。后來(lái)查詢(xún)到可以使用python自帶的ast庫(kù)將python文件轉(zhuǎn)化為抽象語(yǔ)法樹(shù)進(jìn)行解析,一下子就豁然開(kāi)朗了。

元素定位是元素交互的前提條件,也是自動(dòng)化測(cè)試最重要的步驟之一。元素” 存在 “頁(yè)面”中 ,要定位元素,就是調(diào)用“頁(yè)面”的方法:

  • querySelector(engine=body) # 選擇單個(gè)元素
  • querySelectorAll(engine=body) # 選擇多個(gè)元素
  • waitForSelector(engine=body) # 選擇單個(gè)元素,并且自動(dòng)等待到元素可見(jiàn)、可操作

提取代碼

我這里主要用到了ast的 parse walk dump 三個(gè)方法, parse 方法將腳本轉(zhuǎn)化為抽象語(yǔ)法樹(shù), walk 用來(lái)遍歷整個(gè)抽象語(yǔ)法樹(shù)(類(lèi)似xml遍歷), dump 用于調(diào)試和將無(wú)法解析的內(nèi)容直接輸出,其實(shí)這里可以使用 unparse 或通過(guò) lineno col_offset end_lineno end_col_offset 這四個(gè)屬性定位到源碼,但是這些都需要較高的python版本才有,我現(xiàn)在項(xiàng)目中使用的python 3.7版本中還沒(méi)有這些,只能先用 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'無(wú)法解析: {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'無(wú)法解析: {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}條定位信息, 跳過(guò){dup_num}條重復(fù)信息')

代碼解析

代碼中很多地方用到了 isinstance 方法來(lái)判斷節(jié)點(diǎn)是什么類(lèi)型,因?yàn)樾枰馕龅膬?nèi)容都是 page.click('...')或 page.frame('...').click('...')形式,所以大多數(shù)時(shí)候需要提取 Call對(duì)象的 func的 attr屬性即為所需要的定位信息。另外使用了 inspect 庫(kù)來(lái)提取可能需要解析的方法,如 click fill等,直接從Playwright中提取,就不需要一個(gè)一個(gè)去找了。再加上一些重復(fù)判斷,即為上述代碼。

希望有了將錄制腳本轉(zhuǎn)換Page Object的方法之后,可以將Page Object的模式在組內(nèi)推廣起來(lái)吧。

到此這篇關(guān)于如何提取Playwright錄制文件中的元素定位信息的文章就介紹到這了,更多相關(guān)提取Playwright元素定位內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python+opencv實(shí)現(xiàn)目標(biāo)跟蹤過(guò)程

    python+opencv實(shí)現(xiàn)目標(biāo)跟蹤過(guò)程

    這篇文章主要介紹了python+opencv實(shí)現(xiàn)目標(biāo)跟蹤過(guò)程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • TensorFlow2.X使用圖片制作簡(jiǎn)單的數(shù)據(jù)集訓(xùn)練模型

    TensorFlow2.X使用圖片制作簡(jiǎn)單的數(shù)據(jù)集訓(xùn)練模型

    這篇文章主要介紹了TensorFlow2.X使用圖片制作簡(jiǎn)單的數(shù)據(jù)集訓(xùn)練模型,本文通過(guò)截圖實(shí)例代碼相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-04-04
  • Pycharm 2to3配置,python2轉(zhuǎn)python3方式

    Pycharm 2to3配置,python2轉(zhuǎn)python3方式

    這篇文章主要介紹了Pycharm 2to3配置,python2轉(zhuǎn)python3方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • python+pytest接口自動(dòng)化之日志管理模塊loguru簡(jiǎn)介

    python+pytest接口自動(dòng)化之日志管理模塊loguru簡(jiǎn)介

    python中有一個(gè)用起來(lái)非常簡(jiǎn)便的第三方日志管理模塊--loguru,不僅可以避免logging的繁瑣配置,而且可以很簡(jiǎn)單地避免在logging中多進(jìn)程多線程記錄日志時(shí)出現(xiàn)的問(wèn)題,甚至還可以自定義控制臺(tái)輸出的日志顏色,接下來(lái)我們來(lái)學(xué)習(xí)怎么使用loguru模塊進(jìn)行日志管理
    2022-05-05
  • python使用matplotlib繪制折線圖教程

    python使用matplotlib繪制折線圖教程

    Matplotlib是一個(gè)Python工具箱,用于科學(xué)計(jì)算的數(shù)據(jù)可視化。借助它,Python可以繪制如Matlab和Octave多種多樣的數(shù)據(jù)圖形。下面這篇文章主要介紹了python使用matplotlib如何繪制折線圖的方法教程,需要的朋友可以參考借鑒。
    2017-02-02
  • python學(xué)習(xí)筆記之列表(list)與元組(tuple)詳解

    python學(xué)習(xí)筆記之列表(list)與元組(tuple)詳解

    List(列表)是Python中使用最頻繁的數(shù)據(jù)類(lèi)型,而元組是另一個(gè)數(shù)據(jù)類(lèi)型,類(lèi)似于List(列表)。這篇文章主要給大家介紹了python學(xué)習(xí)筆記之列表(list)與元組(tuple)的相關(guān)資料,文中不僅詳細(xì)介紹了兩者的使用,還分享了list和tuple的相互轉(zhuǎn)換的方法,需要的朋友可以參考下
    2017-11-11
  • 使用Python實(shí)現(xiàn)ETL流程的全面指南

    使用Python實(shí)現(xiàn)ETL流程的全面指南

    ETL是數(shù)據(jù)處理領(lǐng)域中的核心概念,代表了從源數(shù)據(jù)到目標(biāo)系統(tǒng)的三個(gè)關(guān)鍵步驟:提取、數(shù)據(jù)、轉(zhuǎn)換,ETL流程在數(shù)據(jù)集成、數(shù)據(jù)倉(cāng)庫(kù)構(gòu)建和業(yè)務(wù)分析中扮演著重要角色,本文將聚焦于使用Python這一強(qiáng)大且靈活的編程語(yǔ)言來(lái)實(shí)現(xiàn)ETL流程,特別關(guān)注從文本文件提取數(shù)據(jù)的技巧和實(shí)踐
    2025-07-07
  • python挖礦算力測(cè)試程序詳解

    python挖礦算力測(cè)試程序詳解

    這篇文章主要介紹了python挖礦算力測(cè)試程序詳解的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-07-07
  • Python函數(shù)中*args和**kwargs來(lái)傳遞變長(zhǎng)參數(shù)的用法

    Python函數(shù)中*args和**kwargs來(lái)傳遞變長(zhǎng)參數(shù)的用法

    這篇文章主要介紹了Python編程中使用*args和**kwargs來(lái)傳遞可變參數(shù)的用法,文中舉了變長(zhǎng)參數(shù)的例子,需要的朋友可以參考下
    2016-01-01
  • 使用Python編寫(xiě)錄屏錄音工具

    使用Python編寫(xiě)錄屏錄音工具

    這篇文章主要為大家詳細(xì)介紹了如何使用Python編寫(xiě)一個(gè)錄屏錄音工具,工具界面十分簡(jiǎn)單,默認(rèn)是全屏錄屏錄音,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-12-12

最新評(píng)論

大洼县| 洛扎县| 当阳市| 团风县| 奉贤区| 新巴尔虎右旗| 凯里市| 东兴市| 长岛县| 六枝特区| 澄城县| 开平市| 铁力市| 浦江县| 宝鸡市| 柳林县| 子长县| 渭源县| 会昌县| 雷山县| 台前县| 太白县| 堆龙德庆县| 上饶县| 昌邑市| 永吉县| 青阳县| 玉田县| 调兵山市| 土默特右旗| 阜阳市| 武穴市| 嘉禾县| 偃师市| 淮南市| 科技| 南乐县| 手游| 许昌县| 兴海县| 沅陵县|