开源测试工具 (已开源) 基于 XCTestWD,swiftmonkey 二次开发,实现无需插桩的 iOS monkey 自动化工具 fastmonkey

zhangzhao_lenovo · 发布于 2017年07月28日 · 最后由 zhangzhao_lenovo 回复于 2017年12月13日 · 9747 次阅读
本帖已被设为精华帖!

打造一款快速高效且高度可复用的ios自动化测试工具 (qq群 :329915064)

优势

  1. 无需插桩!
  2. 高效率,每秒4-5个action!
  3. 轻量极简!

原理

先致敬两个开源工具;

  1. swiftmonkey
    https://github.com/zalando/SwiftMonkey
    因其直接使用了 苹果的私有api 如XCEventGenerator.tapAtTouchLocations 故执行速度极快。同时也用类似android monkey的事件生成机制,自身源源不断的产生如 tap,swipe,pinchIn等事件使其对被测app产生了极大的压力
    缺点:需要插桩

  2. XCTestWD
    https://github.com/macacajs/XCTestWD
    类似facebook wda的方式,在xcode中执行xcuitest时启动一个监听server,可通过外部发送命令来创建待测app对应session并启动app,同时也实现了dump tree 和依据xpath,id等来定位某个控件并操作这些控件

  3. 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()

update

#44楼
支持控件,点击序列,跳出监控
#172楼
总运行时间,总点击次数。action固定间隔,action随机间隔(暂时内编码,后续参数化)
#191楼
增加跳过server 跳过发请求机制,运行xctestwduitest 直接启动待测app直接跑monkey
#
支持xcode9, ios11
#445楼

关于登录输入用户密码等的业务操作

未来

  1. 实现基于控件的monkey
  2. crash收集上报
  3. 性能数据

社区兄弟的搭建扫盲贴
https://testerhome.com/topics/9810

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 423 条回复
13930

期待开源....

306

这个图片分类有点牛批

15929

工具巨叼

2457

好工具,期待开放

1203

厉害了

110

请问能加入业务流程脚本嘛?

3170
110Lihuazhang 回复

业务流程脚本? 比如登陆吗? 如果是跑monkey过程中插入一些特定业务逻辑是可以的。 业务逻辑实际就是原子性的一系列点击输入。 如果是按case跑目前还不支持 改造会比较大 但理论上也是可以的

110

是这样子,就是比如有业务链路:

a->b->d->c->a

随机可能做不到。那如果我用脚本把这些链路都写成一个个业务脚本,可以当做插件插到框架中去,随机执行的话,就会更加有效果。

3170
110Lihuazhang 回复

可以的。这个链路执行的时候 ,随机会暂停。执行完随机再继续。只要设置好各个链路的触发点即可。相对于单个链路中的行为不随机,而不同链路之间也是随机的

209
110Lihuazhang 回复

好想法!

104 seveniruby 将本帖设为了精华贴 07月31日 02:25
3170
110Lihuazhang 回复

补充一个业务流程

7556

期待源码

7313

好工具 坐等开源

11419

能并发吗?

8d5594

其实现在的核心应该还是数据监控和数据分析,执行的话相对还比较好实现一些,期待楼主把未来那块补全,加油

3170
11419sixleaves 回复

稍微改造下可以的。

3170
8d5594terrychow 回复

共勉

11783

膜拜大神,期待开源,牛的一批

5411

高效率,每秒4-5个action!
这块是带截图吗?
idevicescreenshot?

3170
5411junewang 回复

截图没有细研究,目前调试看截图是异步的,跟不上action的速度

5411

那会不会出现,截图看到的,和真实的不是一个地方的现象?

5411

另外想咨询一下:
关于检测是否在指定APP,调用的这个方法,是封装的吗? 具体是会调用哪个API? 或者内部的实现机制是?
let current = XCTestWDFindElementUtils.getAppName(underElement: root!)

目前感觉检测是否指定APP,还挺难实现的。 我看你这个方法,挺好。

3170
5411junewang 回复

打个比方,会出现点击了20次 可能才截出6,7张图。 截图比较鸡肋,实际效果不如录像或者log

3170
5411junewang 回复

自己加了个接口。

这个取得是 xml里 节点属性name

5411

这个func大致实现原理是?

log的话,是采用idevicesyslog来收集还是?
录屏是用什么方案😀

5411

重新launcher。
这块是用的什么方法?

我之前有使用过:idevicedebug 方法

3170
5411junewang 回复

重新launcher 就调的 XCUIApplication.launch()
但这样会重启app,我希望能后台切回前台是最好的。
见 官方api
https://developer.apple.com/documentation/xctest/xcuiapplication

感觉应该用 activate() 但目前只是beta的

3170
5411junewang 回复

log的 就记录每个action后 点击什么页面什么位置。

3170

已完成 基于控件的点击,解析出所有控件,随机某个控件点其中心点 。每秒大概3-4个action

15498

大赞

5411

log的 就记录每个action后 点击什么页面什么位置。

点击什么页面,这个是如何定义页面这个概念的? iOS端毕竟没有Android端activity

3170
5411junewang 回复

取title辅助定位就行。appname会引起个问题,那个函数要重写了

5411

取title辅助定位,是指类似dump出xml后,然后取里面的title?
这里面有没有什么规则? 如取几个,或者去布局的几个等?

有没有验证过,定义window后的准确率有多高? 即,进入相似页面,或者滑动后,是否认为是同一个页面。

5411

了解了,多谢。

3170
5411junewang 回复

xctestwd里已有api取title

37楼 已删除
25f875

请问XCEventGenerator这个API怎么获得啊~~~我在iOS-Runtime-Headers里面没找到,求大神分享一下

25f875

Thanks!
楼主太棒啦

但是第二个地址报404不知道是怎么回事~~~

虽然做伸手党有点可耻,但是我还是想问楼主这么强大的工具什么时候开源给大家用啊~~~~~

41楼 已删除
3170
25f875yxys01 回复

404 那个发帖时链接多了个( ,不明所以。。
这个仅仅是api简易说明。google搜搜就有了

11783

application.running , XCUIApplication 好像没有这个吧...

3170

注! 熊猫直播测试组 出品; 玩游戏关注熊猫直播

已开源了1.0.0.1002。 尚有瑕疵,望见谅。

运行说明:

  1. build 配置 类似wda
  2. 启动server前 执行 iproxy 8001 8001 做手机与mac的端口映射
  3. 在xcode中的XCTestWDUITests target 里执行 run the test case 启动server,开始监听8001端口
  4. 执行 ‘curl -X POST -H "xx" -d "xx" http ://127.0.0.1:8001/wd/hub/monkey’ ,开始执行monkey

配置:

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) 控件选择子 算法

3170
11783Tonyzhangcanon 回复

我测试这个是可以用,可能没公开。我当时搜google 好像在某个stackoverflow里看到的。

69ae3c

@zhangzhao_lenovo 楼主强大 问个问题 就是这个录屏是怎么实现的?是通过screenshort()这个返回的截图合成的视频么
还有一个疑问就是getPageSource()这个拿页面的xml结构的api好慢呀 有没有什么好的办法

