初识 iOS 自动化测试框架 WebDriverAgent

  🔥 交流讨论:欢迎加入我们一起学习!

🔥 资源分享耗时200+小时精选的「软件测试」资料包

🔥 教程推荐:火遍全网的《软件测试》教程  

📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!

微信跳一跳最近很火,外挂代练什么的也越来越多。作为一只程序猿,对外挂的原理产生了强烈的好奇心,于是埋头研究了一阶段,注意到了 WebDriverAgent 这套 Facebook 出品的自动化测试框架。

为了让大家产生兴趣,先从跳一跳外挂的实现说起。

准备工作

安装 homebrew

homebrew 是 Mac OS 下最优秀的包管理工具,没有之一。

xcode-select --install
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

安装 python(本例中的外挂程序使用 python3)

脚本语言 python 用来编写模拟的用户操作。

brew install python3

安装 libimobiledevice

libimobiledevice 是一个使用原生协议与苹果iOS设备进行通信的库。通过这个库我们的 Mac OS 能够轻松获得 iOS 设备的信息。

brew install --HEAD libimobiledevice

使用方法:

# 查看 iOS 设备日志
idevicesyslog

# 查看链接设备的UDID
idevice_id --list

# 查看设备信息
ideviceinfo

# 获取设备时间
idevicedate

# 获取设备名称
idevicename

# 端口转发
iproxy XXXX YYYY

# 屏幕截图
idevicescreenshot

安装 Carthage

Carthage 是一款iOS项目依赖管理工具,与 Cocoapods 有着相似的功能,可以帮助你方便的管理三方依赖。它会把三方依赖编译成 framework,以 framework 的形式将三方依赖加入到项目中进行使用和管理。

WebDriverAgent 本身使用了 Carthage 管理项目依赖,因此需要提前安装 Carthage。

brew install carthage

安装 WebDriverAgent

WebDriverAgent 是 Facebook 推出的一款 iOS 移动测试框架,能够支持模拟器以及真机。

WebDriverAgent 在 iOS 端实现了一个 WebDriver server ,借助这个 server 我们可以远程控制 iOS 设备。你可以启动、杀死应用,点击、滚动视图,或者确定页面展示是否正确。

从 github 克隆 WebDriverAgent 的源码。

git clone https://github.com/facebook/WebDriverAgent.git

运行初始化脚本,确保之前已经安装过 Carthage。

cd WebDriverAgent
./Scripts/bootstrap.sh

脚本完成后可以打开工程文件,根据自己的开发者证书对 bundleid、证书等信息做下配置。

运行 WebDriverAgent

运行 WebDriverAgent 相当于在你的目标设备启动了一个服务器,它接收来自 WDA 客户端(一般是你的电脑)的脚本请求并执行,实现启动、杀死应用,点击、滚动视图等操作。

运行 WebDriverAgent 有两种方式,一种是打开 Xcode 运行,一种是使用脚本运行。

打开 Xcode 运行

菜单栏选择目标设备:

选择目标设备

Scheme 选择 WebDriverAgentRunner:

选择 WebDriverAgentRunner

最后运行 Product -> Test:

运行Product -> Test

一切正常的话,手机/模拟器上会出现一个无图标的 WebDriverAgent 应用,启动之后,马上又返回到桌面。这很正常不要奇怪。

此时控制台界面可以看到设备的 IP 地址:

设备的 IP 地址

通过上面给出的 IP地址 和端口,加上/status合成一个url地址。例如 http://192.168.1.104:8100/status,然后浏览器打开。如果出现一串 JSON 输出,说明 WDA 安装成功了。

此时打开 http://192.168.1.104:8100/inspector,可以看到一个酷炫的界面。左边屏幕图像,右边具体的元素信息,用来查看界面都 UI 图层,方便写测试脚本用。

Inspector

脚本运行(推荐)

# 解锁keychain,以便可以正常的签名应用,
PASSWORD="YourPassword"
security unlock-keychain -p $PASSWORD ~/Library/Keychains/login.keychain

# 获取设备的UDID,用到了之前的 libimobiledevice
UDID=$(idevice_id -l | head -n1)

# 真机运行测试
xcodebuild -project WebDriverAgent.xcodeproj -scheme WebDriverAgentRunner -destination "id=$UDID" test

# 模拟器运行测试
#xcodebuild -project WebDriverAgent.xcodeproj -scheme WebDriverAgentRunner -destination "platform=iOS Simulator,name=iPhone X" test

脚本运行完成后,同样手机/模拟器上会出现一个无图标的 WebDriverAgent 应用,启动之后,马上又返回到桌面。此时终端会输出 IP 地址和端口。

