Selenium + Pytest自動化測試框架實戰(上)

前言

今天呢筆者想和大家來聊聊selenium自動化+ pytest測試框架,在這篇文章里你需要知道一定的python基礎——至少明白類與對象,封裝繼承;一定的selenium基礎。這篇文章不會selenium,不會的可以自己去看selenium中文翻譯網喲。

一、測試框架簡介

測試框架有什么優點呢

    • 代碼復用率高,如果不使用框架的話,代碼會很冗余
    • 可以組裝日志、報告、郵件等一些高級功能
    • 提高元素等數據的可維護性,元素發生變化時,只需要更新一下配置文件
    • 使用更靈活的PageObject設計模式
  • 測試框架的整體目錄
  • 目錄/文件說明是否為python包common這個包中存放的是常見的通用的類,如讀取配置文件是config配置文件目錄是logs日志目錄page對selenium的方放進行深度的封裝是page_element頁面元素存放目錄page_object頁面對象POM設計模式,TestCase所有的測試用例集是utils工具類是script腳本文件conftest.pypytest膠水文件pytest.inipytest配置文件,這樣一個簡單的框架結構就清晰了。

知道了以上這些我們就開始吧!

我們在項目中先按照上面的框架指引,建好每一項目錄。

注意:python包為是的,都需要添加一個__init__.py文件以標識此目錄為一個python包。

二、管理時間

首先呢,因為我們很多的模塊會用到時間戳,或者日期等等字符串,所以我們先單獨把時間封裝成一個模塊。

然后讓其他模塊來調用即可。在utils目錄新建times.py模塊

#!/usr/bin/env python3
# -*- coding:utf-8 -*-
import time
import datetime
from functools import wrapsdef timestamp():"""時間戳"""return time.time()def dt_strftime(fmt="%Y%m"):"""datetime格式化時間:param fmt "%Y%m%d %H%M%S"""return datetime.datetime.now().strftime(fmt)def sleep(seconds=1.0):"""睡眠時間"""time.sleep(seconds)def running_time(func):"""函數運行時間"""@wraps(func)def wrapper(*args, **kwargs):start = timestamp()res = func(*args, **kwargs)print("校驗元素done!用時%.3f秒!" % (timestamp() - start))return resreturn wrapperif __name__ == '__main__':print(dt_strftime("%Y%m%d%H%M%S"))
現在我也找了很多測試的朋友,做了一個分享技術的交流群,共享了很多我們收集的技術文檔和視頻教程。
如果你不想再體驗自學時找不到資源,沒人解答問題,堅持幾天便放棄的感受
可以加入我們一起交流。而且還有很多在自動化,性能,安全,測試開發等等方面有一定建樹的技術大牛
分享他們的經驗,還會分享很多直播講座和技術沙龍
可以免費學習!劃重點!開源的!!!
qq群號:691998057【暗號:csdn999】

三、添加配置文件

配置文件是項目中必不可少的部分!

將固定不變的信息集中在固定的文件中

3.1conf.py

項目中都應該有一個文件對整體的目錄進行管理,我也在這個python項目中設置了此文件。

在項目config目錄創建conf.py文件,所有的目錄配置信息寫在這個文件里面。

#!/usr/bin/env python3
# -*- coding:utf-8 -*-
import os
from selenium.webdriver.common.by import By
from utils.times import dt_strftimeclass ConfigManager(object):# 項目目錄BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))# 頁面元素目錄ELEMENT_PATH = os.path.join(BASE_DIR, 'page_element')# 報告文件REPORT_FILE = os.path.join(BASE_DIR, 'report.html')# 元素定位的類型LOCATE_MODE = {'css': By.CSS_SELECTOR,'xpath': By.XPATH,'name': By.NAME,'id': By.ID,'class': By.CLASS_NAME}# 郵件信息EMAIL_INFO = {'username': '1234567890@qq.com',  # 切換成你自己的地址'password': 'QQ郵箱授權碼','smtp_host': 'smtp.qq.com','smtp_port': 123}# 收件人ADDRESSEE = ['1234567890@qq.com',]@propertydef log_file(self):"""日志目錄"""log_dir = os.path.join(self.BASE_DIR, 'logs')if not os.path.exists(log_dir):os.makedirs(log_dir)return os.path.join(log_dir, '{}.log'.format(dt_strftime()))@propertydef ini_file(self):"""配置文件"""ini_file = os.path.join(self.BASE_DIR, 'config', 'config.ini')if not os.path.exists(ini_file):raise FileNotFoundError("配置文件%s不存在!" % ini_file)return ini_filecm = ConfigManager()
if __name__ == '__main__':print(cm.BASE_DIR)

