商城自動化測試實戰 —— 登錄+滑塊驗證

hello大家好,我是你們的小編!

本商城測試項目采取PO模型和數據分離式架構,采用pytest+selenium+jenkins結合的方式進行腳本編寫與運行,項目架構如下:

圖片

1、創建項目名稱:code_shopping,創建所需項目文件

圖片

2、在tools層中建立 get_log.py文件,復制以下代碼

? ? ?此為項目日志工具,使用時直接調用即可

import?logging.handlers
from?conftest?import?BASE_PATH
import?os#?新建類
class?GetLog:#?新建一個日志變量__logger?=?None#?新建獲取日志的方法@classmethoddef?get_logger(cls):#?判斷日志器為空if?cls.__logger?is?None:#?獲取日志器cls.__logger?=?logging.getLogger()#?修改默認的級別cls.__logger.setLevel(logging.INFO)log_path?=?BASE_PATH?+?os.sep?+?"result"?+?os.sep+"log"?+?os.sep?+?"AT.log"#?獲取處理器th?=?logging.handlers.TimedRotatingFileHandler(filename=log_path,when="midnight",interval=1,backupCount=3,encoding="utf-8")#?獲取格式器fmt?=?"%(asctime)s%(levelname)s[%(filename)s(%(funcName)s:%(lineno)d)]-%(message)s"fm?=?logging.Formatter(fmt)#?將格式器添加到處理器中th.setFormatter(fm)#?將處理器添加到日志器中cls.__logger.addHandler(th)#?返回日志器return?cls.__loggerif?__name__?==?'__main__':log?=?GetLog.get_logger()log.info("1111")log.error("22222")

3、在scripts中建立 sh_login文件夾和?test_login.py文件

? ? ?開始編寫商城登錄頁面代碼

圖片

4、在test_login.py中編寫腳本

? ? ?商城登錄頁面包含:帳號+密碼+滑動驗證碼的混合驗證模式

?????4.1首先將驗證碼的2張圖片下載到本地(注意填寫等待圖片加載時間),通過商城HTML頁面發現圖片經過base64加密,需解碼保存本地

圖片

#?獲取圖片的地址
#?sleep(3)
img?=?driver.find_element(By.XPATH,?('//*[@id="app"]/div/div[2]/div[3]/div[1]/img[1]'))
img2?=?driver.find_element(By.XPATH,?('//*[@id="app"]/div/div[2]/div[3]/div[1]/img[2]'))s?=?img.get_attribute("src")
s2?=?img2.get_attribute("src")
#?print(type(s))
#?print(s)
#?使用split()函數將字符串拆分成多個數字
numbers?=?s.split(",")
numbers2?=?s2.split(",")
#?print(numbers)
#?print(type(numbers))
#?獲取圖片的base64加密數據
djd?=?numbers[1]
djd2?=?numbers2[1]
#?輸出提取出的數字
#?print(djd)
#?base64解碼
lk?=?base64.b64decode(djd)
lk2?=?base64.b64decode(djd2)
#?獲取圖片到本地
pic?=?open("re.png",?"wb")
pic2?=?open("can.png",?"wb")
pic.write(lk)
pic2.write(lk2)
pic.close()
pic2.close()

4.2?對圖像進行處理,計算出滑塊的拖動距離(此方法單獨寫在test001.py文件,方便調用)

import?cv2#?對圖像處理
def?handel_img(img):imgGray?=?cv2.cvtColor(img,?cv2.COLOR_RGBA2GRAY)??#?轉灰度圖imgBlur?=?cv2.GaussianBlur(imgGray,?(5,?5),?1)??#?高斯模糊imgCanny?=?cv2.Canny(imgBlur,?60,?60)??#?Canny算子邊緣檢測return?imgCanny#?讀取圖像
def?match(img_jpg_path,?img_png_path):#?讀取圖像img_jpg?=?cv2.imread(img_jpg_path,?cv2.IMREAD_UNCHANGED)img_png?=?cv2.imread(img_png_path,?cv2.IMREAD_UNCHANGED)img?=?handel_img(img_jpg)small_img?=?handel_img(img_png)res_TM_CCOEFF_NORMED?=?cv2.matchTemplate(img,?small_img,?3)value?=?cv2.minMaxLoc(res_TM_CCOEFF_NORMED)value?=?value[3][0]??#?獲取到移動距離return?valueif?__name__?==?'__main__':dd?=?match('./re.png',?'./can.png')print(dd)