端口转发

有些国产的iPhone机器通过手机的IP和端口还不能访问,此时需要将手机的端口转发到Mac上。需要用到之前安装的 libimobiledevice 这个库。

# 把当前连接的 iOS 设备端口转发到 MacOS 的端口
iproxy 8100 8100

完成后可以直接使用 http://localhost:8100/status 查看是否返回 JSON。inspector 也可以使用 http://localhost:8100/inspector 访问。

安装 WDA 客户端

上面我们在 iOS 设备上启动了 WDA 的服务端。为了运行 Mac OS 上的脚本,我们需要在 Mac OS 上安装 WDA 客户端。

facebook-wda 就是 WDA 的 Python 客户端库,通过直接构造HTTP请求直接跟WebDriverAgent通信。

安装 WDA python 客户端,可以上官网下载安装,但推荐使用pip安装。

# 安装 WDA python 客户端,微信跳一跳是 python3 编写,因此使用 pip3 安装
pip3 install --pre facebook-wda

运行客户端外挂脚本

WDA python 客户端安装完毕后,就剩脚本代码了。不要急,github 上有现成的外挂程序代码。

# 克隆代码
git clone https://github.com/wangshub/wechat_jump_game.git

安装外挂脚本需要的依赖:

pip install -r requirements.txt

config 目录下有许多配置文件,里面是程序运行时,与手机截图像素相关的一些全局参数,脚本作者很贴心的把所有适配的手机像素的配置参数都配好了,我们只需要找到我们手机对应的json配置文件,复制到脚本工程的根目录下的并且命名为 config.json 文件就可以了。

打开微信跳一跳小程序,点击“开始游戏”。

执行脚本:

python3 wechat_jump_auto_iOS.py

好了,现在坐等高分就可以了。

自动跳跃

感兴趣的同学可以自己翻看一下源码,基本原理是利用截图分析距离然后算出点击时长。

下一次运行

以后每次需要运行的时候,只需要按顺序运行下列命令即可。一共要打开三个终端。

1.在iOS设备上启动 WDA 服务器,推荐直接写在一个 shell 文件里。

# 解锁keychain,以便可以正常的签名应用,
PASSWORD="YourPassword"
security unlock-keychain -p $PASSWORD ~/Library/Keychains/login.keychain

# 获取设备的UDID,用到了之前的 libimobiledevice
UDID=$(idevice_id -l | head -n1)

# 真机运行测试
xcodebuild -project WebDriverAgent.xcodeproj -scheme WebDriverAgentRunner -destination "id=$UDID" test

# 模拟器运行测试
#xcodebuild -project WebDriverAgent.xcodeproj -scheme WebDriverAgentRunner -destination "platform=iOS Simulator,name=iPhone X" test

2.配置手机端口转发。

iproxy 8100 8100

3.运行 WDA 客户端脚本

python3 wechat_jump_auto_iOS.py

以上步骤同样适用于任何自动化测试步骤,唯一不同的地方在于将上面的微信客户端外挂脚本改为自己写的测试脚本。

WebDriverAgent 原理

WebDriverAgent 原理

图左侧为 PC 端,右侧为 iOS 端。PC 端(MacOS)运行 WebDriverAgent 工程,令 iOS 端启动 WDA 的 App, 这个 App 实现了一个 WebDriver server。然后 PC 端(可以不是运行 WDA 工程的那台 PC)作为客户端运行测试用例脚本并以 http 协议向 iOS 端的 WDA App 发起请求。最后 iOS 端的 WDA App 接受请求并且启动被测 App 执行测试用例。

需要注意的是,整个过程的服务端和客户端与我们平常理解的完全相反。这里 iOS 端是作为服务端,而运行测试脚本的 PC 端反而是发起请求的客户端。

自动化测试开发

原理理解清楚了,那就让我们开始写一些自动化测试的相关代码吧。

设备连接和弹窗处理

App 可能弹出一些弹框,比如通知、相机的权限请求,或者是 App 给用户的某些提示,总体上来讲,这些弹框的出现无法预估。因此需要对于弹框进行统一处理。

# -*- coding: utf-8 -*-
import wda
import time

bundle_id = 'your_app_bundle_id_here'

c = wda.Client('http://localhost:8100')

s = c.session(bundle_id)

def alert_callback(session):
    btns = set([u'不再提醒', 'OK', u'知道了', 'Allow', u'允许']).intersection(session.alert.buttons())
    if len(btns) == 0:
        raise RuntimeError("Alert can not handled, buttons: " + ', '.join(session.alert.buttons()))
    session.alert.click(list(btns)[0])
s.set_alert_callback(alert_callback)

