該網(wǎng)站上更新文章有延遲陨溅,如需查看關(guān)于python+appium文章妹沙,請前往testhome關(guān)注我哦https://testerhome.com/topics/27802
來自APP Android端自動化測試初學(xué)者的筆記仔蝌,寫的不對的地方大家多多指教哦异希。
現(xiàn)在很多APP都存在賬號設(shè)置,需要設(shè)置并修改頭像唁桩,在自動化測試中,如果要判斷頭像是否修改成功耸棒,可以通過計算修改前后的頭像的相似度荒澡,來判斷頭像是否修改成功,這篇文章的內(nèi)容講的時如何使用openCV計算圖片的相似度与殃。
一单山、安裝openCV環(huán)境:
cmd輸入下列命令
pip install --upgrade setuptools
pip install numpy Matplotlib
pip install opencv-python
安裝成功后分別如下圖顯示:
二、安裝scikit-image環(huán)境
cmd輸入:pip install scikit-image
安裝成功后如下圖顯示:
三幅疼、python計算兩張圖片的相似率
from skimage.metrics import structural_similarity as sk_cpt_ssim
import cv2
def compare_image():
# 傳入圖片路徑米奸,讀取圖片
image_a = cv2.imread(r'path1')
image_b = cv2.imread(r'path1')
# 使用色彩空間轉(zhuǎn)化函數(shù) cv2.cvtColor( )進行色彩空間的轉(zhuǎn)換
gray_a = cv2.cvtColor(image_a, cv2.COLOR_BGR2GRAY)
gray_b = cv2.cvtColor(image_b, cv2.COLOR_BGR2GRAY)
# 計算圖像相似度并圈出不同處
(score, diff) = sk_cpt_ssim(gray_a, gray_b, full=True)
print("SSIM: {}".format(score))
return score
# 測試函數(shù),在運行過程中可以注釋
if __name__ == '__main__':
compare_image()
注意:
1.如果在skimage.metrics庫中導(dǎo)入:from skimage.metrics import compare_ssim包的話爽篷,有些人會出現(xiàn)“Unused import statement 'from skimage.metrics import compare_ssim'”這個問題悴晰,所以將from skimage.metrics import compare_ssim修改為from skimage.metrics import structural_similarity as sk_cpt_ssim,就可以解決該問題逐工。
2.傳入的圖片路徑中不要有中文铡溪;如果圖片和代碼不在同一目錄時,傳入圖片路徑名稱前建議加上‘r'泪喊。
3.使用以上方法棕硫,局限性較大,如果兩張圖片的大小窘俺、擴展名不一樣饲帅,都會報錯。
該方法的局限性較多瘤泪,評論區(qū)有無大神有其它更好的方法
四灶泵、封裝該方法,運用于python+appium自動化測試
場景:用戶修改頭像后对途,通過計算修改前后頭像的相似度赦邻,來判斷是否成功修改頭像
以下均使用微博(V10.12.0版)作為例子,腳本均以PageObject模式編寫
以下內(nèi)容中只涉及到如何計算頭像在修改前后的相似度实檀,其余的BasePage類惶洲、AppStart類均在之前的文章中有寫按声,文章地址為:http://www.reibang.com/p/489146eeb9dd
主要包括以下幾個步驟:
- 修改前定位頭像,將頭像截圖保存到固定的文件夾
- 修改頭像
- 修改后定位頭像恬吕,將頭像截圖保存到固定的文件夾(注意兩張圖片放在同一個文件夾中签则,命名要區(qū)分)
- 調(diào)用計算相似度的函數(shù),計算兩張圖片的相似度铐料,來判斷是否修改頭像
上栗子:
1.file_manager.py——用于截圖保存圖片
# 該類主要用于截圖和保存圖片
import glob
import os
import time
from selenium.webdriver.common.by import By
from page.base_page import BasePage
from common.image_recognition import ImageRecognition
class FileManager(BasePage):
# 我的頁面頭像
_iv_my_page_portrait = (By.ID, "com.sina.weibo:id/ivPortrait")
# 我的賬號頁面用戶頭像
_fl_my_account_portrait = (By.ID, "com.sina.weibo:id/ivPortrait")
# 我的頁面用戶頭像截圖
def get_my_page_portrait(self):
# 截圖將圖片保存至固定的位置
img_folder = 'E:\\\\study\\\\Fork\\\\WeiboDemo\\\\Weibo\\\\image'
# 截圖的文件名組成
name = 'test_my_page_portrait'
screen_save_path = img_folder + name + '.jpg'
self.find_element(self._iv_my_page_portrait).screenshot(screen_save_path)
# 我的賬號頁面用戶頭像截圖
def get_my_account_page_portrait(self):
# 截圖將圖片保存至固定的位置
img_folder = 'E:\\\\study\\\\Fork\\\\WeiboDemo\\\\Weibo\\\\image'
# 截圖的文件名組成
name = 'test_my_account_page_portrait'
screen_save_path = img_folder + name + '.jpg'
self.find_element(self._fl_my_account_portrait).screenshot(screen_save_path)
"""刪除文件中的圖片"""
def delete_all_image(self):
path = 'E:\\\\study\\\\Fork\\\\Weibo_Demo\\\\Weibo\\\\image\\\\'
for infile in glob.glob(os.path.join(path, '*.jpg')):
os.remove(infile)
2.image_manager.py——用于計算圖片的相似度
# 計算修改前后圖片的相似度
from skimage.metrics import structural_similarity as sk_cpt_ssim
import cv2
class ImageManager:
"""判斷修改前后頭像的相似率"""
def compare_image(self):
image_a = cv2.imread(r'E:\\\\study\\\\Fork\\\\WeiboDemo\\\\Weibo\\\\image\\\\test_my_page_portrait.jpg')
image_b = cv2.imread(r'E:\\\\study\\\\Fork\\\\WeiboDemo\\\\Weibo\\\\image\\\\test_my_account_page_portrait.jpg')
gray_a = cv2.cvtColor(image_a, cv2.COLOR_BGR2GRAY)
gray_b = cv2.cvtColor(image_b, cv2.COLOR_BGR2GRAY)
(score, diff) = sk_cpt_ssim(gray_a, gray_b, full=True)
print("SSIM: {}".format(score))
return score
3.homepage.py——提供進入我的頁面操作
# 該類主要提供進入我的頁面操作
class HomePage(BasePage):
# 底部菜單欄“我的”
_btn_my = "http://android.widget.FrameLayout[@content-desc='我']"
def enter_my_page(self):
time.sleep(4)
self.find_xpath(self._btn_my).click()
return MyPage(self.driver)
4.my_page.py——提供進入我的賬號頁面操作
# 該類提供進入我的賬號頁面操作
import time
from selenium.webdriver.common.by import By
from page.base_page import BasePage
from page.my_account_page import MyAccountPage
class MyPage(BasePage):
# 我的頁面頭像
_my_page_portrait = (By.ID, "com.sina.weibo:id/ivPortrait")
def enter_my_account_page(self):
time.sleep(1)
self.find_element(self._my_page_portrait).click()
return MyAccountPage(self.driver)
5.my_account_page.py——我的賬號頁面相關(guān)操作
from selenium.webdriver.common.by import By
from common.file_manager import FileManager
from common.image_manager import ImageManager
from page.base_page import BasePage
class MyAccountPage(BasePage):
# 初始化類
def __init__(self, driver):
super().__init__(driver)
self.img_manager = ImageManager()
self.file_manager = FileManager(driver)
# 頁面返回鍵
_iv_back = (By.ID, "com.sina.weibo:id/img_back")
# 我的賬號頁面用戶頭像
_fl_my_account_portrait = (By.ID, "com.sina.weibo:id/ivPortrait")
def check_portrait(self):
# 獲取我的賬號頁面用戶頭像渐裂,并截圖保存
self.file_manager.get_my_account_page_portrait()
# 返回我的頁面,獲取用戶頭像钠惩,并截圖保存
self.find_element(self._iv_back).click()
self.file_manager.get_my_page_portrait()
# 計算圖片相似度
self.img_manager.compare_image()
# 清除文件中的圖片
self.file_manager.delete_all_image()
6.check_portrait_test.py——執(zhí)行測試用例
# 測試類
from common.init import AppStart
class TestCheckPortrait:
def setup_class(self):
self.my_account_page = AppStart.start().enter_my_page().enter_my_account_page()
def test_check_portrait(self):
self.my_account_page.check_portrait()
def teardown_class(self):
AppStart.quit()
總結(jié):
1.由于初學(xué)柒凉,技術(shù)有限,且當(dāng)前處理的圖片較少篓跛,所以在保存截圖時直接將圖片保存到本地膝捞,圖片保存的位置和名稱直接寫成固定的,調(diào)用比較簡單愧沟。
2.由于圖片名稱固定蔬咬,在重復(fù)執(zhí)行時保存的截圖名稱不變的話會報錯,所以在執(zhí)行完一次后清除文件中擴展名為.jpg的圖片央渣,可以保證在下次的運行過程中不會出現(xiàn)文件名重復(fù)而保存失敗的問題