4.3?最后模擬鼠標點擊拖動滑塊動作,完成驗證

#?計算要滑動的距離
dd?=?match('./re.png',?'./can.png')
print(dd)
sleep(2)
#?拖動滑塊
#?找到拖動元素
slider?=?driver.find_element(By.XPATH,?('//*[@id="app"]/div/div[2]/div[3]/div[2]/span[2]'))
#?按住按鈕
ActionChains(driver).click_and_hold(slider).perform()
sleep(1)
#?滑動距離對應距離
ActionChains(driver).move_by_offset(xoffset=dd,?yoffset=0).perform()
sleep(3)
#?放開鼠標
ActionChains(driver).release().perform()

4.4?完成輸入,驗證,登錄進入系統,判斷是否登錄成功

#?判斷是否登錄成功
getshu?=?driver.find_element(By.XPATH,?('//*[@id="app"]/div/div[3]/div/ul[1]/ul/li[1]')).text
#?print(getshu)
if?getshu?==?"Hi,歡迎來到lilishop":print("登錄成功")
else:print("登錄失敗")

5、完整代碼如下

from?selenium?import?webdriver
from?time?import?sleep
from?selenium.webdriver.common.by?import?By
import?base64
from?scripts.sh_login.test001?import?match
from?selenium.webdriver?import?ActionChains#?啟動瀏覽器驅動
driver?=?webdriver.Chrome()
#?最大化
driver.maximize_window()
#?輸入商城地址
driver.get("https://pc-b2b2c.pickmall.cn/login")
sleep(1)
#?輸入用戶名和密碼
driver.find_element(By.CSS_SELECTOR,?("[placeholder='用戶名']")).send_keys("ceshi")
sleep(1)
driver.find_element(By.CSS_SELECTOR,?("[placeholder='密碼']")).send_keys("123456")
sleep(1)
#?點擊登錄按鈕
driver.find_element(By.XPATH,?('//*[@id="app"]/div/div[2]/div[2]/div[3]/div[1]/form[1]/div[3]/div/button')).click()sleep(2)
#?滑動滑塊
#?獲取圖片的地址
#?sleep(3)
img?=?driver.find_element(By.XPATH,?('//*[@id="app"]/div/div[2]/div[3]/div[1]/img[1]'))
img2?=?driver.find_element(By.XPATH,?('//*[@id="app"]/div/div[2]/div[3]/div[1]/img[2]'))s?=?img.get_attribute("src")
s2?=?img2.get_attribute("src")
#?print(type(s))
#?print(s)
#?使用split()函數將字符串拆分成多個數字
numbers?=?s.split(",")
numbers2?=?s2.split(",")
#?print(numbers)
#?print(type(numbers))
#?獲取圖片的base64加密數據
djd?=?numbers[1]
djd2?=?numbers2[1]
#?輸出提取出的數字
#?print(djd)
#?base64解碼
lk?=?base64.b64decode(djd)
lk2?=?base64.b64decode(djd2)
#?獲取圖片到本地
pic?=?open("re.png",?"wb")
pic2?=?open("can.png",?"wb")
pic.write(lk)
pic2.write(lk2)
pic.close()
pic2.close()#?計算要滑動的距離
dd?=?match('./re.png',?'./can.png')
print(dd)
sleep(2)
#?拖動滑塊
#?找到拖動元素
slider?=?driver.find_element(By.XPATH,?('//*[@id="app"]/div/div[2]/div[3]/div[2]/span[2]'))
#?按住按鈕
ActionChains(driver).click_and_hold(slider).perform()
sleep(1)
#?滑動距離對應距離
ActionChains(driver).move_by_offset(xoffset=dd,?yoffset=0).perform()
sleep(3)
#?放開鼠標
ActionChains(driver).release().perform()
sleep(5)
#?判斷是否登錄成功
getshu?=?driver.find_element(By.XPATH,?('//*[@id="app"]/div/div[3]/div/ul[1]/ul/li[1]')).text
#?print(getshu)
if?getshu?==?"Hi,歡迎來到lilishop":print("登錄成功")
else:print("登錄失敗")
#?關閉瀏覽器
driver.quit()

