在别人公司上班工作是下策,看似光鲜亮丽的生活,其实是温水煮青蛙,当某一天公司倒闭,或个人技术跟不上、在公司各种不服等等因素,不知道你有没有感受到面临淘汰的危机感。我时常有这样的感觉,不是非得自己给自己打工,而是你需要有不受制于人的技术、财富。你就必须要勤奋努力,抓紧时间做出一个有价值的优秀赚钱来源。加油!
————————————————————————————————————————————致己书
在别人公司上班工作是下策,看似光鲜亮丽的生活,其实是温水煮青蛙,当某一天公司倒闭,或个人技术跟不上、在公司各种不服等等因素,不知道你有没有感受到面临淘汰的危机感。我时常有这样的感觉,不是非得自己给自己打工,而是你需要有不受制于人的技术、财富。你就必须要勤奋努力,抓紧时间做出一个有价值的优秀赚钱来源。加油!
————————————————————————————————————————————致己书
特别特别想吐槽Android UIAutomator对WebView的控件树渲染,谷歌简直就写了一坨屎,又乱又臭
需求是这样的,我们期望通过UIAutomator对WebView来dump结构一致的控件树结构,以便在使用XPath定位的时候能够精准查询每个控件。然而实际情况是:
UIAutomator在某些Android版本(好像是4.4.4以下不支持)上无法dump,只有一个android.webkit.WebView节点。
UIAutomator就算能很好的dump应用中WebView的元素,但是结构也非常不统一,结构混乱。
目前我碰到的情况有:
android 8.0会正确识别应用中的图片,把它标记为android.widget.Image
,而在7.1等上却不能,只能识别成android.view.View
有些可能会多增加一些android.view.View
的包装视图,可能不仅仅是一层包装
通常在高版本手机,比如8.0+上能把一些图片识别出带文本的View,低版本却不能
就算你内容识别出文本了,View能正确识别为Image了,我都不怪你,我都可以做转化,比如我忽略问题,Image我都统一转化为View,但是结构不一致那就问题太大了,XPAth查找完全失效!在WebView中你无法利用其它条件来定位一个控件,能定位控件的文本、ID、class在WebView中都是不稳定因素。
本方案的目的就是要能够向WebView注入JavaScript代码,然后输出我们自己的一个查询结果,因为我们面对的是一个固定的网页html,所以它是兼容性很好的方式。
实现方式就是调用WebView的静态方法WebView.setWebContentsDebuggingEnabled(true)
,然后打开chrome://inspect调试当前WebView页面,但是很明显无效,设置调试模式仅仅对当前应用有效,对其他应用不产生任何效果,不然WebView就没啥安全性可言了。
开源地址:https://github.com/android-hacker/VirtualXposed
这个方案你需要掌握VisualApp和epic项目,它可以实现对被测应用的完全掌控,也不需要root权限,但是它过于复杂,不稳定性因素太多,兼容性有待验证,本方案可行,但对暂时Testin云测是不适用,留作待定研究吧。
这种方案来源于我对界面控件元素区域的思考,虽然UIAutomator给的控件树不靠谱,但是界面上的信息它都有(如果能dump的话),如果我们按照控件的区域重新组织这个WebView的结构的话,是否可行?
比如A区域在B区域的里面,那么我们认定A是B的子节点,如果A和B没有父子关系,他们处于同一Y坐标,那么他们可以认为是兄弟节点,如果他们的区域是一致的,那么他们其中之一是可以被忽略的,至于忽略谁,就要看谁附带的信息更有价值,比如A的带有文本或class是Image,显然A就更有价值,忽略B。
按照上面的大致逻辑,我们可以构造一个自己的控件树,这样是否可以提高兼容性?
实际上我做了测试,用云测Testin的700+个手机做了验证,在未使用本方案之前,通过了98台设备,使用本方案我测试了两次,第一次通过223,第二次是194次,提高了一倍
使用本方案之前
使用本方案之后
有一些效果,但是还不够o(╥﹏╥)o
Hi,我是云测自动化研发工程师,关于我可以看这个链接:一只误入歧途的资深自动化研发(待写)
系列文章:细数UIAutomator缺点(待写)
专题:android自动化测试(待写)
关于云测的自动化测试技术:我不说你肯定不知道原来Testin云测自动化技术在某种程度上讲已经超越了谷歌(待写)
本文讨论的是关于UIAutomator版本的吐槽,我们都知道UIAutomator分为两个版本,1.0和2.0
如下是两者的对比
1.0 | 2.0 | |
---|---|---|
最低Android版本分界线 | 大于或等于16 | 大于或等于18 |
运行包形式 | jar | apk |
权限 | shell级别 | 自身apk权限赋予 |
官网已经没有1.0的链接了,只有2.0的,我在其他地方找到老学习链接:https://stuff.mit.edu/afs/sipb/project/android/docs/tools/help/uiautomator/index.html
UIAutomator的运行包是一个jar包,运行命令大致如
# yourtest.jar是你的jar在android系统的具体文件路径,通常放在/data/local/tmp/目录下 |
运行起来后,我们用命令查看UIAutomator1.0的进程是shell的
chengmingdembp:Downloads cmlanche$ adb shell ps | grep uia |
所以它的权限是比较高的,启动之后便可以执行,也不需要安装,虽然它在这方面很便利,但它的获取控件信息的能力很鸡肋,只能获取到一个AccessibilityNodeInfo的root节点,而实际上,多root的情况是普遍存在的,尤其是5.0以后的android版本。
虽然它很鸡肋,但是它可以用来做安装UIAutomator2.0之前的操作,UIAutomator2.0需要自动安装,那么1.0的话就必须安装了,用它来自动点击UIAutomator2.0的安装对话框,在2.0启动之前的所有安装与权限框处理过程,都可以用1.0来做。
2.0是一个安装包的形式来做测试的,它拥有什么权限需要你自己去设定,谷歌现在官方只支持2.0,就说明谷歌对它有足够的重视。
官网:https://developer.android.com/training/testing/ui-automator
更好上网请用:expressvpn
2.0加入了Instrument支持,它的执行命令类似这样的:
# 详情请到官网学习 |
new Thread(() -> System.out.print("hello world")).start(); |
->
我们发现它指向的是Runnable
接口
@FunctionalInterface |
->
这个箭头是lambda表达式的关键操作符
->
把表达式分成两截,前面是函数参数,后面是函数体。
Thread的构造函数接收的是一个Runnable接口对象,而我们这里的用法相当于是把一个函数当做接口对象传递进去了,这点理解很关键,这正是函数式编程的含义所在。
我们注意到Runnable有个注解@FunctionalInterface
,它是jdk8才引入,它的含义是函数接口。它是lambda表达式的协议注解,这个注解非常重要,后面做源码分析会专门分析它的官方注释,到时候一目了然。
/* @jls 4.3.2. The Class Object |
它可以格式化输入文本的内容,可以允许输入哪种值,可以规定光标的位置,例如可以实现一个输入框只允许输入数字,
例如textfield
表示输入框对象,那么设置格式化内容的话就应该像这样子:textfield.setTextformatter(new TextFormatter<String>(IntegerFilter))
, 而其中IntegerFilter
就是只允许输入数字的过滤器,它的代码是怎样的呢?
/** |
DIGIT_PATTERN大家都能看出来它是正则表达式,是匹配文本是否是整数的表达式。
apply方法中的实现的意思是,只要符合整数就返回change,否则返回null
体验过无数个主机产商的虚拟主机服务,今天我把最佳虚拟主机产商颁给腾讯云,因为它给我太多惊喜。
腾讯云建站主机只配置了三款,基础版、专业版、旗舰版,而且网页空间最低都是40G起步,CPU独享,内存独享,不限流量,比阿里云独享的配置都高。
在购买建站主机后,会有一个默认的临时域名,你会发现证书就已经签发好了,例如我购买签发的临时域名是247915467.mylightsite.com,打开后会发现自动变成https,非常棒。当你绑定域名(注意必须是在腾讯购买的域名,如果不是可以把域名转移到腾讯云来)后会自动给这个域名签发证书,自动开启https访问,例如我绑定的域名是elementor.net.cn。
当你购买wordpress建站主机,wordpress你会发现已经安装好了,已经可以访问了。
这个其实也不算什么惊喜,因为所有的相关主机都是免备案的,但是我原先以为腾讯的主机如果是在中国大陆开展业务都是要备案的,香港主机是不需要的。
基础班单年售价5折,只要294元,买两年4折,只要470元。而且初次购买建站主机可以领取一个购买域名送30元代金券礼包,相当于再优惠30元,这太优惠了。相比已经很便宜的阿里云独享香港主机经济版(单年售价298元,两年538元),还要优惠,并且配置更好(主要是数据空间要更好很多,腾讯云是40G,阿里云是5G)。Elementor中文网就买了两年的,这样优惠更多。
腾讯主机Review:Hostreport.cn
腾讯云年终钜惠:cloud.tencent.com