3170
69ae3cpliue 回复

录屏我也还没有实现,仅仅是个想法。
你说的getpagesource 是哪个框架的api? 在44楼发了个优化的方案,牺牲一些准确度来提升获取速度。

69ae3c

@感谢楼主回复 getpagesource这个是appium的实际上就是调用的wda的source 取页面的xml结构 因为我现在做了一个事实操控ios的平台 其他部分已经优化了但就是唯独获取页面xml这块 复杂的页面居然要10s 不好意思 还有一个问题 就是XCTestWD貌似要安装两个app 表示没有开发者账号很蛋疼 你这个要安装多少个app呀 在手机上 谢谢

69ae3c

还有一个就是我发现wda的查找控件我一般是根据id 需要1s多 然后点击啥的也要1s多

3170
69ae3cpliue 回复

是的,需要占两个bundle id

69ae3c

我在想一个问题 是不是swift比object-c的效率要高点 我发现相同的操作 wda的运行速度要低于XCTestWD

69ae3c

@zhangzhao_lenovo 我一开始就选的wda 所以我现在执行一个action 基本上都要2-3s
真想换成XCTestWD

3170
69ae3cpliue 回复

没有 我看wda,xctestwd代码大致类似。 理论上oc的应该更快些,你那里速度慢 根本原因是用的appium,中间经过了太多过程,比如网络请求

156e5d

Hi 楼主 iOS初级用户请教,我在打开XCTestWD.xcodeproj 文件时,提示我下图错误(我的是xcode9 beta5)说是缺少文件,请教如何解决,谢谢~

55楼 已删除
69ae3c

@zhangzhao_lenovo 我在取xml的时候 是直接通过调用的wda没有经过appium还是差不多慢一点 而且这又有个新的问题 当我用iproxy得时候 映射到本地mac的ip地址是127.0.0.1也就是说 我通本机的ip地址是无法访问的 这个有木有比较好的解决办法呀 对了性能数据的获取我已经做好了 需要的话 可以找我拿

25f875
69ae3cpliue 回复

大佬你怎么做的性能数据的获取啊?注入式还是?

69ae3c

@yxys01 是的 直接把代码注入到wda中然后以rest服务的形式发布出来

156e5d

谢谢楼主回复,我打开后里面还是没找到,我是刚从你的git上clone 下来的,里面没这个文件,能发一个给我吗或者楼主重新传一个到git上,谢谢~

25f875
69ae3cpliue 回复

我今天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.)
大佬知道这个该怎么解决吗?

69ae3c

1.断掉use线 然后重启wda
2.重启手机 重启wda
能解决95%的wda问题
@yxys01

69ae3c

@zhangzhao_lenovo 楼主 你的xml是通过sctestwd取得么 怎么取得呀

156e5d

刚从楼主的git上clone的zip包,报错缺少project.pbxproj 文件,各位大神们,谁有这个文件发一个呗,万分谢谢~邮箱:zhulixin@live.com

3170
156e5dslideplustest 回复

所有文件又重新提交了。你再clone试试,应该是环境问题

3170
69ae3cpliue 回复

44楼的 xpathToList 我取的point集合

3170
69ae3cpliue 回复

25楼那个 func 效率低 重写了

69ae3c

@zhangzhao_lenovo 我已找到了
XCTestWDXPath 这个类中就有 生成xml的方法 哈哈 好开心

156e5d

谢谢楼主,还是不行,不知道是不是我的环境问题(我xcode版本Xcode 9 beta 5),还是同样的错误,提示我缺少那个文件,楼主直接发我一个这个文件,我拷贝过来可以用吗?如果可以的话,楼主可以邮件发我下吗?谢谢~麻烦了~ 我邮箱 zhulixin@live.com

D754b7

楼主,我这边遇到了同样的问题,提示
“....Fastmonkey/XCTestWD-master/XCTestWD/XCTestWD.xcodeproj cannot be opened because it is missing its project.pbxproj file.”
刚重新下载,还是不行,在线等~

2506

Xcode 8.3.2 打开同样问题
XCTestWD-master/XCTestWD/XCTestWD.xcodeproj cannot be opened because it is missing its project.pbxproj file.

3170
156e5dslideplustest 回复

可能我少传了.. 马上看下

156e5d

hi 楼主 git用户@magaofei 发现那个缺失的文件是写到了 .gitignore 文件里,他已经给复制出来了,其他朋友如果遇到这个问题,可以.gitignore 里找,或者直接clone https://github.com/magaofei/Fastmonkey.git,谢谢楼主的积极回复,万分感谢~

3170
156e5dslideplustest 回复

@magaofei 感谢 ,已修正了问题。

75楼 已删除
3170

赞一下 👍 我还在晕头中,你已经改好了。

D754b7

感谢各位大神们,可以打开了!!激动中~

15498

我把项目克隆下来, 发现打不开, 把错误Google了一下, 从原版XCTestWD当中xcodeproj文件的包内容, 复制了一个文件过去, 再重新拉项目文件, 又提示缺东西, 我看又有新的更新, 我pull了就好了, 其他人还说有问题, 然后我发现我修改了xcodeproj文件后git没有提示任何变动, 想了一会才发现是 .gitignore 文件的问题

1db7ea



请问楼主这怎添加

3170
1db7eaAlanFightting 回复

第三方库都用cartfile安装

81楼 已删除
11783

application.running 没公开的话,是如何能使用的呢? 你用的是Xcode9?

3170
11783Tonyzhangcanon 回复

我的是8.3.3 ,这个试试便知了

1db7ea

谢谢回复,安装好了,再问一下可否做到多台设备一起测试

3170
1db7eaAlanFightting 回复

可以的。但需要代码修改下。 1启动server监听的端口 2iproxy端口 3curl命令请求的端口
有空我再改下,xcodebuild 直接完成 1,2,3 ,这样可以简单对接到jenkins支持多机了

69ae3c

楼主 swift 里面怎么取一个map的value值么@zhangzhao_lenovo 这个语言真的是坑呀

3170
69ae3cpliue 回复

有那么点像python。但!,?,_ 这些并不友好。而且异常捕获也很坑

// 查询字典
dict["name"]

// 遍历字典中所有的值
for value in dict.values {
    print(value)
}
if mapping[node.attr("private_indexPath")!] != nil{

               let snapshot = mapping[node.attr("private_indexPath")!]
1db7ea

参照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)
}
}

3170
1db7eaAlanFightting 回复

ok这个时长已计划

69ae3c

@zhangzhao_lenovo 突然发现xctestwd 不支持utf-8的中文 怎么搞呀

3170
69ae3cpliue 回复

输入中文字符 ?

69ae3c

@zhangzhao_lenovo 查询控件的时候 控件的id为中文
let value = request.jsonBody["value"].string 这里取出来的就是???????

69ae3c

@zhangzhao_lenovo request这个里面就已经解析成?了 转码也转不鸟了 我看了下源码 是把所有的存成了Uint8
不知道作者怎么想的