6、完成整個登錄過程,成功視頻如下

最后感謝每一個認真閱讀我文章的人,看著粉絲一路的上漲和關注,禮尚往來總是要有的,雖然不是什么很值錢的東西,如果你用得到的話可以直接拿走!?

軟件測試面試文檔

我們學習必然是為了找到高薪的工作,下面這些面試題是來自阿里、騰訊、字節等一線互聯網大廠最新的面試資料,并且有字節大佬給出了權威的解答,刷完這一套面試資料相信大家都能找到滿意的工作。

在這里插入圖片描述

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

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

相關文章

openEuler安裝docker

在openEuler上安裝Docker,可以通過以下步驟進行: 1、更新軟件包索引: sudo yum makecache 2、安裝Docker: sudo yum install docker -y 3、啟動Docker服務: sudo systemctl start docker 4、設置Docker開機自啟&am…

010、GPT-5:AI新紀元的曙光與挑戰

目錄 GPT-5:AI新紀元的曙光與挑戰 1.革命性的個人助理 2.教育領域的變革 3.醫療健康的新篇章 4.科研創新的加速器 5.創意產業的新靈感 6.商業與經濟的智能化 7.社會治理的新工具 8.環境保護與可持續發展 9.倫理與社會影響 學術視角:AI發展的前…

惠海H6392 2.6v升5V 3.7V升9V 4.2V升12V 升壓恒壓芯片 小家電IC

惠海H6392升壓恒壓芯片是一款小家電、移動設備以及其他需要升壓恒壓電源的電子設備設計的DC-DC轉換器。這款芯片以其獨特的產品特性和廣泛的應用場景,為電子產品設計者提供了高效、穩定的電源解決方案。 產品描述: H6392采用了簡單的電流模式升壓技術&a…

使用Collections.shuffle打亂集合順序

使用Collections.shuffle打亂集合順序 大家好,我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編,也是冬天不穿秋褲,天冷也要風度的程序猿!今天我們將探討如何使用Java中的Collections.shuffle方法來打亂集合的順序…

單例模式實現方式

