PO模式登錄測試

項目實踐

登陸項目測試

get_driver

import page
from selenium import webdriverclass GetDriver:driver = None@classmethoddef get_driver(cls):if cls.driver is None:cls.driver = webdriver.Edge()cls.driver.maximize_window()cls.driver.get(page.url)return cls.driver@classmethoddef quit_driver(cls):if cls.driver:cls.driver.quit()cls.driver = None

get_logger

import logging.handlersclass GetLogger:logger = None@classmethoddef get_logger(cls):if cls.logger is None:cls.logger = logging.getLogger()cls.logger.setLevel(logging.INFO)sh = logging.StreamHandler()th = logging.handlers.TimedRotatingFileHandler(filename="../log/login.log",when="midnight",interval=1,backupCount=3,encoding="utf-8")fmt = '%(asctime)s %(levelname)s [%(name)s] [%(filename)s(%(funcName)s:%(lineno)d)] - %(message)s'fm = logging.Formatter(fmt)sh.setFormatter(fm)th.setFormatter(fm)cls.logger.addHandler(sh)cls.logger.addHandler(th)return cls.logger

base

from selenium.webdriver.support.wait import WebDriverWait
import timefrom base.get_logger import GetLoggerlog = GetLogger().get_logger()class Base:def __init__(self, driver):log.info("正在初始化driver{}".format(driver))self.driver = driverdef base_find_element(self, loc, timeout=30, poll=0.5):log.info("正在查找元素{}".format(loc))return WebDriverWait(self.driver, timeout=timeout, poll_frequency=poll).until(lambda x: x.find_element(*loc))def base_click(self, loc):log.info("正在點擊元素{}".format(loc))self.base_find_element(loc).click()def base_input(self, loc, value):log.info("正在給元素輸入內容{}".format(loc))el = self.base_find_element(loc)# 清空log.info("正在給元素{}清空".format(loc))el.clear()# 輸入log.info("正在給元素{}輸入內容".format(loc))el.send_keys(value)def base_get_text(self, loc):# 注意:一定要返回元素的文本信息log.info("正在獲取元素{}文本".format(loc))return self.base_find_element(loc).text# 截圖def base_get_screen_shot(self):self.driver.get_screenshot_as_file("../image/{}.png".format(time.strftime("%Y_%m_%d %H_%M_%S")))# 封裝判斷元素是否存在def base_if_exist(self, loc):try:self.base_find_element(loc, timeout=2)log.info("元素{}存在".format(loc))return Trueexcept:log.info("元素{}不存在".format(loc))return False

__init__

from selenium.webdriver.common.by import By"""項目配置地址"""
url = "https://demo5.tp-shop.cn/""""以下為登錄頁面元素配置信息"""# 用戶名
login_username = By.ID, "username"
# 密碼
login_pwd = By.ID, "password"
# 驗證碼
login_verify_code = By.ID, "verify_code"
# 登錄按鈕
login_btn = By.CSS_SELECTOR, ".J-login-submit"
# 獲取異常文本信息
login_err_info = By.CSS_SELECTOR, ".layui-layer-content"
# 點擊異常提示框 按鈕
login_err_btn_ok = By.CSS_SELECTOR, ".layui-layer-btn0"
# 安全退出
login_logout = By.PARTIAL_LINK_TEXT, "安全退出"# 登錄鏈接
login_link = By.PARTIAL_LINK_TEXT, "登錄"

page_login 繼承Base