3170
69ae3cpliue 回复

调式下看看 是从哪里开始存成??了。感觉上层macaca也会有获取中文的需求,不应该啊

69ae3c

@zhangzhao_lenovo 解析请求的时候 存成了Uint8 这玩意 这玩意存不鸟中文

3170
69ae3cpliue 回复

哦 我明白了。你是说,发给 xctestwd的请求 如 控件的id是个中文。 xctestwd接收到就解析成 uint8了。。 @xdf 达峰帮看看?

69ae3c

@zhangzhao_lenovo @xdf 对的 对的 而且能不能把两个应用合成一个呀 没有开发者账号 要是再加一个应用就不行了
谢谢

69ae3c

@zhangzhao_lenovo @xdf clear 清除文本这个方法写的也有问题

3170
69ae3cpliue 回复

哪个clear清除? 你发的请求是什么?

2457

@zhangzhao_lenovo @pliue 确认的问题请提issue

69ae3c

@xdf 已在github上提了

69ae3c

@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)
这样就可以清除了 谢谢

2457

@pliue clear的方法麻烦给xctestwd提个merge request

105楼 已删除
69ae3c

@xdf 刚才试了下 最新版的 只test xctestwduitests 只会安装一个应用了

3170
69ae3cpliue 回复

👍 我也同步下

69ae3c

@zhangzhao_lenovo 中文的还没回复 清除的 看下103楼 目前还发现xpath定位不是很准确

D754b7

@zhangzhao_lenovo 用真机跑可以得到截图和crash日志吗

3170
D754b7Only7 回复

可以的 xcode里点结束时有个日志路径 xxxxx/test/attachments/ 包含截图和crash

69ae3c

github上XCTestWD的管理员SamuelZhaoY 这哥们大家遇到么 有点无语呀

F8621b
69ae3cpliue 回复

你好,我是XCTestWD 的作,对于你提出的部分问题, 因为考虑到实际价值,所以做了bypaas.

69ae3c

@Samuel.ZhaoY 只是觉得 应该充分的沟通 这个github 评论模式不太习惯

F8621b
69ae3cpliue 回复

欢迎钉钉留言 Samuel.蕉庵 +65-97788734, 提交issue 建议提供多的信息, 关于一些想法可以给一些完整的建议,而不是只言片语. 对issue 处理及时,其实在作者的角度已经是对答问者最大的负责. 特别是同时提出4 - 5 个issue 的时候, 不妨先整理一下思绪😀

115楼 已删除
D754b7

@zhangzhao_lenovo

您好 我这边成功用carthage安装了swiftJSON.framework,但是swifter.framework却失败,查看发现git地址已经404了,不知道是该如何解决呢?

3170
D754b7Only7 回复

github "glock45/swifter" == 1.3.3 试试这个。

D754b7

成功了!感谢回复😍

D754b7

@zhangzhao_lenovo

每次执行如下命令后

都会造成如下错误

不知道该如何解决?

3170
D754b7Only7 回复

monkey 跑起来了吗?

可以把异常断点开下,看看crash在哪里?

D754b7

运行命令后终端有输出后中途停止在这里了

找到报错的地方是这里

3170
D754b7Only7 回复

是说 server都没起来吗?
你那里xcode版本是多少的?

D754b7

8.3.3

3170
D754b7Only7 回复

先试试xcode中启动 server能运行起来不?

D754b7

这样是不是运行成功了?

3170
D754b7Only7 回复

是的 server启来了。

3170
D754b7Only7 回复

运行
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能跑起来不?

D754b7

@zhangzhao_lenovo

大神 有如上的报错 没明白他说的找不到的文件是什么??

3170
D754b7Only7 回复

iproxy 8001 8001 这步执行过了吗?

D754b7


显示如上。
这时我应该做什么操作?

我执行了如下命令

就报了最初的错误

3170
D754b7Only7 回复

执行只需要三步就可

  1. iproxy 8001 8001

  2. 启动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了?

132楼 已删除
D754b7

确实是重复启动server了!

但是第二步(xcodebuild)报如下错

我把设备断开连接后重启 再次执行第二步(xcodebuild -project XCTestWD.xcodeproj \
-scheme XCTestWDUITests \
-destination 'platform=iOS,name=我的devicename' \
XCTESTWD_PORT=8001 \
clean test)

后,又报另外的错误!

😭 😭 😭

3170
D754b7Only7 回复

先用xcode启动的吧。 xcodebuild的回头我看看

4944

跑fastmonkey时,xcode要一直打开么?

3170
4944wangbin039 回复

如果是用xcodebuild执行, 则不需要xcode

D754b7

xcodebuild我多试了几次

如上,这种情况就是成功了吧?
然后我执行了第三步后

您知道是什么情况吗??

D754b7
D754b7Only7 回复

多试了几次,居然莫名可以跑起来了😂 😂

3170
D754b7Only7 回复

你的mac插了多台iphone吗? 如果是的话,iproxy 8001 8001 后需要加serialid 指定哪台iPhone设备做端口映射。 然后curl 中执行对应iPhone设备

D754b7

只插了一台呢~ 我用xcodebuild方式跑起来的截图和crash日志在哪里找呢

3170
D754b7Only7 回复

xcode里中断运行时 有个log路径的日志输出 xxx/XCTestWD-xxx/Logs/Test/Attentment

D754b7

您说的这个是在xcode中启动server的时候的方式吧?
我这边想问的是在终端用xcodebuild启动server的那种,结束与获得截图与log的方式?

3170
D754b7Only7 回复

应该是一样的。同个目录

25f875

楼主,我前几天由于工作原因,一直没来得及使用你的,今天git下来体验,run的时候报错:bridging header '/Users/xiatian/Fastmonkey/XCTestWD-master/XCTestWD/XCTestWD/XCTestWD-Bridging-Header.h' does not exist;不知道是楼主没上传还是要在哪下载呢?

D754b7
25f875yxys01 回复

楼主这边提供的没有问题,应该是你的路径错了

25f875
D754b7Only7 回复

我直接git clone 的,接着在路径下carthage update,然后运行xcode打开XCTestWD.xcodeproj,运行,就报这个错误啊~~~

D754b7
25f875yxys01 回复

你看下 你工程里应该没有XCtestWD-Bridging-Header.h文件,应该有一个XCTestWDUITests-Bridging-Header.h文件,看它在什么路径下,并在 Build Settings -> Header Search Paths 项里做修改试试

25f875
D754b7Only7 回复

确实没有XCtestWD-Bridging-Header.h文件,在XCTestWDUITests里面有一个XCTestWDUITests-Bridging-Header.h文件
修改后

还是报那个错误

3170
25f875yxys01 回复

xcode buildsetting有问题。 xctestwd中没有用到oc,swift混编,header search path,objecktive-c bridging header 配置可去掉再试试。xctestwduitest中用了混编才需要 xctestwduitest-bridging-header.h

D754b7

我现在可以在xcode/DerivedData/xxxx/Logs/Test/Attachments 路径里面找到截图,您说的crash log也是会生成在 Attachments文件夹里面吗? 该crash log是否可以追踪到app代码问题?

