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

Playwright中如何保持登錄狀態(tài)

 更新時(shí)間:2021年12月12日 10:23:12   作者:凌空摘星  
本文主要介紹了Playwright中如何保持登錄狀態(tài),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

引言

在編寫(xiě)UI自動(dòng)化測(cè)試用例的時(shí)候,通常會(huì)采用每個(gè)測(cè)試用例前打開(kāi)新頁(yè)面重新進(jìn)行登錄,以減少用例間的影響,比如一個(gè)測(cè)試用例執(zhí)行失敗會(huì)影響到下一個(gè)測(cè)試用例的執(zhí)行,或者下一個(gè)用例的開(kāi)始依賴于上一個(gè)用例的結(jié)束頁(yè)面。但是這種方式會(huì)使得測(cè)試用例的執(zhí)行時(shí)間大幅度上升,尤其是在測(cè)試用例劃分的顆粒度比較小的時(shí)候;加入一個(gè)項(xiàng)目中有2000個(gè)測(cè)試用例,登錄操作耗時(shí)2秒,那么光耗費(fèi)在登錄上面的時(shí)間就有4000秒,達(dá)到一個(gè)多小時(shí)了,嚴(yán)重影響測(cè)試執(zhí)行效率,再假如項(xiàng)目中使用了驗(yàn)證碼限制登錄的情況,那么就更復(fù)雜了。所以,如果可以將登錄狀態(tài)保持住,開(kāi)始測(cè)試用例的時(shí)候打開(kāi)新頁(yè)面,跳過(guò)登錄直接進(jìn)入到待測(cè)系統(tǒng)中,就可以大幅度提高測(cè)試執(zhí)行效率。通常,每種UI自動(dòng)化測(cè)試工具都會(huì)有類似的功能,這里以Playwright為例來(lái)介紹如何實(shí)現(xiàn)。

功能實(shí)現(xiàn)

在Playwright中提供了現(xiàn)成的方法,通過(guò) context.storage_state(path='<文件路徑>') ,可以將當(dāng)前瀏覽器上下文的全部狀態(tài)保存下來(lái),在創(chuàng)建瀏覽器上下文時(shí),添加 storage_state 參數(shù)即可讀取保存的文件,從而完全恢復(fù)之前的瀏覽器狀態(tài)。示例代碼如下

# 首次登陸系統(tǒng)
from playwright.sync_api import sync_playwright

with sync_playwright() as playwright:
    browser = playwright.chromium.launch()
    context = browser.new_context()
    page = context.new_page()
  
  # 登陸系統(tǒng)
    page.goto('<login url>')
    page.fill('<username>', '<username selector>')
    page.fill('<password>', '<password selector>')
    page.click('<login button selector>')

  # 判斷是否登陸成功
    assert 'Welcome' in page.title()
  
  # 保存狀態(tài)文件
    context.storage_state(path='login_data.json')
# 使用已保存的狀態(tài)文件跳過(guò)登錄狀態(tài)直接訪問(wèn)系統(tǒng)
with sync_playwright() as playwright:
    browser = playwright.chromium.launch()
  
  # 創(chuàng)建瀏覽器上下文時(shí)加載狀態(tài)文件
    context = browser.new_context(storage_state='login_data.json')
    page = context.new_page()
  
  # 直接訪問(wèn)登錄后的URL
    page.goto('<welcome url>')

  # 判斷是否訪問(wèn)到登錄后的頁(yè)面
    assert 'Welcome' in page.title()

結(jié)合Pytest

通過(guò)以上代碼驗(yàn)證了這種實(shí)現(xiàn)方式的可用性,還是很好用的。結(jié)合Pytest測(cè)試框架,可以通過(guò)fixture的形式提供一個(gè)已登錄的page對(duì)象,可以直接在測(cè)試用例中使用,實(shí)現(xiàn)方式如下:

@pytest.fixture()
def logged_page():
    ss_file = 'login_data.json'
    with sync_playwright() as playwright:
        browser = playwright.chromium.launch()

    # 判斷是否存在狀態(tài)文件,有的話就加載
        if os.path.isfile(ss_file):
            context = browser.new_context(storage_state=ss_file)
        else:
            context = browser.new_context()
        page = context.new_page()

    # 直接跳轉(zhuǎn)至登錄后頁(yè)面,前提是未登錄用戶訪問(wèn)待測(cè)系統(tǒng)會(huì)自動(dòng)跳轉(zhuǎn)至登錄頁(yè)面,如果你的系統(tǒng)邏輯不一樣,需要修改
        page.goto('<welcome url>')

    # 通過(guò)title判斷是否成功進(jìn)入系統(tǒng),如果沒(méi)有需要進(jìn)行登錄,一般在第一次訪問(wèn)系統(tǒng),或登錄信息過(guò)期等原因會(huì)觸發(fā)
        if 'Welcome' not in page.title():
            page.fill('<username>', '<username selector>')
            page.fill('<password>', '<password selector>')
            page.click('<login button selector>')
        yield page

    # 測(cè)試執(zhí)行結(jié)束后保存狀態(tài)文件,前提是測(cè)試用例中不能退出系統(tǒng),安全起見(jiàn)加上異常處理
    try:
           context.storage_state(path=ss_file)
        except Exception as e:
            print(e)

結(jié)合Clent-Page Object模式

如前,結(jié)合Pytest已經(jīng)可以實(shí)現(xiàn)一個(gè)很好用的fixture,在很多場(chǎng)景下已經(jīng)夠用了,不過(guò)我在項(xiàng)目中結(jié)合Clent-Page Object模式進(jìn)行了另一種實(shí)現(xiàn),核心代碼如下:

class Client(ABC):
    playwright = None
    browser = None

    def __init__(self, url: str, *, storage_state_name: str = None):
        self.url = url
        self.context = None
        self.main_page = None
        self.storage_state_file_path = None
        if storage_state_name is not None:
            self.storage_state_file_path = os.path.join('storage_state', f'{storage_state_name}.json')

    @abstractmethod
    def register_page(self):
        pass

    @abstractmethod
    def login(self, **kwargs):
        pass

    @abstractmethod
    def is_logged(self):
        pass

    def start(self) -> None:
        Client.playwright = sync_playwright().start()
        Client.browser = Client.playwright.chromium.launch(**BROWSER_CONFIG)
        if self.storage_state_file_path is not None and os.path.isfile(self.storage_state_file_path):
            self.context = Client.browser.new_context(**CONTEXT_CONFIG, storage_state=self.storage_state_file_path)
        else:
            self.context = Client.browser.new_context(**CONTEXT_CONFIG)
        self.main_page = self.context.new_page()
        self.main_page.goto(self.url)

        self.register_page()

    def close(self) -> None:
        if self.storage_state_file_path is not None:
            if not os.path.exists('storage_state'):
                os.mkdir('storage_state')
            self.context.storage_state(path=self.storage_state_file_path)
        self.main_page.close()
        self.context.close()

def logged_user(client, url, *, scope = 'function', storage_state_name = None, **kwargs):
    @pytest.fixture(scope=scope)
    def user_fixture():
        user = client(url, storage_state_name=storage_state_name)
        user.start()
        logger.info(f'用戶登錄: {kwargs}')
        if not user.is_logged():
            user.login(**kwargs)
        yield user
        user.close()

繼承Client類,使用 logger_user 函數(shù)來(lái)生成不同終端用戶的fixture,以實(shí)現(xiàn)繼承Pytest。