from base.base import Base
import pageclass PageLogin(Base):# 點擊登錄鏈接def page_click_login_link(self):self.base_click(page.login_link)# 輸入用戶名def page_input_username(self, username):self.base_input(page.login_username, username)# 輸入密碼def page_input_password(self, pwd):self.base_input(page.login_pwd, pwd)# 輸入驗證def page_input_verify_code(self, code):self.base_input(page.login_verify_code, code)# 點擊登錄按鈕def page_click_login_btn(self):self.base_click(page.login_btn)# 獲取異常提示信息def page_get_error_info(self):return self.base_get_text(page.login_err_info)# 點擊異常信息框 確定def page_click_err_btn_ok(self):self.base_click(page.login_err_btn_ok)# 截圖def page_get_img(self):self.base_get_screen_shot()# 點擊 安全退出 --》退出使用def page_click_logout(self):self.base_click(page.login_logout)# 判斷是否登錄成功def page_is_login_success(self):return self.base_if_exist(page.login_logout)# 判斷是否退出成功def page_is_logout_success(self):return self.base_if_exist(page.login_link)# 組合業務方法def page_login(self, username, pwd,code):self.page_input_username(username)self.page_input_password(pwd)self.page_input_verify_code(code)self.page_click_login_btn()

數據準備

json:

{"login_001":{"username":"138000011112","password":"123456","verify_code":"8888","expect_result":"賬號不存在!","success": false},"login_002":{"username":"13800001111","password":"1234567","verify_code":"8888","expect_result":"密碼錯誤!","success": false},"login_003":{"username":"","password":"123456","verify_code":"8888","expect_result":"用戶名不能為空!","success": false},"login_004":{"username":"13800001111","password":"","verify_code":"8888","expect_result":"密碼不能為空!","success": false},"login_005":{"username":"13800001111","password":"123456","verify_code":"","expect_result":"驗證碼不能為空!","success": false},"login_006":{"username":"13800001111","password":"123456","verify_code":"8888","expect_result":"安全退出","success": true}
}

txt:

138000011112,123456,8888,賬號不存在!,false
13800001111,1234567,8888,密碼錯誤!,false
,123456,8888,用戶名不能為空!,false
13800001111,,8888,密碼不能為空!,false
13800001111,123456,,驗證碼不能為空!,false
13800001111,123456,8888,安全退出,true

數據驅動方法

json:

# 導包
import jsondef read_json(filename):filepath = "../data/" + filename# 打開文件并調用 load方法with open(filepath, "r", encoding="utf-8")as f:return json.load(f)

txt:

def read_txt(filename):filepath = "../data/" + filenamewith open(filepath, "r", encoding="utf-8")as f:return f.readlines()

業務層

# 導包
import unittest
from time import sleepfrom base.get_driver import GetDriver
from page.page_login import PageLogin
from parameterized import parameterized
from tool.read_json import read_json
from tool.read_txt import read_txt
from base.get_logger import GetLoggerlog = GetLogger().get_logger()def get_data():arr = []for data in read_json("login.json").values():arr.append((data.get("username"),data.get("password"),data.get("verify_code"),data.get("expect_result"),data.get("success")))return arr  # 注意:必須進行return 返回# def get_data():
#     arr = []
#     for data in read_txt("login.txt"):
#         arr.append(tuple(data.strip().split(",")))
#     return arr# 新建測試類
class TestLogin(unittest.TestCase):login = None@classmethoddef setUpClass(cls):try:# 實例化 獲取頁面對象 PageLogincls.login = PageLogin(GetDriver().get_driver())# 點擊登錄連接cls.login.page_click_login_link()except Exception as e:log.error(e)# tearDown@classmethoddef tearDownClass(cls):sleep(3)# 關閉 driver驅動對象GetDriver().quit_driver()def tearDown(self):self.login.driver.refresh()# 登錄測試方法@parameterized.expand(get_data())def test_login(self, username, pwd, code, expect_result, success):# 調用登錄方法self.login.page_login(username, pwd, code)if success:try:# 判斷安全退出是否存在self.assertTrue(self.login.page_is_login_success())# 點擊退出self.login.page_click_logout()try:# 判斷登錄是否存在self.assertTrue(self.login.page_is_logout_success)except:# 截圖self.login.page_get_img()# 點擊登錄連接self.login.page_click_login_link()except Exception as e:# 截圖self.login.page_get_img()log.error(e)else:# 獲取登錄提示信息msg = self.login.page_get_error_info()try:# 斷言self.assertEqual(msg, expect_result)except AssertionError:# 截圖self.login.page_get_img()# 點擊 確認框self.login.page_click_err_btn_ok()