3170
D754b7Only7 回复

crash 也在Attachments里
就是系统生成的崩溃堆栈文件,研发有对应的符号文件是可以定位的

25f875 yxys01 fastmonkey 自我扫盲贴 中提及了此贴 08月24日 19:03
25f875

为了不只做伸手党,我把我的配置过程以及一些遇到的简单问题做了个总结,萌新们可以来看下具体的配置流程,遇到大问题再来问大佬吧~~https://testerhome.com/topics/9810

981500

iproxy 8001 8001,iproxy命令怎么安装的?

981500

多谢,我也刚找到

D754b7

之前配置的比较乱,打算重新配置下,结果遇到了这个问题,尝试解决未成功...

3170
D754b7Only7 回复

重装下那个 fuzi

981500

登录这块的用户名和密码如何配置?iOS代码没去学习过,看的不是太懂。。。- -

D754b7

自己重新carthage update了很多次都没解决原来是 cezheng/Fuzi 版本的问题,之前1.0.1一直失败。
请问Monkey时间设定的功能快完成了吗,小白伸手党万分感谢😢

3170
D754b7Only7 回复

这个还没有上日程。。有其他 job 要先弄

3170
981500hu_qingen 回复

登录的 可以先看看 44楼

981500

懂了,设计的很好,自定义事件处理,赞

3170
D754b7Only7 回复

你说的时间设定 是指 设 monkey最多跑多久吧?

D754b7

就是给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

9698
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

3170
9698y693055797 回复

这段Log 没有什么有用的信息,没能看出是什么错误,再详细描述下?

9698

评论都看了 其中出现的错误也都改了 然后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)

3170
9698y693055797 回复

/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 这个装下试试

9698

尴尬 看到了。。。。 装完了可以run了 厉害厉害 不过这个参数制定在哪 比如多少次 还有间隔

3170
9698y693055797 回复

目前这块还缺少 后续会补充上的。比如总运行时间,或者总点击次数。每次点击固定间隔,以及每次点击随机间隔

3170

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) 个毫秒
3170
9698y693055797 回复

"多少次 还有间隔 " 已更新 看看是否符合需求

3170
D754b7Only7 回复

“添加 time = 1000s 一项,它就会自动在1000秒时停止monkey” 已更新 看看是否符合需求

8136


不知道为什么跟着步骤走 都是这个报错

3170
8136304764691 回复

"code signing is required .." 你那里XCTestWDUITests配置的签名有问题
XCTestWDUITests->General->Signing
与 XCTestWD 一样

D754b7

大神!!拜谢!!在github上下载最新的就可以了是吧!

最近发现经常会有这个问题,自己实现的解决办法是设备断连再重启,想知道大神有没有在根本上解决问题的方式?

3170
D754b7Only7 回复

从log上看 是报的签名invalid。
iphone上的 ‘设置->通用->设备管理’ XCTestWDUITests 设置受信任了吧?

D754b7

一般跑完一次后,再跑第二次或第三次会发生这样的错误。
请问xxx/XCTestWD-xxx/Logs/Test/Attentment路径下的crashlog是发生了闪退才会生成相应文件是吗? app闪退后仍会重新跑知道完成1000s才停止吗?

3170
D754b7Only7 回复

嗯 app闪退之后,监控线程就检测到了,然后会自动拉活待测的app然后继续跑monkey。 除了退出还有跳转到其他app也会切回继续跑。
crashlog 会生成在Attentment目录里,让研发查查崩溃的堆栈看是否能定位闪退。

第二次,第三次会出这个错误?我有空了调试看看。

9bfbe7

请问下,第一步执行iproxy 8001 8001命令,一直显示 waiting for connecting,是不是苹果手机需要越狱?;用xcode运行XCTestWD在真机上跑起来了,不过控制台没有输出。还有devicename就是苹果手机的udid吗?

3170
9bfbe7hejianhao0612 回复

iproxy后显示waiting for connecting 是对的,说明8001端口已经开始做映射了。 iphone 不需要越狱

需用xcode运行 XCTestWDUITests ,而不是XCTestWD,运行成功控制台会显示 server已启动并监控8001

devicename 不是udid 在xcode设备info里可以看到 是个string

9bfbe7

感谢大佬的细心指点,我大概理解了,不过还是想请问下devicename 在xcode设备info里 是哪个string

3170
9bfbe7hejianhao0612 回复


是在 Xcode -> Window ->Devices

D754b7

这是什么原因呢
第一步执行了,第二步成功了,第三步报这个错

D754b7
9bfbe7hejianhao0612 回复

或者在设备中,打开 通用→关于本机→名称 (该名称就是你的devicename)

3170
D754b7Only7 回复

iproxy 没执行成功 或 server没起来?

D754b7

只是每次粗暴的全都停止,重新来一遍才能解决问题,不清楚具体原因。

3170
D754b7Only7 回复

你这个是不是上一个session还在占用着端口,下一次测试就开始了。 感觉像是这样子, 这两天我再改下版。跳过server这环节 到时候再试试。

3170
D754b7Only7 回复
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连接了。

3170

2017.08.29 update

  1. 增加跳过server 跳过发请求机制,运行xctestwduitest 直接启动待测app直接跑monkey (临时内编码,后续参数化)

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 项目中自行添加下

3170
D754b7Only7 回复

已更新 用新Mode 试下看看

3170
1db7eaAlanFightting 回复

“再问一下可否做到多台设备一起测试”
已更新 应该可以支持你说的需求了 使用新mode , xcodebuild时用不同的 -destination 'platform=iOS,name=(your device name)'

D754b7

只需执行第二步和第三步?

3170
D754b7Only7 回复

只需要执行第二步就行了

D754b7

大神报错情况如下,是不是少上传了某文件?

3170
D754b7Only7 回复

这个就在server目录下,工程里自己添加下就行。 我本地开发用的另一套工程怕全拷过来又出最开头那个问题了。

左侧选server。 File->Add Files to "XCTestWD" -> 选XCTestWDMonkey.swift ->add

D754b7

👍 已解决

D754b7

按照大神描述的设置完成后 项目运行无报错后
执行如下
xcodebuild -project XCTestWD.xcodeproj \
-scheme XCTestWDUITests \
-destination 'platform=iOS,name=xxxx' \
XCTESTWD_PORT=8001 \
clean test

结果一直报错如下

一直如此 😢 😢

3170
D754b7Only7 回复

Xcode的手动执行看能跑起来吗? bundleID改成你自己app了吧?

D754b7

能跑起来了,几秒种后报错

3170
D754b7Only7 回复

报的错误是什么?
XCTestWDMonkey我内编码的bundleID是我测试用的,这个你那修改的对吧?

D754b7

修改了

D754b7

终端运行报这样的错,和上面截图一样的
都是能看到成功启动了app,短暂的跑了几秒后就失败报错

3170
D754b7Only7 回复

你那里把 异常断点打开,再跑次看看崩到哪句里了

开启方法在120楼。exception 勾选上

