热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

iOS模拟器发送通知和UI测试

iOS模拟器发送通知和UI测试背景我们可能通过点击通知直接跳转到页面指定页面,或者点击通知打开web页面,更或者通过其他应用启动app打开指定页面。

iOS模拟器发送通知和UI测试


背景

我们可能通过点击通知直接跳转到页面指定页面,或者点击通知打开web页面,更或者通过其他应用启动 app打开指定页面。面对这种跳转指定页面我们应该如何做 UI测试了?


向模拟器发送通知

从 Xcode11.4中,用户可以想 iOS 模拟器推送通知,包含以下两种方式:


  • 终端使用 Xcode 命令执行,发送通知。
  • 将 apns 文件拖放到目标模拟器。

apns 文件

首先我们需要定义 apns 发送文件,并命名ExamplePush.apns

定义格式如下:

{"Simulator Target Bundle": "xxxx(包名)","aps": {"badge": 0,"alert": {"title": "打开百度","subtitle": "url加载测试","body": "点击跳转App web 容器并且打开百度搜索",},"sound":"default",},"route": {"url":"https://www.baidu.com/"}
}

至此,你可以填写正确的应用包名,通过拖拽到模拟器来发送通知了。


Xcode 命令发送

在项目已经正确配置好通知所需要的条件后,保证待测模拟器的通知权限已经开启。

发送命令如下:

xcrun simctl push <device> com.example.my-app ExamplePush.apns

如命令所见,我们需要模拟器标识符,应用包名和 apns 文件。


同理,我们还可以通过xcrun simctl openurl booted 来发送通用链接和 scheme 跳转,请参考文章IOS Deep linking: URL Scheme vs Universal Links



  1. 获取模拟器设备标识符

img


  1. 应用包名

img

在结合之前我们定义的 apns 文件,发送通知的命令如下:

xcrun simctl push 942A6B1C-BE29-4E05-A075-5146088F7C9E com.compass.MusselExample PushNotificationTest.apns

UI 测试发送通知

可惜的是 XCodeTest 并没有提供在测试中发送通知的方式。

接下来该怎么办了?

方法1:【推荐】借助其他库实现,比如Mussel(可以在测试用例中发送通知、Scheme Link 和通用链接,最低支持 iOS11)、NWPush(配置麻烦,需要各种证书,教程示例)等库

方法2:自己写 shell 脚本和命令


使用 Mussel 发送通知

Mussel github 仓库:https://github.com/UrbanCompass/Mussel


自定义脚本发送通知

原理:在编译 UI测试 target 期间,添加运行脚本来发送通知

缺点:每次编译都会发送通知(需要手动控制参数)


编写推送通知脚本

#!/bin/bash
#推送和通用链接
#是否运行推送(以便关闭通知)1:打开 0关闭
isAllowPushNotification=1
# 获取脚本所在路径
DIR="$( cd "$( dirname "$0" )" && pwd )"
#进入目录,以便发送 apns 文件
echo ${DIR}pushNotification(){# 模拟器 iddiviceId=xxxxx# 应用包名appName=xxxxxcrun simctl push $diviceId $appName ./ExamplePush.apns
}if [ $isAllowPushNotification == 1 ]; then
pushNotification
fi

暂且命名为 pushNotification.sh 并把相应的权限修改了chmod +x pushNotification.s(不然没有执行权限)。


为 UITest 添加运行脚本

将所需的脚本和 apns 文件都添加到测试 target 目录下后,选中UI 测试 target。 添加脚本。

添加脚本示例

这样每次编译 UI 测试 target 就会发送通知了。


打开通知页面的测试操作

注意:我这里为了方便测试,关闭了通知以组显示的方式。

参数和setUp 方法

@interface OpentNotificationUITests : XCTestCase
@property(nonatomic, strong) XCUIApplication *app; //当前应用
@property(nonatomic, strong) XCUIApplication *springboard; //系统页面
@end@implementation OpentNotificationUITests- (void)setUp {// Put setup code here. This method is called before the invocation of each test method in the class.// In UI tests it is usually best to stop immediately when a failure occurs.self.cOntinueAfterFailure= NO;// UI tests must launch the application that they test. Doing this in setup will make sure it happens for each test method.self.app = [[XCUIApplication alloc] init];self.springboard = [[XCUIApplication alloc] initWithBundleIdentifier:@"com.apple.springboard"];[self.app launch];// In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this.
}

测试方法

- (void)testOpenUrlFromNotification{[self openNotificationCenterTitle:@"打开百度"];NSArray *webViews = [[self.app webViews] allElementsBoundByIndex]; //业务中已处理(点击会通过 webViewController 去加载 url)XCTAssertTrue((webViews.count >= 1), @"应该打开 web 页面"); // 或者使用XCTAssertTrue([webViews[0] waitForExistenceWithTimeout:10], @"应该打开 web 页面");
}

辅助方法

我这里是通过通知的标题来获取对应通知,然后进行点击打开。

