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

简介: 在移动端自动化测试过程中经常会遇到需要截长图的场景,比如大促活动的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 requestspip 
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次的过程如下:

image.png

最终融合的效果如下:

微信图片_20220519185903.jpg

iOS

滑动3次的过程如下:

微信图片_20220519185908.jpg

最终融合效果如下:

image.png


相关文章
|
2天前
|
安全 Android开发 iOS开发
深入探讨Android与iOS操作系统的差异性
本文旨在通过对比分析Android和iOS两大主流移动操作系统,揭示它们在设计理念、用户体验、安全性、应用生态及系统更新等方面的根本差异。不同于传统的功能列表式摘要,本摘要强调了两大系统背后的哲学思想及其对用户日常使用的实际影响,为读者提供了一个宏观且深入的视角来理解这两种操作系统的独特之处。
|
1天前
|
Android开发 Swift iOS开发
探索安卓与iOS开发的差异和挑战
【10月更文挑战第37天】在移动应用开发的广阔舞台上,安卓和iOS这两大操作系统扮演着主角。它们各自拥有独特的特性、优势以及面临的开发挑战。本文将深入探讨这两个平台在开发过程中的主要差异,从编程语言到用户界面设计,再到市场分布的不同影响,旨在为开发者提供一个全面的视角,帮助他们更好地理解并应对在不同平台上进行应用开发时可能遇到的难题和机遇。
|
1天前
|
存储 安全 数据安全/隐私保护
深入探索Android与iOS的隐私保护机制:一场没有硝烟的较量####
本文深度剖析了Android与iOS两大移动操作系统在用户隐私保护方面的策略与实践,揭示两者在设计理念、技术实现及用户体验上的异同。通过对比分析,旨在为读者提供一个全面而深入的视角,理解两大平台如何在保障用户隐私的同时,实现功能的丰富与便捷。本文不涉及具体产品推荐或品牌偏好,仅从技术角度出发,探讨隐私保护的现状与挑战。 ####
|
1天前
|
前端开发 Android开发 iOS开发
探索Android与iOS的跨平台开发策略
在移动应用开发的多元化时代,跨平台开发已成为开发者追求效率和广泛覆盖的重要手段。本文深入探讨了Android与iOS两大主流平台下的跨平台开发策略,分析了各自的优势与挑战,并通过实际案例展示了如何有效实施跨平台解决方案,以期为开发者提供有价值的参考和启示。
|
8天前
|
安全 搜索推荐 Android开发
深入探索Android与iOS的系统架构差异
【10月更文挑战第29天】 在当今的智能手机市场中,Android和iOS无疑是两大主流操作系统。本文旨在深入探讨这两个系统的架构差异,从底层的操作系统设计到用户界面的呈现,以及它们如何影响了开发者和用户的体验。通过对比分析,我们可以更清晰地理解这两种平台的优势与局限,为开发者在选择开发平台时提供有价值的参考,同时也为用户选择设备提供一定的指导。
24 2
|
6天前
|
移动开发 Java Android开发
探索Android与iOS开发的差异性与互联性
【10月更文挑战第32天】在移动开发的大潮中,Android和iOS两大平台各领风骚。本文将深入浅出地探讨这两个平台的开发差异,并通过实际代码示例,展示如何在各自平台上实现相似的功能。我们将从开发环境、编程语言、用户界面设计、性能优化等多个角度进行对比分析,旨在为开发者提供跨平台开发的实用指南。
26 0
|
9天前
|
安全 Android开发 iOS开发
深入探索iOS与Android系统的差异性及优化策略
在当今数字化时代,移动操作系统的竞争尤为激烈,其中iOS和Android作为市场上的两大巨头,各自拥有庞大的用户基础和独特的技术特点。本文旨在通过对比分析iOS与Android的核心差异,探讨各自的优势与局限,并提出针对性的优化策略,以期为用户提供更优质的使用体验和为开发者提供有价值的参考。
|
1月前
|
机器学习/深度学习 人工智能 运维
构建高效运维体系:从自动化到智能化的演进
本文探讨了如何通过自动化和智能化手段,提升IT运维效率与质量。首先介绍了自动化在简化操作、减少错误中的作用;然后阐述了智能化技术如AI在预测故障、优化资源中的应用;最后讨论了如何构建一个既自动化又智能的运维体系,以实现高效、稳定和安全的IT环境。
61 4
|
1月前
|
运维 Linux Apache
,自动化运维成为现代IT基础设施的关键部分。Puppet是一款强大的自动化运维工具
【10月更文挑战第7天】随着云计算和容器化技术的发展,自动化运维成为现代IT基础设施的关键部分。Puppet是一款强大的自动化运维工具,通过定义资源状态和关系,确保系统始终处于期望配置状态。本文介绍Puppet的基本概念、安装配置及使用示例,帮助读者快速掌握Puppet,实现高效自动化运维。
48 4
|
9天前
|
机器学习/深度学习 数据采集 运维
智能化运维:机器学习在故障预测和自动化响应中的应用
智能化运维:机器学习在故障预测和自动化响应中的应用
28 4