热门标签 | 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 }

消息点击效果

模拟器点击通知


推荐阅读
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • EPICS Archiver Appliance存储waveform记录的尝试及资源需求分析
    本文介绍了EPICS Archiver Appliance存储waveform记录的尝试过程,并分析了其所需的资源容量。通过解决错误提示和调整内存大小,成功存储了波形数据。然后,讨论了储存环逐束团信号的意义,以及通过记录多圈的束团信号进行参数分析的可能性。波形数据的存储需求巨大,每天需要近250G,一年需要90T。然而,储存环逐束团信号具有重要意义,可以揭示出每个束团的纵向振荡频率和模式。 ... [详细]
  • 原文地址:https:www.cnblogs.combaoyipSpringBoot_YML.html1.在springboot中,有两种配置文件,一种 ... [详细]
  • 推荐系统遇上深度学习(十七)详解推荐系统中的常用评测指标
    原创:石晓文小小挖掘机2018-06-18笔者是一个痴迷于挖掘数据中的价值的学习人,希望在平日的工作学习中,挖掘数据的价值, ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • imx6ull开发板驱动MT7601U无线网卡的方法和步骤详解
    本文详细介绍了在imx6ull开发板上驱动MT7601U无线网卡的方法和步骤。首先介绍了开发环境和硬件平台,然后说明了MT7601U驱动已经集成在linux内核的linux-4.x.x/drivers/net/wireless/mediatek/mt7601u文件中。接着介绍了移植mt7601u驱动的过程,包括编译内核和配置设备驱动。最后,列举了关键词和相关信息供读者参考。 ... [详细]
  • 本文介绍了Linux Shell中括号和整数扩展的使用方法,包括命令组、命令替换、初始化数组以及算术表达式和逻辑判断的相关内容。括号中的命令将会在新开的子shell中顺序执行,括号中的变量不能被脚本余下的部分使用。命令替换可以用于将命令的标准输出作为另一个命令的输入。括号中的运算符和表达式符合C语言运算规则,可以用在整数扩展中进行算术计算和逻辑判断。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • 本文总结了Linux下多线程执行shell脚本的4种方法,包括切换到工作目录执行、使用绝对路径执行、直接使用bash或sh执行。同时介绍了为什么需要加上"./"来执行脚本的原因。 ... [详细]
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社区 版权所有