生成測試報告?

from tool.HTMLTestRunner import HTMLTestRunner
import unittestsuite = unittest.defaultTestLoader.discover("./", "test_login.py")
# 網頁要wb
with open("../report/report_html.html", "wb") as f:HTMLTestRunner(stream=f).run(suite)

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

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

相關文章

Java高風險漏洞與修復之——LDAP injection(LDAP注入)

LDAP注入介紹 LDAP注入是一種攻擊技術,它可以利用應用程序中的安全漏洞對LDAP(輕量級目錄訪問協議)服務進行惡意查詢或修改操作。當應用程序未能適當地清理用戶的輸入內容,將其嵌入到LDAP查詢中時,就可能發生LDAP注入。攻擊者通過注入未經授權的指令或條件來操縱查詢結果…

【代碼隨想錄訓練營】【Day 66】【圖論-3】| 卡碼 101-104

【代碼隨想錄訓練營】【Day 66】【圖論-3】| 卡碼 101-104 需強化知識點 103,104 優化思路 題目 101. 孤島的總面積 此處 area 多余 def dfs(grid, x, y, area):dirs [[0, 1], [0, -1], [1, 0], [-1, 0]]m, n len(grid), len(grid[0])area[0] 1grid[x][y] …

k8s學習筆記——k8s升級

前一段時間,由于搭建k8s集群的硬件設備故障,老化導致k8s需要重裝。使用原來的kubeadm安裝方式卻發現裝不了了。查了一下官方文檔,說從v1.24版本之后,kubelet移除了容器引擎,容器及鏡像管理將有第三方工具來接管&#x…

Vue.js有哪些優點和缺點

