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

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

  1. #!/usr/bin/env python
  2. #coding=utf-8
  3.  
  4. import os
  5. import platform
  6. import tempfile
  7. import shutil
  8.  
  9. from PIL import Image
  10.  
  11. PATH = lambda p: os.path.abspath(p)
  12. TEMP_FILE = PATH(tempfile.gettempdir() + "/temp_screen.png")
  13.  
  14. class Appium_Extend(object):
  15. def __init__(self, driver):
  16. self.driver = driver
  17.  
  18. def get_screenshot_by_element(self, element):
  19. #先截取整个屏幕,存储至系统临时目录下
  20. self.driver.get_screenshot_as_file(TEMP_FILE)
  21.  
  22. #获取元素bounds
  23. location = element.location
  24. size = element.size
  25. box = (location["x"], location["y"], location["x"] + size["width"], location["y"] + size["height"])
  26.  
  27. #截取图片
  28. image = Image.open(TEMP_FILE)
  29. newImage = image.crop(box)
  30. newImage.save(TEMP_FILE)
  31.  
  32. return self
  33.  
  34. def get_screenshot_by_custom_size(self, start_x, start_y, end_x, end_y):
  35. #自定义截取范围
  36. self.driver.get_screenshot_as_file(TEMP_FILE)
  37. box = (start_x, start_y, end_x, end_y)
  38.  
  39. image = Image.open(TEMP_FILE)
  40. newImage = image.crop(box)
  41. newImage.save(TEMP_FILE)
  42.  
  43. return self
  44.  
  45. def write_to_file( self, dirPath, imageName, form = "png"):
  46. #将截屏文件复制到指定目录下
  47. if not os.path.isdir(dirPath):
  48. os.makedirs(dirPath)
  49. shutil.copyfile(TEMP_FILE, PATH(dirPath + "/" + imageName + "." + form))
  50.  
  51. def load_image(self, image_path):
  52. #加载目标图片供对比用
  53. if os.path.isfile(image_path):
  54. load = Image.open(image_path)
  55. return load
  56. else:
  57. raise Exception("%s is not exist" %image_path)
  58.  
  59. #http://testerhome.com/topics/202
  60. def same_as(self, load_image, percent):
  61. #对比图片,percent值设为0,则100%相似时返回True,设置的值越大,相差越大
  62. import math
  63. import operator
  64.  
  65. image1 = Image.open(TEMP_FILE)
  66. image2 = load_image
  67.  
  68. histogram1 = image1.histogram()
  69. histogram2 = image2.histogram()
  70.  
  71. differ = math.sqrt(reduce(operator.add, list(map(lambda a,b: (a-b)**2, \
  72. histogram1, histogram2)))/len(histogram1))
  73. if differ <= percent:
  74. return True
  75. else:
  76. return False

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

  1. #coding=utf-8
  2.  
  3. import unittest
  4. import os
  5.  
  6. from extend import Appium_Extend
  7. from appium import webdriver
  8.  
  9. class Test(unittest.TestCase):
  10. #初始化环境
  11. def setUp(self):
  12. desired_caps = {}
  13. desired_caps["platformName"] = "Android"
  14. desired_caps["platformVersion"] = "4.3"
  15. desired_caps["deviceName"] = "788a6ab5"
  16. desired_caps["appPackage"] = "com.android.settings"
  17. desired_caps["appActivity"] = ".Settings"
  18.  
  19. self.driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", desired_caps)
  20.  
  21. self.extend = Appium_Extend(self.driver)
  22.  
  23. #回到主屏幕
  24. self.driver.press_keycode(3)
  25.  
  26. #退出测试
  27. def tearDown(self):
  28. self.driver.quit()
  29.  
  30. def test_get_screen_by_element(self):
  31. element = self.driver.find_element_by_id("com.android.deskclock:id/imageview")
  32.  
  33. self.extend.get_screenshot_by_element(element).write_to_file("f:\\screen", "image")
  34. self.assertTrue(os.path.isfile("f:\\screen\\image.png"))
  35.  
  36. def test_same_as(self):
  37. element = self.driver.find_element_by_id("com.android.deskclock:id/imageview")
  38.  
  39. load = self.extend.load_image("f:\\screen\\image.png")
  40. #要求百分百相似
  41. result = self.extend.get_screenshot_by_element(element).same_as(load, 0)
  42. self.assertTrue(result)
  43.  
  44. if __name__ == "__main__":
  45. suite = unittest.TestSuite()
  46. suite.addTest(Test("test_get_screen_by_element"))
  47. suite.addTest(Test("test_same_as"))
  48. #执行测试
  49. unittest.TextTestRunner().run(suite)

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

截取后的图片:

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