#pragma mark - helper
/// 相当于按 Home 键
- (void)toHome{[[XCUIDevice sharedDevice] pressButton:XCUIDeviceButtonHome];
}
/// 打开通知, 注意 需要保证模拟器通知方式[取消以组显示通知],通知 title 也需要不一致。
- (void)openNotificationCenterTitle:(NSString * _Nonnull)title {[self toHome];XCUIApplication *app = self.springboard;XCUICoordinate *coord1 = [app coordinateWithNormalizedOffset:CGVectorMake(0.1, 0.01)];XCUICoordinate *coord2 = [app coordinateWithNormalizedOffset:CGVectorMake(0.1, 0.8)];[coord1 pressForDuration:0.1 thenDragToCoordinate:coord2]; // 滑动显示通知XCUIElement *mainWindow = [[app windows] elementMatchingType:XCUIElementTypeWindow identifier:@"SBCoverSheetWindow"];NSArray *notiCells = [[mainWindow scrollViews] allElementsBoundByIndex];XCUIElement *scroll = notiCells[0];NSArray *allNotiCells = [[scroll scrollViews] allElementsBoundByIndex];XCUIElement *aimElement = nil;for (int i=0; i }

消息点击效果

模拟器点击通知


推荐阅读
  • Android 构建基础流程详解
    Android 构建基础流程详解 ... [详细]
  • 本文介绍了如何利用Shell脚本高效地部署MHA(MySQL High Availability)高可用集群。通过详细的脚本编写和配置示例,展示了自动化部署过程中的关键步骤和注意事项。该方法不仅简化了集群的部署流程,还提高了系统的稳定性和可用性。 ... [详细]
  • 数字图书馆近期展出了一批精选的Linux经典著作,这些书籍虽然部分较为陈旧,但依然具有重要的参考价值。如需转载相关内容,请务必注明来源:小文论坛(http://www.xiaowenbbs.com)。 ... [详细]
  • 在开发过程中,我最初也依赖于功能全面但操作繁琐的集成开发环境(IDE),如Borland Delphi 和 Microsoft Visual Studio。然而,随着对高效开发的追求,我逐渐转向了更加轻量级和灵活的工具组合。通过 CLIfe,我构建了一个高度定制化的开发环境,不仅提高了代码编写效率,还简化了项目管理流程。这一配置结合了多种强大的命令行工具和插件,使我在日常开发中能够更加得心应手。 ... [详细]
  • 本文将带你快速了解 SpringMVC 框架的基本使用方法,通过实现一个简单的 Controller 并在浏览器中访问,展示 SpringMVC 的强大与简便。 ... [详细]
  • 字符串学习时间:1.5W(“W”周,下同)知识点checkliststrlen()函数的返回值是什么类型的?字 ... [详细]
  • 原文网址:https:www.cnblogs.comysoceanp7476379.html目录1、AOP什么?2、需求3、解决办法1:使用静态代理4 ... [详细]
  • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
  • 开机自启动的几种方式
    0x01快速自启动目录快速启动目录自启动方式源于Windows中的一个目录,这个目录一般叫启动或者Startup。位于该目录下的PE文件会在开机后进行自启动 ... [详细]
  • 秒建一个后台管理系统?用这5个开源免费的Java项目就够了
    秒建一个后台管理系统?用这5个开源免费的Java项目就够了 ... [详细]
  • Shell脚本编译器的全面解析与应用指南 ... [详细]
  • 在更换电脑后,使用 Git Bash 运行 Python 时可能会遇到找不到 Python 解释器的问题。本文详细介绍了如何在 Windows 环境下通过 Bash Shell 调用不同版本的 Python,并成功运行 SRSPlayer HTTP 服务器。具体步骤包括配置环境变量、验证 Python 版本以及启动服务器的方法。 ... [详细]
  • 优化后的标题:深入探讨网关安全:将微服务升级为OAuth2资源服务器的最佳实践
    本文深入探讨了如何将微服务升级为OAuth2资源服务器,以订单服务为例,详细介绍了在POM文件中添加 `spring-cloud-starter-oauth2` 依赖,并配置Spring Security以实现对微服务的保护。通过这一过程,不仅增强了系统的安全性,还提高了资源访问的可控性和灵活性。文章还讨论了最佳实践,包括如何配置OAuth2客户端和资源服务器,以及如何处理常见的安全问题和错误。 ... [详细]
  • 深入理解Java中的多态性概念及其应用
    多态是面向对象编程中的三大核心特性之一,与封装和继承共同构成了面向对象的基础。多态使得代码更加灵活和可扩展,封装和继承则为其提供了必要的支持。本文将深入探讨多态的概念及其在Java中的具体应用,帮助读者全面理解和掌握这一关键知识点。 ... [详细]
  • 2018年9月21日,Destoon官方发布了安全更新,修复了一个由用户“索马里的海贼”报告的前端GETShell漏洞。该漏洞存在于20180827版本的某CMS中,攻击者可以通过构造特定的HTTP请求,利用该漏洞在服务器上执行任意代码,从而获得对系统的控制权。此次更新建议所有用户尽快升级至最新版本,以确保系统的安全性。 ... [详细]
author-avatar
时-_尚微视点
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有