注意:QQ郵箱授權碼怎么生成自己去百度

這個conf文件我模仿了Django的settings.py文件的設置風格,但是又有些許差異。

在這個文件中我們可以設置自己的各個目錄,也可以查看自己當前的目錄。

遵循了約定:不變的常量名全部大寫,函數名小寫。看起來整體美觀。

3.2config.ini

在項目config目錄新建一個config.ini文件,里面暫時先放入我們的需要測試的URL

[HOST]
HOST = https://www.baidu.com

四、讀取配置文件

配置文件創建好了,接下來我們需要讀取這個配置文件以及使用里面的信息。

我們在common目錄中新建一個readconfig.py文件

#!/usr/bin/env python3
# -*- coding:utf-8 -*-
import configparser
from config.conf import cmHOST = 'HOST'class ReadConfig(object):"""配置文件"""def __init__(self):self.config = configparser.RawConfigParser()  # 當有%的符號時請使用Raw讀取self.config.read(cm.ini_file, encoding='utf-8')def _get(self, section, option):"""獲取"""return self.config.get(section, option)def _set(self, section, option, value):"""更新"""self.config.set(section, option, value)with open(cm.ini_file, 'w') as f:self.config.write(f)@propertydef url(self):return self._get(HOST, HOST)ini = ReadConfig()if __name__ == '__main__':print(ini.url)

可以看到我們用python內置的configparser模塊對config.ini文件進行了讀取。

對于url值的提取,我使用了高階語法@property屬性值,寫法更簡單。

五、記錄操作日志

日志,大家應該都很熟悉這個名詞,就是記錄代碼中的動作。

在utils目錄中新建logger.py文件。

這個文件就是我們用來在自動化測試過程中記錄一些操作步驟的。

#!/usr/bin/env python3
# -*- coding:utf-8 -*-
import logging
from config.conf import cmclass Log:def __init__(self):self.logger = logging.getLogger()if not self.logger.handlers:self.logger.setLevel(logging.DEBUG)# 創建一個handle寫入文件fh = logging.FileHandler(cm.log_file, encoding='utf-8')fh.setLevel(logging.INFO)# 創建一個handle輸出到控制臺ch = logging.StreamHandler()ch.setLevel(logging.INFO)# 定義輸出的格式formatter = logging.Formatter(self.fmt)fh.setFormatter(formatter)ch.setFormatter(formatter)# 添加到handleself.logger.addHandler(fh)self.logger.addHandler(ch)@propertydef fmt(self):return '%(levelname)s\t%(asctime)s\t[%(filename)s:%(lineno)d]\t%(message)s'log = Log().loggerif __name__ == '__main__':log.info('hello world')

在終端中運行該文件,就看到命令行打印出了:

INFO	2022-06-15 16:00:05,467	[logger.py:38]	hello world

然后在項目logs目錄下生成了當月的日志文件。

六、簡單理解POM模型

由于下面要講元素相關的,所以首先理解一下POM模型

Page Object模式具有以下幾個優點。

該觀點來自 《Selenium自動化測試——基于Python語言》

  • 抽象出對象可以最大程度地降低開發人員修改頁面代碼對測試的影響, 所以, 你僅需要對頁
    面對象進行調整, 而對測試沒有影響;
  • 可以在多個測試用例中復用一部分測試代碼;
  • 測試代碼變得更易讀、 靈活、 可維護

Page Object模式圖

  • basepage ——selenium的基類,對selenium的方法進行封裝
  • pageelements——頁面元素,把頁面元素單獨提取出來,放入一個文件中
  • searchpage ——頁面對象類,把selenium方法和頁面元素進行整合
  • testcase ——使用pytest對整合的searchpage進行測試用例編寫

通過上圖我們可以看出,通過POM模型思想,我們把:

  • selenium方法
  • 頁面元素
  • 頁面對象
  • 測試用例