控件定位

如何模仿用户操作,点击一个按钮呢?还记得之前介绍的 inspector 么?通过访问 http://localhost:8100/inspector 可以获取应用的UI图层结构,方便我们定位控件,写测试脚本模拟用户点击。

定位控件

# 点击酒店按钮
s(name=u'酒店').tap()

断言

自动化测试最重要的就是断言。断言虽然不能像人工判断预期结果那样准确,但合理灵活地运用,对于重要节点加上断言也是具有一定判断预期的效果的。

加入断言后的一个较完整的测试用例:

def test_index(s):
    # 首页广告停顿几秒
    time.sleep(3)

    # 点击酒店项目
    s(name=u'酒店').tap()
    assert s(name=u'搜索', type='Button').wait(3.0)

    # 返回按钮
    s.tap(20,55)

test_index(s)

写在最后

WebDriverAgent 本身功能非常完善,能做自动化测试,能写 App/小程序 外挂,本文只是引了个路,小试牛刀,抛砖引玉,具体如何去使用它,需要大家自己深入挖掘。

最后我邀请你进入我们的【软件测试学习交流群:785128166】, 大家可以一起探讨交流软件测试,共同学习软件测试技术、面试等软件测试方方面面,还会有免费直播课,收获更多测试技巧,我们一起进阶Python自动化测试/测试开发,走向高薪之路

作为一个软件测试的过来人,我想尽自己最大的努力,帮助每一个伙伴都能顺利找到工作。所以我整理了下面这份资源,现在免费分享给大家,有需要的小伙伴可以关注【公众号:程序员二黑】自提!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/402701.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

软件测试面试喜欢问的linux文件操作命令总结

1切换目录 我们切换目录的命令是cd 但是在切换的时候,可以用两种形式,一种是绝对目录的形式切换,一种是相对目录的形式切换。 绝对路径:以 / 开头,或者 ~ 开头,分别表示根路径或者root路径。表示从根目录…

学习 python的第四天,顺便分享两首歌:we don‘ talk anymore,You ‘re Still The One

诸君晚上好,现在是🌃晚上,今天是学习python的第四个学习日,不知不觉学了四天了,还是那句话:不积跬步无以至千里、不积小流无以成江海! 暂时回顾下前面的学习日吧: 第一个学习日----…

C++入门04 函数的参数传递、引用类型与重载

图源:文心一言 听课笔记简单整理,供小伙伴们参考,包含以下内容“🐋3.11 引用类型、🐋3.14 内联函数、🐋3.15 默认参数值、🐋3.16 函数重载、🐋3.17 C系统函数”~🥝&…

Sora的第一波受害者出现了。

不知道大家最近除了被Sora刷屏之外,有没有被这张图刷屏 我只能说网友太强大了 说实话,我进入舟老师的直播间,每次都是还有3分钟下播,还有6单就拍完 但是10分钟后还在激情逼单,6单之后还有6单 也许在营销学上&#x…

Vitis HLS 仿真 C++ 工具代码分享

1 自媒体账号 目前运营的自媒体账号如下: 哔哩哔哩 【雪天鱼】: 雪天鱼个人主页-bilibili.com微信公众号 【雪天鱼】 CSDN 【雪天鱼】: 雪天鱼-CSDN博客 菜鸡一枚,记录下自己的学习过程,可能后续有更新,也可能没有更新&#xff…

C# cass10 面积计算

运行环境Visual Studio 2022 c# cad2016 cass10 通过面积计算得到扩展数据,宗地面积 ,房屋占地面积,房屋使用面积 一、主要步骤 获取当前AutoCAD应用中的活动文档、数据库和编辑器对象。创建一个选择过滤器,限制用户只能选择&q…

Commonjs 和 Es Module详解

一 前言 今天我们来深度分析一下 Commonjs 和 Es Module,希望通过本文的学习,能够让大家彻底明白 Commonjs 和 Es Module 原理,能够一次性搞定面试中遇到的大部分有关 Commonjs 和 Es Module 的问题。 带上疑问开始今天的分析: …

贷齐乐系统最新版SQL注入(无需登录绕过WAF可union select跨表查询)

一、环境 已上传资源(daiqile) 二、代码解释 1.1Request 不管get请求还是post请求都可以接收到 1.2过滤的还挺多 1.3第二个WAF把数据分为两个了一个Key一个value,全是explode的功劳 1.4submit是if进入的前提 很明显走进来了 1.5那我们在这…

springboot206基于SpringBoot的农商对接系统的设计与实现

