前言
做測試工程師的少不了和一些bug管理工具打交道,比如禪道,jira,今天安靜介紹下如何通過requests完成禪道的登錄以及自動提bug
抓取登錄狀態
我們先通過fiddler進行抓取禪道的登錄接口,查看禪道登錄接口都有哪些內容。

通過上圖片可以看到禪道登錄的接口地址,請求方式,請求類型。登錄的賬號名和密碼,細心的小伙伴們可以看出來,在登錄的賬號名密碼中,密碼是通過進行加密過后的一段字符,但是密碼是怎么加密的,這個沒有辦法知道。
分析請求體
我們可以先通過進行發送請求這個接口地址,看看返回的內容有沒有一些提示信息
import requests
url = 'http://127.0.0.1/pro/user-login.html'
r = requests.get(url)
print(r.content.decode('utf-8'))
通過requests進行發送請求,查看我們的返回的內容,可以看到一段關於請求內容一些加密情況

這里很清楚的描述了,密碼的加密情況,密碼是通過MD5的方式進行一層加密,然后加上了一個 verifyRand 這個字符內容又進行了一層加密。分析到這里,我們可以知道只要找到 verifyRand 這個字符的內容就能通過MD5的加密方式求出加密后的密碼內容。安靜這里多次抓包發現 verifyRand 這個值每次請求頁面的時候都會發生改變,並且在我們的返回內容中也找到了值的位置。

既然發現在我們的請求返回值中可以找到,那么就可以通過正則表達式的形式進行提取出來。
import requests
import re
url = 'http://127.0.0.1/pro/user-login.html'
r = requests.get(url)
verify = re.findall(r"name='verifyRand' id='verifyRand' value='(.*?)' />",r.content.decode('utf-8'))
print(verify)
通過上述內容,執行后可以看出,已經將 verifyRand 的值提取出來了
MD5加密
前面的步驟已經將登錄的所需要的內容都找到了,接下來就是通過MD5進行加密了,這里安靜介紹一個python的MD5加密的庫 hashlib 進行完成加密。這里的密碼進行了雙重加密
import requests
import re
import hashlib
# 通過session的方式進行請求
s = requests.session()
user = 'anjing_test'
password = 'test_anjing'
url = 'http://127.0.0.1/pro/user-login.html'
r = s.get(url)
# print(r.content.decode('utf-8'))
verify = re.findall(r"name='verifyRand' id='verifyRand' value='(.*?)' />", r.content.decode('utf-8'))[0]
# 第一次加密密碼
pwd1md5 = hashlib.md5()
pwd1md5.update(password.encode('utf-8'))
pwd1_result = pwd1md5.hexdigest()
# 第2次加密
pwd2md5 = hashlib.md5()
pwd2md5.update((pwd1_result+verify).encode('utf-8'))
pwd2_result = pwd2md5.hexdigest()
這里將密碼進行了2層加密后,我們再次帶上加密后的密碼,進行請求登錄接口。
注意:因為這里后續要進行請求其他網址,安靜用了session的方式進行請求。
完成登錄
這里安靜加了一個判斷內容,通過請求進入測試頁面,如果進入了測試頁面,說明我們的登錄成功了,如果沒有進入,就是登錄失敗了
import requests
import re
import hashlib
# 通過session的方式進行請求
s = requests.session()
user = 'anjing_test'
password = 'test_anjing'
url = 'http://127.0.0.1/pro/user-login.html'
r = s.get(url)
# print(r.content.decode('utf-8'))
verify = re.findall(r"name='verifyRand' id='verifyRand' value='(.*?)' />", r.content.decode('utf-8'))[0]
# 第一次加密密碼
pwd1md5 = hashlib.md5()
pwd1md5.update(password.encode('utf-8'))
pwd1_result = pwd1md5.hexdigest()
# 第2次加密
pwd2md5 = hashlib.md5()
pwd2md5.update((pwd1_result+verify).encode('utf-8'))
pwd2_result = pwd2md5.hexdigest()
body = {
"account": user,
"password": pwd2_result,
"passwordStrength": 1,
"referer": "/pro/",
"verifyRand": verify,
"keepLogin": 0,
}
r = s.post('http://127.0.0.1/pro/user-login.html', data=body)
# 訪問測試頁面
test = s.get("http://127.0.0.1/pro/qa/")
if "測試主頁" in test.text:
print('登錄成功!!')
else:
print('登錄失敗!!')
通過執行后發現,我們已經登錄成功了。
自動提交bug
通過上面的步驟已經完成了對禪道的登錄,接下來就是抓取提bug的接口信息。然后模擬接口自動提交bug內容。
分析提交bug接口
繼續通過Fiddler進行抓取提交bug接口

