08 web 自動化之 PO 設計模式詳解

文章目錄

      • 一、什么是 POM
      • 二、如何基于 POM 進行自動化框架架構?
        • 1、base 層封裝
        • 2、pageobjects 層封裝
        • 3、TestCases 層封裝
      • 三、元素和方法分離&數據分離
        • 1、哪些部分可以進行分離
        • 2、示例代碼
      • 四、總結

一、什么是 POM

POM page object model 頁面對象模型 WEB 自動化測試框架應用最為廣泛的一種框架設計模式
設計思路: web 項目由很多頁面組成,把每個頁面當做頁面對象來進行設計
Python 專題: 什么是對象?通過類描述一組對象 對象=屬性+方法
某電商項目 = n 個 頁面
登錄頁面=對每個頁面設計對應頁面類=相同屬性+相同的方法
class LoginPage:
#屬性?元素、頁面標題…
#方法?你在頁面進行操作/行為:點擊、定位、輸入…等等元素及頁面的操作
每個頁面有相同的屬性及方法 比如:點擊、輸入、元素定位
基于 POM 進行設計分為四層進行架構:

  • 第一層 basepage 層 每個頁面有相同的屬性及方法 比如:點擊、輸入、元素定位
  • 第二層 pageobjects 層 針對每個頁面定義頁面類 每個頁面有獨有的屬性及方法
    登錄頁面 LoginPage 類
    注冊頁面 RegisterPage 類
  • 第三層 TestCases 層 用例層包含項目的業務流程
  • 第四層 TestData 測試數據

二、如何基于 POM 進行自動化框架架構?

1、base 層封裝
from selenium import webdriver
import timeclass BasePage:"""BasePage:定義每個頁面的相同屬性及方法相同屬性?獲取瀏覽器驅動對象(數據)相同方法?元素定位、點擊、輸入...等等操作"""def __init__(self,driver=webdriver.Edge()):self.driver = driverdef locator(self,loc):"""元素定位"""# 參數loc,里面包含兩個參數# loc = (By.LINK_TEXT,'登錄')# *loc,是把外面括號去掉,變成2個參數return self.driver.find_element(*loc) # WebElement 對象def input(self,loc,value):"""輸入"""self.locator(loc).send_keys(value)def click(self,loc):"""點擊"""self.locator(loc).click()def sleep(self,s):time.sleep(s)
2、pageobjects 層封裝
from TestPOM.base.basepage import BasePage
from selenium.webdriver.common.by import By
class LoginPage(BasePage):"""登錄頁面類=頁面獨有的屬性及方法頁面獨有的屬性:頁面元素定位方法:登錄頁面的操作"""# 登錄頁面的屬性el_login = (By.XPATH, '//button[text()="登錄"]')el_username = (By.NAME, "accounts")el_password = (By.XPATH, '//input[@type="password"]')url = "http://116.62.63.211/shop/user/logininfo.html"# 方法def login(self, username, password):# 實現登錄步驟self.driver.get(self.url)self.sleep(1)# 輸入用戶名self.input(loc=self.el_username, value=username)# 輸入密碼self.input(loc=self.el_password, value=password)# 點擊登錄self.click(loc=self.el_login)self.sleep(1)
3、TestCases 層封裝
import unittest
from TestPOM.pageobjects.webpage import LoginPageclass TestLogin(unittest.TestCase):def test_login(self):# 實例化對象loginPage = LoginPage()username = "hc_test"password = "hctest123"loginPage.login(username=username, password=password)

三、元素和方法分離&數據分離

1、哪些部分可以進行分離
  • 1、頁面對象類-元素定位+方法再一次進行分離:元素定位層+業務流程層,更利于團隊分工合作
  • 2、項目數據分離
    • a、項目的全局配置數據進行分離:項目地址/根地址、頁面地址、數據庫賬號及地址、測試報告路徑、數據路徑
    • b、業務流程中的數據進行分離

2、示例代碼

a、Global_Datas.py 項目的全局配置數據

# 根路徑
base_url = "http://116.62.63.211/shop"
# 登錄路徑
login_url = base_url + "/user/logininfo.html"

b、login_datas.py 登錄業務流程中的數據

success = ("hc_test","hctest123")
fail = ("hc_test","hctest123456")

c、login_page_loc.py 登錄頁面的定位元素:

from selenium.webdriver.common.by import By"""
登錄頁面類=頁面獨有的屬性及方法
頁面獨有的屬性:頁面元素定位
方法:登錄頁面的操作
"""
class LoginPageLoc:el_login = (By.XPATH, '//button[text()="登錄"]')el_username = (By.NAME, "accounts")el_password = (By.XPATH, '//input[@type="password"]')