單例模式 單例模式(Singleton Pattern)的主要目的是確保一個類只有一個實例,并提供一個全局訪問點來訪問該實例。 在 Java 中,實現單例模式的方式有幾種常見的方式 懶漢式 public class Singleton{private static final Singlet…

華為od-C卷200分題目4 -電腦病毒感染

華為od-C卷200分題目4 -電腦病毒感染 一個局域網內有很多臺電腦,分別標注為0 - N-1的數字。相連接的電腦距離不一樣,所以感染時間不一樣,感染時間用t表示。其中網絡內一個電腦被病毒感染,其感染網絡內所有的電腦需要最少需要多長…

二叉樹的題目

目錄 1、將遍歷的結果放在list中 2、判斷兩棵樹是否相同 3、翻轉二叉樹 4、判斷平衡二叉樹 5、判斷二叉樹是否對稱 6、判斷是否為完全二叉樹 先創建一個二叉樹 public class BinaryTree {static class TreeNode {public char val;public TreeNode left;public TreeNode …

NextJs 系列文章

NextJs 系列文章 NextJs 初級篇 - 安裝 | 路由 | 中間件NextJs 渲染篇 - 什么是CSR、SSR、SSG、ISR 和服務端/客戶端組件NextJs 數據篇 - 數據獲取 | 緩存 | Server Actions

使用Java實現通用樹形結構轉換工具類:深入解析TreeUtil和TreeNode接口

文章目錄 一、TreeNode接口設計二、TreeUtil工具類設計三、示例:實現TreeNode接口的節點類四、示例:使用TreeUtil構建樹形結構五、總結 🎉歡迎來到Java學習路線專欄~探索Java中的靜態變量與實例變量 ☆* o(≧▽≦)o *☆嗨~我是IT陳寒&#x1…

基于vue腳手架創建的圖書商城

功能簡介 此項目包括首頁, 搜索列表, 商品詳情, 購物車, 訂單, 支付, 用戶登陸/注冊等多個子模塊,使用 Vue 全家 桶ES6WebpackAxios 等技術,采用模塊化、組件化、工程化的模式開發。 功能模塊圖 2.1首頁 2.2.搜索列表 2.3.商品詳情 2.4.購物車 2.5.支…

條件測試,if語句,case語句

測試命令 格式1:test 條件表達式 格式2:[條件表達式] test命令和 [ ] 相同,建議使用[ ] #方框中要空格 #用test可能會不小心定義變量文件測試 常見的測試操作符含義-d檢查文件是否存在且為目錄-f檢查文件是否存在且為常規文件-L測試…

解決json日期格式問題

解決json日期格式問題 1.json默認輸出時間格式 RequestMapping("/json3") public String json3() throws JsonProcessingException {ObjectMapper mapper new ObjectMapper();//創建時間一個對象,java.util.DateDate date new Date();//將我們的對象解…

Knife4j:快速入門

1. 概述 Knife4j是一個用于生成和展示API文檔的工具,同時它還提供了在線調試的功能,下圖是其工作界面。 * Knife4j有多個版本,最新版的Knife4j基于開源項目springdoc-openapi,這個開源項目的核心功能就是根據SpringBoot項目中的代…

uniapp uniCloud云開發

uniCloud概述 uniCloud 是 DCloud 聯合阿里云、騰訊云、支付寶云,為開發者提供的基于 serverless 模式和 js 編程的云開發平臺。 uniCloud 的 web控制臺地址:https://unicloud.dcloud.net.cn 文檔:https://doc.dcloud.net.cn/uniCloud/ un…

大模型應用-多模態和大模型是如何相互成就的

前言 如果單純的將大模型用來聊天,那就是low了。 而多模態賦予了大模型更多的現實價值,大模型則助力多模態變得更強大。 多模態 我們所處的是一個物理世界,不同事物之間模態多種多樣,即便是簡單的文本,按照語言&am…

【Docker0】網絡更改

目錄 1. 停止docker服務 2. 關閉docker默認橋接網絡接口 3. 從系統刪除docker0接口 4. 創建一個名為bridge0的新接口 5. 添加ip地址和子網掩碼 6. 啟用bridge0接口 7. (如果沒起來就執行該句) 8. 查看ip 1. 停止docker服務 sudo service docker…

c++用什么軟件編程?都有哪些?

c用什么軟件編程?都有哪些? C 作為一種高效、面向對象的編程語言,廣泛應用于軟件開發、游戲開發、嵌入式系統等領域。那么在進行 C 編程時,我們通常會使用哪些軟件呢?下面就來具體分析。 1. Visual Studio Visual Stu…

深入 SSH:解鎖本地轉發、遠程轉發和動態轉發的潛力

文章目錄 前言一、解鎖內部服務:SSH 本地轉發1.1 什么是 SSH 本地轉發1.2 本地轉發應用場景 二、打開外部訪問大門:SSH 遠程轉發2.1 什么是 SSH 遠程轉發2.2 遠程轉發應用場景 三、動態轉發:SSH 讓你擁有自己的 VPN3.1 什么是 SSH 動態轉發3.…

mysqldump全備份之后,如何只恢復一個庫或者一個表

在實際工作中,一個MySQL實例中可能有多個database。而我們備份時,通常采用完全備份,將所有database都備份到一個文件中。 但是,偶爾會遇到只恢復一個database或者一個表的情況。怎么解決呢? 一、利用全備恢復一個庫(database)的數據 案例:朋友在群里問, MySQL全庫備份…

memory動態內存管理學習之weak_ptr

此頭文件是動態內存管理庫的一部分。std::weak_ptr 是一種智能指針,它持有對被 std::shared_ptr 管理的對象的非擁有性(“弱”)引用。在訪問所引用的對象前必須先轉換為 std::shared_ptr。std::weak_ptr 用來表達臨時所有權的概念&#xff1a…