3170
D754b7Only7 回复

我本地也调式看看。。

D754b7

这边为什么乘两次1000?? 前面的 “0” 是默认0 秒吗

3170
D754b7Only7 回复

支持的是微秒,所以 秒*1000*1000
0表示不生效

3170
D754b7Only7 回复

我这里调试没出问题 -_-。 你把那个xxx.log发出来看看。

D754b7

那边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 **

这样的吗??
正常结束 什么样子的?

3170
D754b7Only7 回复

你那里是用新mode 然后设的 elapsedtime = 0了?

超时时 我直接exit了 所以xctest会认为test failed 。是正常的。后续看看怎么改下 正常结束下

D754b7

serverMode 设为了 false
elapsedtime = n * 1000 * 1000 (n分别设置过10000 或 30 等等 )

3170
D754b7Only7 回复

http://blog.csdn.net/totogo2010/article/details/8949440 按这个增加下崩溃断点。
跑下看具体崩溃到哪里了。

D754b7

发现elapsedtime 设置稍微大一些就会这样,比如10000s就会发生以上错误

3170

THX 是个bug。 U32int 越界了

D754b7

设置比如100s的时候是可以正常运行的,10000s则报错,可以解决吗

3170
D754b7Only7 回复

嗯 已修改。更新下吧

9bfbe7

嗯,谢谢了

221楼 已删除
222楼 已删除
223楼 已删除
3170

elapsedtime =10000 就行,不用*1000*1000了

225楼 已删除
3170

帮来个215楼那个带具体定位。 这个截图没法定位错误。

D754b7

这次没有绿色的崩溃点。。
做了设置

有红色错误如206楼

D754b7

设10000s时,那边可以坚持运行多久?
这边可以正常运行,但没几秒就停止了

3170
D754b7Only7 回复

我这能一直跑着的。 要不你随机加一些断点?

D754b7

尝试了下,有几次是运行到这里就报错

3170
D754b7Only7 回复

usleep 你这是老代码了。又新更新了,解决了elapsedtime >10000 越界的问题。 你update新的再试试看?

 DispatchQueue.global().async { 
             if self.elapsedTime != 0{ 
-                usleep(useconds_t(self.elapsedTime)) 
+                Thread.sleep(forTimeInterval: TimeInterval(self.elapsedTime)) 
                 exit(0) 
             } 
232楼 已删除
D754b7

不应该呢,我12点多重新拉取了一次的,后来就是觉得是不是没更新好 在快两点的时候又重新拉取得呢
最后一次拉取的时候 以下部分显示的是 " 2 hours ago " 😢 拉取方法是 git clone xxxx

D754b7

我再一次通过另一种download的方式新拷下来了代码。
发现大神拷出来的这段代码是应该是在174行, 我上方断点部分的是在203行

这两段代码类似

经确认发现

Monkey.swift文件中

174~177行 代码为大神新修改的代码
203~207行 代码仍为老代码
我将第二部分照着上方做了修改,目前已经打破无法跑过8秒的问题,已经跑了一段时间了!! 拜谢大神耐心回复😍

3170
D754b7Only7 回复

嗯 重新拉下 应该就行

25f875 yxys01 fastmonkey 自我扫盲贴 中提及了此贴 08月31日 09:32
156e5d

@zhangzhao_lenovo,求教大神,执行xcodebuild -project XCTestWD.xcodeproj -scheme XCTestWDUITests -destination 'platform=iOS,name=lemon' XCTESTWD_PORT=8001 clean test 出现如下错误,求教如何解决,新手伸手党,惭愧~~

156e5d

谢谢大神回复,这个设置我已经按照@yxys01 的扫盲帖子修改过了,如下图:还是不行,跟上面同样的错误,疑惑😇

3170
156e5dslideplustest 回复

不是xctestwd 而是XCTestWDUITests 你的截图是xctestwd

156e5d

谢谢大神的细心回复,看了你的回复和@yxys01的帖子我有点不解,@yxys01在步骤中描述说修改的是XCTestWD 的build settings,见下图,所以又蒙圈了~~

我自己实际操作了两种配置方案,都会报错,由于是小白级的伸手党,所以感觉无从下手,还请大神帮忙看下如何处理,万分感谢。

3170
156e5dslideplustest 回复

哦。sorry 我240楼 回答错了。。

xctestwd中的去掉,xctestwduitest需要保留

"xctestwd中没有用到oc,swift混编,header search path,objecktive-c bridging header 配置可去掉再试试。xctestwduitest中用了混编才需要 xctestwduitest-bridging-header.h"

3170
156e5dslideplustest 回复

第二个图里 报错 是因为去掉了 所以找不到相关的引用

156e5d

谢谢回复,依旧还是出现之前#237楼我截图的那个错误,😥 我自己先搜搜看有没有解决方案,其他人有遇到或者知道解决方案的,帮忙回复下,万分感谢~🙏

3170
156e5dslideplustest 回复

你那里xcode是多少版本?

156e5d

9.0 beta5 🙏

3170
156e5dslideplustest 回复

😅 果不其然。 9.0 太超前了。你看下你那的swift版本用的是多少?

需修改为swift3

156e5d

我看了下,我选的是3.2,我再搜搜看,实在不行我就重新下个8.3的xcode再试试看😥 ,谢谢了🙏

3170
156e5dslideplustest 回复

建议还是先换8.3吧。 9.0beta 或许有其他坑

25f875 yxys01 fastmonkey 自我扫盲贴 中提及了此贴 08月31日 17:10
156e5d

hi 楼主 我装了个8.3的,xctestwd运行成功了,但执行最后一个命令时,xctestwd自动打开后闪一下就关闭了,然后就出现下图的错误,monkey没有跑起来,辛苦帮忙再看下,感恩~🙏。另外我想问下,我时跑你的demo的,熊猫直播我真机上需要安装吗?

3170
156e5dslideplustest 回复

你上面图里输入的curl 需要先装熊猫tv才能调启它跑monkey的。

或者curl里bundleID改成你自己要测试的app

156e5d

嗯 谢谢楼主,熊猫直播和熊猫主播版我都安装了,运行还是没跑起来😭 ,错误跟上面#251一样,我用我们自己要测的app,也是同样的错误失败提示,xctestwd一闪就关闭了。

我把XCTestWDMonkey.swift.中 的bundleID修改成要测试的app bundleID,也是老样子,😰

3170
156e5dslideplustest 回复

XCTestWDMonkey是新mode用的。如果用curl 就不用改XCTestWDMonkey
你那里iphone上设备-通用-设备管理-开发者 信任了吗

156e5d

是这个信任吗?下图的这个信任我是确认了的。还是说要在设置->通用->描述文件与设备管理 里去信任什么证书之类的东西?

3170
156e5dslideplustest 回复

对应xctestwduitest的开发者账号需要 信任。

3170
156e5dslideplustest 回复

这样 你按#214 楼方法 把崩溃断点加上。跑次看看崩在哪里了

156e5d

hi 楼主,断点显示没有错误,如下图所示:

另外我在xtestwd页面加了个button看了下,运行后,进到这个xcrtestwd主页面之后就停留在这个页面了,然后就没有调起熊猫tv
Xcode显示:

手机端:

3170
156e5dslideplustest 回复

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启动就闪退了? 还是一点也没起来? 还是起来跑了一会再闪退的?

156e5d

谢谢回复,我是直接从你github上clone下来的,所以没改动

3170
156e5dslideplustest 回复

那这样吧。在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()
156e5d

xetestwd闪先后,熊猫tv app没起来

3170
156e5dslideplustest 回复

-_- 你的iphone手机不会是 ios11吧?

156e5d

不是,我试了两台:iPhone6s 10.0.2, iPhone6 10.3.2 你用的是多少的,我换个一样的看下

3170
156e5dslideplustest 回复

嗯。我这是10.3 之前10.0也试了。应该10,9 问题都不大。

156e5d

我在 private func registerRouters() 打了个断点,貌似这个方法都没调起来,XCTestWDMonkeyController也没进去,心塞~😭

3170
156e5dslideplustest 回复

这个... 貌似是XCTestWD 系统限制了没起来?? 还是回到原点 看看开发者账号那块是不是有什么问题?

156e5d

我的开发者账号配置,楼主辛苦~感谢不厌其烦的回复,iOS伸手党小白🙏

269楼 已删除
156e5d

hi 楼主 跟研发确认了,我用的公司的测试设备,你说的那些都是添加了的,但是还是依旧。。。。。 😭 😭 😭 悲催~

3170
156e5dslideplustest 回复

实在不行 你换个个人开发账号试试。占2个bundleID 免费版的就行。

156e5d

hi 楼主,又来麻烦你了,我在XCTestWDMonkeyController里打了断点,发现到下图所示的位置后,继续执行就自动跳出去了,然后就一直不再往下执行了。

3170
156e5dslideplustest 回复

这里只是注册一些路由的回调,你那控制台log里有 XCTestWDSetup->http://localhost:8001 这段吗?
如果有表示server 启动成功了

156e5d

嗯,谢谢楼主回复,有看到,启动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

156e5d
156e5dslideplustest 回复

谢谢楼主提供的源码,我的问题解决了,现在可以跑起来了,发现问题竟然出现在设备名的命名上,我把我全英文字符的设备名改成xx's iphone,竟然跑起来了,但是没搞明白为什么会这样。😇

2506

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代码

3170
2506jira 回复

没有直接的swipe事件
drap事件、多次tap事件 也能达到swipe效果
内部调的都是 私有的api sharedXCEventGenerator.pressAtPoint

2506

好的,测试支持最大的时间是多久?

3170
2506jira 回复

目前time可以设置 见 172楼
不设则一直monkey, 我测试一直跑到iphone卡死

283
209vigossjjj 回复

大师没时间搞了😉

282楼 已删除
902
1db7eaAlanFightting 回复

请问你用多台设备测试成功了吗?我这边用xcodebuild方式,在iproxy中添加了serialid之后,再通过curl会提示number of avaible devices == 2,是因为curl中的内容填写的不正确吗?

902

xcodebuild设置不同的deviceName也不行,iproxy 8001 8001 serialid xxx设置了之后,curl运行之后提示number of available devices == 2,不知道是哪里出错了,大神能不能说的更详细一些呢?

3170
902zwdlp520 回复

多台设备的话 别用server模式了。也就不用iproxy了。 直接用新mode。见191楼
新mode直接内编码直接启monkey,跳过了server及插入命令的过程。

902

跑多台设备的话,xcodebuild -project XCTestWD.xcodeproj -scheme XCTestWDUITests -destination 'platform=iOS,name=xxx' XCTESTWD_PORT=8001 clean test,还是用这个命令吗?这个destination将name=xxx修改成另一台设备的名字即可对吧?这个port需要做修改吗?

3170

嗯 还是的。 port 可以不用。带上也没事

902

只修改了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)

