一分钟教你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


相关文章
|
9天前
|
IDE Android开发 iOS开发
探索Android与iOS开发的差异:平台选择对项目成功的影响
【9月更文挑战第27天】在移动应用开发的世界中,Android和iOS是两个主要的操作系统平台。每个系统都有其独特的开发环境、工具和用户群体。本文将深入探讨这两个平台的关键差异点,并分析这些差异如何影响应用的性能、用户体验和最终的市场表现。通过对比分析,我们将揭示选择正确的开发平台对于确保项目成功的重要作用。
|
1天前
|
安全 Android开发 数据安全/隐私保护
探索安卓与iOS的安全性对比:哪个更适合企业环境?
在数字化时代,移动设备已成为企业日常运营不可或缺的一部分。选择合适的操作系统对于保障企业数据安全至关重要。本文深入分析了Android和iOS两大主流操作系统的安全性,从系统架构、安全功能、应用生态及更新频率四个维度进行全面比较,旨在为企业提供一个清晰的决策依据,帮助企业在Android的开放性与iOS的封闭性之间找到最适合自身需求的平衡点。
13 6
|
6天前
|
开发框架 移动开发 Android开发
安卓与iOS开发中的跨平台解决方案:Flutter入门
【9月更文挑战第30天】在移动应用开发的广阔舞台上,安卓和iOS两大操作系统各自占据半壁江山。开发者们常常面临着选择:是专注于单一平台深耕细作,还是寻找一种能够横跨两大系统的开发方案?Flutter,作为一种新兴的跨平台UI工具包,正以其现代、响应式的特点赢得开发者的青睐。本文将带你一探究竟,从Flutter的基础概念到实战应用,深入浅出地介绍这一技术的魅力所在。
24 7
|
9天前
|
开发框架 前端开发 Android开发
安卓与iOS开发中的跨平台解决方案
【9月更文挑战第27天】在移动应用开发的广阔天地中,安卓和iOS两大操作系统如同双子星座般耀眼。开发者们在这两大平台上追逐着创新的梦想,却也面临着选择的难题。如何在保持高效的同时,实现跨平台的开发?本文将带你探索跨平台开发的魅力所在,揭示其背后的技术原理,并通过实际案例展示其应用场景。无论你是安卓的忠实拥趸,还是iOS的狂热粉丝,这篇文章都将为你打开一扇通往跨平台开发新世界的大门。
|
3天前
|
开发工具 Android开发 iOS开发
移动应用开发的艺术:探索Android与iOS的操作系统特性
【9月更文挑战第33天】在数字时代的浪潮中,移动应用已成为我们日常生活不可或缺的一部分。本文将深入探讨两个主流移动操作系统——Android和iOS——的独特特性,并分析它们如何影响移动应用的开发过程。我们将通过比较这两个系统的设计哲学、用户界面(UI)设计、开发工具以及市场策略,来揭示开发者如何在这些不同的平台上打造出色的用户体验。无论你是开发者还是对移动技术感兴趣的读者,这篇文章都将为你提供宝贵的见解。
|
10天前
|
开发工具 Android开发 iOS开发
安卓与iOS开发环境对比:选择适合你的平台
【9月更文挑战第26天】在移动应用开发的广阔天地中,安卓和iOS是两大巨头。它们各自拥有独特的优势和挑战,影响着开发者的选择和决策。本文将深入探讨这两个平台的开发环境,帮助你理解它们的核心差异,并指导你根据个人或项目需求做出明智的选择。无论你是初学者还是资深开发者,了解这些平台的异同都至关重要。让我们一起探索,找到最适合你的那片开发天地。
|
10天前
|
搜索推荐 Android开发 数据安全/隐私保护
探索安卓与iOS的未来发展
本文旨在探讨移动操作系统领域的两大巨头——安卓和iOS的未来发展。通过对技术革新、用户体验优化以及市场竞争格局的综合分析,揭示两者在各自生态系统中的创新路径与潜在挑战。
22 0
|
1月前
|
运维 Ubuntu Devops
自动化运维工具的魅力:Ansible入门
【9月更文挑战第5天】在快速变化的IT世界里,自动化运维不再是可选项,而是必需品。Ansible,一款简单却强大的自动化工具,正成为众多DevOps工程师的首选。本文将带你了解Ansible的基本概念、安装步骤以及如何编写简单的Playbook,从而开启你的自动化之旅。
68 36
|
7天前
|
机器学习/深度学习 运维 Cloud Native
构建高效运维体系:从自动化到智能化的演进之路
在当今数字化时代,运维作为信息技术的重要支柱,其效率与创新能力直接关系到企业信息系统的稳定性和业务连续性。本文将探讨如何通过技术手段,实现运维从传统手工操作向自动化、智能化的转变,进而构建一个高效、可靠的运维体系。我们将从自动化工具的应用开始,逐步深入到智能运维的实践,最终展望云原生架构下的运维未来趋势。
|
11天前
|
机器学习/深度学习 人工智能 运维
构建高效运维体系:从自动化到智能化的演进之路
在当今数字化时代,运维作为保障企业IT系统稳定运行的关键环节,正经历着前所未有的变革。本文将探讨如何通过实施自动化和引入智能化技术,构建一个更加高效、可靠的运维体系,以应对日益复杂的业务需求和技术挑战。
24 1
下一篇
无影云桌面