Vue.js 作為一個流行的前端框架,具有許多優點和一些潛在的缺點。以下是 Vue.js 的一些主要優點和缺點: 優點: 輕量級和靈活性:Vue.js 的核心庫專注于視圖層,這使得它非常輕量級(壓縮后只有幾十KB&#xff…

Web 反爬指南

本質上說,防抓的目的在于增加腳本或機器獲取你網站內容的難度,而不要影響真實用戶的使用或搜索引擎的收錄 不幸的是這挺難的,你需要在防抓和降低真實用戶以及搜索引擎的可訪問性之間做一下權衡。 為了防爬(也稱為網頁抓取、屏幕…

智譜AI: ChatGLM API的使用

一、獲取API 1、打開網址:智譜AI開放平臺 注冊賬號登錄 2、登錄,查看API key (注冊后贈送100萬token,實名認證后多贈送400萬, 有效期一個) 二、安裝及調用 安裝質譜SDK pip install zhipuai調用方式 流式調用 from zhipuai import ZhipuA…

開放簽電子簽章,讓簽字有跡可循

開放簽(企業版)V2.0.5版本上線后,系統支持一鍵查詢電子文件的簽署操作記錄,支持一鍵生成詳細的簽署記錄報告,詳細請看下圖: 1、操作記錄詳情: 從合同發起、填寫、簽署、撤銷等環節全流程展示操…

【Linux從入門到放棄】探究進程如何退出以進程等待的前因后果

🧑?💻作者: 情話0.0 📝專欄:《Linux從入門到放棄》 👦個人簡介:一名雙非編程菜鳥,在這里分享自己的編程學習筆記,歡迎大家的指正與點贊,謝謝! 進…

常見反爬及應對

一,特殊混淆的還原 1.1 還原 AAEncode 與 JJEncode AAEncode是一種JavaScript代碼混淆算法,利用它,可以將代碼轉換成 顏文字 表示的JavaScript代碼。 去掉代碼最后的 (‘‘),這是函數的自調用,去除后就是函數的聲明…

【CSharp】定義結構體并指定字段對齊

【CSharp】定義結構體并指定字段對齊 1.背景2.代碼3.分析1.背景 在 C# 中可以通過 StructLayout 屬性來定義結構體并指定字段對齊方式。 在 C# 中,內存對齊是指數據在內存中的排列方式,使用StructLayout 特性用于控制結構體的內存布局。其特性可以指定字段的內存排列順序(例…

【揭秘】國內十大頂尖AI大模型,引領智能科技新紀元

大模型大模型通常指的是參數量非常大、數據量也非常大的深度學習模型。這些模型由數百萬到數十億甚至更多的參數組成,需要海量的數據和強大的計算資源進行訓練和推理學習的模型。大模型設計的目的在于提高模型的表示能力和性能、應對復雜數據集和任務、提升泛化能力…

6、限界上下文:定義領域邊界的利器

在DDD限界上下文:定義領域邊界的利器領域建模和微服務建設過程中,會有很多項目參與者,包括領域專家、產品經理、項目經理、架構師、開發經理和測試經理等。對于同樣的領域知識,不同的參與者可能會有不同的理解。而且有的時候同一個…

嵌入式學習——硬件(Linux系統在2440上的啟動)——day57

1. Linux2.6系統在s3c2440上的啟動過程分三個階段 1.1 啟動u-boot 1.2 啟動Linux內核 1.3 掛載根文件系統 2. bootloader 2.1 定義 bootloader的本質是一個裸機程序,bootlood專門是為了能夠正確地啟動linux操作系 統,在系統初上電時需要對系統做一些…

BK145FRC10HSK、BK165FRC10HSK電液比例開環控制變量泵放大器

BK15FRC10HAK、BK35FRC10HAK、BK45FRC10HAK、BK55FRC10HAK、BK70FRC10HSK、BK80FRC10HSK、BK90FRC10HSK、BK100FRC10HSK、BK120FRC10HSK、BK145FRC10HSK、BK165FRC10HSK、BK180FRC10HSK電液比例開環控制柱塞泵主要是在傳統的液壓泵基礎上,增加了電液比例控制先導閥。…

從零開始實現大語言模型(二):文本數據處理

1. 前言 神經網絡不能直接處理自然語言文本,文本數據處理的核心是做tokenization,將自然語言文本分割成一系列tokens。 本文介紹tokenization的基本原理,OpenAI的GPT系列大語言模型使用的tokenization方法——字節對編碼(BPE, byte pair en…

重采樣(上采樣或下采樣)是什么?

重采樣(Resampling)是在數據處理中常用的一種技術,主要用于處理數據集中的不平衡問題。具體來說,重采樣可以分為上采樣(Oversampling)和下采樣(Undersampling),它們分別是…

【bug報錯已解決】ERROR: Could not find a version that satisfies the requirement

🎬 鴿芷咕:個人主頁 🔥 個人專欄: 《C干貨基地》《粉絲福利》 ??生活的理想,就是為了理想的生活! 文章目錄 引言一、問題描述1.1 報錯示例1.2 報錯分析 二、解決方法2.1 方法一2.2 方法二 三、總結 引言 有沒有遇到過那種讓人…

軟件開發中常用環境你都知道哪些?

目錄 本地環境(Local Environment,簡稱 LOCAL) 開發環境(Development Environment,簡稱 DEV) 測試環境(Testing Environment,簡稱 TEST) 集成測試環境(Sy…

墨烯的C語言技術棧-C語言基礎-003

三.數據類型 1.char // 字符數據型 2.short // 短整型 3.int // 整型 4.long // 長整型 5.long long // 更長的整型 6.float // 單精度浮點數 7.double // 雙精度浮點數 為什么寫代碼? 為了解決生活中的問題 購物,點餐,看電影 為什么有這么多類型呢? 因為說的話都是字符型…

CM-UNet: Hybrid CNN-Mamba UNet for Remote Sensing Image Semantic Segmentation

論文:CM-UNet: Hybrid :CNN-Mamba UNet for Remote Sensing Image Semantic Segmentation 代碼:https://github.com/XiaoBuL/CM-UNet Abstrcat: 由于大規模圖像尺寸和對象變化,當前基于 CNN 和 Transformer 的遙感圖像語義分割方…