这个错误是代表有些区域获取结构的时候出现了异常吗?

3170
902zwdlp520 回复

mach_vm_map(size=1363546112) failed (error code=3)
*** error: can't allocate region
内存ran out了?

3170
902zwdlp520 回复

每次都在固定的位置Terminatie吗?

902

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值都是一样的,基本都是刚起来到了某一个页面加载页面的时候出现的

3170
902zwdlp520 回复

哦。单个机跑的时候到 同样这个页面能monkey吗?

2182

每步执行截图如何保存,runner没有权限写相册。另外截图量太大,对手机硬盘是个考验,大神们有何看法

902

好像跟是不是单机没关系,而且后来再跑的时候,不知道是不是因为没有正常结束,会出现这个错误提示:
), 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 **

3170
902zwdlp520 回复

没明白。
你那个内存ran out 是因为多机并行跑出的? 还是解析某个页面时出的?

902

用另一台6P就没有出现这个问题,用5C的这个单机跑也出现过这个问题~

3170
902zwdlp520 回复

ok 这次明白了。 这台5c支持的有问题,你在github上提交个issue简单说下问题吧,我这先记录下。但是我没有5c 具体原因不是很确定

2182
2182bingle 回复

并且xctest里面不能发起网络请求

3170
2182bingle 回复

截图无非是用来查看crash前一些截图 及 log来分析崩溃场景。
所以无需大量保存截图,只需保留crash前十几张即可。

902

我在代码中增加了手动造了一个崩溃,具体如下:
在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 **

3170
902zwdlp520 回复

dump生成了吗?

F4d75c

修改了新的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才开始运行。
但是一修改运行时间,就会报错。

3170
F4d75cxiaoshouzi 回复

同时执行2次 destination不同的 xcodebuild 。

F4d75c

尝试了,解决啦,谢谢大神!

902

dump生成了,但是并不是在attachments的路径下,我们接了友盟的sdk,直接crash信息传到了友盟的平台上~

3170
902zwdlp520 回复

你的这个能crash 的 app 能否发我吗? 我隔天调试看看确定下问题

14148

@zhangzhao_lenovo @zwdlp520
二位,你们谈到的 5c 会报 too many instances of this service are already running 据了解是一个 32 位设备的坑,目测短期内是不会修复了。解决办法很简单粗暴 重启

1db7ea

多机运行ok了,多谢大神,直接跳过sever的模式和用sever的有区别么

3170
1db7eaAlanFightting 回复

本质上没有区别

3170
141481717p 回复

哦 有5c这个问题背景出处吗?

14148

之前碰到的时候 google 过一圈,大概有印象。当时出问题的机器也是 5c 和一台 32位的 iPad,出处翻了一下没看到,可以看一下这个:https://stackoverflow.com/questions/39464682/dtdevicekit-could-not-start-house-arrest-service-for-app-identifier-xxx 不过下面有人说 6s 也碰到了,我这边是没有发现过。

1db7ea
69ae3cpliue 回复

我也遇到这个问题了,断线,重启都试过了但是还不行,之前跑的还行,今天就不行

3170
1db7eaAlanFightting 回复

可有报了什么错?

1db7ea

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就这个错误