d、login_page.py 登錄頁面的操作方法

from TestPOM.base.basepage import BasePage
from TestPOM.pagelocators.login_page_loc import LoginPageLoc as Locs
from TestPOM.testdatas import Global_Datas as GDatasfrom selenium.webdriver.common.by import By
class LoginPage(BasePage):# 方法def login(self, username, password):# 實現登錄步驟self.driver.get(GDatas.login_url)self.sleep(1)# 輸入用戶名self.input(loc=Locs.el_username, value=username)# 輸入密碼self.input(loc=Locs.el_password, value=password)# 點擊登錄self.click(loc=Locs.el_login)self.sleep(1)

e、testcase_login.py 登錄頁面的用例

import unittest
from TestPOM.pageobjects.login_page import LoginPage
from TestPOM.testdatas import login_datas as ldclass TestLogin(unittest.TestCase):def test_login(self):# 實例化對象loginPage = LoginPage()loginPage.login(username=ld.success[0], password=ld.success[1])

四、總結

pom : 把每個頁面或每個模塊當做一個對象來進行編程 實現某個業務流程的測試=調用頁面對象的一些屬性及方法實現測試
數據驅動: 用外部數據驅動測試
關鍵字驅動: 所有業務流程封裝成對應的函數 實現某個業務流程的測試=調用多個關鍵字
方法,實現業務流程的測試

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

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

相關文章

將 JSON 批量轉換為 XML:深度解析與完整實現指南

在數據科學與機器學習項目中,數據預處理始終扮演著不可或缺的角色。尤其當你面對多類別圖像標注任務,而標注數據卻是以 JSON 形式存在,而目標檢測模型卻偏好 VOC 格式的 XML 時,這個轉換過程就變得極為關鍵。 本文將帶你深入解讀…

AlphaEvolve:基于Gemini的算法發現與優化綜合報告

引言 ? 本報告分析Google DeepMind于2025年5月14日正式發布的AlphaEvolve技術。? AlphaEvolve是一種由Gemini大型語言模型驅動的進化式編碼代理,專注于通用算法的發現和優化。? 報告深入探討AlphaEvolve的技術原理、實際應用及其對未來AI和算法研究的潛在影響。…

排序算法之高效排序:快速排序,歸并排序,堆排序詳解

排序算法之高效排序:快速排序、歸并排序、堆排序詳解 前言一、快速排序(Quick Sort)1.1 算法原理1.2 代碼實現(Python)1.3 性能分析 二、歸并排序(Merge Sort)2.1 算法原理2.2 代碼實現&#xf…

Android開發——輪播圖引入

Android開發——輪播圖引入 一、前期準備與依賴引入二、配置啟動類(AndroidManifest.xml)三、構造啟動類(MainActivity.java)四、配置布局文件(activity_main.xml)五、最終效果與擴展方向一、前期準備與依賴引入 在開始引入輪播圖功能前,需確保已正確搭建Android開發環境…

[逆向工程]C++實現DLL卸載(二十六)

[逆向工程]C實現DLL卸載(二十六) 引言 DLL注入(DLL Injection)是Windows系統下實現進程間通信、功能擴展、監控調試的核心技術之一。本文將從原理分析、代碼實現、實戰調試到防御方案,全方位講解如何用C實現DLL注入&…

lesson01-PyTorch初見(理論+代碼實戰)

一、初識PyTorch 二、同類框架 PyTorchVSTensorFlow 三、參數 對比 四、PyTorch生態 四、常用的網絡層 五、代碼分析 import torch from torch import autogradx torch.tensor(1.) a torch.tensor(1., requires_gradTrue) b torch.tensor(2., requires_gradTrue) c tor…

STM32中的DMA

DMA介紹 什么是DMA? DMA(Direct Memory Access,直接存儲器訪問)提供在外設與內存、存儲器和存儲器之間的高速數據傳輸使用。它允許不同速度的硬件裝置來溝通,而不需要依賴于CPU,在這個時間中,CPU對于內存…

聊聊JetCache的緩存構建

