暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

一分钟教你Android、iOS如何实现自动化截长图功能,超实用!

岛哥手记 2021-08-11
1158

阅读本文大约需要1分钟。

点击👆小卡片,回复 “合集” 获取系统性的学习笔记和测试开发技能图谱


背景

在移动端自动化测试过程中经常会遇到需要截长图的场景,比如大促活动的H5页面、动态信息流页面等,但是目前在网上检索只能搜到关于截长图的软件推荐,没有讲关于如何通过自动化脚本的方式实现的文章,今天就来给大家分享一个简单的实现方案。


方案

在实现截长图的自动化方案中,图像融合是一个重要的环节,这里推荐大家一个不错的图像融合服务:vision-ui


服务部署

该服务支持源代码和docker容器两种方式部署,这里我以容器部署方式为例,首先肯定是需要有Docker环境,然后下载远程镜像:

docker pull brighthai/vision-ui:latest

启动容器,如果本地需要处理的图像文件在/User/image(根据实际替换为实际路径)本地使用的服务端口为9092,执行如下命令启动容器:

docker run -it -d --name container_vision -p 9092:9092 -v /User/image:/vision/capture brighthai/vision-ui


Android

先安装依赖:

pip install requests
pip install pillow

我们只需要在设备上获得连续的几张截图,就可以还原页面的实际空间展示,这里我们在页面上截图后向上滑动25%屏幕长度的距离再截图,重复上述步骤后获得几张前后连续的图像,然后调用上面的服务接口完成图像融合具体实现如下:

import os
import time


import requests
from PIL import Image


def get_long_screenshot(times):
image_list = []
server_addr = '/Users/mafei/images'
img = str(int(time.time() * 1000)) + ".png"
os.system('adb shell screencap -p /sdcard/{0}'.format(img))
os.system('adb pull /sdcard/{0}'.format(img))
img_obj = Image.open(img)
width = img_obj.width
height = img_obj.height
# 开始截图,向上滑动25%
for i in range(times):
img_name = str(int(time.time() * 1000)) + ".png"
os.system('adb shell screencap -p /sdcard/{0}'.format(img_name))
os.system('adb pull /sdcard/{0} {1}'.format(img_name, server_addr))


image_list.append(img_name)
x1 = int(width * 0.5)
x2 = int(width * 0.5)
y1 = int(height * 0.5)
y2 = int(height * 0.25)
os.system('adb shell input swipe {0} {1} {2} {3} 900'.format(x1, y1, x2, y2))


image_merged = "image_merge_{0}.png".format(str(int(time.time() * 1000)))
payload = {
"image_list": image_list,
"name": image_merged
}
headers = {
'Content-Type': 'application/json; charset=UTF-8'
}
requests.request("post", url="http://127.0.0.1:9092/vision/merge", timeout=10, json=payload, headers=headers)
image_merged = server_addr + "/" + image_merged


return image_merged




get_long_screenshot(3)


iOS

iOS的自动化方案相比Android稍微有点麻烦,需要先在iOS设备上安装WebDriverAgent,具体如何在iOS真机安装WebDriverAgent,可以参考文章《iOS真机安装WebDriverAgent图文详解》。


这里我们默认大家已经给设备安装好了WDA,并且通过Xcode或者xcodebuild启动了WebDriverAgent,那么接下里只需要再安装一些依赖:

pip install requests
pip install pillow
pip install airtest

实现iOS自动化的方式有很多,这里我们选择Airtest框架来完成UI的驱动,具体代码如下:

import os
import time


import requests
from PIL import Image
from airtest.core.api import swipe, connect_device


def get_ios_long_screenshot(times):
connect_device("ios:///169.254.66.2:8100")
image_list = []
server_addr = '/Users/mafei/images'
# 获取设备长宽
img = str(int(time.time() * 1000)) + ".png"
os.system("tidevice screenshot {0}".format(img))
img_obj = Image.open(img)
width = img_obj.width
height = img_obj.height
# 开始截图,向上滑动25%
for i in range(times):
img_name = str(int(time.time() * 1000)) + ".png"
os.system("tidevice screenshot {0}/{1}".format(server_addr, img_name))
image_list.append(img_name)
x1 = int(width * 0.5)
x2 = int(width * 0.5)
y1 = int(height * 0.5)
y2 = int(height * 0.25)
swipe((x1, y1), (x2, y2))


image_merged = "image_merge_{0}.png".format(str(int(time.time() * 1000)))
payload = {
"image_list": image_list,
"name": image_merged
}
headers = {
'Content-Type': 'application/json; charset=UTF-8'
}
requests.request("post", url="http://127.0.0.1:9092/vision/merge", timeout=10, json=payload, headers=headers)
image_merged = server_addr + "/" + image_merged


return image_merged




get_ios_long_screenshot(3)


效果

Android

滑动3次的过程如下:

最终融合的效果如下:


iOS

滑动3次的过程如下:

最终融合的效果如下:


推荐阅读:

利用Docker快速构建基于devpi的企业级私有PyPI Server

苹果个人付费开发者证书申请及使用图文详解

Android自动化辅助APP保活配置

让Android自动化辅助APP成为设备所有者(一)

让Android自动化辅助应用成为设备所有者(二)

提高Android自动化测试稳定性的方法(一)

提高Android自动化测试稳定性的方法(二)

提高Android自动化测试稳定性的方法(三)


文章转载自岛哥手记,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论