以上四種代碼主體進行了拆分,雖然在用例很少的情況下做會增加代碼,但是當用例多的時候意義很大,代碼量會在用例增加的時候顯著減少。我們維護代碼變得更加直觀明顯,代碼可讀性也變得比工廠模式強很多,代碼復用率也極大的得到了提高。

這篇文章暫時到這里喲,后面會接著講的喲。

下面是配套資料,對于做【軟件測試】的朋友來說應該是最全面最完整的備戰倉庫,這個倉庫也陪伴我走過了最艱難的路程,希望也能幫助到你!

最后: 可以在公眾號:程序員小濠 ! 免費領取一份216頁軟件測試工程師面試寶典文檔資料。以及相對應的視頻學習教程免費分享!,其中包括了有基礎知識、Linux必備、Shell、互聯網程序原理、Mysql數據庫、抓包工具專題、接口測試工具、測試進階-Python編程、Web自動化測試、APP自動化測試、接口自動化測試、測試高級持續集成、測試架構開發測試框架、性能測試、安全測試等。

如果我的博客對你有幫助、如果你喜歡我的博客內容,請 “點贊” “評論” “收藏” 一鍵三連哦!

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

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

相關文章

六西格瑪管理培訓公司:事業進階的充電站,助你沖破職場天花板!

六西格瑪,源于制造業,卻不僅僅局限于制造業。它是一種以數據為基礎、以顧客為中心、以流程優化為手段的全面質量管理方法。通過六西格瑪管理,企業可以系統性地識別并解決運營過程中的問題,提高產品和服務的質量,降低成…

導航app為什么知道還有幾秒變綠燈?

在使用地圖導航app行駛至信號燈的交叉路口時,這些應用程序會貼心地告知用戶距信號燈變化還有多少秒,無論是即將轉為綠燈還是紅燈。這一智能化提示不僅使得駕駛員能適時做好起步或剎車的準備,有效緩解了因等待時間不確定而產生的焦慮情緒&…

GBPC2510-ASEMI工業電源專用GBPC2510

編輯:ll GBPC2510-ASEMI工業電源專用GBPC2510 型號:GBPC2510 品牌:ASEMI 封裝:GBPC-4 最大重復峰值反向電壓:1000V 最大正向平均整流電流(Vdss):25A 功率(Pd):中小功率 芯片個數&#x…

分布式鎖之RedissonLock

什么是Redisson? 俗話說他就是看門狗,看門狗機制是一種用于保持Redis連接活躍性的方法,通常用于分布式鎖的場景。看門狗的工作原理是:當客戶端獲取到鎖之后,會對Redis中的一個特定的鍵設置一個有限的過期時間&#xff…

[附源碼]傳世手游_玲瓏傳世_GM_安卓搭建教程

本教程僅限學習使用,禁止商用,一切后果與本人無關,此聲明具有法律效應!!!! 教程是本人親自搭建成功的,絕對是完整可運行的,踩過的坑都給你們填上了。 如果你是小白也沒…

C++ 509. 斐波那契數

文章目錄 一、題目描述二、參考代碼 一、題目描述 示例 1: 輸入:n 2 輸出:1 解釋:F(2) F(1) F(0) 1 0 1 示例 2: 輸入:n 3 輸出:2 解釋:F(3) F(2) F(1) 1 1 2 示例 3…

設計模式——訪問者模式(Visitor)

訪問者模式(Visitor Pattern)是一種將數據操作與數據結構分離的設計模式。這種模式適用于數據結構相對穩定,而操作算法經常改變的情況。訪問者模式將數據結構(穩定的部分)中的元素(Element)的訪…

C語言題目:一元二次方程

題目描述 解一元二次方程ax^2bxc0的解。 輸入格式 a,b,c的值。 輸出格式 輸出兩個解,按照大小順序輸出,一個解時需要打印兩次,不用考慮無解問題,保留兩位小數 樣例輸入 1 5 -2樣例輸出 0.37 -5.37 代碼解析 首先&#xff0…

了解進程和線程

一、進程和線程 類比: 一個工廠,至少有一個車間,一個車間中至少有一個工人,最終是工人在工作。 一個程序,至少有一個進程,一個進程中至少有一個線程,最終是線程在工作。 進程:是計…

C#正則表達式,提取信息使用