通過分析接口可以看出來,我們是通過表單的形式進行請求的,requests沒有請求表單的內容
表單提交
這里我們需要引入第3方庫 requests-toolbelt 進行完成,這個庫需要通過pip進行安裝
pip install requests-toolbelt
安裝過后,我們將上述抓到的信息填寫到請求體中,然后在攜帶這請求體進行請求提交bug的接口內容。
import requests
import re
import hashlib
from requests_toolbelt import MultipartEncoder
s = requests.session()
user = 'anjing_test'
password = 'test_anjing'
url = 'http://127.0.0.1/pro/user-login.html'
r = s.get(url)
# print(r.content.decode('utf-8'))
verify = re.findall(r"name='verifyRand' id='verifyRand' value='(.*?)' />", r.content.decode('utf-8'))[0]
# 第一次加密密碼
pwd1md5 = hashlib.md5()
pwd1md5.update(password.encode('utf-8'))
pwd1_result = pwd1md5.hexdigest()
# 第2次加密
pwd2md5 = hashlib.md5()
pwd2md5.update((pwd1_result+verify).encode('utf-8'))
pwd2_result = pwd2md5.hexdigest()
body = {
"account": user,
"password": pwd2_result,
"passwordStrength": 1,
"referer": "/pro/",
"verifyRand": verify,
"keepLogin": 0,
}
r = s.post('http://127.0.0.1/pro/user-login.html', data=body)
# 訪問測試頁面
test = s.get("http://127.0.0.1/pro/qa/")
if "測試主頁" in test.text:
print('登錄成功!!')
else:
print('登錄失敗!!')
# 提交bug接口
url2 = 'http://127.0.0.1/pro/bug-create-1-0-moduleID=0.html'
body2 = MultipartEncoder(
fields=[
('product', "1"),
('module', '0'),
('project', ' '),
('openedBuild[]', 'trunk'),
('assignedTo', 'admin'),
('deadline', ''),
('type', 'codeerror'),
('os', ''),
('browser', ''),
('title', '正確的賬號密碼登錄失敗'), # bug 名稱
('color', ''),
('severity', '3'),
('pri', '3'),
('steps', '<p>[步驟]</p>\n<p>輸入正確的賬號名密碼進行完成登錄</p>\n<br />\n<p>[結果]</p>\n登錄失敗<br />\n<p>[期望]</p>\n登錄成功<br />'),
('story', '0'),
('task','0'),
('oldTaskID', '0'),
('mailto[]', ''),
('contactListMenu', ''),
('keywords', ''),
('status', 'active'),
('labels[]', ''),
('files[]', ''),
('uid', '602f5eb06ddc9'),
('case', '0'),
('caseVersion', '0'),
('caseVersion', '0'),
('result', '0'),
('testtask', '0'),
],
)
# 請求提交bug接口
r2 = s.post(url2, headers={'Content-Type': body2.content_type}, data=body2)
if '保存成功' in r2.text:
print('bug提交成功!')
else:
print('bug提交失敗')
通過執行后,再次返回到我們的bug頁面,會發現已經提交成功了。

總結
這里登錄禪道以及自動提交bug的過程,主要運用了requests的一些方法以及如何通過代碼的形式進行提交表單類型。以及如何通過python進行MD5的加密。