基于Spring Boot的农商对接系统的设计与实现 Design and implementation of agricultural business docking system based on Spring Boot 摘 要 如今社会上各行各业,都喜欢用自己行业的专属软件工作,互联网发展到这个时候,人们已经发现离…

day05-进程通信

1> 将互斥机制的代码实现重新敲一遍 代码&#xff1a; #include<myhead.h>int num520;//临界资源//1.创建互斥锁 pthread_mutex_t fastmutex;//定义任务函数 void *task1(void *arg){printf("1111111\n");//3.临界区上面获取锁资源&#xff08;上锁&#…

开发个IDEA插件

开发IDEA一个插件&#xff0c;但是这个插件的功能是个大杂烩吧&#xff0c; 主要完成以下几个功能&#xff0c;方便组内开发人员提高效率。 1 网关会传过来登录人员的 一些核心字段&#xff0c;公司编码/用户编号/主岗。 因为存在多租户&#xff0c;所以经常要切换任务&…

【ACM出版】第五届计算机信息和大数据应用国际学术会议(CIBDA 2024)

第五届计算机信息和大数据应用国际学术会议&#xff08;CIBDA 2024&#xff09; 2024 5th International Conference on Computer Information and Big Data Applications 重要信息 大会官网&#xff1a;www.ic-cibda.org 大会时间&#xff1a;2024年3月22-24日 大会地点&#…

LeetCode 0106.从中序与后序遍历序列构造二叉树:分治(递归)——五彩斑斓的题解(若不是彩色的可以点击原文链接查看)

【LetMeFly】106.从中序与后序遍历序列构造二叉树&#xff1a;分治&#xff08;递归&#xff09;——五彩斑斓的题解&#xff08;若不是彩色的可以点击原文链接查看&#xff09; 力扣题目链接&#xff1a;https://leetcode.cn/problems/construct-binary-tree-from-inorder-an…

开发Chrome插件,background.js中log打印未出现在控制台

不同于内容脚本&#xff08;通常命名content.js&#xff09;&#xff0c;在后台脚本&#xff08;通常命名background.js或service-worker.js&#xff09;中console.log并不会在控制台中直接显示。 要查看后台脚本上下文的正确控制台&#xff0c;执行如下步骤&#xff1a; 访问…

leetcode hot100单词拆分

在本题中&#xff0c;我们是要把一个字符串&#xff0c;判断是否能用给的字符串数组中的单词进行拆分&#xff0c;如果可以则返回true&#xff0c;不能的话则返回false。这个题一开始看无法与背包问题联系在一起。但仔细考虑&#xff0c;就是用物品&#xff08;给的字符串数组中…

在Mac上搭建MongoDB环境

最近工作中需要装MongoDB环境&#xff0c;搭建过程中遇到了一些问题&#xff0c;在这里记录一下安装MongoDB环境的方法以及问题的解决方法。有两种安装MongoDB的方法&#xff1a;brew安装和手动安装。 目录 使用Homebrew安装MongoDB 手动安装MongoDB&#xff08;不使用Homebr…

WordPres Bricks Builder 前台RCE漏洞复现(CVE-2024-25600)

0x01 产品简介 Bricks Builder是一款用于WordPress的开发主题,提供直观的拖放界面,用于设计和构建WordPress网站。它使用户能够轻松创建自定义的网页布局和设计,无需编写或了解复杂的代码。Bricks Builder具有用户友好的界面和强大的功能,使用户可以通过简单的拖放操作添加…

Vue图片浏览组件v-viewer,支持旋转、缩放、翻转等操作

Vue图片浏览组件v-viewer&#xff0c;支持旋转、缩放、翻转等操作 之前用过viewer.js&#xff0c;算是市场上用过最全面的图片预览。v-viewer&#xff0c;是基于viewer.js的一个图片浏览的Vue组件&#xff0c;支持旋转、缩放、翻转等操作。 基本使用 安装&#xff1a;npm安装…

浅谈TCP协议的可靠含义和三次握手

这里不过多阐述计算机网络的体系结构&#xff0c;本文主要是想阐述三次握手和可靠连接之间的联系。TCP协议全称传输控制协议&#xff08;Transmission Cotrol Protocol&#xff09;。 1、TCP协议运行在哪一层 TCP运行在运输层。 2、TCP协议的可靠是什么意思 步入主题&…

MLflow【部署 01】MLflow官网Quick Start实操(一篇学会部署使用MLflow)

一篇学会部署使用MLflow 1.版本及环境2.官方步骤Step-1 Get MLflowStep-2 Start a Tracking ServerStep 3 - Train a model and prepare metadata for loggingStep 4 - Log the model and its metadata to MLflowStep 5 - Load the model as a Python Function (pyfunc) and us…