正則表達式簡介 在C#中,正則表達式(Regular Expression,通常簡寫為regex或regexp)是一種功能強大的文本處理工具,它使用特定的字符序列來定義搜索模式,從而實現對文本的高效搜索、匹配和替換操作。正則表達…

鄉村振興與鄉村旅游深度融合:依托鄉村自然和文化資源,發展鄉村旅游產業,促進農民增收致富,打造特色美麗鄉村

目錄 一、引言 二、鄉村振興與鄉村旅游的內在聯系 三、依托鄉村自然和文化資源發展鄉村旅游產業 (一)挖掘鄉村自然資源優勢,打造特色旅游品牌 (二)挖掘鄉村文化資源內涵,豐富旅游活動內容 四、促進農…

新手做視頻號電商,做什么樣的產品好賣?適合不會選類目的新手看

大家好,我是電商花花,專注做電商的花花。 視頻號現在的發展可以說是非常好的,擁有著空前的市場和流量,隨著視頻號小店新項目對電商的沖擊,讓更多創業者和新手商家開始涌入視頻號電商的行列。 想要在新項目中搶占流量…

【客戶案例】禪道軟件助力長虹新網實現研發項目管理創新

四川長虹新網科技有限責任公司(以下簡稱長虹新網)深耕全球運營商市場二十多年,具備行業領先的軟硬件研發、制造、全球化市場營銷能力,持續服務國內外200多家主流電信及廣電運營商、垂直行業服務商,與合作伙伴共同成長。…

Windows11系統安裝Mysql8之后,啟動服務net start mysql報錯“服務沒有響應控制功能”的解決辦法

問題 系統環境:Windows11 數據庫版本:Mysql8 雙擊安裝,一路下一步,完成,很順利,但是開啟服務后 net start mysql 報錯: 服務沒有響應控制功能。 請鍵入 NET HELPMSG 2186 以獲得更多的幫助 不…

【項目001】運維工程師項目實踐:高可用性云基礎設施部署與升級項目

目錄 項目名稱 項目背景 項目目標 項目成果 我的角色與職責 我主要完成的工作內容 本次項目涉及的技術 本次項目遇到的問題與解決方法 本次項目中可能被面試官問到的問題 1、什么是ELK? 2、什么是Elasticsearch、Logstash 和Kibana? 3、ELK 三…

echarts樹圖 改文本顯示的地方的樣式

樹圖改文本顯示的時候的樣式 雖然有點越改越丑 其中有一些失敗的嘗試 forammter 無法識別html元素 所以對于tooptips有用的html元素定義獲取返回在這里寫的話是不生效的 rich配置項里面的backgroundColor官方說支持 html元素和canvas元素 已經圖片url 沒有詳細試驗 官網地址 h…

【chisel】如何用chisel寫一個上升沿檢測程序

自定義上升沿檢測 class RisingEdgeDetector extends Module {val io IO(new Bundle {val inSig Input(Bool())val outSig Output(Bool())val clock Input(Clock())})// 定義 risingedge 函數def risingedge(x: Bool): Bool x && !RegNext(x)// 使用 risingedge …

代碼簽名證書的重要作用及申請途徑

代碼簽名技術是一種確保軟件完整性和來源可信度的安全措施。它通過數字證書和加密算法為軟件代碼或可執行文件加上一個“簽名”,以此驗證軟件未被篡改,并確認其來源于可信賴的開發者。 一、代碼簽名證書的重要作用 1、提高下載率和安裝率:用…

Linux提權--Rsync(未授權訪問) Docker 組掛載

免責聲明:本文僅做技術學習與交流... 目錄 Rsync(未授權訪問) 介紹: 靶場及過程: 提權過程: Docker 組掛載 原理: 復現: 利用: 具體操作: 1-確定是否有docker服務 2-查看用戶是否在docker組里面 3-執行命…

包管理工具npm、cnpm、yarn、NVM

文章目錄 npmnpm基本使用npm搜索包生產環境與開發環境開發依賴與生產依賴全局安裝環境變量Path安裝包依賴安裝指定版本的包、刪除依賴配置命令別名 cnpm安裝操作命令:配置 yarnyarn安裝及常用命令yarn 配置淘寶鏡像 NVM使用常用命令 擴展內容npm和yarn的選擇npm發布…