python+appium自動化測試-openCV判斷圖片的相似度

該網(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

安裝成功后分別如下圖顯示:

image.png
image.png
image.png

二、安裝scikit-image環(huán)境

cmd輸入:pip install scikit-image

安裝成功后如下圖顯示:

image.png

三幅疼、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ù)而保存失敗的問題

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末计盒,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子芽丹,更是在濱河造成了極大的恐慌北启,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拔第,死亡現(xiàn)場離奇詭異咕村,居然都是意外死亡,警方通過查閱死者的電腦和手機蚊俺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門懈涛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人泳猬,你說我怎么就攤上這事批钠。” “怎么了得封?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵埋心,是天一觀的道長。 經(jīng)常有香客問我忙上,道長拷呆,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮茬斧,結(jié)果婚禮上腰懂,老公的妹妹穿的比我還像新娘。我一直安慰自己项秉,他們只是感情好绣溜,可當(dāng)我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著伙狐,像睡著了一般涮毫。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上贷屎,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天,我揣著相機與錄音艘虎,去河邊找鬼唉侄。 笑死,一個胖子當(dāng)著我的面吹牛野建,可吹牛的內(nèi)容都是我干的属划。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼候生,長吁一口氣:“原來是場噩夢啊……” “哼同眯!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起唯鸭,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤须蜗,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后目溉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體明肮,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年缭付,在試婚紗的時候發(fā)現(xiàn)自己被綠了柿估。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡陷猫,死狀恐怖秫舌,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情绣檬,我是刑警寧澤足陨,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站河咽,受9級特大地震影響钠右,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜忘蟹,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一飒房、第九天 我趴在偏房一處隱蔽的房頂上張望搁凸。 院中可真熱鬧,春花似錦狠毯、人聲如沸护糖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽嫡良。三九已至,卻和暖如春献酗,著一層夾襖步出監(jiān)牢的瞬間寝受,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工罕偎, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留很澄,地道東北人。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓颜及,卻偏偏與公主長得像甩苛,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子俏站,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容