3170
1db7eaAlanFightting 回复

确实没遇到过,查stackoverflow 说换端口就行...

@1717p 兄台有遇到过这个吗?

1db7ea

换了四个端口还真可以了,有些端口不知为啥不行

14148

没有碰到过,面对 Stack Overflow 编程告诉我们换个端口试试- -

F4d75c

hi,楼主,又来麻烦你了。我已经按照44楼配置了登录,但是这边,已经运行到addXCTestLoginAction这个方法,但是并没有像预期一样输入账号和密码。。请问是怎么回事呢?

3170
F4d75cxiaoshouzi 回复

如果是运行到 addXCTestLoginAction的话会立即插入登录事件序列的

你在public func addXCTestLoginAction(application:XCUIApplication) 这个函数里加些断点调试看看跑到哪了?

13728

@zhangzhao_lenovo ,出现了
recv failed:Resource temporarily unavailable
recv failed:Operation not permitted
请教怎么解决

D754b7

@zhangzhao_lenovo fastmonkey经常有crash呢😭

1db7ea
D754b7Only7 回复


我也遇到,有时候跑十几个小时,有时候两小时就Crash。。这是我常崩的地方

D754b7
1db7eaAlanFightting 回复

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 **

我的总是这样的,我有时候几百秒就会崩溃。。。

3170
D754b7Only7 回复

可有什么切换app的场景?

3170
1db7eaAlanFightting 回复

check这个看来得改一下 ,这里面存在一个悖论……

3170
D754b7Only7 回复

跑的时候尽量少切换app. 目前我研究的来看 xcode9可以大致避免此问题了。争取10.1前后完成迁移提新版

3170
1db7eaAlanFightting 回复

已知是有一个概率性的崩溃存在。问题根源在于私有api只能在主线程中跑,而本该是于monkey并行的退出检测也就是那个check app目前是于monkey主体串行抢占式执行。另外checkapp那个函数为避免拉长整个action执行时间 特意做的非常快 大概只消耗20-30ms. 此两个问题就会存在一种情况 检测时app还没退出完认为是在前台,但之后某些action时取app。就此时app退出了就取不到了于是崩溃 ,另外一种反之 目测你这个崩溃就是后者
目前调研情况看可将退出检测改为非私有api 也就是切换到xcode9

9698

升级到 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下跑吗

3170
9698y693055797 回复

xcode9 我还在升级ing,很多代码估计都得重写。 苹果一贯如此

你们那还是先用xcode8吧。等兼容后再发个for xcode9

9698

多谢 不过再安装一个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)
3170
9698y693055797 回复

XCTestWDMonkey 这个文件需要手动添加下。方法见github里的issue

742657

Hi,楼主 我试着跑了一下自己的app 但是每次跑到同样的地方(如上图)都会崩溃,app闪退,测试程序也退出了,显示TEST FAILED.试着打断点看了一下,是下图这个位置崩了

想问下楼主是什么问题呢 谢谢🙇

3170
742657tanami 回复

😢 你这个问题还真没见过呢。 怎么app弹了2个悬浮窗。 崩溃位置大概是检测到有悬浮窗弹出,点击button时出现异常了。我初步估计是2个悬浮窗引起的。 你qq多少?

742657

qq449315714 麻烦楼主了😋

25f875

@zhangzhao_lenovo 楼主有没有XCTestWD的web接口文档啊,我最近想用XCTestWD做点东西

D754b7

@zhangzhao_lenovo 新问题新问题!!!

每次都卡在这里然后就失败退出了!!

3170
25f875yxys01 回复

没看到有类似文档,我都是看代码修修改改,其实XCTestWD和wda 实现是类似的。

3170
D754b7Only7 回复

什么问题? com.autohome.new launch不起来?

3170
9698y693055797 回复

xcode9已支持了。

3170
D754b7Only7 回复

已支持xcode9 可以试试 看还有崩溃吗?

9698

赞 马上就试

9698
9698y693055797 回复

尴尬 报这个错误
Module compiled with Swift 3.1 cannot be imported in Swift 3.2
我已经 carthage update 还是不行

3170
9698y693055797 回复

那几个三方库都 carthage update --no-use-binaries 下 应该就成

9698

更新了还是不行 报一样的错

3170
9698y693055797 回复

哦 我明天上班了帮你看看

3170
9698y693055797 回复

你那里问题解决了吗? 我查了下 应该就是carthage update --no-use-binaries 就可以解决。

B05d5e

楼主你好,请问下我这边执行CURL命令触发测试后能正常打开app,但是没有执行monkey测试,执行xcodebuild命令的窗口有如下报错,请问如何解决?

ps:我的执行方式是开三个窗口,分别执行iproxy、xcodebuild 和 curl 命令

13930

@shinetony 有一个扫盲的帖子你搜一下

9698

那天就是过了 reset后还是一样~

3170
9698y693055797 回复

reset后还是一样? ?

9698

恩 reset后重写配置 .h文件 证书等后 还是一样。

3170
9698y693055797 回复

还是报 Module compiled with Swift 3.1 cannot be imported in Swift 3.2 ??

9698

对 我再从头试下一遍

9698

还是一样。。。

B05d5e
13930Test_Sir 回复

谢谢,我看一下

3170
9698y693055797 回复

这样,你把这几个三方库都先移到其他目录下 然后重新再执行下 carthage update --no-use-binaries

9698

我把 Carthage文件夹删除在执行的还是不行 Module compiled with Swift 3.1 cannot be imported in Swift 3.2

14148

@zhangzhao_lenovo 有兴趣搞一下遍历不😑

3170
141481717p 回复

短期可能不会,遍历可能会拖慢单步执行的速度。

14148

遍历速度上肯定慢,但是可以让入口很深的问题暴露出来呀

3170
141481717p 回复

遍历也是有利有弊的,每个控件只点一次,如果当点多次才出现崩溃时遍历也就发现不了问题了。
实际上遍历也好随机也好都最终归结为森林中树节点路径的选择算法,目前我正在搞些选择算法,需要先在android上调整使用。
更理想的做法是结合一些大数据分析来学习拟合出一些选择算法,这样带有历史回溯的才更有威力。

14148

赞 之前有想过如果机器学习应用在 QA 中的某些场景 已经开始实践了吗 赞

3170
141481717p 回复

还没有呢。一步一步来吧。

3170
110Lihuazhang 回复

感谢

69ae3c

楼主 我下载了最新的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)

请问是什么问题呢

3170
69ae3cpliue 回复

swift 选3 先别用4了。

69ae3c

是不是先安装4呀 对了4兼容之前3
写的东西么
谢谢回答

156e5d
69ae3cpliue 回复

楼主说的是build settings里 swift language version 选 3

69ae3c
156e5dslideplustest 回复

我是选的3呀

3170
69ae3cpliue 回复

XcTestWDUITests 的 Build Settings ->swift language version 选swift 3.2

69ae3c

是不是要安装3.2呀 通过carthage安装么

3170
69ae3cpliue 回复

把几个三方库都先移到其他目录下 然后重新再执行下 carthage update --no-use-binaries

