【转】Appium 中截取 element 图片作为对比,判断对比结果

其实在https://github.com/gb112211/Adb-For-Test 里面有一个截取element进行对比的方法,但是在使用appium时是无法使用的,因为其用到了uiautomator命令。。。

在appium中截取界面某个element,也就是截取屏幕的部分区域进行对比,在以图片对比结果作为判断依据的时候还是有用的,直接上代码:
extend.py

 

#!/usr/bin/env python  
#coding=utf-8  
  
import os  
import platform  
import tempfile  
import shutil  
  
from PIL import Image  
  
PATH = lambda p: os.path.abspath(p)  
TEMP_FILE = PATH(tempfile.gettempdir() + "/temp_screen.png")  
  
class Appium_Extend(object):  
    def __init__(self, driver):  
        self.driver = driver  
  
    def get_screenshot_by_element(self, element):  
        #先截取整个屏幕,存储至系统临时目录下  
        self.driver.get_screenshot_as_file(TEMP_FILE)  
  
        #获取元素bounds  
        location = element.location  
        size = element.size  
        box = (location["x"], location["y"], location["x"] + size["width"], location["y"] + size["height"])  
  
        #截取图片  
        image = Image.open(TEMP_FILE)  
        newImage = image.crop(box)  
        newImage.save(TEMP_FILE)  
  
        return self  
  
    def get_screenshot_by_custom_size(self, start_x, start_y, end_x, end_y):  
        #自定义截取范围  
        self.driver.get_screenshot_as_file(TEMP_FILE)  
        box = (start_x, start_y, end_x, end_y)  
  
        image = Image.open(TEMP_FILE)  
        newImage = image.crop(box)  
        newImage.save(TEMP_FILE)  
  
        return self  
  
    def write_to_file( self, dirPath, imageName, form = "png"):  
        #将截屏文件复制到指定目录下  
        if not os.path.isdir(dirPath):  
            os.makedirs(dirPath)  
        shutil.copyfile(TEMP_FILE, PATH(dirPath + "/" + imageName + "." + form))  
  
    def load_image(self, image_path):  
        #加载目标图片供对比用  
        if os.path.isfile(image_path):  
            load = Image.open(image_path)  
            return load  
        else:  
            raise Exception("%s is not exist" %image_path)  
  
    #http://testerhome.com/topics/202  
    def same_as(self, load_image, percent):  
        #对比图片,percent值设为0,则100%相似时返回True,设置的值越大,相差越大  
        import math  
        import operator  
  
        image1 = Image.open(TEMP_FILE)  
        image2 = load_image  
  
        histogram1 = image1.histogram()  
        histogram2 = image2.histogram()  
  
        differ = math.sqrt(reduce(operator.add, list(map(lambda a,b: (a-b)**2, \  
                                                         histogram1, histogram2)))/len(histogram1))  
        if differ <= percent:  
            return True  
        else:  
            return False  

接着跑了个appium脚本简单测试了下:
extend_test.py

#coding=utf-8  
  
import unittest  
import os  
  
from extend import Appium_Extend  
from appium import webdriver  
  
class Test(unittest.TestCase):  
    #初始化环境  
    def setUp(self):  
        desired_caps = {}  
        desired_caps["platformName"] = "Android"  
        desired_caps["platformVersion"] = "4.3"  
        desired_caps["deviceName"] = "788a6ab5"  
        desired_caps["appPackage"] = "com.android.settings"  
        desired_caps["appActivity"] = ".Settings"  
  
        self.driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", desired_caps)  
  
        self.extend = Appium_Extend(self.driver)  
  
        #回到主屏幕  
        self.driver.press_keycode(3)  
  
    #退出测试  
    def tearDown(self):  
        self.driver.quit()  
  
    def test_get_screen_by_element(self):  
        element = self.driver.find_element_by_id("com.android.deskclock:id/imageview")  
  
        self.extend.get_screenshot_by_element(element).write_to_file("f:\\screen", "image")  
        self.assertTrue(os.path.isfile("f:\\screen\\image.png"))  
  
    def test_same_as(self):  
        element = self.driver.find_element_by_id("com.android.deskclock:id/imageview")  
  
        load = self.extend.load_image("f:\\screen\\image.png")  
        #要求百分百相似  
        result = self.extend.get_screenshot_by_element(element).same_as(load, 0)  
        self.assertTrue(result)  
  
if __name__ == "__main__":  
    suite = unittest.TestSuite()  
    suite.addTest(Test("test_get_screen_by_element"))  
    suite.addTest(Test("test_same_as"))  
    #执行测试  
    unittest.TextTestRunner().run(suite)  

这里截取的图片是下面这张图中的时间插件:

截取后的图片:

另外批量截图、批量对比就针对需求再做扩展了!

转载于:https://www.cnblogs.com/Test-xiaobai/p/9057278.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Appium概述    appium 是一个自动化测试开源工具,支持 iOS, Android, Windows, Firefox OS平台上的原生应用, 纯web应用和混合应用。“移动原生应用”是指那些用iOS或者 Android SDK 写的应用(Application简称app)。“移动web应用”是指使用移动浏览器访问的应用(appium支持iOS上的Safari和Android上的 Chrome)。“混合应用”是指原生代码封装网页视图——原生代码和 web 内容交互。比如,像 Phonegap,可以帮助研发者使用网页技术开发应用,然    后用原生代码封装,这些就是混合应用。     更重要的是,appium是一个跨平台的工具:它允许测试人员在不同的平台(iOS,Android)使用同一套API来写自动化测试脚本,这样大大增加了iOS 和Android测试套件间代码的复用性。学习Tips    本系列课程所涵盖的内容,包括所有Appium APIs相关的讲解都是基于java语言,当然不需要测试学习者精通java语言,只需要稍微有些java基础就能轻松学习,比如,基本数据类型,循环控制结构,分支控制结构,java面向对象的概念等;    本系列课程的脚本案例编写是基于TestNG测试框架,测试项目使用Maven构建,课程内容会对这些相关的基础知识点做简单介绍,没有基础的同学无需担心,为了尽可能得降低课程的学习难度,其他相关的工具用法只做简单介绍(够用为主)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值