【转】Appium 中截取 element 图片作为对比,判断对比结果的更多相关文章

  1. C#从大图中截取一部分图片

    #region 从大图中截取一部分图片 /// <summary> /// 从大图中截取一部分图片 /// </summary> /// <param name=&quo ...

  2. pdf文件中截取eps图片并压缩

    最近遇到了一个问题,需要从pdf裁剪出其中部分的矢量图格式的图片,并保存为eps格式,方便使用. 最简单的方法就是先用acrobat pro将pdf进行页面抽取,并裁剪,剩下所需要的图片部分,然后另存 ...

  3. 微信开发中使用微信JSSDK和使用URL.createObjectURL上传预览图片的不同处理对比

    在做微信公众号或者企业微信开发业务应用的时候,我们常常会涉及到图片预览.上传等的处理,往往业务需求不止一张图片,因此相对来说,需要考虑的全面一些,用户还需要对图片进行预览和相应的处理,在开始的时候我使 ...

  4. selenium - 截取页面图片和截取某个元素的图

    1.截取页面图片并保存 在测试过程中,是有必要截图,特别是遇到错误的时候进行截图. # coding:utf-8 from time import sleep from PIL import Imag ...

  5. PHPThumb处理图片,生成缩略图,图片尺寸调整,图片截取,图片加水印,图片旋转

    [强烈推荐]下载地址(github.com/masterexploder/PHPThumb). 注意这个类库有一个重名的叫phpThumb,只是大小写的差别,所以查找文档的时候千万注意. 在网站建设过 ...

  6. 13、在 uwp应用中,给图片添加高斯模糊滤镜效果(一)

    如果在应用中,如果想要给app 添加模糊滤镜,可能第一想到的是第三方类库,比如 Win2d.lumia Imaging SDK .WriteableBitmapEx,不可否认,这些类库功能强大,效果也 ...

  7. C# 截取图片区域,并返回所截取的图片

    /// <summary> /// 截取图片区域,返回所截取的图片 /// </summary> /// <param name="SrcImage" ...

  8. 在Windows 10中截取截图的6种方式 简介

    在Windows 10中截取截图的6种方式 简介 截图对于不同的目的很重要.它可以用于捕获笔记本电脑上的任何内容的截图.所以,如果你使用Windows 10,你可能不知道如何截图,因为它是比较新的.因 ...

  9. C#截取验证码图片

    使用Graphics类中的DrawImage方法,这个方法有30种重载方式,这里只介绍一种,也是我认为最直观的一种,代码如下: using System.Drawing; namespace kq.U ...

随机推荐

  1. [T-ARA][yayaya]

    歌词来源:http://music.163.com/#/song?id=22704449 U look at me Right T-ARA U Ready Let me seeya LaLaLaLa ...

  2. 智能指针shared_ptr新特性shared_from_this及weak_ptr

    enable_shared_from_this是一个模板类,定义于头文件<memory>,其原型为: template< class T > class enable_shar ...

  3. Android 4.4中AudioRecord用例 - 录制系统内置声音

    通过API 19新加的MediaRecorder.AudioSource.REMOTE_SUBMIX參数能够让系统App录制系统内置的声音,也就是扬声器的声音.以下是一个巨简单的样例来演示样例怎样通过 ...

  4. VM下,装centos7系统,配置nginx的问题

    一.流程 1.先安装nginx依赖的包 (1)yum install gcc-c++ (2)yum install -y pcre pcre-devel (3)yum install -y zlib ...

  5. ethers.js-1

    https://docs.ethers.io/ethers.js/html/ What is ethers.js The ethers.js library aims to be a complete ...

  6. Windows与Linux之间的文件自动同步

    问题:在工作中遇到一个场景,需要每天定时将Linux机器上的文件自动同步到Windows机器上. 解决方案有两个: 1.在Windows 机器上设置共享目录,然后在Linux机器上挂载共享 目录,每天 ...

  7. ICC Scenario Definition

    现代先进工艺下的后端设计都是在 MCMM 情况下设计的,所谓 MCMM 就是 muti-corner  muti-mode,用于芯片的不同工作模式和工作条件. 后端设计过程中,需要保证芯片在所有工作模 ...

  8. ejs引擎项目

    关于这个我也很懵逼,写这篇博客就是想记录一下,有哪位大神看到之后可以略微指点一二,不胜感激....... 一.项目结构 db model user.js version.js schema xx.js ...

  9. 743. Network Delay Time

    题目来源: https://leetcode.com/problems/network-delay-time/ 自我感觉难度/真实难度: 题意: 分析: 自己的代码: class Solution: ...

  10. ddt 测试用例UI运用

    import xlrd from selenium import webdriver import ddt import time import unittest class Excel(object ...