微信号:gh_be6ab0a8dfb7

介绍:国内首个移动测试交流社区,最专业的 Appium 交流社区.专注于移动互联网测试和 Web 相关测试技术研究.我们的理念:Coding Share Show Cool

WebDriverAgent 踩坑记

2016-07-04 13:06 chenhengjie123

因为公司一些自动化测试场景需要(对官方 app 进行 UI 自动化、多机并行跑 monkey ),这几天在基于 appium python client 的基础上编写 WebDriverAgent 的 python client,对 WebDriverAgent 进行单独支持。目前已经完成得差不多了,过程中发现不少坑,在这里记录下,顺便吐下槽。

PS:这个 client 由于公司政策不能放出来,请见谅。


关于和 WebDriver Spec 不一样的部分


这部分最坑。本来实现的是 WebDriver Spec 已经定义好的功能,结果实现方式还不一样,导致需要自己覆盖原有的 client 方法。

注:打字太累,下面 WebDriverAgent 均简称 WDA


1、 获取页面元素树(page_source)

原请求:GET /source
WDA实现:POST /source

另外要注意的是,WDA 返回的元素树默认是 json 格式,client 在进行 json 转 dict 时会把元素数也转为 dict ,需要手动转化回 json string 。


2、 错误信息处理

原格式:{'status': 1, 'sessionId': xxx, 'message': 'error message'}
WDA 实现:{'status': 1, 'sessionId': xxx, 'value': 'error message'}

如果是找元素出错,还会变成 {'status': 1, 'sessionId': xxx, 'value': {'description': 'error message', 'using': 'class name', 'value': 'test'}}

要修改的话,直接在 error_handler 修改 Exception 中的处理就好。


3、获取 textfield 元素的 text 属性

当输入框没有内容时,返回的 value 是 null (在 python client 里面会自动转换为 None )。记住:不要通过空字符串来判断 textfield 是否为空哦。当然,你也可以 override text 方法,把 None 转换回空字符串。


WebDriverAgent 自带的坑


1、 查找元素

使用 inspector 时,属性名显示为 Class 。使用 source 时,属性名变成了 type 。当然搜索时,用 find_element_by_class_name('testClass') 等价于 find_element_by_link_text('type=testClass')

还有另一坑,在 inspector 和 source 中显示的其实都是精简后的名称。例如 inspector 中显示 'Class: Button' ,但你用 'Button' 这个 class name 去找是死活找不到的,因为在查找元素的时候它的完整名称是 XCUIElementTypeButton 。也就是你必须用 XCUIElementTypeButton 这个名称作为 class name 才能找到这个元素。

用 xpath 的同学也要注意,json 中的元素属性值和 xpath 会有些出入。举例如下:


其中 xml 文件需要自己手动在 FBFindElementCommands.m 的 + (NSArray<XCElementSnapshot *> *)descendantsOfElementSnapshot:(XCElementSnapshot *)elementSnapshot withXPathQuery:(NSString *)xpathQuery 自己打断点:


打完断点后在 lldb 的调试窗口里输入 
po [xmlElement xmlString] 获取。xpath 的查找也是基于这个 xml 的。


2、查看元素属性值

留意官方的 integration test FBElementAttributeTests.m,不是所有元素都有 name, label 这两个属性值。如果刚好没有需要的属性值,轻则返回 None,重则直接在 WebDriverAgent 端产生错误。


关于如何从源码获取接口 api 相关信息


虽然官方给了一个 wiki,但里面给到的 api 并不全。不过好在 WebDriverAgent 的代码结构还是比较清晰的,所以也可以简单地通过源码获取 api 信息。

接口相关处理文件全部在 WebDriverAgentLib/Commands 中。


route


一般一开始就是此文件处理的所有 command 的 route 列表。例如 FBDebugCommands.m 中:


其中第二个请求带有 .withoutSession ,表明请求中可以不带有 sessionId 这个字段。这个 route 应该是给 inspector 用的。


arguments


通过查看 route 指定的 selector 可以找到对应 handler ,handler 中如果会获取请求中的参数,会以 request.arguments[@"argName"] 的形式获取,如 FBDebugCommands.m 中


可以看到它会处理请求中的 accessible 参数,并会先转化为 boolean 类型。因此请求中可以带有 accessible 参数,且它的值必须是 true 或者 false


总结


WebDriverAgent 作为新的基于 XCUITest 的测试工具,有其独到之处:


  • 支持一台 mac 连接多台设备进行测试(走 xcodebuild ,不走 instruments)

  • 任意应用的 UI 测试(悄悄告诉你,苹果的桌面也是一个应用,它的 bundle id 是 com.apple.springboard 哦)

  • 支持跨应用(任意界面都能控制)


而且稳定性也还可以接受(针对所有支持命令编写的50条测试用例基本可以稳定保持通过,只是偶尔响应速度比较慢)。

虽然目前还有前面提到的这些坑,但都不是什么大坑,只要少许修改就能填掉。相信经过逐步完善,会像现在 Android 的 UIAutomator 那样成为主要的 UI 自动化测试框架之一。

最后,如果有同学想练手同时熟悉 appium python client ,不妨自己动手做个 WebDriverAgent python client 出来哦。




除此之外,小编也整理了一下到目前为止评论区里提到的一些 WebDriverAgent 还存在的问题:


来自 gogle长时间运行WDA内存泄漏最终导致低内存crash

来自 恒温gogle:元素多了,就废了。实测控件树有236个元素,耗时2.6秒,这仅仅是获取控件树的耗时


可见从稳定性和性能角度,WebDriverAgent 还有很大提升空间。



 
testerhome 更多文章 Ant+JMeter+WebDriverAgent 游记 微信爆破报告 中国移动测试大会晚宴票火热售票中! 第二届中国移动互联网测试大会 PPT 开放下载! [译]《Testing with Xcode》第一章——QuickStart
猜您喜欢 PHP7与Swoole 12位古代数学家的现代化成就 JavaScript 中 this 的使用技巧总结 springmvc 注解 【数据挖掘】数据挖掘R语言实践目录