到此這篇關(guān)于Playwright中如何保持登錄狀態(tài)的文章就介紹到這了,更多相關(guān)Playwright保持登錄狀態(tài)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 深度解析Django REST Framework 批量操作

    深度解析Django REST Framework 批量操作

    這篇文章主要介紹了深度解析Django REST Framework批量操作,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • 機(jī)器學(xué)習(xí)10大經(jīng)典算法詳解

    機(jī)器學(xué)習(xí)10大經(jīng)典算法詳解

    這篇文章主要為大家詳細(xì)介紹了機(jī)器學(xué)習(xí)10大經(jīng)典算法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • pytorch使用tensorboardX進(jìn)行l(wèi)oss可視化實(shí)例

    pytorch使用tensorboardX進(jìn)行l(wèi)oss可視化實(shí)例

    今天小編就為大家分享一篇pytorch使用tensorboardX進(jìn)行l(wèi)oss可視化實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-02-02
  • Python中字典的基礎(chǔ)知識(shí)歸納小結(jié)

    Python中字典的基礎(chǔ)知識(shí)歸納小結(jié)

    這篇文章主要介紹了Python中字典的基礎(chǔ)知識(shí)歸納小結(jié),都是Python入門(mén)學(xué)習(xí)中的基本知識(shí),值得反復(fù)鞏固:)需要的朋友可以參考下
    2015-08-08
  • python redis 批量設(shè)置過(guò)期key過(guò)程解析

    python redis 批量設(shè)置過(guò)期key過(guò)程解析

    這篇文章主要介紹了python redis 批量設(shè)置過(guò)期key過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • Python中print函數(shù)語(yǔ)法格式以及各參數(shù)舉例詳解

    Python中print函數(shù)語(yǔ)法格式以及各參數(shù)舉例詳解

    這篇文章主要給大家介紹了關(guān)于Python中print函數(shù)語(yǔ)法格式以及各參數(shù)舉例詳解的相關(guān)資料,print()函數(shù)用于將指定的字符串或?qū)ο?通常是字符串)輸出到屏幕或文件中,需要的朋友可以參考下
    2023-10-10
  • Python基于template實(shí)現(xiàn)字符串替換

    Python基于template實(shí)現(xiàn)字符串替換

    這篇文章主要介紹了Python基于template實(shí)現(xiàn)字符串替換,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-11-11
  • Python學(xué)習(xí)之str 以及常用的命令

    Python學(xué)習(xí)之str 以及常用的命令

    下面小編就為大家?guī)?lái)一篇Python的str 以及常用的命令。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2021-10-10
  • Python中查找缺失值的三種方法

    Python中查找缺失值的三種方法

    本文主要介紹了Python中查找缺失值的三種方法,包括pandas庫(kù)的isnull()方法、numpy庫(kù)的isnan()方法和scikit-learn庫(kù)的SimpleImputer類,感興趣的可以了解一下
    2023-11-11
  • Python?EasyDict庫(kù)以屬性方式訪問(wèn)字典元素(無(wú)需使用方括號(hào)和鍵)

    Python?EasyDict庫(kù)以屬性方式訪問(wèn)字典元素(無(wú)需使用方括號(hào)和鍵)

    在Python中,字典(dict)是一種常用的數(shù)據(jù)結(jié)構(gòu),用于存儲(chǔ)鍵值對(duì),然而,有時(shí)候我們希望以屬性的方式訪問(wèn)字典中的元素,而無(wú)需使用方括號(hào)和鍵,這就是EasyDict庫(kù)的用武之地,本文將深入介紹EasyDict庫(kù),展示其強(qiáng)大的功能和如何通過(guò)示例代碼更好地利用它
    2023-12-12

最新評(píng)論

天镇县| 汝州市| 若羌县| 仲巴县| 扎鲁特旗| 湖口县| 萨迦县| 盐边县| 阿城市| 景泰县| 棋牌| 邵阳县| 曲沃县| 绥德县| 那曲县| 襄汾县| 宁国市| 达州市| 彩票| 长汀县| 奉新县| 玉林市| 乌什县| 丽水市| 成都市| 察雅县| 白水县| 读书| 合阳县| 嘉兴市| 凤台县| 祁连县| 贺兰县| 怀来县| 得荣县| 仙居县| 西藏| 额尔古纳市| 讷河市| 沅江市| 海晏县|