中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么提取Playwright錄制文件中的元素定位信息

發布時間:2021-12-13 09:07:47 來源:億速云 閱讀:121 作者:iii 欄目:開發技術

本篇內容主要講解“怎么提取Playwright錄制文件中的元素定位信息”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“怎么提取Playwright錄制文件中的元素定位信息”吧!

引言

最近組內推行Playwright進行自動化測試,由我封裝了一個簡單的框架供大家使用。本意是想讓大家使用Page Object模式來編寫自動化代碼的,可是不知道是因為大家嫌麻煩,還是Playwright自帶的錄制工具太好用,基本上都是先錄制,再把錄制好的腳本放到框架中執行,結果就是Page Object的優勢完全沒有享受到,另外我在頁面操作中加入了自動等待、重試等優化機制也是,還得在腳本里面一個個處理。由此,我分析大家不愿意用Page Object的一個原因是自己編寫元素定位比較麻煩,而錄制下來的腳本里面已經包含了定位信息,那么我是不是可以將錄制腳本中的定位信息解析出來,在轉換成我框架里的頁面基類,就可以直接使用了。

方法研究

首先我想到使用讀取python文件配合正則表達式的方式進行解析,但是仔細一想,如果一個表達式有多行的話就很難處理了,還需要分析語法進行拼接。后來查詢到可以使用python自帶的ast庫將python文件轉化為抽象語法樹進行解析,一下子就豁然開朗了。

元素定位是元素交互的前提條件,也是自動化測試最重要的步驟之一。元素” 存在 “頁面”中 ,要定位元素,就是調用“頁面”的方法:

  • querySelector(engine=body) # 選擇單個元素

  • querySelectorAll(engine=body) # 選擇多個元素

  • waitForSelector(engine=body) # 選擇單個元素,并且自動等待到元素可見、可操作

提取代碼

我這里主要用到了ast的 parse walk dump 三個方法, parse 方法將腳本轉化為抽象語法樹, walk 用來遍歷整個抽象語法樹(類似xml遍歷), dump 用于調試和將無法解析的內容直接輸出,其實這里可以使用 unparse 或通過 lineno col_offset end_lineno end_col_offset 這四個屬性定位到源碼,但是這些都需要較高的python版本才有,我現在項目中使用的python 3.7版本中還沒有這些,只能先用 dump 代替(當然,也是我比較偷懶)。代碼如下:

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}條重復信息')

代碼解析

代碼中很多地方用到了 isinstance 方法來判斷節點是什么類型,因為需要解析的內容都是 page.click('...')或 page.frame('...').click('...')形式,所以大多數時候需要提取 Call對象的 func的 attr屬性即為所需要的定位信息。另外使用了 inspect 庫來提取可能需要解析的方法,如 click fill等,直接從Playwright中提取,就不需要一個一個去找了。再加上一些重復判斷,即為上述代碼。

到此,相信大家對“怎么提取Playwright錄制文件中的元素定位信息”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

文水县| 秦安县| 贞丰县| 通河县| 闻喜县| 乌拉特后旗| 合山市| 启东市| 香格里拉县| 陆丰市| 韶山市| 长岭县| 彭水| 高邮市| 荔波县| 成安县| 新泰市| 博湖县| 根河市| 安徽省| 临清市| 鄂托克前旗| 信宜市| 汕头市| 大田县| 邢台县| 乃东县| 永仁县| 岐山县| 宣恩县| 万安县| 酉阳| 石门县| 昌邑市| 鄂尔多斯市| 樟树市| 安新县| 犍为县| 翁牛特旗| 马公市| 新余市|