【web自動化】-5- fixture集中管理和項目重構

一、投標用例設計?

# 定義讓前臺頁面保持自動登錄的fixture
@pytest.fixture()
def user_driver():driver = webdriver.Chrome()driver.get("http://47.107.116.139/fangwei/")driver.maximize_window()# 創建頁面類對象page = ReceptionLoginPage(driver)# 通過頁面類對象調用方法執行腳本msg = page.login("admin", "msjy123")# 斷言實際結果print(msg)assert msg == "成功登錄"return driver
  • 如何繞過登錄執行投標用例流程,包括投標的正例和反例
  • 在瀏覽器的驅動第一次執行前臺頁面登錄之后,保持登錄狀態,在第二次及以上的用例執行投標
定義一個 fixture
  • 完成第一次登錄之后進行清除頁面緩存
@pytest.fixture()
# 清除緩存的夾具,可以結合第一次登錄成功之后的夾具一起結合使用
def clear_deal_page(user_driver):user_driver.get("http://47.107.116.139/fangwei/index.php?ctl=deal&id=25070")
  • 在投標用例中使用清除緩存的 fixture

出現的問題:可以正常流程去登錄,但是定位點擊馬上投標的元素超時

  • 元素找不到
  • 問題出現原因:登錄成功之后,界面沒有立馬出現馬上投標元素
def test_user_deal_ok(user_driver, clear_deal_page):# 投標用例執行page = ReceptionLoginPage(user_driver)msg = page.pay("msjy123")print(msg)assert msg == "投標成功!"def test_user_deal_ok2(user_driver, clear_deal_page):# 投標用例執行page = ReceptionLoginPage(user_driver)msg = page.pay("msjy123")print(msg)assert msg == "投標成功!"def test_user_deal_fail(user_driver, clear_deal_page):# 投標用例執行page = ReceptionLoginPage(user_driver)msg = page.pay("msjy1234")print(msg)assert msg == "支付密碼錯誤"

?

  • 由于直接進入投標界面可以實現流程用例執行
  • 解決方案:
    • 由于登錄成功之后自動跳轉立即投資界面

    • 所以注釋點擊馬上投標的元素

    • 保持登錄的夾具: user_driver 作用域改成 session 級別,保持整個頁面的自動登錄狀態

最終結果:

  • 實現投標用例在第一次登錄成功之后,不需要繼續進行登錄,直接執行投標流程用例即可
  • 作用:保持第一次之后的登錄狀態來完成投標流程用例執行
# 定義用例腳本執行投標步驟:
def pay(self, password):# - 點擊馬上投標按鈕# self.find_element(*self.btn_deal_submit).click()# - 點擊立即投資self.find_element(*self.btn_money).click()# - 輸入支付密碼self.find_element(*self.ipt_pay_password).send_keys(password)# - 點擊確定按鈕self.find_element(*self.btn_pay_submit).click()# 獲取提示信息的實際結果斷言預期結果msg = self.find_element(*self.pay_msg, need_wait=True).text# - 關閉提示信息彈框self.find_element(*self.txt_deal_msg).click()# 返回用例執行結果msgreturn msg

