Macaca 使用 XCTestWD 遇到的一些坑

匿名 · 2017年08月18日 · 1934 次阅读

前段时间发现 XCTestWD 的获取页面 xml 结构要比 facebook 的 WebDriverAgent 快很多果断选择开始研究 XCTestWD
然后,你们懂得,就遇到了很多问题特此贴出来跟大家分享分享:

1.我想获取一个 xml 格式的页面 source,不好意思没有对应的接口,怎么办呢?我的解决办法是:
在 XCTestWDXPath 再添加一个方法 findXmlForm

static func findXmlForm(_ root:XCElementSnapshot) -> String {
        var mapping = [String:XCElementSnapshot]()
        let documentXml = generateXMLPresentation(root,
                                                  nil,
                                                 nil,
                                                  defaultTopDir,
                                                 &mapping)?.xml
        if documentXml == nil {
           return ""
        }
        return documentXml!
    }

这样就能获得 xml 类型的 source 然后你再通过 rest 传出来跟 json 类型的一样

2.我想调用 delSession 这里就会遇到两个坑
a.request.session?.application 是 nil 呀老哥们 没办法自己动手 let session = request.params[":sessionId"]! 这样就可以去到 session 了
b.解决了上面的问题你就会发现应用虽然关掉了但是 XCTestWD 挂了没办法我只能把 deleteSession 这个方法里面的
NotificationCenter.default.post(name: NSNotification.Name(XCTestWDSessionShutDown), object: nil) 这段注销掉就好了

3.我在查找元素的时候发现元素 ID 是中文悲剧的发现在服务端是?????乱码 好吧这个问题已经提给 GITHUB 了
我的解决办法是:

let text:String = firstNonEmptyValue(element?.wdValue() as? String, element?.wdLabel()) ?? ""
         let l = text.characters.count
         var typeString = ""
         for _ in 1...l {
             typeString=typeString + "\u{8}"
         }
         element?.typeText(typeString)

4.Clear 文本框也是有问题的,解决办法如下:
把 element?.typeText(“”) 改成如下即可
这个问题已经修复

5.关于会生成两个应用的问题,下载最新版的 XCTestWD 然后只 build XCTestWDUITests 即可 只会生成一个

照例 @ 两位大神
@xdf @zhangzhao_lenovo

共收到 14 条回复 时间 点赞

没排版啊。

Q1: 仅 generateXMLPresentation 也是有些问题,虽然快速获取了 xml ,但如果当前页面有下拉内容或仅只显示了部分内容,generateXMLPresentation 里会包含所有内容的 xml,也包含未显示的。 xctestwd 里原函数会进一步做一些查询已确保返回是当前显示的元素。

匿名 #6 · 2017年08月18日

@zhangzhao_lenovo 感谢大神提醒 还不太会用 这个
我目前需要的无论是不是当前显示的元素都行 只需要每个元素的的位置信息是正确的就好了 你说的那个问题 我再研究 研究😀

“Clear 文本框也是有问题的” typeText(“”) 是清理文本框的合理用法,可以去 macaca sample 中试一下

匿名 #13 · 2017年08月18日

@Samuel.ZhaoY 我是下载的最新的 发现不行额

匿名 #3 · 2017年08月18日

@Samuel.ZhaoY 我现在是这样的操作 先在一个文本框(比如账号输入框)输入 123456 然后再调用 clear 发现 123456 没有被清除

确实有这个问题,试试这么写 :
element?.typeText((element?.value as? String ?? "").characters.map { _ in XCUIKeyboardKeyDelete }.joined(separator: ""))

匿名 #14 · 2017年08月18日

@Samuel.ZhaoY 可以的 牛掰 牛掰 毕竟大神

匿名 #12 · 2017年08月18日

@Samuel.ZhaoY 多问一句 那个查找 id 为中文时乱码的问题 啥时候能解决呀

会尽快解决,XCTestWD 非业务性质项目,只能投入少部分时间维护,请见谅

匿名 #10 · 2017年08月18日

@Samuel.ZhaoY 好的 感谢 感谢 对了还有我有时候使用 xpath 定位的时候 感觉并不是很准确 比如我使用//[1]//[4]//[1]//[1]//[1] 能定位到 然后使用//[1]//[4]//[1]//[1]//[2] 定位下一个元素就定位不到了

inspector 能检测到吗, 以它为准

匿名 #4 · 2017年08月18日

@Samuel.ZhaoY 能检测到 我就是 copy 的它的 xpath 路径 我看代码里面把那些 element 都替换成 * 了所以我上面就写成上面那样

能获取内存不

@codeskyblue host_processor_info sysctl 这两个系统函数

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