序 本文主要研究一下JetCache的緩存構建 invokeWithCached com/alicp/jetcache/anno/method/CacheHandler.java private static Object invokeWithCached(CacheInvokeContext context)throws Throwable {CacheInvokeConfig cic context.getCacheInvokeConfig();CachedAnnoC…

c#隊列及其操作

可以用數組、鏈表實現隊列&#xff0c;大致與棧相似&#xff0c;簡要介紹下隊列實現吧。值得注意的是循環隊列判空判滿操作&#xff0c;在用鏈表實現時需要額外思考下出入隊列條件。 設計頭文件 #ifndef ARRAY_QUEUE_H #define ARRAY_QUEUE_H#include <stdbool.h> #incl…

開源項目實戰學習之YOLO11:12.3 ultralytics-models-sam-encoders.py源碼分析

?? 點擊關注不迷路 ?? 點擊關注不迷路 ?? 另外,前些天發現了一個巨牛的AI人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。感興趣的可以點擊相關跳轉鏈接。 點擊跳轉到網站。 ultralytics-models-sam 1.sam-modules-encoders.pyblocks.py: 定義模型中的各…

STM32 | FreeRTOS 消息隊列

01 一、概述 隊列又稱消息隊列&#xff0c;是一種常用于任務間通信的數據結構&#xff0c;隊列可以在任務與任務間、中斷和任務間傳遞信息&#xff0c;實現了任務接收來自其他任務或中斷的不固定長度的消息&#xff0c;任務能夠從隊列里面讀取消息&#xff0c;當隊列中的消…

Java 安全漏洞掃描工具:如何快速發現和修復潛在問題?

Java 安全漏洞掃描工具&#xff1a;如何快速發現和修復潛在問題&#xff1f; 在當今的軟件開發領域&#xff0c;Java 作為一種廣泛使用的編程語言&#xff0c;其應用的規模和復雜度不斷攀升。然而&#xff0c;隨著應用的拓展&#xff0c;Java 應用面臨的潛在安全漏洞風險也日益…

Python繪制克利夫蘭點圖:從入門到實戰

Python繪制克利夫蘭點圖&#xff1a;從入門到實戰 引言 克利夫蘭點圖&#xff08;Cleveland Dot Plot&#xff09;是一種強大的數據可視化工具&#xff0c;由統計學家William Cleveland在1984年提出。這種圖表特別適合展示多個類別的數值比較&#xff0c;比傳統的條形圖更直觀…

LVGL- Calendar 日歷控件

1 日歷控件 1.1 日歷背景 lv_calendar 是 LVGL&#xff08;Light and Versatile Graphics Library&#xff09;提供的標準 GUI 控件之一&#xff0c;用于顯示日歷視圖。它支持用戶查看某年某月的完整日歷&#xff0c;還可以實現點擊日期、標記日期、導航月份等操作。這個控件…

多指標組合策略

該策略(MultiConditionStrategy)是一種基于多種技術指標和市場條件的交易策略。它通過綜合考慮多個條件來生成交易信號,從而決定買入或賣出的時機。 以下是對該策略的詳細分析: 交易邏輯思路 1. 條件1:星期幾和價格變化判斷 - 該條件根據當前日期是星期幾以及價格的變化…

BC 范式與 4NF

接下來我們詳細解釋 BC 范式&#xff08;Boyce-Codd范式&#xff0c;簡稱 BCNF&#xff09;&#xff0c;并通過具體例子說明其定義和應用。 一、BC范式的定義 BC范式&#xff08;Boyce-Codd范式&#xff0c;BCNF&#xff09;是數據庫規范化理論中的一種范式&#xff0c;它比第…

基于 CSS Grid 的網頁,拆解頁面整體布局結構

通過以下示例拆解網頁整體布局結構&#xff1a; 一、基礎結構&#xff08;HTML骨架&#xff09; <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"…

采購流程規范化如何實現?日事清流程自動化助力需求、采購、財務高效協作

采購審批流程全靠人推進&#xff0c;內耗嚴重&#xff0c;效率低下&#xff1f; 花重金上了OA&#xff0c;結果功能有局限、不靈活&#xff1f; 問題出在哪里&#xff1f;是我們的要求太多、太苛刻嗎&#xff1f;NO&#xff01; 流程名稱&#xff1a; 采購審批管理 流程功能…

全棧項目搭建指南:Nuxt.js + Node.js + MongoDB

全棧項目搭建指南&#xff1a;Nuxt.js Node.js MongoDB 一、項目概述 我們將構建一個完整的全棧應用&#xff0c;包含&#xff1a; 前端&#xff1a;Nuxt.js (SSR渲染)后端&#xff1a;Node.js (Express/Koa框架)數據庫&#xff1a;MongoDB后臺管理系統&#xff1a;集成在同…

NVMe簡介6之PCIe事務層

PCIe的事務層連接了PCIe設備核心與PCIe鏈路&#xff0c;這里主要基于PCIe事務層進行分析。事務層采用TLP傳輸事務&#xff0c;完整的TLP由TLPPrefix、TLP頭、Payload和TLP Digest組成。TLP頭是TLP中最關鍵的部分&#xff0c;一般由三個或四個雙字的長度&#xff0c;其格式定義如…