1. Fixture 作用域控制(scope="session"

如果?user_driver?Fixture 定義時指定了?scope="session"(需補充代碼確認,但從場景推斷是關鍵),它會在整個測試會話期間只執行一次

@pytest.fixture(scope="session")  # 關鍵:作用域為 session,全局共享
def user_driver():driver = webdriver.Chrome()# 登錄邏輯...return driver

  • scope="session"?意味著:整個測試運行中,user_driver?只會初始化一次瀏覽器、執行一次登錄,所有依賴它的用例共享同一個瀏覽器實例,不會重復打開新窗口。

2. 保持登錄狀態(Cookie/Session 復用)

Web 登錄本質是通過?Cookie 或 Session?維持狀態:

  • 首次用例執行時,user_driver?完成登錄,瀏覽器會緩存登錄態 Cookie。
  • 后續用例復用同一個?driver?實例時,瀏覽器自帶已登錄的 Cookie,訪問系統時會自動識別登錄狀態,無需重復登錄。

3. 用例依賴共享實例

測試用例通過參數注入?user_driver,所有用例拿到的是同一個瀏覽器對象

def test_bid_2(user_driver, clear_deal_page):# 復用已登錄的 user_driver,無需重新打開窗口/登錄page = ReceptionLoginPage(user_driver)  page.pay(...)

因為瀏覽器實例沒銷毀,登錄狀態、頁面上下文都被保留,自然 “跳過登錄、不新開窗口”。

關鍵總結

  • Fixture 作用域(session?讓瀏覽器實例全局復用,避免重復初始化。
  • Cookie 持久化?讓登錄狀態在同瀏覽器實例內自動延續。
  • 最終實現 “一次登錄、多例復用”,跳過重復登錄和窗口打開流程。

?

在自動化測試流程里,user_driver?結合?clear_deal_page?主要是為了?解決 “登錄后頁面狀態殘留” 導致的用例干擾問題

1. 「頁面緩存 / 殘留狀態」的干擾問題

登錄后執行投標用例時,頁面可能殘留上一次操作的狀態(比如彈窗未關閉、按鈕狀態異常、緩存數據未清空):

  • 示例:第一次投標后,頁面可能停留在 “支付成功” 提示頁,或某些按鈕因狀態變更無法點擊。
  • 影響:后續用例執行時,元素定位會失敗(如提示彈窗遮擋按鈕),或流程因殘留狀態報錯,導致測試不穩定。

2.?clear_deal_page?的核心作用

clear_deal_page?本質是 **“重置頁面環境” 的 Fixture**,通常做這些事:

@pytest.fixture()
def clear_deal_page(user_driver):# 1. 跳轉到統一的“投標初始化頁面”user_driver.get("http://.../deal?reset=1")  # 2. 可能包含清理彈窗、重置按鈕狀態等操作user_driver.execute_script("window.localStorage.clear();")  # 清理本地緩存return user_driver

  • 重置頁面上下文:強制跳轉到一個 “干凈” 的投標初始頁,確保每次用例執行前,頁面狀態一致(沒有殘留彈窗、按鈕可點擊)。
  • 清理緩存 / 狀態:通過 JS 清理?localStoragesessionStorage,或關閉殘留提示框,避免上一次用例的緩存數據干擾當前用例。

3. 結合?user_driver?的必要性

user_driver?負責維持登錄態(共享瀏覽器實例、保留 Cookie),但無法解決 “頁面級的殘留狀態”:

  • 只靠?user_driver:登錄態是保留了,但頁面可能因上一次用例操作變得 “不干凈”(比如彈窗未關),導致后續用例定位元素超時 / 失敗。
  • 結合?clear_deal_page:在保留登錄態的基礎上,強制重置頁面環境,讓每個用例都在 “登錄且頁面干凈” 的狀態下執行,既復用了登錄(提升效率),又避免了頁面殘留的干擾(保證穩定)。

二、fixture集中管理?

fixture 的使用形式

  • 用例可以直接調用
  • fixture 夾具之間可以進行關聯使用
  • fixture 夾具可以完成任意測試用例腳本的前后置編寫
  • 一般情況下不同的用例使用自定義的 fixture 進行使用

為了降低用例腳本和 fixture 夾具的耦合性,將 fixture 進行集中管理

fixture 一般統一管理放置項目中固定 conftest.py 文件中

?

fixture 定位順序:

  • 先從當前運行的 py 文件開始定位 fixture
  • 其次從同級目錄的 py 文件中定位 fixture
  • 再從項目包的目錄中開始定位定位 fixture
  • 然后從 conftest.py 文件中開始定位 fixture
  • 最后會從項目所有根目錄定位 fixture
  • 以上查找定位 fixture 如果沒有對應的夾具,那么程序會報錯

三、項目重構

對框架代碼進行規劃和分類

在項目重構的過程中,之前導入的路徑使用的模塊,會隨著目錄結構發生變化而變化,不需要手動修改導包路徑

  • testcases
    • 封裝完成的用例腳本集中管理
  • commons
    • 項目公共模塊集中使用包
  • script
    • 用例的線性腳本
  • data
    • 數據文件相關內容
  • log
    • 日志信息相關內容
  • report
    • 缺陷報告記錄的內容
  • conftest.py
    • 存放 fixture 夾具的集中管理

?

?

四、統一管理項目驅動

目的:為了方便后期做兼容性測試,使用不同的瀏覽器來設計驅動獲取

from selenium.webdriver import Chrome, Firefox, Ie, Edge, Safari
自定義函數獲取對應的瀏覽器驅動
def get_webdriver(name: str = "chrome"):# 根據調用獲取瀏覽器的實參來返回對應的驅動# 將具體瀏覽器實參名字進行整理# 將所有瀏覽器的名字轉化為小寫# 將所有瀏覽器的名字中空格去除# 再返回驅動的驅動name = name.lower()name = name.replace(" ", "")# print(name)# 第一種格式:# if name == "chrome":#     return Chrome()# elif name == "firefox":#     return Firefox()# 使用match和case關鍵字匹配驅動match name:case "chrome":return Chrome()case "firefox":return Firefox()case "ie":return Ie()case "edge":return Edge()

# get_webdriver("C hrome")
# get_webdriver("C H  ro  ME")

自定義獲取驅動方式重寫之后
  • 需要再創建驅動的地方,調用自定義的get_webdriver ("對應瀏覽器的名字")

五、后臺登錄的驅動

# 后臺登錄頁面的驅動
@pytest.fixture(scope="session")
def admin_driver():driver = get_webdriver()driver.get("http://47.107.116.139/fangwei/m.php?m=Public&a=login&")# 使用cookie信息load_cookies(driver)# 如果第一次登錄:沒有cookie信息那么正常流程登錄if is_login(driver):# 驗證碼處理code = save_code_img(driver)# 完成正常登錄流程:使用 POM 封裝調用腳本執行page = BackgroundLoginPage(driver)page.login("admin", "msjy123", code)yield driver# 第一次正常登錄之后,用例執行結束之后,完成后置保持 cookie 信息save_cookies(driver)

1. 裝飾器與 fixture 作用域
@pytest.fixture(scope="session")

  • scope="session":表示該 fixture 的作用域是整個測試會話(session)。也就是說,在一次?pytest?測試運行過程中,這個?admin_driver?夾具只會被初始化一次,然后在所有需要它的測試用例中復用,測試會話結束時才會執行其后置清理邏輯(yield?之后的代碼)。這樣可以提升測試效率,比如這里用于保持后臺登錄狀態,避免重復登錄操作。

?

2. 驅動初始化與頁面訪問

driver = get_webdriver()
driver.get("http://47.107.116.139/fangwei/m.php?m=Public&a=login&")

  • get_webdriver():調用了一個自定義的函數(這個函數用于根據配置獲取對應的瀏覽器驅動實例,比如 Chrome、Firefox 等瀏覽器的驅動,方便進行兼容性測試 ),獲取到瀏覽器驅動對象?driver,后續用這個驅動來操作瀏覽器。
  • driver.get(...):使用獲取到的瀏覽器驅動,打開指定的后臺登錄頁面 URL,讓瀏覽器跳轉到對應的登錄界面,為后續登錄操作做準備。

?

3. Cookie 相關操作

# 使用 cookie 信息
load_cookies(driver)

  • load_cookies(driver):調用自定義函數?load_cookies,作用是嘗試從某個地方加載之前保存的 Cookie 信息,并將其注入到當前的瀏覽器驅動?driver?中。這樣做的目的是,如果之前有成功登錄過并保存了 Cookie,那么通過加載這些 Cookie,可以直接保持登錄狀態,無需再次輸入賬號密碼等進行登錄,提升測試執行效率。

?

4. 登錄流程處理(條件判斷)

# 如果第一次登錄:沒有 cookie 信息那么正常流程登錄
if is_login(driver):# 驗證碼處理code = save_code_img(driver)# 完成正常登錄流程:使用 POM 封裝調用腳本執行page = BackgroundLoginPage(driver)page.login("admin", "msjy123", code)

  • is_login(driver):調用自定義函數?is_login,用于判斷當前瀏覽器驅動?driver?對應的頁面是否處于已登錄狀態。可能的實現邏輯比如檢查頁面中是否存在登錄后的特定元素(如用戶名顯示、登錄狀態標識等 ),或者根據 Cookie 信息判斷會話是否有效。如果返回?True,說明需要執行正常的登錄流程(一般是首次登錄或者 Cookie 失效等情況 )。
  • save_code_img(driver):調用自定義函數?save_code_img,用于處理登錄頁面的驗證碼。可能的操作包括截取驗證碼圖片、識別驗證碼內容(如果結合了驗證碼識別技術,比如 OCR 等 ),并返回驗證碼的文本內容?code,以便后續登錄時使用。
  • BackgroundLoginPage(driver):這里使用了頁面對象模型(POM,Page Object Model )的設計模式,創建一個?BackgroundLoginPage?類的實例?page,并將瀏覽器驅動?driver?傳入。POM 模式把頁面的元素定位和操作方法封裝到對應的頁面類中,便于代碼維護和復用。
  • page.login("admin", "msjy123", code):調用?BackgroundLoginPage?類中封裝的?login?方法,傳入用戶名?admin、密碼?msjy123?和前面獲取到的驗證碼?code,執行實際的登錄操作,模擬用戶在頁面上輸入賬號、密碼、驗證碼并提交登錄的流程。

?

5. fixture 的 yield 關鍵字

yield driver

  • yield?是?pytest?fixture 中用于分隔前置操作和后置操作的關鍵字。yield?之前的代碼屬于前置準備邏輯,執行到?yield?時,會暫停當前 fixture 的執行,將?driver?對象返回給調用它的測試用例使用。當所有依賴該 fixture 的測試用例執行完畢后,會回到這個 fixture,繼續執行?yield?之后的代碼,也就是后置清理 / 保存操作。

?

6. 后置保存 Cookie 操作

# 第一次正常登錄之后,用例執行結束之后,完成后置保持 cookie 信息
save_cookies(driver)

  • save_cookies(driver):調用自定義函數?save_cookies,在測試用例執行完畢后,將當前瀏覽器驅動?driver?中的 Cookie 信息保存起來(比如保存到文件、數據庫等 )。這樣,下次再執行測試時,就可以通過前面的?load_cookies?函數加載這些 Cookie,實現免登錄或者保持登錄狀態的效果,提升后續測試的效率,也能模擬實際用戶的會話保持場景。

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/915812.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/915812.shtml
英文地址,請注明出處:http://en.pswp.cn/news/915812.shtml

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

相關文章

Dify工作流:爬蟲文章到AI知識庫

部署Dify 代碼拉取 git clone https://github.com/langgenius/dify.git cd dify/docker啟動容器 docker-compose up -d啟動成功準備知識庫 創建知識庫 創建一個空的知識庫要先從網址中,找到這個知識庫的id,記下后面需要用到。新建API密鑰 創建密鑰&#…

支付鑒權方案介紹

前后端交互中的鑒權是確保請求來源合法、身份可信、權限合適的關鍵手段。不同系統架構和業務類型下,使用的鑒權方式略有不同,但主要可分為以下幾類: ? 一、前后端交互常見的鑒權方式概覽 鑒權方式 優點 缺點 適用場景 Cookie + Session 簡單、成熟,服務端易控制 不適合跨域…

halcon處理灰度能量圖

使用halcon處理射線圖像,對高能區域和低能區域分割處理感興趣區域,篩選區域下的灰度值區間范圍。圖像灰度值為16位深度圖。* 讀取灰度圖像 read_image (Image, /123.tif)** 獲取圖像尺寸 get_image_size (Image, Width, Height)* 分割圖像為左右兩部分&a…

Oracle From查看彈性域設置

打開彈性與設置:【應用開發員->彈性域->說明性->段】打開后界面如下: 把光標定位到標題,然后點擊“手電筒”搜索名稱(名稱就是你要查詢的那個彈性域的名稱)我這里就是搜索“附加題頭信息”&#xff0…

git初始流程

對于一個新項目,從 Git 倉庫拉取 test_tool 分支并進行后續修改提交的完整流程如下: 一、首次拉取項目(克隆倉庫并切換分支)克隆遠程倉庫到本地 打開終端(或 PyCharm 的 Terminal),進入你想存放…

emuelec模擬器 ,s905盒子樹莓派街機游戲

EmuELEC支持的盒子類型相當廣泛,主要包括使用以下芯片方案的機頂盒等設備: S905系列及其變體:如S905、S905D、S905L、S905M、S905X、S905X2、S905X3、S905X4、S905W、S905Y等。 S912:這也是EmuELEC支持的一個常見芯片方案。 S922x…

Ansible部署

Ansible部署 一、部署環境及前置操作 1、測試環境 注:主機復用原測試環境,主機hostname根據需求調整 硬件環境:N100 x86主機 Proxmox系統 軟件環境:Ubuntu 22.04.3 LTS 軟件版本:redis-7.4.0.tar.gz 主機環境:主機IP …

智慧教室:科技賦能,奏響個性化學習新樂章

在傳統教育模式中,課堂互動的局限性猶如一道無形的枷鎖,束縛著學生主動學習的熱情與能力。課堂上,往往是教師單向的知識輸出,僅有少數學生能獲得發言機會,大部分學生只能被動聆聽,逐漸在枯燥的學習氛圍中喪…

Android埋點實現方案深度分析

埋碼是數據驅動業務決策、產品優化、用戶行為分析的核心基礎,其實現方案的優劣直接影響數據的準確性、完整性、實時性、可維護性以及開發效率。 以下從多個維度對主流方案進行剖析: 一、核心目標與挑戰目標: 精準采集: 在用戶觸發…

萬界星空科技銅線/漆包線行業智能化MES系統解決方案

萬界星空科技針對銅線及漆包線行業開發的智能化MES系統,專門解決該行業原材料管理復雜、工藝控制嚴、質量追溯困難等核心痛點。該系統通過數字化手段實現生產全流程的可視化與精準控制,助力企業提升生產效率、降低運營成本并增強市場競爭力。一、行業專屬…

Git 完全手冊:從入門到團隊協作實戰(3)

Hello大家好&#xff01;很高興我們又見面啦&#xff01;給生活添點passion&#xff0c;開始今天的編程之路&#xff01; 我的博客&#xff1a;<但凡. 我的專欄&#xff1a;《編程之路》、《數據結構與算法之美》、《C修煉之路》、《Linux修煉&#xff1a;終端之內 洞悉真理…

使用Docker搭建SearXNG搜索引擎

1、安裝Docker# 安裝Docker https://docs.docker.com/get-docker/# 安裝Docker Compose https://docs.docker.com/compose/install/# CentOS安裝Docker https://mp.weixin.qq.com/s/nHNPbCmdQs3E5x1QBP-ueA2、安裝SearXNG詳見&#xff1a; https://docs.searxng.org/admin/inst…

基于pi/4-QPSK擴頻解擴和gardner環定時同步的通信系統matlab性能仿真

目錄 1.引言 2.算法仿真效果演示 3.數據集格式或算法參數簡介 4.算法涉及理論知識概要 4.1 π/4-QPSK 4.2 直接序列擴頻與解擴 4.3 Gardner環定時同步 5.參考文獻 6.完整算法代碼文件獲得 1.引言 π/4-QPSK是一種特殊的QPSK調制方式&#xff0c;其相鄰符號間的相位跳變…

CGA老年人能力評估師:提升老年生活質量

一、CGA老年人能力評估師是提升老年生活質量的“導航者” 老年生活質量的提升&#xff0c;始于對老年人真實需求的精準把握。CGA老年人能力評估師正是這樣一群“導航者”&#xff0c;他們運用CGA老年綜合評估系統&#xff0c;深入了解老年人在生理、心理、社會參與等方面的狀況…

開源的大語言模型(LLM)應用開發平臺Dify

概述Dify 是一個開源的大語言模型&#xff08;LLM&#xff09;應用開發平臺&#xff0c;結合了后端即服務&#xff08;Backend-as-a-Service&#xff09;和 LLMOps 的理念&#xff0c;旨在幫助開發者快速構建生產級的生成式 AI 應用。它通過直觀的界面、強大的功能和靈活的部署…

RAG(檢索增強生成)里的文檔管理

RAG&#xff08;檢索增強生成&#xff09;是結合檢索與生成式 AI 的技術框架。核心邏輯是先從外部知識庫精準檢索相關信息&#xff0c;再將其作為上下文輸入大模型生成回答。技術上依賴檢索引擎&#xff08;如向量數據庫、BM25&#xff09;、大語言模型&#xff08;如 GPT、LLa…

床上肢體康復機器人的機械結構設計cad【7張】三維圖+設計說明書

摘要 近年來&#xff0c;隨著人口老齡化問題的加重&#xff0c;常年臥床的老年人數增多&#xff0c;同時因為各種疾病的原因&#xff0c;患肢體功能障礙的人數也在增加。嚴重影響著患者的生活質量&#xff0c;同時給社會和家庭增加了很多麻煩。他們迫切希望盡快康復&#xff0c…

主要分布在背側海馬體(dHPC)CA1區域(dCA1)的時間細胞對NLP中的深層語義分析的積極影響和啟示

時間細胞&#xff08;time cells&#xff09;作為海馬體CA1區域中編碼時間信息的神經元&#xff0c;其工作機制對自然語言處理&#xff08;NLP&#xff09;中的深層語義分析具有多方面的啟示。這些神經元通過整合時空信息、動態競爭機制和序列編碼能力&#xff0c;為解決NLP中語…

數字ic后端設計從入門到精通12(含fusion compiler, tcl教學)全定制設計進階

標準單元庫中幾種時序單元介紹 C2MOS觸發器C2MOS觸發器的工作分為兩個階段&#xff1a; 1&#xff09;φ0&#xff08;φ1&#xff09;時&#xff0c;第一個三態驅動器導通&#xff08;三態門主要體現在&#xff0c;此時主級處于求值模式。同時從級處在高阻抗模式&#xff0c;即…

Qt調試技巧與常見錯誤解決方法

一、調試工具與環境配置 1.1 Qt Creator調試器集成 Qt Creator內置GDB/Lldb調試器&#xff0c;支持斷點、單步執行、變量監視等功能。 啟動調試&#xff1a;按F5或點擊"Debug"按鈕斷點設置&#xff1a;在代碼行號旁點擊添加斷點調試工具欄&#xff1a;包含繼續、暫停…