由于UI層自動化的不穩定性,經常會遇到執行中斷或用例失敗的問題,以下是一些常見的措施。
1.詳細的日志
2.定位出錯時截圖
3.Pytest的緩存機制(可以記錄成功了哪些失敗了哪些)
4.自動重試機制(如pytest-rerunfailures)
5.用例錄像
用例錄像是最直觀的一種方式,可以查看到實時的操作情況。很多云平臺如Saucelabs等都提供了用例錄像的功能。
然而很遺憾selenium本身沒有這種能力。除了借助三方軟件如ffmpeg同步錄屏外,另外一種實現方法是另外啟動一個線程,不斷截圖,最后將圖片拼接成git。
操作方法如下。
實時截圖
1.編寫一個循環截圖函數shot
def shot(dr):
? ? i = 0
? ? while True:
? ? ? ? img_file = os.path.join(img_dir, f'{i}.png')
? ? ? ? try:
? ? ? ? ? ? dr.save_screenshot(img_file)
? ? ? ? except:
? ? ? ? ? ? return
? ? ? ? i += 1
由于webdriver接口執行截圖命令的速度限制,每一輪截圖無需再sleep。
2.操作web時,啟動一個線程
img_dir = 'img' ?# 臨時圖片目錄
dr = webdriver.Chrome()
t = threading.Thread(target=shot, args=(dr, img_dir)) ?# 新建線程
t.start() ?# 啟動截圖線程
dr.get('https://www.baidu.com')
dr.find_element('id', 'kw').send_keys('簡書 韓志超')
dr.find_element('id', 'su').click()
time.sleep(1)
dr.get('https://www.qq.com')
dr.back()
time.sleep(2)
dr.quit()
3.圖片拼接成gif
需要安裝pillow: pip install pillow
img_list = os.listdir(img_dir) ?# 列出目錄所有圖片
img_list.sort(key=lambda x: int(x[:-4])) ?# 排序
first_img = Image.open(os.path.join(img_dir, img_list[0])) ?# 第一張圖片對象
else_imgs = [Image.open(os.path.join(img_dir, img)) for img in img_list[1:]] ?# 剩余圖片對象
first_img.save("record.gif", append_images=else_imgs,
? ? ? ? ? ? ? ?duration=300,
? ? ? ? ? ? ? ?save_all=True) # 拼接保存
?? ??? ??? ? ??
完整代碼
from selenium import webdriver
import threading
import os
import time
from PIL import Image
def clear_dir(path):
? ? """創建或清空目錄"""
? ? if not os.path.isdir(path):
? ? ? ? os.mkdir(path) ?# 創建目錄
? ? else: ?# 清空目錄
? ? ? ? [os.remove(os.path.join(path, file_name)) for file_name in os.listdir(path)]
def shot(dr, img_dir):
? ? """循環截圖函數"""
? ? i = 0
? ? clear_dir(img_dir) ?# 清空目錄
? ? while True:
? ? ? ? img_file = os.path.join(img_dir, f'{i}.png')
? ? ? ? try:
? ? ? ? ? ? dr.save_screenshot(img_file)
? ? ? ? except:
? ? ? ? ? ? return
? ? ? ? i += 1
# Selenium操作
img_dir = 'img' ?# 臨時圖片目錄
dr = webdriver.Chrome()
t = threading.Thread(target=shot, args=(dr, img_dir)) ?# 新建線程
t.start() ?# 啟動截圖線程
dr.get('https://www.baidu.com')
dr.find_element('id', 'kw').send_keys('簡書 韓志超')
dr.find_element('id', 'su').click()
time.sleep(1)
dr.get('https://www.qq.com')
dr.back()
time.sleep(2)
dr.quit()
# 圖片拼接成gif
img_list = os.listdir(img_dir) ?# 列出目錄所有圖片
img_list.sort(key=lambda x: int(x[:-4])) ?# 排序
first_img = Image.open(os.path.join(img_dir, img_list[0])) ?# 第一張圖片對象
else_imgs = [Image.open(os.path.join(img_dir, img)) for img in img_list[1:]] ?# 剩余圖片對象
first_img.save("record.gif", append_images=else_imgs,
? ? ? ? ? ? ? ?duration=300, ?# 每張圖片的過過渡時間
? ? ? ? ? ? ? ?save_all=True) # 拼接保存,如果想要循環播放可以加上loop=0
?