69ae3c

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"}}

报这个错 楼主

3170
69ae3cpliue 回复

/usr/local/lib/node_modules/xctestwd/ 这个目录下执行试试?

69ae3c

我是在这个目录下执行的
但是把几个三方库都先移到其他目录下 这个我不知道怎么操作

3170
69ae3cpliue 回复

删了也行。移出去就有个备份。

69ae3c

是不是 Carthage\Build 里面的东西呢

3170
69ae3cpliue 回复

嗯。build这个目录重命名下再执行试试

69ae3c

报错 没有Cartfile 这个文件夹 然后我新建了一个 给了777的权限 现在又说我没有权限打开这个文件夹

3170
69ae3cpliue 回复

??? XCTestWD-master 目录下应该有cartfile文件的啊。 你哪里怎么没有了? 不行从github上再拉下

69ae3c

谢谢回答 去github下载zip可以 通过npm下载的不行 原来是酱紫

Bd0a60


楼主,server 起不起来,编译都通过。

1db7ea

xcode9 + 最新拉下来的变异报错如下,没有找到XCTestWDApplication,我在文件中找到了这个文件加到项目中,仍然报错,XCTestWDApplication这个是oc代码

3170
1db7eaAlanFightting 回复

XCTestWDUITests\XCTestWDUITests-Bridge-Header.h 缺少#import "XCTestWDApplication.h"

3170
1db7eaAlanFightting 回复

可能我忘记上传这个文件了。

3170
Bd0a60rainy0824 回复

你那里怎么报这么多错。不正常啊。 你是xcode多少版本?

Bd0a60

xcode 8.3.3.

3170
Bd0a60rainy0824 回复

https://github.com/zhangzhao4444/Fastmonkey/tree/xcode8.3 8.3的需要下这个分支上的code. 最新那个是支持xcode9的 api不兼容

Bd0a60

楼主,我又重新下载了一遍,XCTestWDUITests 这个编译出错

3170
Bd0a60rainy0824 回复

你这个还是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;

  • (instancetype)appWithPID:(pid_t)processID;
1db7ea

ok,我已经在桥接文件中加上了,现在可以了

Bd0a60

嗯,8.3.3的server已经起起来了。谢谢

69ae3c

楼主 我在编译最新的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'?

3170
69ae3cpliue 回复

xcode9.0 还是8.3?

69ae3c

我的xcode是8.3.3
应该是要升级到9才能使用最新的xctestwd 是吧

3170
69ae3cpliue 回复

嗯 我拉出分支了。
9.0的可以用最新代码
8.3的 从 https://github.com/zhangzhao4444/Fastmonkey/tree/xcode8.3 这个分支下。

3170
69ae3cpliue 回复

两者区别
1 做了api从8.3迁移到9.0 苹果自己的不兼容。
2 退出检测及切回用了 9.0提供的新api ,机制上应该相对稳定。

69ae3c

我现在试试 ths

69ae3c

deleteSession deleteSession 这个方法写的有点问题 如果是本地应用 就是没有启动app的时候
直接调terminate方法会抛异常 导致xctestwd挂掉
let a = sessionMapping[sessionId]?.application.bundleID;
if sessionMapping[sessionId]?.application.running==true && !(a?.contains("local"))! {
sessionMapping[sessionId]?.application.terminate()
}
这样写 可以

3170
69ae3cpliue 回复
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里我没有调用这个

69ae3c

嗯嗯 我需要调用 主要是 我每执行完一个case要关闭当前app

3170
69ae3cpliue 回复

哦。可以调试试试看

5411

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位机器,高概率遇到这个异常。

5411


xcode9 遇到这样的异常。

3170
5411junewang 回复

看上去是配置的问题。那几个三方库都安装了吗?

D754b7

@zhangzhao_lenovo 大神请教一下 Bundle ID 可以做到外传吗 在终端的执行命令里传进去😢 😢 😢

3170
D754b7Only7 回复

$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模式?

3170
D754b7Only7 回复

还是非server模式 把XCTestWDMonkey.swift里的bundleid 参数化?

D754b7

server 模式~~~

3170
D754b7Only7 回复

server模式 已经支持了, curl 时传入 bundleid

5411

已执行carthage update。都装了。

同时,也加入了swifter.framework

5411

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位机器,高概率遇到这个异常。

这个异常有解决方案吗?

D754b7

我说错了!是非server模式呢~~~~

3170
D754b7Only7 回复

好,非server参数化 在排期了。

3170
5411junewang 回复

这个异常没有遇到过,你哪里是xcode多少? 手机是ios几的?

2457

XCTestWD升级最新版,支持最新Xcode

D754b7

可以实现? 是什么思路呢😀 😀 😀

3170
2457xdf 回复

xctestwd 10.1时候照着wda 简单改了改 已经支持xcode9了

3170
D754b7Only7 回复

xcodebuild 时携带传入参数 设bundleid,如果没带参数 则用默认的。

D754b7

👍 👍 👍 望大神快快开发出来哈

96

请问出现这个错误,怎么解决,感觉是XCTestWDSession.swift中有地方需要加try之类

3170
32liuby 回复

加下我q

D754b7

大神q多少?

3170
D754b7Only7 回复

77227005

156e5d

@zhangzhao_lenovo Hi 楼主,Xcode8升级到xcode9, git最新代码,有个错误, 请教如何解决,谢谢🙏~
Xcode:Version 9.1 (9B55)
Mac OS:macOS High Sierra 版本:10.13.1

3170
156e5dslideplustest 回复

嗯 这个问题正跟进的

3170
156e5dslideplustest 回复

同学加下我q 77227005

69ae3c

楼主 有没有遇到这种报错:打开某个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}}

7310

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 编译 一直报这个错误,是签名的问题吗

3170
69ae3cpliue 回复

我本地调试出现过 事件太快太多 真机会阻塞住,暂停monkey后是可以恢复,但没有固定某个控件

69ae3c

我的是打开某个控件 就会这样 而且不可恢复 xctestwd进程直接挂了

3170
69ae3cpliue 回复

加我个q 回头调式看看

156e5d

谢谢楼主,这几天项目上太忙,没有登录论坛,抱歉~ 刚重新git了你的代码,这个问题已经解决了,楼主👍 ,再次感谢~

Cefa35

不错~

10779

大神好,我在运行xcodebuild命令时,报错如下图:
xcode:9.1(9B55)
mac os:10.13
ios:11.2

然后我import XCTest,上面的报错没有了,新增两个报错如下图:

请问应该怎么解决呢?
谢谢指点

4ad2d7
7310pacerron 回复

一般这种错误 都是和证书有关系。

3170
10779abigale 回复

重下次代码,重新update三方库,重新build 就好了。

3170

关于登录输入用户密码等的业务操作

1.XCTestWDMonkeyController.swift 里先开启Login事件

2.MonkeyXCTest.swift 修改addXCTestAppLogin 中 登录的关键点

3.MonkeyXCTestPrivate.swift 中修改 对应登录事件逻辑

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册