思绪
最近完成了自定义Appium的需求,让Appium内置了自动识别权限框并点击的能力,参考我的知乎专栏:自定义Appium之路
但遇到另外一个问题,就是testerhome思寒开发的AppiumCrawler并不支持Appium最新版,也就是当前的1.12版本,只支持到1.8版本,让人很是捉急。
本来是想基于1.8重新自定义一个appium,但是发现这个appium实在太老了,下载下来编译都有各种问题,况且后续还要自定义appium-android-driver,appium-uiautomator2-driver和appium-uiaumator2-server,工作量至少得3天,太费时间。
索性,我来替思寒把AppCrawler来升级一下,让它支持最新appium。
刚开始觉得挺难的,毕竟我对scala只略知一二,编译打包方面还要学,但事后发现,这个工程做的确实不错,升级改造过程比预计的要简单很多,这里要给思寒大佬一个赞👍!
改造
先看看出了什么问题?
我开启最新的appium:
appium |
执行appcrawler测试:
java -jar appcrawler-2.1.3.jar -a ApiDemos-debug.apk |
执行过程中在appium和appcrawler两端都报错:
[HTTP] <-- GET /wd/hub/session/efdf97d8-cf46-4ffb-b2d4-7d8feb931cee/window/rect 200 7 ms - 50 |
2019-05-08 11:34:01 WARN [AppiumClient.$anonfun$getPageSource$1.340] get page source error |
分析原因
我们看到Appcrawler中报了个get page source error
,我们追查appcrawler的代码发现是在这里报错的:
override def getPageSource(): String = { |
我们看appium的源码,发现在appcrawler给我们的appium传递了一段js代码来获取控件树
{"script":"var source = document.documentElement.outerHTML; \nif (!source) { source = new XMLSerializer().serializeToString(document); }\nreturn source;","args":[]} |
然而,我们的appium代码对get page source这个功能接口做了限制,源码在appium-android-driver
中的lib/execute.js中:
extensions.execute = async function execute (script, args) { |
我们可以看到,这里抛出异常了,说明可能是接口变动了,那么我这里有个大胆猜想,appcrawler所使用的java-client过老。
解决问题
ok,立马开始行动,替换上最新的java-client,也就是7.0,同时我们使用最新的appcrawler2.4.0
<dependency> |
同时添加对应的仓库:
<repository> |
打包
mvn assembly:assembly |
打包完成,会再target目录下生成一个完整依赖的jar包:appcrawler-2.4.0-jar-with-dependencies.jar
重新执行,你会发现美妙的事情发生,最新appium完美支持!
提出质疑
上面的完美支持,是不是因为我更新了最新版本2.4.0,而不是使用的最开始的2.1.3版本呢?
有可能!!!
撤销修改,直接打包2.4.0,执行测试看是否正常。
结果就是:最开始的get page source问题没了,但出现另外一个问题:
2019-05-08 11:55:46 INFO [AppiumClient.30.initLog] already exist |
[debug] [W3C (dd159942)] Encountered internal error running command: NoSuchDriverError: A session is either terminated or not started |
还是错的!
那就用我的最新java-client 7.0吧,重新执行一次完整的测试,发现没有任何问题!