打造一款快速高效且高度可复用的 ios 自动化测试工具 (qq 群 :329915064)
先致敬两个开源工具;
swiftmonkey
https://github.com/zalando/SwiftMonkey
因其直接使用了 苹果的私有 api 如 XCEventGenerator.tapAtTouchLocations 故执行速度极快。同时也用类似 android monkey 的事件生成机制,自身源源不断的产生如 tap,swipe,pinchIn 等事件使其对被测 app 产生了极大的压力
缺点:需要插桩
XCTestWD
https://github.com/macacajs/XCTestWD
类似 facebook wda 的方式,在 xcode 中执行 xcuitest 时启动一个监听 server,可通过外部发送命令来创建待测 app 对应 session 并启动 app,同时也实现了 dump tree 和依据 xpath,id 等来定位某个控件并操作这些控件
Fastmonkey
Xcode9.0(https://github.com/zhangzhao4444/Fastmonkey)
Xcode8.3(https://github.com/zhangzhao4444/Fastmonkey/tree/xcode8.3)
结合两者优点并改造两者,在 XCTestWD 基础上实现一个 server 路由,外部命令时可引导启动 app 并执行 monkey
app 插桩增加小手的反馈,可以更直观的看到其点击效率! (可选,实际不插也可 monkey)
测试时会保存截图,及 appcrash log(此处植入广告!)
1.monkey 执行过程中跳出 app,如何跳回继续跑 monkey
增加一个定时执行的 action,检测当前 app,如果不是待测则重新 launcher(其时更好的应该时 reactive,但并没有找到类似 api)
public func addXCTestCheckCurrentApp(interval:Int, appname:String, application:XCUIApplication) {
addAction(interval:interval){ [weak self] in
let current = XCTestWDFindElementUtils.getAppName(underElement: root!)
let isRunning = application.running
if current == appname && isRunning {
for i in 0 ..< application.alerts.count {
let alert = application.alerts.element(boundBy: i)
...
}
}else{
application.launch()
self!.sleep(5)
2.登陆等业务流程如何解决
同样增加一个定时的 action,检测当某个关键点出现时,往事件队列中插入一个业务事件
public func addXCTestAppLogin(interval:Int, application:XCUIApplication) {
addAction(interval:interval){ [weak self] in
if root != nil{
let usage = "xpath"
let tag = "//XCUIElementTypeOther[@name='登录']/XCUIElementTypeTextField"
let element = try? XCTestWDFindElementUtils.filterElement(usingText: usage, withvalue: tag, underElement: root!)
...
if element != nil {
self?.addXCTestLoginAction(application: application)
}
public func addXCTestLoginAction(application:XCUIApplication) {
addAction(){ [weak self] in
if root == nil{
return
}
let usage = "xpath"
let username = "//XCUIElementTypeOther[@name='登录']/XCUIElementTypeTextField"
let passwd = "//XCUIElementTypeOther[@name='登录']/XCUIElementTypeSecureTextField"
let button = "//XCUIElementTypeOther[@name='登录']//XCUIElementTypeStaticText[@name='登录']"
var element = try? XCTestWDFindElementUtils.filterElement(usingText: usage, withvalue: username, underElement: root!)
if let element = element {
let value = "abc"
...
let semaphore = DispatchSemaphore(value: 0)
let numberOfTaps = 1
self!.sharedXCEventGenerator.tapAtTouchLocations(locations, numberOfTaps: UInt(numberOfTaps), orientation: orientationValue) {
semaphore.signal()
}
semaphore.wait()
#44 楼
支持控件,点击序列,跳出监控
#172 楼
总运行时间,总点击次数。action 固定间隔,action 随机间隔(暂时内编码,后续参数化)
#191 楼
增加跳过 server 跳过发请求机制,运行 xctestwduitest 直接启动待测 app 直接跑 monkey
#
支持 xcode9, ios11
#445 楼
社区兄弟的搭建扫盲贴
https://testerhome.com/topics/9810
另一扫盲贴
http://cdn2.jianshu.io/p/2cbdb50411ae
jenkins 部署案例
https://testerhome.com/topics/12672
* 基于 xcode9.2 部署
https://www.jianshu.com/p/373c14d014f2
期待开源....
这个图片分类有点牛批
工具巨叼
好工具,期待开放
厉害了
请问能加入业务流程脚本嘛?
业务流程脚本? 比如登陆吗? 如果是跑 monkey 过程中插入一些特定业务逻辑是可以的。 业务逻辑实际就是原子性的一系列点击输入。 如果是按 case 跑目前还不支持 改造会比较大 但理论上也是可以的
是这样子,就是比如有业务链路:
a->b->d->c->a
随机可能做不到。那如果我用脚本把这些链路都写成一个个业务脚本,可以当做插件插到框架中去,随机执行的话,就会更加有效果。
可以的。这个链路执行的时候 ,随机会暂停。执行完随机再继续。只要设置好各个链路的触发点即可。相对于单个链路中的行为不随机,而不同链路之间也是随机的
期待源码
好工具 坐等开源
能并发吗?
其实现在的核心应该还是数据监控和数据分析,执行的话相对还比较好实现一些,期待楼主把未来那块补全,加油
膜拜大神,期待开源,牛的一批
高效率,每秒 4-5 个 action!
这块是带截图吗?
idevicescreenshot?
另外想咨询一下:
关于检测是否在指定 APP,调用的这个方法,是封装的吗? 具体是会调用哪个 API? 或者内部的实现机制是?
let current = XCTestWDFindElementUtils.getAppName(underElement: root!)
目前感觉检测是否指定 APP,还挺难实现的。 我看你这个方法,挺好。
打个比方,会出现点击了 20 次 可能才截出 6,7 张图。 截图比较鸡肋,实际效果不如录像或者 log
这个 func 大致实现原理是?
log 的话,是采用 idevicesyslog 来收集还是?
录屏是用什么方案
重新 launcher。
这块是用的什么方法?
我之前有使用过:idevicedebug 方法
重新 launcher 就调的 XCUIApplication.launch()
但这样会重启 app,我希望能后台切回前台是最好的。
见 官方 api
https://developer.apple.com/documentation/xctest/xcuiapplication
感觉应该用 activate() 但目前只是 beta 的
已完成 基于控件的点击,解析出所有控件,随机某个控件点其中心点 。每秒大概 3-4 个 action
大赞
log 的 就记录每个 action 后 点击什么页面什么位置。
点击什么页面,这个是如何定义页面这个概念的? iOS 端毕竟没有 Android 端 activity
取 title 辅助定位,是指类似 dump 出 xml 后,然后取里面的 title?
这里面有没有什么规则? 如取几个,或者去布局的几个等?
有没有验证过,定义 window 后的准确率有多高? 即,进入相似页面,或者滑动后,是否认为是同一个页面。
请问 XCEventGenerator 这个 API 怎么获得啊~~~我在 iOS-Runtime-Headers 里面没找到,求大神分享一下
Thanks!
楼主太棒啦
但是第二个地址报 404 不知道是怎么回事~~~
虽然做伸手党有点可耻,但是我还是想问楼主这么强大的工具什么时候开源给大家用啊~~~~~
404 那个发帖时链接多了个( ,不明所以。。
这个仅仅是 api 简易说明。google 搜搜就有了
application.running , XCUIApplication 好像没有这个吧...
注! 熊猫直播测试组 出品; 玩游戏关注熊猫直播
已开源了 1.0.0.1002。 尚有瑕疵,望见谅。
运行说明:
配置:
XCTestWDMonkeyController.swift
let monkey = Monkey(frame: app.frame)
monkey.addDefaultXCTestPrivateActions()
monkey.addXCTestTapAlertAction(interval: 100, application: app)
monkey.addXCTestCheckCurrentApp(interval: 10, application: app) # app后台或退出检测
//monkey.addXCTestAppLogin(interval: 50, application: app) # 登陆业务逻辑 50次事件加入1次业务关键点检查,无登陆逻辑可注释
monkey.monkeyAround()
MonkeyXCTestPrivate.swift
public func addDefaultXCTestPrivateActions() {
addXCTestTapAction(weight: 35) #随机点击事件 100-200ms/action
//addXCTestElementTapAction(weight: 10) #基于控件的点击事件 执行概率: 10/(35+10+5) 300-400ms/action
addXCTestLongPressAction(weight: 1)
addXCTestDragAction(weight: 1)
addXCTestPinchCloseAction(weight: 1)
addXCTestPinchOpenAction(weight: 1)
addXCTestRotateAction(weight: 1)
}
注!事件序列如何实现:
通过设置一个关键点 引入一个事件序列,当检测到出现关键点时插入自定义事件序列,并立即执行; 可按此原理实现自己的事件序列
public func addXCTestAppLogin(interval:Int, application:XCUIApplication) {
addAction(interval:interval){ [weak self] in
do{
let session = try XCTestWDSessionManager.singleton.checkDefaultSessionthrow() #检测到出现'登录'关键点时 插入
let root = session.application
if root != nil{
let usage = "xpath"
let tag = "//XCUIElementTypeOther[@name='登录']/XCUIElementTypeTextField"
let element = try? XCTestWDFindElementUtils.filterElement(usingText: usage, withvalue: tag, underElement: root!)
if let element = element {
if element != nil {
self?.addXCTestLoginAction(application: application) #插入一个特殊事件序列
}
else{
return
}
}
}
}catch{
return
}
}
}
public func addXCTestLoginAction(application:XCUIApplication) { #该事件为一个原子事件序列,保证事件中不会插入其他事件
addAction(){ [weak self] in
do{
let session = try XCTestWDSessionManager.singleton.checkDefaultSessionthrow()
let root = session.application
if root == nil{
return
}
let usage = "xpath"
let username = "//XCUIElementTypeOther[@name='登录']/XCUIElementTypeTextField"
let passwd = "//XCUIElementTypeOther[@name='登录']/XCUIElementTypeSecureTextField"
let button = "//XCUIElementTypeOther[@name='登录']//XCUIElementTypeStaticText[@name='登录']"
var element = try? XCTestWDFindElementUtils.filterElement(usingText: usage, withvalue: username, underElement: root!)
if let element = element {
if let element = element {
NSLog("XCTestWDSetup->loginuser find?\(String(describing: element))<-XCTestWDSetup")
let value = "1111111111"
let rect = element.wdRect()
let point = CGPoint(x:rect["x"]!,y:rect["y"]!)
let locations = [point]
let semaphore = DispatchSemaphore(value: 0)
let numberOfTaps = 1
self!.sharedXCEventGenerator.tapAtTouchLocations(locations, numberOfTaps: UInt(numberOfTaps), orientation: orientationValue) { #点击使用坐标,调用xctest私有api
semaphore.signal()
}
semaphore.wait()
注! 屏幕中控件获取如何加快速度
如果使用 app.descendants(matching: .xxx) 可以获取某种类型的控件集,但获取其中某个控件坐标时,xctest 内部会再次执行一次当前界面查找确保控件仍存在,该过程测试时间过长,超过 500ms 甚至 1s 更多。故此处进行了优化,缩短了时间 ;最终点击某个控件控制在 300-400ms
static func xpathToList(_ root:XCElementSnapshot, _ xpathQuery:String) -> [CGPoint]? {
var mapping = [String:XCElementSnapshot]()
let xml = generateXMLPresentation(root,nil,nil,defaultTopDir,&mapping)?.xml
if xml == nil
{return nil}
let tree = try? XMLDocument(string: xml!, encoding:String.Encoding.utf8) #xml tree
let nodes = tree?.xpath(xpathQuery) #筛选生成对应节点
var list = [CGPoint]()
for node in nodes! {
if mapping[node.attr("private_indexPath")!] != nil{
let x = (node.attr("x")! as NSString).floatValue
let y = (node.attr("y")! as NSString).floatValue
if (x <= 0) && (y <= 0)
{continue}
let snapshot = mapping[node.attr("private_indexPath")!]
let isvisible = try? snapshot?.isWDVisible() #仅isvisible的才视为当前可见,加入到point队列
if isvisible == nil || isvisible! == false
{continue}
let w = (node.attr("width")! as NSString).floatValue
let h = (node.attr("height")! as NSString).floatValue
let cX = Int(x + w/2)
let cY = Int(y + h/2)
let point = CGPoint(x:cX,y:cY)
if list.contains(point) == false {
list.append(point)
}
}
}
return list #最终返回所选控件对应的坐标队列集
}
注! app 退出如何检测
(坑点!!! app 切换或者闪退自身也需要时间,可能获取当前 pid 时 app 还未完成退出或切换操作)
app 退出通过三种方式检测
1) app 退出检测线程 每 500ms 执行一次, 检测耗时 50ms
public func addXCTestCheckCurrentApp(interval:Int, application:XCUIApplication) {
addCheck(interval:interval){ [weak self] in
let work = DispatchWorkItem(qos:.userInteractive){
let isRunning = application.running #获取当前是否在运行中
let current = Int(XCTestWDFindElementUtils.getAppPid()) #获取当前前台pid
if current != self?.pid || !isRunning{ #当切换到后台或已退出时,执行launch
application.launch()
self?.sleep(5)
self?.pid = Int(XCTestWDFindElementUtils.getAppPid())
}
}
DispatchQueue.main.async(execute:work)
}
}
static func getAppPid() -> Int32{
var activeApplicationElement:XCAccessibilityElement?
activeApplicationElement = (XCAXClient_iOS.sharedClient() as! XCAXClient_iOS).activeApplications().first
if activeApplicationElement == nil {
activeApplicationElement = (XCAXClient_iOS.sharedClient() as! XCAXClient_iOS).systemApplication() as? XCAccessibilityElement
}
let pid = activeApplicationElement?.processIdentifier #通过私有api 获取当前前台pid
if pid == nil{
return 0
}
return pid!
}
上述检测方式 因为使用 xcaxclient 私有 api 和 launch 只能在主线程中执行,故只能通过定时方式检测并插入高优先级队列执行。而且要尽量缩短其耗时从而不会影响其他各点击事件的执行频率
2) 低概率检测事件,获取 pid 前增加延迟
public func addXCTestTapAlertAction(interval: Int, application: XCUIApplication) {
addAction(interval: interval) { [weak self] in
usleep(2000000) #sleep 2s
let isRunning = application.running
let current = Int(XCTestWDFindElementUtils.getAppPid())
3) 最后一关把控,当 resovle 前再检测一次
func resolve() throws {
self._application.query()
let pid = self._application.processID
let activeApplicationElement = (XCAXClient_iOS.sharedClient() as! XCAXClient_iOS).activeApplications().first
let currentprocessID = activeApplicationElement?.processIdentifier #@A@
if pid != currentprocessID{ #最后把关 pid不同 则抛出异常
throw OperationError.Error
}
#@B@
self._application?.resolve()
}
此处实现目前仍存在瑕疵,如果 app 在上述@A处仍在前台,@B处却切到后台,monkey 可能 crash,原因是此时 application 已不在 _application.resolve 崩溃。但当 xcode9 发布时应该就不存在问题了,新 api 提供了 state,可以线程检测当前状态
(此崩溃仅会出现在 开启基于的控件点击)
未来后续;
1) 瑕疵修正
2) 性能监控
3) 崩溃分析
4) 控件选择子 算法
我测试这个是可以用,可能没公开。我当时搜 google 好像在某个 stackoverflow 里看到的。
@zhangzhao_lenovo 楼主强大 问个问题 就是这个录屏是怎么实现的?是通过 screenshort() 这个返回的截图合成的视频么
还有一个疑问就是 getPageSource() 这个拿页面的 xml 结构的 api 好慢呀 有没有什么好的办法
录屏我也还没有实现,仅仅是个想法。
你说的 getpagesource 是哪个框架的 api? 在 44 楼发了个优化的方案,牺牲一些准确度来提升获取速度。
@ 感谢楼主回复 getpagesource 这个是 appium 的实际上就是调用的 wda 的 source 取页面的 xml 结构 因为我现在做了一个事实操控 ios 的平台 其他部分已经优化了但就是唯独获取页面 xml 这块 复杂的页面居然要 10s 不好意思 还有一个问题 就是 XCTestWD 貌似要安装两个 app 表示没有开发者账号很蛋疼 你这个要安装多少个 app 呀 在手机上 谢谢
还有一个就是我发现 wda 的查找控件我一般是根据 id 需要 1s 多 然后点击啥的也要 1s 多
是的,需要占两个 bundle id
我在想一个问题 是不是 swift 比 object-c 的效率要高点 我发现相同的操作 wda 的运行速度要低于 XCTestWD
@zhangzhao_lenovo 我一开始就选的 wda 所以我现在执行一个 action 基本上都要 2-3s
真想换成 XCTestWD
没有 我看 wda,xctestwd 代码大致类似。 理论上 oc 的应该更快些,你那里速度慢 根本原因是用的 appium,中间经过了太多过程,比如网络请求
Hi 楼主 iOS 初级用户请教,我在打开 XCTestWD.xcodeproj 文件时,提示我下图错误(我的是 xcode9 beta5)说是缺少文件,请教如何解决,谢谢~
@zhangzhao_lenovo 我在取 xml 的时候 是直接通过调用的 wda 没有经过 appium 还是差不多慢一点 而且这又有个新的问题 当我用 iproxy 得时候 映射到本地 mac 的 ip 地址是 127.0.0.1 也就是说 我通本机的 ip 地址是无法访问的 这个有木有比较好的解决办法呀 对了性能数据的获取我已经做好了 需要的话 可以找我拿
大佬你怎么做的性能数据的获取啊?注入式还是?
@yxys01 是的 直接把代码注入到 wda 中然后以 rest 服务的形式发布出来
谢谢楼主回复,我打开后里面还是没找到,我是刚从你的 git 上 clone 下来的,里面没这个文件,能发一个给我吗或者楼主重新传一个到 git 上,谢谢~
我今天 WDA 不知道怎么回事报错:
2017-08-15 15:23:50.445222+0800 XCTRunner[3977:2074841] Running tests...
2017-08-15 15:23:50.874611+0800 XCTRunner[3977:2074893] Connection peer refused channel request for "dtxproxy:XCTestDriverInterface:XCTestManager_IDEInterface"; channel canceled
Failed to run tests: The operation couldn’t be completed. (DTXProxyChannel error 1.)
大佬知道这个该怎么解决吗?
1.断掉 use 线 然后重启 wda
2.重启手机 重启 wda
能解决 95% 的 wda 问题
@yxys01
@zhangzhao_lenovo 楼主 你的 xml 是通过 sctestwd 取得么 怎么取得呀
刚从楼主的 git 上 clone 的 zip 包,报错缺少 project.pbxproj 文件,各位大神们,谁有这个文件发一个呗,万分谢谢~邮箱:zhulixin@live.com
44 楼的 xpathToList 我取的 point 集合
@zhangzhao_lenovo 25 楼的呢
25 楼那个 func 效率低 重写了
@zhangzhao_lenovo 我已找到了
XCTestWDXPath 这个类中就有 生成 xml 的方法 哈哈 好开心
谢谢楼主,还是不行,不知道是不是我的环境问题 (我 xcode 版本 Xcode 9 beta 5),还是同样的错误,提示我缺少那个文件,楼主直接发我一个这个文件,我拷贝过来可以用吗?如果可以的话,楼主可以邮件发我下吗?谢谢~麻烦了~ 我邮箱 zhulixin@live.com
楼主,我这边遇到了同样的问题,提示
“....Fastmonkey/XCTestWD-master/XCTestWD/XCTestWD.xcodeproj cannot be opened because it is missing its project.pbxproj file.”
刚重新下载,还是不行,在线等~
Xcode 8.3.2 打开同样问题
XCTestWD-master/XCTestWD/XCTestWD.xcodeproj cannot be opened because it is missing its project.pbxproj file.
hi 楼主 git 用户@magaofei 发现那个缺失的文件是写到了 .gitignore 文件里,他已经给复制出来了,其他朋友如果遇到这个问题,可以.gitignore 里找,或者直接 clone https://github.com/magaofei/Fastmonkey.git,谢谢楼主的积极回复,万分感谢~
赞一下 👍 我还在晕头中,你已经改好了。
感谢各位大神们,可以打开了!!激动中~
我把项目克隆下来, 发现打不开, 把错误 Google 了一下, 从原版 XCTestWD 当中 xcodeproj 文件的包内容, 复制了一个文件过去, 再重新拉项目文件, 又提示缺东西, 我看又有新的更新, 我 pull 了就好了, 其他人还说有问题, 然后我发现我修改了 xcodeproj 文件后 git 没有提示任何变动, 想了一会才发现是 .gitignore 文件的问题
请问楼主这怎添加
可以的。但需要代码修改下。 1 启动 server 监听的端口 2iproxy 端口 3curl 命令请求的端口
有空我再改下,xcodebuild 直接完成 1,2,3 ,这样可以简单对接到 jenkins 支持多机了
楼主 swift 里面怎么取一个 map 的 value 值么@zhangzhao_lenovo 这个语言真的是坑呀
有那么点像 python。但!,?,_ 这些并不友好。而且异常捕获也很坑
// 查询字典
dict["name"]
// 遍历字典中所有的值
for value in dict.values {
print(value)
}
if mapping[node.attr("private_indexPath")!] != nil{
let snapshot = mapping[node.attr("private_indexPath")!]
参照 swiftMonkey 的似乎没有限制时长的,我在原地方看到有个扩展方法设置跑的时间
https://www.ctolib.com/article/comments/23532
extension Monkey {
func startTesting(forDuration duration: TimeInterval) {
let start = CFAbsoluteTimeGetCurrent() // start time
repeat {
actRandomly()
actRegularly()
} while ((CFAbsoluteTimeGetCurrent() - start) < duration)
}
}
@zhangzhao_lenovo 突然发现 xctestwd 不支持 utf-8 的中文 怎么搞呀
输入中文字符 ?
@zhangzhao_lenovo 查询控件的时候 控件的 id 为中文
let value = request.jsonBody["value"].string 这里取出来的就是???????
@zhangzhao_lenovo request 这个里面就已经解析成?了 转码也转不鸟了 我看了下源码 是把所有的存成了 Uint8
不知道作者怎么想的
调式下看看 是从哪里开始存成??了。感觉上层 macaca 也会有获取中文的需求,不应该啊
@zhangzhao_lenovo 解析请求的时候 存成了 Uint8 这玩意 这玩意存不鸟中文
哦 我明白了。你是说,发给 xctestwd 的请求 如 控件的 id 是个中文。 xctestwd 接收到就解析成 uint8 了。。 @xdf 达峰帮看看?
@zhangzhao_lenovo @xdf 对的 对的 而且能不能把两个应用合成一个呀 没有开发者账号 要是再加一个应用就不行了
谢谢
@zhangzhao_lenovo @xdf clear 清除文本这个方法写的也有问题
哪个 clear 清除? 你发的请求是什么?
@zhangzhao_lenovo @pliue 确认的问题请提 issue
@xdf 已在 github 上提了
@zhangzhao_lenovo @xdf (RequestRoute("/wd/hub/session/:sessionId/element/:elementId/clear", "post"), clearText),
这个方法 element?.typeText(“”) 这样是不会清除文本的 我改了下:
let text:String = firstNonEmptyValue(element?.wdValue() as? String, element?.wdLabel()) ?? ""
let l = text.characters.count
var bb = "\u{8}"
var typeString = ""
for _ in 1...l {
typeString=typeString + bb
}
element?.typeText(typeString)
这样就可以清除了 谢谢
@pliue clear 的方法麻烦给 xctestwd 提个 merge request
@xdf 刚才试了下 最新版的 只 test xctestwduitests 只会安装一个应用了
👍 我也同步下
@zhangzhao_lenovo 中文的还没回复 清除的 看下 103 楼 目前还发现 xpath 定位不是很准确
@zhangzhao_lenovo 用真机跑可以得到截图和 crash 日志吗
可以的 xcode 里点结束时有个日志路径 xxxxx/test/attachments/ 包含截图和 crash
github 上 XCTestWD 的管理员 SamuelZhaoY 这哥们大家遇到么 有点无语呀
你好,我是 XCTestWD 的作,对于你提出的部分问题, 因为考虑到实际价值,所以做了 bypaas.
@Samuel.ZhaoY 只是觉得 应该充分的沟通 这个 github 评论模式不太习惯
欢迎钉钉留言 Samuel.蕉庵 +65-97788734, 提交 issue 建议提供多的信息, 关于一些想法可以给一些完整的建议,而不是只言片语. 对 issue 处理及时,其实在作者的角度已经是对答问者最大的负责. 特别是同时提出 4 - 5 个 issue 的时候, 不妨先整理一下思绪
@zhangzhao_lenovo
您好 我这边成功用 carthage 安装了 swiftJSON.framework,但是 swifter.framework 却失败,查看发现 git 地址已经 404 了,不知道是该如何解决呢?
运行
curl -X POST -H "Content-Type:application/json" -d "{\"desiredCapabilities\":{\"deviceName\":\"xxxx\",\"platformName\":\"iOS\", \"bundleId\":\"xxxx\",\"autoAcceptAlerts\":\"false\"}}" http://127.0.0.1:8001/wd/hub/monkey
看看 monkey 能跑起来不?
大神 有如上的报错 没明白他说的找不到的文件是什么??
执行只需要三步就可
iproxy 8001 8001
启动 server (或 xcode 中启动)(或 xcodebuild)2 选 1
3.curl -X POST -H "Content-Type:application/json" -d "{\"desiredCapabilities\":{\"deviceName\":\"xxxx\",\"platformName\":\"iOS\", \"bundleId\":\"xxxx\",\"autoAcceptAlerts\":\"false\"}}" http://127.0.0.1:8001/wd/hub/monkey
正常情况 执行完 curl app 就启来开始跑 monkey 了
你那里是不是重复启动 server 了?
确实是重复启动 server 了!
但是第二步(xcodebuild)报如下错
我把设备断开连接后重启 再次执行第二步(xcodebuild -project XCTestWD.xcodeproj \
-scheme XCTestWDUITests \
-destination 'platform=iOS,name=我的 devicename' \
XCTESTWD_PORT=8001 \
clean test)
后,又报另外的错误!
跑 fastmonkey 时,xcode 要一直打开么?
xcodebuild 我多试了几次
如上,这种情况就是成功了吧?
然后我执行了第三步后
您知道是什么情况吗??
你的 mac 插了多台 iphone 吗? 如果是的话,iproxy 8001 8001 后需要加 serialid 指定哪台 iPhone 设备做端口映射。 然后 curl 中执行对应 iPhone 设备
xcode 里中断运行时 有个 log 路径的日志输出 xxx/XCTestWD-xxx/Logs/Test/Attentment
您说的这个是在 xcode 中启动 server 的时候的方式吧?
我这边想问的是在终端用 xcodebuild 启动 server 的那种,结束与获得截图与 log 的方式?
楼主,我前几天由于工作原因,一直没来得及使用你的,今天 git 下来体验,run 的时候报错:bridging header '/Users/xiatian/Fastmonkey/XCTestWD-master/XCTestWD/XCTestWD/XCTestWD-Bridging-Header.h' does not exist;不知道是楼主没上传还是要在哪下载呢?
我直接 git clone 的,接着在路径下 carthage update,然后运行 xcode 打开 XCTestWD.xcodeproj,运行,就报这个错误啊~~~
你看下 你工程里应该没有 XCtestWD-Bridging-Header.h 文件,应该有一个 XCTestWDUITests-Bridging-Header.h 文件,看它在什么路径下,并在 Build Settings -> Header Search Paths 项里做修改试试
确实没有 XCtestWD-Bridging-Header.h 文件,在 XCTestWDUITests 里面有一个 XCTestWDUITests-Bridging-Header.h 文件
修改后
还是报那个错误
xcode buildsetting 有问题。 xctestwd 中没有用到 oc,swift 混编,header search path,objecktive-c bridging header 配置可去掉再试试。xctestwduitest 中用了混编才需要 xctestwduitest-bridging-header.h
我现在可以在 xcode/DerivedData/xxxx/Logs/Test/Attachments 路径里面找到截图,您说的 crash log 也是会生成在 Attachments 文件夹里面吗? 该 crash log 是否可以追踪到 app 代码问题?
crash 也在 Attachments 里
就是系统生成的崩溃堆栈文件,研发有对应的符号文件是可以定位的
为了不只做伸手党,我把我的配置过程以及一些遇到的简单问题做了个总结,萌新们可以来看下具体的配置流程,遇到大问题再来问大佬吧~~https://testerhome.com/topics/9810
iproxy 8001 8001,iproxy 命令怎么安装的?
登录这块的用户名和密码如何配置?iOS 代码没去学习过,看的不是太懂。。。- -
自己重新 carthage update 了很多次都没解决原来是 cezheng/Fuzi 版本的问题,之前 1.0.1 一直失败。
请问 Monkey 时间设定的功能快完成了吗,小白伸手党万分感谢
就是给 monkey 设定运行时间,例如在如下命令行里添加 time = 1000s 一项,它就会自动在 1000 秒时停止 monkey.
curl -X POST -H "Content-Type:application/json" -d "{\"desiredCapabilities\":{\"deviceName\":\"xxxx\",\"platformName\":\"iOS\", \"bundleId\":\"xxx\",\"autoAcceptAlerts\":\"false\"}}" http://127.0.0.1:8001/wd/hub/monkey
2017-08-25 18:03:52.821 xcodebuild[17995:1706636] Error Domain=IDETestOperationsObserverErrorDomain Code=4 "Test operation was canceled. If you believe this error represents a bug, please attach the log file at /Users/xxxxxxxx/Library/Developer/Xcode/DerivedData/XCTestWD-ecleedtsdbxztvfcvaqqgwnsgqxl/Logs/Test/932A09AF-A07A-45B2-BBDB-42CAE9A7F4C5/Session-XCTestWDUITests-2017-08-25_180350-vRucrT.log" UserInfo={NSLocalizedDescription=Test operation was canceled. If you believe this error represents a bug, please attach the log file at /Users/xxxxxxxx/Library/Developer/Xcode/DerivedData/XCTestWD-ecleedtsdbxztvfcvaqqgwnsgqxl/Logs/Test/932A09AF-A07A-45B2-BBDB-42CAE9A7F4C5/Session-XCTestWDUITests-2017-08-25_180350-vRucrT.log}
Testing failed:
Command /bin/sh failed with exit code 127
** TEST FAILED **
The following build commands failed:
PhaseScriptExecution Run\ Script /Users/xxxxxxxx/Library/Developer/Xcode/DerivedData/XCTestWD-ecleedtsdbxztvfcvaqqgwnsgqxl/Build/Intermediates/XCTestWD.build/Debug-iphoneos/XCTestWDUITests.build/Script-7FA43F311F0CB57400FB2332.sh
请问这个错误怎么处理 @zhangzhao_lenovo
评论都看了 其中出现的错误也都改了 然后 run 的时候 报这个 不知道怎么
export XCODE_APP_SUPPORT_DIR=/Applications/Xcode.app/Contents/Developer/Library/Xcode
export XCODE_PRODUCT_BUILD_VERSION=8E3004b
export XCODE_VERSION_ACTUAL=0833
export XCODE_VERSION_MAJOR=0800
export XCODE_VERSION_MINOR=0830
export XCTESTWD_PORT=8001
export XPCSERVICES_FOLDER_PATH=XCTestWDUITests.xctest/XPCServices
export YACC=yacc
export arch=armv7
export YACC=yacc
export arch=armv7
export diagnostic_message_length=116
export variant=normal
/bin/sh -c /Users/xxxxxxx/Library/Developer/Xcode/DerivedData/XCTestWD-ecleedtsdbxztvfcvaqqgwnsgqxl/Build/Intermediates/XCTestWD.build/Debug-iphoneos/XCTestWDUITests.build/Script-7FA43F311F0CB57400FB2332.sh
d2af20af5674f416a6ea33edc144120752af515e
/Users/xxxxxxxxx/Library/Developer/Xcode/DerivedData/XCTestWD-ecleedtsdbxztvfcvaqqgwnsgqxl/Build/Intermediates/XCTestWD.build/Debug-iphoneos/XCTestWDUITests.build/Script-7FA43F311F0CB57400FB2332.sh: line 12: ideviceinstaller: command not found
Command /bin/sh failed with exit code 127
2017-08-25 18:15:54.733 xcodebuild[18119:1717957] Error Domain=IDETestOperationsObserverErrorDomain Code=4 "Test operation was canceled. If you believe this error represents a bug, please attach the log file at /Users/jxxxxxx/Library/Developer/Xcode/DerivedData/XCTestWD-ecleedtsdbxztvfcvaqqgwnsgqxl/Logs/Test/F063AE42-B5A6-4694-A98E-6241C3848607/Session-XCTestWDUITests-2017-08-25_181552-bw8Dwx.log" UserInfo={NSLocalizedDescription=Test operation was canceled. If you believe this error represents a bug, please attach the log file at /Users/xxxxxxx/Library/Developer/Xcode/DerivedData/XCTestWD-ecleedtsdbxztvfcvaqqgwnsgqxl/Logs/Test/F063AE42-B5A6-4694-A98E-6241C3848607/Session-XCTestWDUITests-2017-08-25_181552-bw8Dwx.log}
Testing failed:
Command /bin/sh failed with exit code 127
** TEST FAILED **
The following build commands failed:
PhaseScriptExecution Run\ Script /Usersx'x'x'x'x'x'x'xLibrary/Developer/Xcode/DerivedData/XCTestWD-ecleedtsdbxztvfcvaqqgwnsgqxl/Build/Intermediates/XCTestWD.build/Debug-iphoneos/XCTestWDUITests.build/Script-7FA43F311F0CB57400FB2332.sh
(1 failure)
/Users/xxxxxxxxx/Library/Developer/Xcode/DerivedData/XCTestWD-ecleedtsdbxztvfcvaqqgwnsgqxl/Build/Intermediates/XCTestWD.build/Debug-iphoneos/XCTestWDUITests.build/Script-7FA43F311F0CB57400FB2332.sh: line 12: ideviceinstaller: command not found
Command /bin/sh failed with exit code 127
brew install ideviceinstaller 这个装下试试
目前这块还缺少 后续会补充上的。比如总运行时间,或者总点击次数。每次点击固定间隔,以及每次点击随机间隔
2017.08.28
update:
1.总运行时间,总点击次数。action 固定间隔,action 随机间隔(暂时内编码,后续参数化)
Monkey.swift
let elapsedTime = n //设定跑monkey n秒后退出
let actionMax = n //设定跑monkey n个action后退出 (elapsedtime 与actionmax 二选一)
let throttle = n * 1000 // randomize_throttle=false,则每个action之间 sleep throttle( n个毫秒)
let randomize_throttle = false // randomize_throttle=true,则每个action之间 sleep ramdom(throttle) 个毫秒
“添加 time = 1000s 一项,它就会自动在 1000 秒时停止 monkey” 已更新 看看是否符合需求
不知道为什么跟着步骤走 都是这个报错
"code signing is required .." 你那里 XCTestWDUITests 配置的签名有问题
XCTestWDUITests->General->Signing
与 XCTestWD 一样
大神!!拜谢!!在 github 上下载最新的就可以了是吧!
最近发现经常会有这个问题,自己实现的解决办法是设备断连再重启,想知道大神有没有在根本上解决问题的方式?
从 log 上看 是报的签名 invalid。
iphone 上的 ‘设置->通用->设备管理’ XCTestWDUITests 设置受信任了吧?
一般跑完一次后,再跑第二次或第三次会发生这样的错误。
请问 xxx/XCTestWD-xxx/Logs/Test/Attentment 路径下的 crashlog 是发生了闪退才会生成相应文件是吗? app 闪退后仍会重新跑知道完成 1000s 才停止吗?
嗯 app 闪退之后,监控线程就检测到了,然后会自动拉活待测的 app 然后继续跑 monkey。 除了退出还有跳转到其他 app 也会切回继续跑。
crashlog 会生成在 Attentment 目录里,让研发查查崩溃的堆栈看是否能定位闪退。
第二次,第三次会出这个错误?我有空了调试看看。
请问下,第一步执行 iproxy 8001 8001 命令,一直显示 waiting for connecting,是不是苹果手机需要越狱?;用 xcode 运行 XCTestWD 在真机上跑起来了,不过控制台没有输出。还有 devicename 就是苹果手机的 udid 吗?
iproxy 后显示 waiting for connecting 是对的,说明 8001 端口已经开始做映射了。 iphone 不需要越狱
需用 xcode 运行 XCTestWDUITests ,而不是 XCTestWD,运行成功控制台会显示 server 已启动并监控 8001
devicename 不是 udid 在 xcode 设备 info 里可以看到 是个 string
感谢大佬的细心指点,我大概理解了,不过还是想请问下 devicename 在 xcode 设备 info 里 是哪个 string
你这个是不是上一个 session 还在占用着端口,下一次测试就开始了。 感觉像是这样子, 这两天我再改下版。跳过 server 这环节 到时候再试试。
private func fetchPort() -> in_port_t {
let arguments = ProcessInfo.processInfo.arguments
let index = arguments.index(of: "--port")
var startingPort:Int = Int(portNumber())
if index != nil {
if index! != NSNotFound || index! < arguments.count - 1{
startingPort = Int(arguments[index!+1])!
}
}
var (isValid, _) = checkTcpPortForListen(port: in_port_t(startingPort))
while isValid == false {
startingPort = startingPort + 1
(isValid, _) = checkTcpPortForListen(port: in_port_t(startingPort))
}
return in_port_t(startingPort)
}
查了下代码 原因基本明了。server 启动时会检测端口是否被占用,如果占用则继续检测 +1 端口。直到有空闲端口
所以从 log 上看 你那里 8001 应该是上个 task 还在占用中,本次监测完可能已经建立 8002 连接了。
2017.08.29 update
XCTestWDMonkey.swift
public class XCTestWDMonkey {
func swiftmonkey() -> Int {
let bundleID = "com.pandatv.test.meizi" //修改bundleid 为待测app 即可
var app : XCUIApplication!
var session : XCTestWDSession!
let path :String? = nil
app = XCUIApplication.init(privateWithPath: path, bundleID: bundleID)!
app!.launch()
XCTextWDRunner.swift
class XCTextWDRunner: XCTestCase {
var serverMode = true // true 为原server 请求模式, false 为直接启动跑monkey模式
var server: XCTestWDServer?
var monkey: XCTestWDMonkey?
新增加的 XCTestWDMonkey.swift 项目中自行添加下
“再问一下可否做到多台设备一起测试”
已更新 应该可以支持你说的需求了 使用新 mode , xcodebuild 时用不同的 -destination 'platform=iOS,name=(your device name)'
这个就在 server 目录下,工程里自己添加下就行。 我本地开发用的另一套工程怕全拷过来又出最开头那个问题了。
左侧选 server。 File->Add Files to "XCTestWD" -> 选 XCTestWDMonkey.swift ->add
按照大神描述的设置完成后 项目运行无报错后
执行如下
xcodebuild -project XCTestWD.xcodeproj \
-scheme XCTestWDUITests \
-destination 'platform=iOS,name=xxxx' \
XCTESTWD_PORT=8001 \
clean test
结果一直报错如下
一直如此
报的错误是什么?
XCTestWDMonkey 我内编码的 bundleID 是我测试用的,这个你那修改的对吧?
你那里把 异常断点打开,再跑次看看崩到哪句里了
开启方法在 120 楼。exception 勾选上
这边为什么乘两次 1000?? 前面的 “0” 是默认 0 秒吗
那边 elapsedTime 时间到了后 终端输出的 log 也是
Testing failed:
Run test suite XCTextWDRunner encountered an error (Early unexpected exit, operation never finished bootstrapping - no restart will be attempted)
Failing tests:
-[XCTextWDRunner testRunner()]
** TEST FAILED **
这样的吗??
正常结束 什么样子的?
你那里是用新 mode 然后设的 elapsedtime = 0 了?
超时时 我直接 exit 了 所以 xctest 会认为 test failed 。是正常的。后续看看怎么改下 正常结束下
serverMode 设为了 false
elapsedtime = n * 1000 * 1000 (n 分别设置过 10000 或 30 等等 )
http://blog.csdn.net/totogo2010/article/details/8949440 按这个增加下崩溃断点。
跑下看具体崩溃到哪里了。
发现 elapsedtime 设置稍微大一些就会这样,比如 10000s 就会发生以上错误
THX 是个 bug。 U32int 越界了
elapsedtime =10000 就行,不用 *1000*1000 了
帮来个 215 楼那个带具体定位。 这个截图没法定位错误。
usleep 你这是老代码了。又新更新了,解决了 elapsedtime >10000 越界的问题。 你 update 新的再试试看?
DispatchQueue.global().async {
if self.elapsedTime != 0{
- usleep(useconds_t(self.elapsedTime))
+ Thread.sleep(forTimeInterval: TimeInterval(self.elapsedTime))
exit(0)
}
不应该呢,我 12 点多重新拉取了一次的,后来就是觉得是不是没更新好 在快两点的时候又重新拉取得呢
最后一次拉取的时候 以下部分显示的是 " 2 hours ago " 拉取方法是 git clone xxxx
我再一次通过另一种 download 的方式新拷下来了代码。
发现大神拷出来的这段代码是应该是在 174 行, 我上方断点部分的是在 203 行
这两段代码类似
经确认发现
Monkey.swift 文件中
174~177 行 代码为大神新修改的代码
203~207 行 代码仍为老代码
我将第二部分照着上方做了修改,目前已经打破无法跑过 8 秒的问题,已经跑了一段时间了!! 拜谢大神耐心回复
@zhangzhao_lenovo,求教大神,执行 xcodebuild -project XCTestWD.xcodeproj -scheme XCTestWDUITests -destination 'platform=iOS,name=lemon' XCTESTWD_PORT=8001 clean test 出现如下错误,求教如何解决,新手伸手党,惭愧~~
谢谢大神回复,这个设置我已经按照@yxys01 的扫盲帖子修改过了,如下图:还是不行,跟上面同样的错误,疑惑
哦。sorry 我 240 楼 回答错了。。
xctestwd 中的去掉,xctestwduitest 需要保留
"xctestwd 中没有用到 oc,swift 混编,header search path,objecktive-c bridging header 配置可去掉再试试。xctestwduitest 中用了混编才需要 xctestwduitest-bridging-header.h"
谢谢回复,依旧还是出现之前#237 楼我截图的那个错误, 我自己先搜搜看有没有解决方案,其他人有遇到或者知道解决方案的,帮忙回复下,万分感谢~
果不其然。 9.0 太超前了。你看下你那的 swift 版本用的是多少?
需修改为 swift3
hi 楼主 我装了个 8.3 的,xctestwd 运行成功了,但执行最后一个命令时,xctestwd 自动打开后闪一下就关闭了,然后就出现下图的错误,monkey 没有跑起来,辛苦帮忙再看下,感恩~🙏。另外我想问下,我时跑你的 demo 的,熊猫直播我真机上需要安装吗?
你上面图里输入的 curl 需要先装熊猫 tv 才能调启它跑 monkey 的。
或者 curl 里 bundleID 改成你自己要测试的 app
嗯 谢谢楼主,熊猫直播和熊猫主播版我都安装了,运行还是没跑起来 ,错误跟上面 #251 一样,我用我们自己要测的 app,也是同样的错误失败提示,xctestwd 一闪就关闭了。
我把 XCTestWDMonkey.swift.中 的 bundleID 修改成要测试的 app bundleID,也是老样子,
XCTestWDMonkey 是新 mode 用的。如果用 curl 就不用改 XCTestWDMonkey
你那里 iphone 上设备 - 通用 - 设备管理 - 开发者 信任了吗
是这个信任吗?下图的这个信任我是确认了的。还是说要在设置->通用->描述文件与设备管理 里去信任什么证书之类的东西?
hi 楼主,断点显示没有错误,如下图所示:
另外我在 xtestwd 页面加了个 button 看了下,运行后,进到这个 xcrtestwd 主页面之后就停留在这个页面了,然后就没有调起熊猫 tv
Xcode 显示:
手机端:
xtestwd 不用管的。就是个空壳
你看下 monkey.swift 里
public class Monkey {
let elapsedTime = 0 // ?s
let actionMax = 0
let throttle = 0 * 1000 // ?ms *1000
let randomize_throttle = false
这几个值设的多少?
还有这个
class XCTextWDRunner: XCTestCase {
var serverMode = true
var server: XCTestWDServer?
xctestwd 一闪就关闭了 是对的。
另外你那里 熊猫 tv app 启动就闪退了? 还是一点也没起来? 还是起来跑了一会再闪退的?
那这样吧。在 XCTestWDMonkeyController 里 随机加些断点,单步调试跑下 看看?
internal static func swiftmonkey(request: Swifter.HttpRequest) -> Swifter.HttpResponse {
var app : XCUIApplication!
var session : XCTestWDSession!
let desiredCapabilities = request.jsonBody["desiredCapabilities"].dictionary
let path = desiredCapabilities?["app"]?.string ?? nil
let bundleID = desiredCapabilities?["bundleId"]?.string ?? nil
if bundleID == nil {
app = XCTestWDSession.activeApplication()
} else {
app = XCUIApplication.init(privateWithPath: path, bundleID: bundleID)!
app!.launchArguments = desiredCapabilities?["arguments"]?.arrayObject as! [String]? ?? [String]()
app!.launchEnvironment = desiredCapabilities?["environment"]?.dictionaryObject as! [String : String]? ?? [String:String]();
app!.launch()
}
if app != nil {
session = XCTestWDSession.sessionWithApplication(app!)
XCTestWDSessionManager.singleton.mountSession(session)
try? session.resolve()
}
if app?.processID == 0 {
return HttpResponse.internalServerError
}
sleep(3)
NSLog("XCTestWDSetup->start fastmonkey<-XCTestWDSetup")
_ = app.descendants(matching: .any).element(boundBy: 0).frame
let monkey = Monkey(frame: app.frame)
monkey.addDefaultXCTestPrivateActions()
monkey.addXCTestTapAlertAction(interval: 100, application: app)
monkey.addXCTestCheckCurrentApp(interval: 10, application: app)
//monkey.addXCTestAppLogin(interval: 50, application: app)
monkey.monkeyAround()
不是,我试了两台:iPhone6s 10.0.2, iPhone6 10.3.2 你用的是多少的,我换个一样的看下
我在 private func registerRouters() 打了个断点,貌似这个方法都没调起来,XCTestWDMonkeyController 也没进去,心塞~
这个... 貌似是 XCTestWD 系统限制了没起来?? 还是回到原点 看看开发者账号那块是不是有什么问题?
hi 楼主,又来麻烦你了,我在 XCTestWDMonkeyController 里打了断点,发现到下图所示的位置后,继续执行就自动跳出去了,然后就一直不再往下执行了。
这里只是注册一些路由的回调,你那控制台 log 里有 XCTestWDSetup->http://localhost:8001 这段吗?
如果有表示 server 启动成功了
嗯,谢谢楼主回复,有看到,启动 xctestwd 后,就一直停在这个位置了,然后就没有然后了 ,我自己慢慢调调看吧,谢谢楼主,辛苦
2017-09-04 14:05:18.752445 XCTRunner[14430:5896095] Running tests...
2017-09-04 14:05:20.780470 XCTRunner[14430:5896095] Continuing to run tests in the background with task ID 1
Test Suite 'All tests' started at 2017-09-04 14:05:21.378
Test Suite 'XCTestWDUITests.xctest' started at 2017-09-04 14:05:21.379
Test Suite 'XCTextWDRunner' started at 2017-09-04 14:05:21.380
Test Case '-[XCTestWDUITests.XCTextWDRunner testRunner]' started.
t = 0.00s Start Test at 2017-09-04 14:05:21.381
t = 0.00s Set Up
2017-09-04 14:05:21.412191 XCTRunner[14430:5896095] com.apple.test.XCTestWDUITests-Runner
2017-09-04 14:05:21.412314 XCTRunner[14430:5896095] XCTestWDSetup->http://localhost:8001<-XCTestWDSetup
谢谢楼主提供的源码,我的问题解决了,现在可以跑起来了,发现问题竟然出现在设备名的命名上,我把我全英文字符的设备名改成 xx's iphone,竟然跑起来了,但是没搞明白为什么会这样。
build 一直卡在这个地方
/bin/sh -c /Users/myName/Library/Developer/Xcode/DerivedData/XCTestWD-bskdnjihiujjaraablsvmjfcodst/Build/Intermediates/XCTestWD.build/Debug-iphoneos/XCTestWDUITests.build/Script-7FA43F311F0CB57400FB2332.sh
ecab65eca01ae1d42874c26e645a33aee78296b6 ecab65eca01ae1d42874c26e645a33aee78296b6
这个脚本是不是需要网络?之后莫名奇怪的好了。
@zhangzhao_lenovo swipe 事件源码在哪个位置?表示看不懂 swift 代码
没有直接的 swipe 事件
drap 事件、多次 tap 事件 也能达到 swipe 效果
内部调的都是 私有的 api sharedXCEventGenerator.pressAtPoint
目前 time 可以设置 见 172 楼
不设则一直 monkey, 我测试一直跑到 iphone 卡死
请问你用多台设备测试成功了吗?我这边用 xcodebuild 方式,在 iproxy 中添加了 serialid 之后,再通过 curl 会提示 number of avaible devices == 2,是因为 curl 中的内容填写的不正确吗?
xcodebuild 设置不同的 deviceName 也不行,iproxy 8001 8001 serialid xxx 设置了之后,curl 运行之后提示 number of available devices == 2,不知道是哪里出错了,大神能不能说的更详细一些呢?
多台设备的话 别用 server 模式了。也就不用 iproxy 了。 直接用新 mode。见 191 楼
新 mode 直接内编码直接启 monkey,跳过了 server 及插入命令的过程。
跑多台设备的话,xcodebuild -project XCTestWD.xcodeproj -scheme XCTestWDUITests -destination 'platform=iOS,name=xxx' XCTESTWD_PORT=8001 clean test,还是用这个命令吗?这个 destination 将 name=xxx 修改成另一台设备的名字即可对吧?这个 port 需要做修改吗?
嗯 还是的。 port 可以不用。带上也没事
只修改了 name 的字段之后,在跑第二台设备的时候,是一台 5C 设备,系统是 10.3.3,先跑起来了,然后出现了这个异常:
t = 8.19s Find the Application "com.xxx" 0x15e064c0
t = 8.19s Snapshot accessibility hierarchy for com.xxx
2017-09-11 15:23:11.219048+0800 XCTRunner[314:39254] XCTestWDSetup->start fastmonkey<-XCTestWDSetup
t = 13.78s Find the Any
t = 13.79s Use cached accessibility hierarchy for com.xxx
t = 13.79s Find: Descendants matching type Any
t = 13.80s Find: Element at index 0
t = 13.81s Find the Application "com.xxx" 0x15e064c0
t = 13.81s Use cached accessibility hierarchy for com.xxx
XCTRunner(314,0x3b7b1e40) malloc: *** mach_vm_map(size=1363546112) failed (error code=3)
*** error: can't allocate region
*** set a breakpoint in malloc_error_break to debug
2017-09-11 15:23:20.310614+0800 XCTRunner[314:39254] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSXPCEncoder checkObject:]: This coder only encodes objects that adopt NSSecureCoding (object is of class 'NSMallocBlock_').'
*** First throw call stack:
(0x1dfdbb3d 0x1d263067 0x1dfdba85 0x1e836ecd 0x1e836c2f 0x2cad7d 0x1e837421 0x1e837833 0x1e837597 0x1e837421 0x1ea1715f 0x1ea16883 0x1e836809 0x1dfdef63 0x1df07dc8 0x2da867 0x240dd8c 0x2445fe8 0x244606c 0x244526c 0x2444ad4 0x2443ed8 0x1d6b4067 0x1d6b8d77 0x1d6a9783 0x1d6add05 0x1df97d69 0x1df95e19 0x1dee91af 0x1dee8fd1 0x1e83daf5 0x1e88adb9 0x24040ac 0x2453644 0x24536b0 0x1dfe0354 0x1df042b9 0x2d06bd 0x311099 0x2d0295 0x30912b 0x2cffeb 0x2d0a39 0x2cdc23 0x2cd74b 0x2cd9bf 0x2cdc23 0x2cd74b 0x2cd9bf 0x2cdc23 0x2cd74b 0x2cd9bf 0x3160cb 0x2dc279 0x315f63 0x2b962b 0x30c439 0x1df97f15 0x1df97925 0x1df95f47 0x1dee91af 0x1dee8fd1 0x1f693b41 0x23271a53 0xf6fc5 0x1d6d64eb)
这个错误是代表有些区域获取结构的时候出现了异常吗?
mach_vm_map(size=1363546112) failed (error code=3)
*** error: can't allocate region
内存 ran out 了?
XCTRunner(242,0x3b9c9e40) malloc: *** mach_vm_map(size=1363546112) failed (error code=3)
*** error: can't allocate region
*** set a breakpoint in malloc_error_break to debug
2017-09-11 17:00:07.105276+0800 XCTRunner[242:6204] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSXPCEncoder checkObject:]: This coder only encodes objects that adopt NSSecureCoding (object is of class 'NSMallocBlock_').'
这个 mach_vm_map 括号里面的 size 值都是一样的,基本都是刚起来到了某一个页面加载页面的时候出现的
每步执行截图如何保存,runner 没有权限写相册。另外截图量太大,对手机硬盘是个考验,大神们有何看法
好像跟是不是单机没关系,而且后来再跑的时候,不知道是不是因为没有正常结束,会出现这个错误提示:
), NSLocalizedRecoverySuggestion=Too many instances of this service are already running., NSLocalizedDescription=Too many instances of this service are already running.}
2017-09-11 17:51:19.038 xcodebuild[97561:2368496] Error Domain=IDETestOperationsObserverErrorDomain Code=6 "Early unexpected exit, operation never finished bootstrapping - no restart will be attempted" UserInfo={NSLocalizedDescription=Early unexpected exit, operation never finished bootstrapping - no restart will be attempted}
Testing failed:
Test target XCTestWDUITests encountered an error (Early unexpected exit, operation never finished bootstrapping - no restart will be attempted)
** TEST FAILED **
ok 这次明白了。 这台 5c 支持的有问题,你在 github 上提交个 issue 简单说下问题吧,我这先记录下。但是我没有 5c 具体原因不是很确定
截图无非是用来查看 crash 前一些截图 及 log 来分析崩溃场景。
所以无需大量保存截图,只需保留 crash 前十几张即可。
我在代码中增加了手动造了一个崩溃,具体如下:
在 Delegate.m 中添加: self.window.rootViewController = self.tabBarController; self.window.backgroundColor = [UIColor orangeColor]; [self.window makeKeyAndVisible]; [NSTimer scheduledTimerWithTimeInterval:5 target:self selector:@selector(test) userInfo:nil repeats:NO]; NSMutableArray *array1 = [NSMutableArray array]; self.array = array1; return YES; 并且添加函数: - (void) test{ [self.array addObject:@"1"]; }
然后运行之后出现错误:(一般是在 app 自己卡住出现了崩溃的情况下会出现下面这样的错误)
t = 42.96s Snapshot accessibility hierarchy for com.xxx
2017-09-12 15:22:03.469370 XCTRunner[404:27133] *** Terminating app due to uncaught exception '_XCTestCaseInterruptionException', reason: 'Interrupting test' *** First throw call stack: (0x184cb41c0 0x1836ec55c 0x184cb4108 0x1001db1f0 0x1001f17c0 0x10021769c 0x1001e1d2c 0x100217484 0x100216748 0x100214214 0x1001e1d2c 0x100214174 0x1008ac8a8 0x1008d80a8 0x1008d7434 0x1008d6d08 0x10089e860 0x183b48dd4 0x183b3d1c0 0x183b4e0c4 0x183b3d1c0 0x183b41d6c 0x184c61f2c 0x184c5fb18 0x184b8e048 0x18569cb1c 0x1856f12a0 0x10089fd20 0x1008e2f00 0x1008e2f54 0x184cba160 0x184badc3c 0x1001dca30 0x1001dc67c 0x100217dac 0x1001dc430 0x1001dcd80 0x1001d9f44 0x1001d9b64 0x1001d9d54 0x1001d9f44 0x1001d9b64 0x1001d9d54 0x1001d9f44 0x1001d9b64 0x1001d9d54 0x100225a14 0x1001e88dc 0x100225894 0x1001c4f70 0x10021b6f8 0x184c62160 0x184c6195c 0x184c5f7b0 0x184b8e048 0x186611198 0x18ab67818 0x18ab62550 0x10009c474 0x183b705b8) libc++abi.dylib: terminating with uncaught exception of type _XCTestCaseInterruptionException
....
2017-09-12 15:22:09.940061 XCTRunner[419:27958] Running tests...
2017-09-12 15:22:10.819493 XCTRunner[419:27958] Continuing to run tests in the background with task ID 1 Restarting after unexpected exit or crash in XCTextWDRunner/testRunner(); summary will include totals from previous launches. Test Suite 'Selected tests' started at 2017-09-12 15:22:11.419
Test Suite 'XCTestWDUITests.xctest' started at 2017-09-12 15:22:11.422
Test Suite 'XCTestWDUITests.xctest' failed at 2017-09-12 15:22:11.423.
Executed 1 test, with 1 failure (0 unexpected) in 0.000 (0.001) seconds Test Suite 'Selected tests' failed at 2017-09-12 15:22:11.426.
Executed 1 test, with 1 failure (0 unexpected) in 0.000 (0.007) seconds Failing tests: -[XCTextWDRunner testRunner()]
** TEST FAILED **
修改了新的 mode,然后用 xcodebuild -project XCTestWD.xcodeproj -scheme XCTestWDUITests -destination 'platform=iOS,name=a' -destination 'platform=iOS,name=b' clean test,只能 run 起来 a 设备,b 设备还是没有 run 起来。
修改了下运行时间,发现是 a 运行结束后,b 才开始运行。
但是一修改运行时间,就会报错。
dump 生成了,但是并不是在 attachments 的路径下,我们接了友盟的 sdk,直接 crash 信息传到了友盟的平台上~
@zhangzhao_lenovo @zwdlp520
二位,你们谈到的 5c 会报 too many instances of this service are already running 据了解是一个 32 位设备的坑,目测短期内是不会修复了。解决办法很简单粗暴 重启
之前碰到的时候 google 过一圈,大概有印象。当时出问题的机器也是 5c 和一台 32 位的 iPad,出处翻了一下没看到,可以看一下这个:https://stackoverflow.com/questions/39464682/dtdevicekit-could-not-start-house-arrest-service-for-app-identifier-xxx 不过下面有人说 6s 也碰到了,我这边是没有发现过。
我也遇到这个问题了,断线,重启都试过了但是还不行,之前跑的还行,今天就不行
2017-09-15 11:02:02.599535+0800 XCTRunner[351:31926] Running tests...
2017-09-15 11:02:03.647275+0800 XCTRunner[351:32001] Connection peer refused channel request for "dtxproxy:XCTestDriverInterface:XCTestManager_IDEInterface"; channel canceled
Failed to run tests: The operation couldn’t be completed. (DTXProxyChannel error 1.)
这个错,试了很多办法,重启也不行,我两个手机都好好的,两个 ipad 就这个错误
hi,楼主,又来麻烦你了。我已经按照 44 楼配置了登录,但是这边,已经运行到 addXCTestLoginAction 这个方法,但是并没有像预期一样输入账号和密码。。请问是怎么回事呢?
如果是运行到 addXCTestLoginAction 的话会立即插入登录事件序列的
你在 public func addXCTestLoginAction(application:XCUIApplication) 这个函数里加些断点调试看看跑到哪了?
@zhangzhao_lenovo ,出现了
recv failed:Resource temporarily unavailable
recv failed:Operation not permitted
请教怎么解决
@zhangzhao_lenovo fastmonkey 经常有 crash 呢
Restarting after unexpected exit or crash in XCTextWDRunner/testRunner(); summary will include totals from previous launches.
Test Suite 'Selected tests' started at 2017-09-13 09:30:01.476
Test Suite 'XCTestWDUITests.xctest' started at 2017-09-13 09:30:01.481
Test Suite 'XCTestWDUITests.xctest' failed at 2017-09-13 09:30:01.483.
Executed 1 test, with 2 failures (0 unexpected) in 0.000 (0.001) seconds
Test Suite 'Selected tests' failed at 2017-09-13 09:30:01.486.
Executed 1 test, with 2 failures (0 unexpected) in 0.000 (0.010) seconds
Failing tests:
-[XCTextWDRunner testRunner()]
-[XCTextWDRunner testRunner()]
** TEST FAILED **
我的总是这样的,我有时候几百秒就会崩溃。。。
跑的时候尽量少切换 app. 目前我研究的来看 xcode9 可以大致避免此问题了。争取 10.1 前后完成迁移提新版
已知是有一个概率性的崩溃存在。问题根源在于私有 api 只能在主线程中跑,而本该是于 monkey 并行的退出检测也就是那个 check app 目前是于 monkey 主体串行抢占式执行。另外 checkapp 那个函数为避免拉长整个 action 执行时间 特意做的非常快 大概只消耗 20-30ms. 此两个问题就会存在一种情况 检测时 app 还没退出完认为是在前台,但之后某些 action 时取 app。就此时 app 退出了就取不到了于是崩溃 ,另外一种反之 目测你这个崩溃就是后者
目前调研情况看可将退出检测改为非私有 api 也就是切换到 xcode9
升级到 xcode9 后 一直报这个错
/Users/jackyoung/Documents/Monkey/Fastmonkey/XCTestWD-master/XCTestWD/XCTestWDUITests/PrivateHeaders/XCUIApplication.h:37:1: error: type of property 'unsigned long long' in class extension does not match property type in primary class
1 error generated.
<unknown>:0: error: failed to emit precompiled header '/Users/jackyoung/Library/Developer/Xcode/DerivedData/XCTestWD-ecleedtsdbxztvfcvaqqgwnsgqxl/Build/Intermediates.noindex/PrecompiledHeaders/XCTestWDUITests-Bridging-Header-swift_HD8S09YT7455-clang_3F4FDQP5SKX2L.pch' for bridging header '/Users/jackyoung/Documents/Monkey/Fastmonkey/XCTestWD-master/XCTestWD/XCTestWDUITests/XCTestWDUITests-Bridging-Header.h'
是暂时不支持 xcode9 下跑吗
xcode9 我还在升级 ing,很多代码估计都得重写。 苹果一贯如此
你们那还是先用 xcode8 吧。等兼容后再发个 for xcode9
多谢 不过再安装一个 xcode8 后(终端已转到 xcodebuild8)跑 monkey 报错
Tests -emit-module-path /Users/jackyoung/Library/Developer/Xcode/DerivedData/XCTestWD-ecleedtsdbxztvfcvaqqgwnsgqxl/Build/Intermediates/XCTestWD.build/Debug-iphoneos/XCTestWDUITests.build/Objects-normal/arm64/XCTestWDRunner~partial.swiftmodule -emit-dependencies-path /Users/jackyoung/Library/Developer/Xcode/DerivedData/XCTestWD-ecleedtsdbxztvfcvaqqgwnsgqxl/Build/Intermediates/XCTestWD.build/Debug-iphoneos/XCTestWDUITests.build/Objects-normal/arm64/XCTestWDRunner.d -emit-reference-dependencies-path /Users/jackyoung/Library/Developer/Xcode/DerivedData/XCTestWD-ecleedtsdbxztvfcvaqqgwnsgqxl/Build/Intermediates/XCTestWD.build/Debug-iphoneos/XCTestWDUITests.build/Objects-normal/arm64/XCTestWDRunner.swiftdeps -o /Users/jackyoung/Library/Developer/Xcode/DerivedData/XCTestWD-ecleedtsdbxztvfcvaqqgwnsgqxl/Build/Intermediates/XCTestWD.build/Debug-iphoneos/XCTestWDUITests.build/Objects-normal/arm64/XCTestWDRunner.o
/Users/jackyoung/Documents/Monkey/Fastmonkey/XCTestWD-master/XCTestWD/XCTestWDUITests/XCTestWDRunner.swift:15:17: error: use of undeclared type 'XCTestWDMonkey'
var monkey: XCTestWDMonkey?
^~~~~~~~~~~~~~
/Users/jackyoung/Documents/Monkey/Fastmonkey/XCTestWD-master/XCTestWD/XCTestWDUITests/XCTestWDRunner.swift:34:27: error: use of unresolved identifier 'XCTestWDMonkey'
self.monkey = XCTestWDMonkey()
^~~~~~~~~~~~~~
/Users/jackyoung/Documents/Monkey/Fastmonkey/XCTestWD-master/XCTestWD/XCTestWDUITests/server/XCTestWDServer.swift:12:14: note: did you mean 'XCTestWDServer'?
public class XCTestWDServer {
^
/Users/jackyoung/Documents/Monkey/Fastmonkey/XCTestWD-master/XCTestWD/XCTestWDUITests/XCTestWDRunner.swift:12:7: note: did you mean 'XCTextWDRunner'?
class XCTextWDRunner: XCTestCase {
^
XCTest.XCTestToolKey:2:12: note: did you mean 'XCTestToolKey'?
public let XCTestToolKey: String
^
/Users/jackyoung/Documents/Monkey/Fastmonkey/XCTestWD-master/XCTestWD/XCTestWDUITests/server/models/XCTestWDReponse.swift:13:16: note: did you mean 'XCTestWDResponse'?
internal class XCTestWDResponse {
^
CompileSwift normal arm64 /Users/jackyoung/Documents/Monkey/Fastmonkey/XCTestWD-master/XCTestWD/XCTestWDUITests/server/models/XCTestWDErrors.swift
cd /Users/jackyoung/Documents/Monkey/Fastmonkey/XCTestWD-master/XCTestWD
2017-09-25 21:54:51.572 xcodebuild[51273:4449473] Error Domain=IDETestOperationsObserverErrorDomain Code=4 "Test operation was canceled. If you believe this error represents a bug, please attach the log file at /Users/jackyoung/Library/Developer/Xcode/DerivedData/XCTestWD-ecleedtsdbxztvfcvaqqgwnsgqxl/Logs/Test/0328CE33-5065-4FC7-A363-733A1989A4F8/Session-XCTestWDUITests-2017-09-25_215442-aWwF1c.log" UserInfo={NSLocalizedDescription=Test operation was canceled. If you believe this error represents a bug, please attach the log file at /Users/jackyoung/Library/Developer/Xcode/DerivedData/XCTestWD-ecleedtsdbxztvfcvaqqgwnsgqxl/Logs/Test/0328CE33-5065-4FC7-A363-733A1989A4F8/Session-XCTestWDUITests-2017-09-25_215442-aWwF1c.log}
Testing failed:
Use of undeclared type 'XCTestWDMonkey'
Use of unresolved identifier 'XCTestWDMonkey'
** TEST FAILED **
The following build commands failed:
CompileSwift normal arm64 /Users/jackyoung/Documents/Monkey/Fastmonkey/XCTestWD-master/XCTestWD/XCTestWDUITests/XCTestWDRunner.swift
CompileSwiftSources normal arm64 com.apple.xcode.tools.swift.compiler
(2 failures)
XCTestWDMonkey 这个文件需要手动添加下。方法见 github 里的 issue
Hi,楼主 我试着跑了一下自己的 app 但是每次跑到同样的地方 (如上图) 都会崩溃,app 闪退,测试程序也退出了,显示 TEST FAILED.试着打断点看了一下,是下图这个位置崩了
想问下楼主是什么问题呢 谢谢
你这个问题还真没见过呢。 怎么 app 弹了 2 个悬浮窗。 崩溃位置大概是检测到有悬浮窗弹出,点击 button 时出现异常了。我初步估计是 2 个悬浮窗引起的。 你 qq 多少?
@zhangzhao_lenovo 楼主有没有 XCTestWD 的 web 接口文档啊,我最近想用 XCTestWD 做点东西
@zhangzhao_lenovo 新问题新问题!!!
每次都卡在这里然后就失败退出了!!
尴尬 报这个错误
Module compiled with Swift 3.1 cannot be imported in Swift 3.2
我已经 carthage update 还是不行
那几个三方库都 carthage update --no-use-binaries 下 应该就成
你那里问题解决了吗? 我查了下 应该就是 carthage update --no-use-binaries 就可以解决。
@shinetony 有一个扫盲的帖子你搜一下
还是报 Module compiled with Swift 3.1 cannot be imported in Swift 3.2 ??
这样,你把这几个三方库都先移到其他目录下 然后重新再执行下 carthage update --no-use-binaries
我把 Carthage 文件夹删除在执行的还是不行 Module compiled with Swift 3.1 cannot be imported in Swift 3.2
@zhangzhao_lenovo 有兴趣搞一下遍历不
遍历也是有利有弊的,每个控件只点一次,如果当点多次才出现崩溃时遍历也就发现不了问题了。
实际上遍历也好随机也好都最终归结为森林中树节点路径的选择算法,目前我正在搞些选择算法,需要先在 android 上调整使用。
更理想的做法是结合一些大数据分析来学习拟合出一些选择算法,这样带有历史回溯的才更有威力。
楼主 我下载了最新的 xctestwd 然后编译的时候报错
Showing Recent Errors Only
ld: /usr/local/lib/node_modules/xctestwd/Carthage/Build/iOS/Swifter.framework/Swifter compiled with newer version of Swift language (unknown ABI version 0x05) than previous files (3.0) for architecture armv7
Showing Recent Errors Only
clang: error: linker command failed with exit code 1 (use -v to see invocation)
请问是什么问题呢
swift 选 3 先别用 4 了。
楼主说的是 build settings 里 swift language version 选 3
XcTestWDUITests 的 Build Settings ->swift language version 选 swift 3.2
把几个三方库都先移到其他目录下 然后重新再执行下 carthage update --no-use-binaries
pluiedeMac-mini:xctestwd root2$ carthage update --no-use-binaries
Failed to read file or folder at /usr/local/lib/node_modules/xctestwd/Cartfile: Error Domain=NSCocoaErrorDomain Code=260 "The file “Cartfile” couldn’t be opened because there is no such file." UserInfo={NSFilePath=/usr/local/lib/node_modules/xctestwd/Cartfile, NSUnderlyingError=0x7f9922e3a460 {Error Domain=NSPOSIXErrorDomain Code=2 "No such file or directory"}}
报这个错 楼主
/usr/local/lib/node_modules/xctestwd/ 这个目录下执行试试?
删了也行。移出去就有个备份。
嗯。build 这个目录重命名下再执行试试
报错 没有 Cartfile 这个文件夹 然后我新建了一个 给了 777 的权限 现在又说我没有权限打开这个文件夹
??? XCTestWD-master 目录下应该有 cartfile 文件的啊。 你哪里怎么没有了? 不行从 github 上再拉下
楼主,server 起不起来,编译都通过。
xcode9 + 最新拉下来的变异报错如下,没有找到 XCTestWDApplication,我在文件中找到了这个文件加到项目中,仍然报错,XCTestWDApplication 这个是 oc 代码
XCTestWDUITests\XCTestWDUITests-Bridge-Header.h 缺少 #import "XCTestWDApplication.h"
https://github.com/zhangzhao4444/Fastmonkey/tree/xcode8.3 8.3 的需要下这个分支上的 code. 最新那个是支持 xcode9 的 api 不兼容
楼主,我又重新下载了一遍,XCTestWDUITests 这个编译出错
你这个还是 xcode9 分支的版本。。下的不对啊 。
8.3 的 应该是
@property(readonly, nonatomic) UIInterfaceOrientation interfaceOrientation; //TODO tvos
@property(readonly, nonatomic) BOOL running;
@property(nonatomic) pid_t processID; // @synthesize processID=_processID;
@property unsigned long long state; // @synthesize state=_state;
@property(readonly) XCAccessibilityElement *accessibilityElement;
楼主 我在编译最新的 xctestwd 的时候报这个错
Showing Recent Errors Only
/usr/local/lib/node_modules/XCTestWD-master/XCTestWD/XCTestWDUITests/PrivateHeaders/XCUIApplication.h:37:11: Unknown type name 'XCUIApplicationState'; did you mean 'UIApplicationState'?
xcode9.0 还是 8.3?
嗯 我拉出分支了。
9.0 的可以用最新代码
8.3 的 从 https://github.com/zhangzhao4444/Fastmonkey/tree/xcode8.3 这个分支下。
两者区别
1 做了 api 从 8.3 迁移到 9.0 苹果自己的不兼容。
2 退出检测及切回用了 9.0 提供的新 api ,机制上应该相对稳定。
deleteSession deleteSession 这个方法写的有点问题 如果是本地应用 就是没有启动 app 的时候
直接调 terminate 方法会抛异常 导致 xctestwd 挂掉
let a = sessionMapping[sessionId]?.application.bundleID;
if sessionMapping[sessionId]?.application.running==true && !(a?.contains("local"))! {
sessionMapping[sessionId]?.application.terminate()
}
这样写 可以
static func routes() -> [(RequestRoute, RoutingCall)] {
return [(RequestRoute("/wd/hub/session", "post"), createSession),
(RequestRoute("/wd/hub/sessions", "get"), getSessions),
(RequestRoute("/wd/hub/session/:sessionId", "delete"), delSession)]
deletesession 似乎只有这里可以调用,而且是启动 server 以后才有入口的。 monkey 里我没有调用这个
哦。可以调试试试看
XCTRunner[276:35059] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSXPCEncoder checkObject:]: This coder only encodes objects that adopt NSSecureCoding (object is of class 'NSMallocBlock_').'
*** First throw call stack:
@zhangzhao_lenovo @1717p @zwdlp520 你们有碰到这个异常吗?
这个是与 32 位机器有关? 我在 32 位机器,高概率遇到这个异常。
xcode9 遇到这样的异常。
@zhangzhao_lenovo 大神请教一下 Bundle ID 可以做到外传吗 在终端的执行命令里传进去
$curl -X POST -H "Content-Type:application/json" -d "{\"desiredCapabilities\":{\"deviceName\":\"xxxx\",\"platformName\":\"iOS\", \"bundleId\":\"com.PandaTV.Live-iPhone\",\"autoAcceptAlerts\":\"false\"}}" http://127.0.0.1:8001/wd/hub/monkey
说的是指 server 模式?
还是非 server 模式 把 XCTestWDMonkey.swift 里的 bundleid 参数化?
XCTRunner[276:35059] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSXPCEncoder checkObject:]: This coder only encodes objects that adopt NSSecureCoding (object is of class 'NSMallocBlock_').'
*** First throw call stack:
@zhangzhao_lenovo @1717p @zwdlp520 你们有碰到这个异常吗?
这个是与 32 位机器有关? 我在 32 位机器,高概率遇到这个异常。
这个异常有解决方案吗?
XCTestWD 升级最新版,支持最新 Xcode
请问出现这个错误,怎么解决,感觉是 XCTestWDSession.swift 中有地方需要加 try 之类
@zhangzhao_lenovo Hi 楼主,Xcode8 升级到 xcode9, git 最新代码,有个错误, 请教如何解决,谢谢🙏~
Xcode:Version 9.1 (9B55)
Mac OS:macOS High Sierra 版本:10.13.1
楼主 有没有遇到这种报错:打开某个 UI 控件真机卡死
Enqueue Failure: Failure getting snapshot Error Domain=XCTDaemonErrorDomain Code=9 "Error -25204 getting snapshot for element {pid=2597}" UserInfo={NSLocalizedDescription=Error -25204 getting snapshot for element {pid=2597}}
Library/Developer/Xcode/DerivedData/XCTestWD-cdhrejtailslktczrbnqaylvvwyv/Build/Products/Debug-iphoneos/XCTestWD.app/Frameworks/Swifter.framework: unknown error -1=ffffffffffffffff
Command /bin/sh failed with exit code 1
大神,为什么我 xcode 编译 一直报这个错误,是签名的问题吗
我本地调试出现过 事件太快太多 真机会阻塞住,暂停 monkey 后是可以恢复,但没有固定某个控件
加我个 q 回头调式看看
谢谢楼主,这几天项目上太忙,没有登录论坛,抱歉~ 刚重新 git 了你的代码,这个问题已经解决了,楼主 ,再次感谢~
不错~
大神好,我在运行 xcodebuild 命令时,报错如下图:
xcode:9.1(9B55)
mac os:10.13
ios:11.2
然后我 import XCTest,上面的报错没有了,新增两个报错如下图:
请问应该怎么解决呢?
谢谢指点
关于登录输入用户密码等的业务操作
1.XCTestWDMonkeyController.swift 里先开启 Login 事件
2.MonkeyXCTest.swift 修改 addXCTestAppLogin 中 登录的关键点
3.MonkeyXCTestPrivate.swift 中修改 对应登录事件逻辑
嗨咯楼主的工具不错呀,求 QQ 或者微信交流
你好,请问跑完的日志保存在哪呢,我看了上面的评论,xcode 里并没有打印日志的保存路径
### 已解决~
踩坑帖的操作都做齐了,运行 xcodebuild 的时候会报如下错误:
Testing failed:
Use of undeclared type 'XCUIElement'
Use of undeclared type 'XCElementSnapshot'
Use of undeclared type 'XCUIApplication'
Use of undeclared type 'XCUIApplication'
Cannot invoke 'XCUIApplication.Type.init' with an argument list of type '(privateWithPath: String?, bundleID: String?)'
Use of undeclared type 'XCUIApplication'
Value of type 'XCUIApplication' has no member 'processID'
Use of undeclared type 'XCUIApplication'
Use of undeclared type 'XCUIElement'
Cannot invoke 'XCUIApplication.Type.init' with an argument list of type '(privateWithPath: String?, bundleID: String?)'
Value of type 'XCUIApplication' has no member 'processID'
** TEST FAILED **
The following build commands failed:
CompileSwift normal x86_64 /Users/micky/Fastmonkey/XCTestWD-master/XCTestWD/XCTestWDUITests/server/controllers/Random.swift
CompileSwift normal x86_64 /Users/micky/Fastmonkey/XCTestWD-master/XCTestWD/XCTestWDUITests/server/controllers/XCTestWDSessionController.swift
CompileSwift normal x86_64 /Users/micky/Fastmonkey/XCTestWD-master/XCTestWD/XCTestWDUITests/server/controllers/XCTestWDMonkeyController.swift
CompileSwift normal x86_64 /Users/micky/Fastmonkey/XCTestWD-master/XCTestWD/XCTestWDUITests/server/controllers/XCTestWDTitleController.swift
CompileSwiftSources normal x86_64 com.apple.xcode.tools.swift.compiler
(5 failures)
xcode 9.2
@zhangzhao_lenovo 麻烦这个怎么解决呢
你好,每次运行都失败(xcode 9.2),请问是什么原因呢@zhangzhao_lenovo
您好,请问现在支持特定步骤的测试吗,比如自动打开 app 后去登录流程,而不是现在随机点@zhangzhao_lenovo
请问@zhangzhao_lenovo,FastMonkey 的手势从屏幕顶端向下滑,把消息屏打开后,如何 dismiss 掉?
监听 com.apple.springboard.lockcomplete 消息,会回调多次,实现起来有问题。
性能数据那部分,可以分享下么?
使用 serve 模式,执行第二个命令行时报错
Use of undeclared type 'XCUIElement'
Use of undeclared type 'XCElementSnapshot'
Use of undeclared type 'XCUIApplication'
Use of undeclared type 'XCUIApplication'
这怎么解决的啊?
请问各路大神,按照同样的输入登录文本方法,能对下图这类有光标的场景生效吗?
我的 xpath 是这样定位的
let username = "//*[@value='请输入邮箱']"
会有问题吗?
大家都没遇到 点到一个死胡同无法返回的问题么?
小白,不会写 OC,就想问下,有没有统计性的报告
还有就是如果想在崩溃的地方再做些操作是否可行?
想问下,没有设置具体的执行时间,最终跑完 30min 左右就停止了,有人是这样的么
你好,大神~
这种情况我也遇到过,如果 App 中有外链,经常点到外链进入别的 web 后,无法返回,在那哪里可以控制?如果遇到外链,发送发烧 action 后,就回到主应用?
2018-09-10 10:44:02.754 XCTestWDUITests-Runner[845:257725] Running tests...
2018-09-10 10:44:04.463 XCTestWDUITests-Runner[845:257725] Continuing to run tests in the background with task ID 1
Restarting after unexpected exit or crash in XCTextWDRunner/testRunner(); summary will include totals from previous launches.
Test Suite 'Selected tests' started at 2018-09-10 10:44:07.125
Test Suite 'XCTestWDUITests.xctest' started at 2018-09-10 10:44:07.130
Test Suite 'XCTestWDUITests.xctest' failed at 2018-09-10 10:44:07.133.
Executed 1 test, with 1 failure (0 unexpected) in 0.000 (0.002) seconds
Test Suite 'Selected tests' failed at 2018-09-10 10:44:07.142.
Executed 1 test, with 1 failure (0 unexpected) in 0.000 (0.017) seconds
Test session log:
/var/folders/64/xr7d0qtj6r1_7x6b18rldjs80000gn/T/com.apple.dt.XCTest/IDETestRunSession-BDB191DF-76BE-4CDB-9719-4A1F5CC44870/XCTestWDUITests-10517542-5112-42E6-9B1E-54E54FE04923/Session-XCTestWDUITests-2018-09-10_104358-KZDbi8.log
求助大神为什么我的日志跑完每次都这样的,都是两个错误,然后我的 APP 闪退了也没有记录的,这个日志给开发看开发也看不懂,感觉日志没什么用,希望大神指出错误。
如果是设定 Monkey 时长,跑完会报这个错误,可忽略,一直没改的问题
app 闪退 可查看崩溃 dump,把 dump 给研发
请问大神崩溃 dump 在哪里找呢,
Test session log:
/var/folders/64/xr7d0qtj6r1_7x6b18rldjs80000gn/T/com.apple.dt.XCTest/IDETestRunSession-90B06898-71AD-41D5-B312-D0BC35FC0905/XCTestWDUITests-81700BC4-584E-4985-AF94-C7A416D4EF15/Session-XCTestWDUITests-2018-09-11_151624-Srj7Hl.log
从这个 xocde 日志给的路径里面的 log,看不出来什么问题,是我没有配置好吗。
public class Monkey {
let elapsedTime = 60 // ?s
let actionMax = 0
let throttle = 10 * 1000 // ?ms *1000
let randomize_throttle = false
我的参数是这样的,麻烦了。
Testing failed:
Use of undeclared type 'XCUIElement'
Use of undeclared type 'XCElementSnapshot'
Use of undeclared type 'XCUIApplication'
Use of undeclared type 'XCUIApplication'
Cannot invoke 'XCUIApplication.Type.init' with an argument list of type '(privateWithPath: String?, bundleID: String?)'
Use of undeclared type 'XCUIApplication'
Value of type 'XCUIApplication' has no member 'processID'
Use of undeclared type 'XCUIApplication'
Use of undeclared type 'XCUIElement'
Cannot invoke 'XCUIApplication.Type.init' with an argument list of type '(privateWithPath: String?, bundleID: String?)'
Value of type 'XCUIApplication' has no member 'processID'
** TEST FAILED **
请问这个问题是怎么解决的
崩溃路径 github 上 issue 里有说了,或者用 xcode->device info->log,实在找不到请教一下研发吧
楼主,支持 xcode9.4.1 吗?
博主您好,请问动图中的显示的点击位置的小手要怎么配置才能出现?
楼主,后续会支持 xcode10 的版本吗
楼主,我自己加了一个事件,然后每次运行一段时间 monkey 就会自动停止是什么问题,我没有设置运行事件,运行的日志如下
qq 联系吧,加了哪些 code, 看 log 是 谓词查询失败了,没找到这种 elements
Transport for IDE session acquired 请问这个错误有见过没,iOS12 上运行 出现的,11 的手机上运行时正常的
10:49:57.346 XCTestWDUITests-Runner[272:5640] done waiting
10:49:57.347 XCTestWDUITests-Runner[272:5640] reporting timed out failure with Exchange protocol versions with daemon
10:49:57.348 XCTestWDUITests-Runner[272:5640] cleaning up Exchange protocol versions with daemon
10:49:57.348 XCTestWDUITests-Runner[272:5640] Connection to testmanagerd timed out, unknown protocol version.
10:49:57.350 XCTestWDUITests-Runner[272:5640] Requesting socket
10:49:57.352 XCTestWDUITests-Runner[272:5640] entering wait loop for 60.00s with expectations: (
"Transport for IDE session acquired"
)
10:50:57.353 XCTestWDUITests-Runner[272:5640] done waiting
10:50:57.355 XCTestWDUITests-Runner[272:5640] reporting timed out failure with Transport for IDE session acquired
ios12 上出现错误,然后停止运行,这个应该如何解决
请问楼主,伸手党小白在 os10.14 xcode10 上部署的,开始运行报如下错误:
后面查资料移除了报错的 plist 文件,再重新运行又报下面的错误:
手动添加 XCAutoMationSupport.framework,位置在:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/PrivateFrameworks
然后在 Framework Search Path 添加 $(PLATFORM_DIR)/Developer/Library/PrivateFrameworks
爬了 500 多楼,还是没找到答案。。。请教为什么 iPad 不能运行。iPhone 都是可以呢。使用的 xcode10。
运行以后,一直卡在这里。
有人知道这个原因错在哪里嘛
大神,什么时候能支持 xcode10? 🙏
请问大神,我登录有定位,但是输入的登录账号和密码不是我设置的,这是怎么回事啊(新手渣渣小白)
我这里有两个问题咨询下哈,期待楼主的回复
1、问一下我这里是 xcode11 环境搭建完成了,就是每次执行完,会报个错,看别的文章说是,最后报错原因,monkey 结束了,但是 xctest 未退出,大概截图如下,不过感觉问题不大,就是觉得每次执行完后,报错感觉有问题
2、第二个问题就是,日志怎么看呢,我找到了日志,领导说要看一些有用的信息,比如崩溃啥的,还有截图,看到是异步截图,但是什么时候触发截图机制,截的图有啥用呢
拉了最新的 master 在 xcode10.1 上配置完成后,发现启动的比以前慢了很多,启动后有时候也会出现不点击的问题,但是过一会就好了
@John, xcode 10.1 上环境搭建文档可以共享一下吗,Xcode10.1 上的配置文件增多,导致之前 9.2 的配置方式行不通,谢谢
Xcode 10.2 会报如下错误:
@ 随风 xcode10.2 已经屏蔽了 XCAXClient_iOS 和 XCEventGenerator,XCAXClient_iOS 可用 XCUIDevice 来代替,可参考 WDA 的 XCAXClientProxy.m 中在实现方法。XCEventGenerator 无解,想继续用 monkey 工具只能将 xcode10.1 的 XCTest.framework 拷到 xcode10.2 对应目录下替换使用
请问一下有人适配了 XCODE 10.2 吗?可以跑起来的吗
XCUIApplication.init
目前确实会等待 60s 左右才 lauch,一直等待系统方法 [XCTWaiter waitForExceptations:timeout:enforceOrder:]
设了 60s 的超时。。。 另外中间停顿粗略看报错是等待应用程序 idle 那个。目前整个自动化平台搭建完了,开始着手取解决这两个问题,毕竟影响了自动化效率,不解决不行。。。。请问 @zhangzhao_lenovo 大神,这两个问题解决了吗?求教。
ps: 关于性能确实可以配合 instrument 来获取,目前用自定义模板获取下 FPS,GPU 等数据,但是貌似也没啥价值。崩溃日志用 idevicecrashreport 取拿,但是我是一次崩溃都没跑出来。。。。
第一个问题,XCTWaiter 我 hook 了下,确实是 60s 超时,方法交换下,修改时间随意,我这边是 5s:
extension XCTWaiter {
@objc open class func swizzled_wait(for expectations: [XCTestExpectation], timeout seconds: TimeInterval, enforceOrder enforceOrderOfFulfillment: Bool) -> XCTWaiter.Result {
let result = self.swizzled_wait(for: expectations, timeout: 5, enforceOrder: enforceOrderOfFulfillment)
return result
}
class func swizzleMethods() {
let _ : () = {
let originalSelector = #selector(XCTWaiter.wait(for:timeout:enforceOrder:))
let swizzledSelector = #selector(XCTWaiter.swizzled_wait(for:timeout:enforceOrder:))
let originalMethod = class_getClassMethod(XCTWaiter.self, originalSelector)
let swizzledMethod = class_getClassMethod(XCTWaiter.self, swizzledSelector)
method_exchangeImplementations(originalMethod!, swizzledMethod!)
}()
}
}
但是这样有个问题,其他用到这个方法的都会被替换了,自己做个处理哈。@John,比如搞个全局变量,第一次跳过了就不要固定 5s 超时了,或者判断是 60 秒超时就设置短一些
@zhangzhao_lenovo,罗列 FastMonkey 几个可以提高的点:
Descendants matching type Alert...
似乎也会暂停;【未解决】"instruments -v -t {template} -w {device_udid} -D {trace_file} -l 10000 {app_path}
,注意点:启动 XCTestWD 后面,可以延迟 10 秒再去执行这个 instruments 命令,这里我是用 python 的threading.Timer
搞了个定时;【解决】
求解下,我这起第二步,但是没报错,啥提示都没,这种是什么原因?没法排查。。xcode 是 10.2.1,手机是 phone6s plus,ios12
我用的是 appium 维护的 WebDriverAgent, 现在 xcode10.2.1 报错 Failure getting list of active applications
。看堆栈是 XCAXClient_iOS 对应方法的报错,有人解决了这个问题吗?
PS:
看了一下,XCTestWD
的实现也是一样的,应该也会出现一样的问题,有人遇到吗?
注释掉后,报错
我用 master 分支,在 xcode10.3 上运行报错,当要测试的 app 启动之后,XCTestWDUITests 就会崩溃,错误信息如下图:
log 如下:
2019-08-23 15:52:46.902934+0800 XCTestWDUITests-Runner[96132:10834578] +[XCAXClient_iOS sharedClient]: unrecognized selector sent to class 0x107fe4880
有人遇到过这个问题吗?
有,
我可以 run 起来,但是开始运行,打开 app 后,就会报这个错误,应该怎么解决呢
我也有类似的问题
@zhangzhao_lenovo大神,求救。。。。 我是用 xcode 10.1 适配了 iOS14,可以 build 成功,但是一跑 monkey 打开应用就失败了。帮忙看下,谢谢啦! _ = app.descendants(matching: .any).element(boundBy: 0).frame
let monkey = Monkey(frame: app.frame) 感觉是这边没有拿到元素导致失败的。
日志如下:
t = 68.68s Find the Application 'com.xxx
t = 68.68s Snapshot accessibility hierarchy for app with pid 3574
catching internal failure: Failure fetching attributes for Device system-wide element: Error Domain=XCTDaemonErrorDomain Code=39 "Deprecated API. Call _XCT_fetchAttributes:forElement:reply: instead." UserInfo={NSLocalizedDescription=Deprecated API. Call _XCT_fetchAttributes:forElement:reply: instead.} in file: /Users/autotest/Documents/Fastmonkey-master/XCTestWD-master/XCTestWD/XCTestWDUITests/XCTestWDRunner.swift at line: 38
catching internal failure: Failure to determine system application: (null) in file: /Users/autotest/Documents/Fastmonkey-master/XCTestWD-master/XCTestWD/XCTestWDUITests/XCTestWDRunner.swift at line: 38
catching internal failure: Failure fetching attributes for (null): Error Domain=XCTDaemonErrorDomain Code=39 "Deprecated API. Call _XCT_fetchAttributes:forElement:reply: instead." UserInfo={NSLocalizedDescription=Deprecated API. Call _XCT_fetchAttributes:forElement:reply: instead.} in file: /Users/autotest/Documents/Fastmonkey-master/XCTestWD-master/XCTestWD/XCTestWDUITests/XCTestWDRunner.swift at line: 38
catching internal failure: Failure getting list of active applications: (null) in file: /Users/autotest/Documents/Fastmonkey-master/XCTestWD-master/XCTestWD/XCTestWDUITests/XCTestWDRunner.swift at line: 38
catching internal failure: Failure fetching attributes for Device system-wide element: Error Domain=XCTDaemonErrorDomain Code=39 "Deprecated API. Call _XCT_fetchAttributes:forElement:reply: instead." UserInfo={NSLocalizedDescription=Deprecated API. Call _XCT_fetchAttributes:forElement:reply: instead.} in file: /Users/autotest/Documents/Fastmonkey-master/XCTestWD-master/XCTestWD/XCTestWDUITests/XCTestWDRunner.swift at line: 38
catching internal failure: Failure to determine system application: (null) in file: /Users/autotest/Documents/Fastmonkey-master/XCTestWD-master/XCTestWD/XCTestWDUITests/XCTestWDRunner.swift at line: 38
2020-07-13 14:54:28.398855+0800 XCTestWDUITests-Runner[3570:2008392] *** Assertion failure in -[XCUIApplicationMonitor_iOS applicationProcessWithPID:], /Library/Caches/com.apple.xbs/Sources/XCTest_iOS/XCTest-14460.20/Sources/UITesting/Applications/XCUIApplicationMonitor.m:227
t = 68.73s Assertion Failure: XCTestWDRunner.swift:38: failed: caught "NSInternalInconsistencyException", "Invalid pid 0"
(
0 CoreFoundation 0x000000019e02dc7c 334FCE90-3729-30B1-8F52-182B5ACEB454 + 1182844
1 libobjc.A.dylib 0x000000019dd4579c objc_exception_throw + 60
2 CoreFoundation 0x000000019df37718 334FCE90-3729-30B1-8F52-182B5ACEB454 + 173848
3 Foundation 0x000000019e3ab61c E4DEEB39-F560-3043-B1A5-62242DEE0F18 + 505372
4 XCTest 0x0000000104ae81e0 -[XCUIApplicationMonitor applicationProcessWithPID:] + 404
5 XCTest 0x0000000104ae7704 -[XCUIApplicationMonitor_iOS monitoredApplicationWithProcessIdentifier:] + 52
6 XCTest 0x0000000104b43750 +[XCUIApplication applicationWithPID:] + 68
7 XCTestWD 0x000000010a37b1a8 +[XCTestWDApplication createByPID:] + 160
8 XCTestWD 0x000000010a37b024 +[XCTestWDApplication activeApplication] + 368
9 XCTestWD 0x000000010a3c16bc $S8XCTestWD0A9WDSessionC17activeApplicationSo15XCUIApplicationCSgyFZ + 56
10 XCTestWD 0x000000010a3cc7c0 $S8XCTestWD0A18WDFindElementUtilsC9getAppPids5Int32VyFZ + 52
11 XCTestWD 0x000000010a37cee0 $S8XCTestWD6MonkeyC4seed5frameACs6UInt32V_So6CGRectVtcfc + 980
12 XCTestWD 0x000000010a37c9e4 $S8XCTestWD6MonkeyC5frameACSo6CGRectV_tcfc + 684
13 XCTestWD 0x000000010a37c728 $S8XCTestWD6MonkeyC5frameACSo6CGRectV_tcfC + 80
14 XCTestWD 0x000000010a3cdc14 $S8XCTestWD0A8WDMonkeyC11startMonkeySiyF + 2104
15 XCTestWDUITests 0x000000010a09e540 $S15XCTestWDUITests14XCTextWDRunnerC10testRunneryyF + 224
16 XCTestWDUITests 0x000000010a09e5b4 $S15XCTestWDUITests14XCTextWDRunnerC10testRunneryyFTo + 40
17 CoreFoundation 0x000000019e032c94 334FCE90-3729-30B1-8F52-182B5ACEB454 + 1203348
18 CoreFoundation 0x000000019df0ef44 334FCE90-3729-30B1-8F52-182B5ACEB454 + 8004
19 XCTest 0x0000000104b0c610 __24-[XCTestCase invokeTest]_block_invoke_2.202 + 72
20 XCTest 0x0000000104b785d4 -[XCTMemoryChecker _assertInvalidObjectsDeallocatedAfterScope:] + 76
21 XCTest 0x0000000104b151a0 -[XCTestCase assertInvalidObjectsDeallocatedAfterScope:] + 116
22 XCTest 0x0000000104b0c594 __24-[XCTestCase invokeTest]_block_invoke.196 + 212
23 XCTest 0x0000000104b638e0 -[XCTestCase(Failures) performFailableBlock:testCaseRun:shouldInterruptTest:] + 72
24 XCTest 0x0000000104b637f0 -[XCTestCase(Failures) _performTurningExceptionsIntoFailuresInterruptAfterHandling:block:] + 112
25 XCTest 0x0000000104b0c1e8 __24-[XCTestCase invokeTest]_block_invoke + 840
26 XCTest 0x0000000104b696d0 -[XCUITestContext performInScope:] + 272
27 XCTest 0x0000000104b0bdc0 -[XCTestCase testContextPerformInScope:] + 104
28 XCTest 0x0000000104b0be8c -[XCTestCase invokeTest] + 156
29 XCTest 0x0000000104b0daec __26-[XCTestCase performTest:]_block_invoke_2 + 48
30 XCTest 0x0000000104b638e0 -[XCTestCase(Failures) performFailableBlock:testCaseRun:shouldInterruptTest:] + 72
31 XCTest 0x0000000104b637f0 -[XCTestCase(Failures) _performTurningExceptionsIntoFailuresInterruptAfterHandling:block:] + 112
32 XCTest 0x0000000104b0da00 __26-[XCTestCase performTest:]_block_invoke.341 + 112
33 XCTest 0x0000000104b74430 +[XCTContext runInContextForTestCase:block:] + 224
34 XCTest 0x0000000104b0d178 -[XCTestCase performTest:] + 684
35 XCTest 0x0000000104b50274 -[XCTest runTest] + 64
36 XCTest 0x0000000104b083e8 __27-[XCTestSuite performTest:]_block_invoke + 300
37 XCTest 0x0000000104b07cc8 -[XCTestSuite _performProtectedSectionForTest:testSection:] + 76
38 XCTest 0x0000000104b07f74 -[XCTestSuite performTest:] + 288
39 XCTest 0x0000000104b50274 -[XCTest runTest] + 64
40 XCTest 0x0000000104b083e8 __27-[XCTestSuite performTest:]_block_invoke + 300
41 XCTest 0x0000000104b07cc8 -[XCTestSuite _performProtectedSectionForTest:testSection:] + 76
42 XCTest 0x0000000104b07f74 -[XCTestSuite performTest:] + 288
43 XCTest 0x0000000104b50274 -[XCTest runTest] + 64
44 XCTest 0x0000000104b083e8 __27-[XCTestSuite performTest:]_block_invoke + 300
45 XCTest 0x0000000104b07cc8 -[XCTestSuite _performProtectedSectionForTest:testSection:] + 76
46 XCTest 0x0000000104b07f74 -[XCTestSuite performTest:] + 288
47 XCTest 0x0000000104b50274 -[XCTest runTest] + 64
48 XCTest 0x0000000104b830ac __44-[XCTTestRunSession runTestsAndReturnError:]_block_invoke + 180
49 XCTest 0x0000000104b831f8 __44-[XCTTestRunSession runTestsAndReturnError:]_block_invoke.80 + 68
50 XCTest 0x0000000104b2083c -[XCTestObservationCenter _observeTestExecutionForBlock:] + 524
51 XCTest 0x0000000104b82e20 -[XCTTestRunSession runTestsAndReturnError:] + 636
52 XCTest 0x0000000104aeccd8 -[XCTestDriver runTestsAndReturnError:] + 428
53 XCTest 0x0000000104b70b0c _XCTestMain + 1440
54 XCTestWDUITests-Runner 0x0000000104763b18 -[_XCTRunnerAppDelegate applicationWillResignActive:] + 0
55 XCTestWDUITests-Runner 0x0000000104763a20 _XCTRunnerRunTests + 0
56 CoreFoundation 0x000000019dfaaed4 334FCE90-3729-30B1-8F52-182B5ACEB454 + 646868
57 CoreFoundation 0x000000019dfaa4dc 334FCE90-3729-30B1-8F52-182B5ACEB454 + 644316
58 CoreFoundation 0x000000019dfa4d90 334FCE90-3729-30B1-8F52-182B5ACEB454 + 621968
59 CoreFoundation 0x000000019dfa4630 CFRunLoopRunSpecific + 564
60 GraphicsServices 0x00000001a9d7e818 GSEventRunModal + 164
61 UIKitCore 0x00000001a2731a38 8B922C39-CE14-3B3F-B9C1-A5414EBE342C + 11782712
62 UIKitCore 0x00000001a2737928 UIApplicationMain + 1876
63 XCTestWDUITests-Runner 0x0000000104763cf8 main + 192
64 libdyld.dylib 0x000000019de3038c 496AD165-6976-3479-8511-BF5BED814142 + 5004
)
t = 68.76s Tear Down
t = 68.76s Pressing Home button
t = 68.79s Pressing Home button
Test Case '-[XCTestWDUITests.XCTextWDRunner testRunner]' failed (68.799 seconds).
Test Suite 'XCTextWDRunner' failed at 2020-07-13 14:54:28.467.
Executed 1 test, with 1 failure (1 unexpected) in 68.799 (68.799) seconds
Test Suite 'XCTestWDUITests.xctest' failed at 2020-07-13 14:54:28.467.
Executed 1 test, with 1 failure (1 unexpected) in 68.799 (68.800) seconds
Test Suite 'XCTestWD.framework' started at 2020-07-13 14:54:28.467
Test Suite 'XCTestWD.framework' passed at 2020-07-13 14:54:28.467.
Executed 0 tests, with 0 failures (0 unexpected) in 0.000 (0.000) seconds
Test Suite 'All tests' failed at 2020-07-13 14:54:28.467.
Executed 1 test, with 1 failure (1 unexpected) in 68.799 (68.801) seconds