cmlanche

越努力越幸运


  • 首页

  • 关于

  • 归档

  • 标签

  • 友链+

  • 搜索

工作无非是温水煮青蛙

发表于 2018-08-24 | 阅读次数:
字数统计: 142 字 | 阅读时长 ≈ 1 分钟

在别人公司上班工作是下策,看似光鲜亮丽的生活,其实是温水煮青蛙,当某一天公司倒闭,或个人技术跟不上、在公司各种不服等等因素,不知道你有没有感受到面临淘汰的危机感。我时常有这样的感觉,不是非得自己给自己打工,而是你需要有不受制于人的技术、财富。你就必须要勤奋努力,抓紧时间做出一个有价值的优秀赚钱来源。加油!

————————————————————————————————————————————致己书

令人绝望的UIAutomator WebView自动化测试

发表于 2018-08-17 | 分类于 Appium | 阅读次数:
字数统计: 1,176 字 | 阅读时长 ≈ 4 分钟

特别特别想吐槽Android UIAutomator对WebView的控件树渲染,谷歌简直就写了一坨屎,又乱又臭

为什么要吐槽?

需求是这样的,我们期望通过UIAutomator对WebView来dump结构一致的控件树结构,以便在使用XPath定位的时候能够精准查询每个控件。然而实际情况是:

1. 可以与不可以的问题

UIAutomator在某些Android版本(好像是4.4.4以下不支持)上无法dump,只有一个android.webkit.WebView节点。

2. 就算可以dump,结构和内容也极度不统一

UIAutomator就算能很好的dump应用中WebView的元素,但是结构也非常不统一,结构混乱。

目前我碰到的情况有:

1. 识别能力不一致

android 8.0会正确识别应用中的图片,把它标记为android.widget.Image,而在7.1等上却不能,只能识别成android.view.View

2.识别出的结构不一致

有些可能会多增加一些android.view.View的包装视图,可能不仅仅是一层包装

3. 识别出的内容也不一样

通常在高版本手机,比如8.0+上能把一些图片识别出带文本的View,低版本却不能

吐槽

就算你内容识别出文本了,View能正确识别为Image了,我都不怪你,我都可以做转化,比如我忽略问题,Image我都统一转化为View,但是结构不一致那就问题太大了,XPAth查找完全失效!在WebView中你无法利用其它条件来定位一个控件,能定位控件的文本、ID、class在WebView中都是不稳定因素。

寻找思路解决这个问题

1. 将WebView设置为可调试模式,远程调试它

本方案的目的就是要能够向WebView注入JavaScript代码,然后输出我们自己的一个查询结果,因为我们面对的是一个固定的网页html,所以它是兼容性很好的方式。

实现方式就是调用WebView的静态方法WebView.setWebContentsDebuggingEnabled(true),然后打开chrome://inspect调试当前WebView页面,但是很明显无效,设置调试模式仅仅对当前应用有效,对其他应用不产生任何效果,不然WebView就没啥安全性可言了。

网上说(https://blog.csdn.net/zhulin2609/article/details/51437821)可以用root权限强制开启,但是我们的场景是面对成千上万的没root权限手机,去root显然不现实,本方案放弃

2. 利用VisualXposed来架设一个类似虚拟机的东西,用这个虚拟机来启动被测应用

开源地址:https://github.com/android-hacker/VirtualXposed

这个方案你需要掌握VisualApp和epic项目,它可以实现对被测应用的完全掌控,也不需要root权限,但是它过于复杂,不稳定性因素太多,兼容性有待验证,本方案可行,但对暂时Testin云测是不适用,留作待定研究吧。

3. 利用UIAutomator渲染的不稳定坑逼的WebView的AccessbilityNodeInfo来重新构造我们自己的控件树结构

这种方案来源于我对界面控件元素区域的思考,虽然UIAutomator给的控件树不靠谱,但是界面上的信息它都有(如果能dump的话),如果我们按照控件的区域重新组织这个WebView的结构的话,是否可行?

比如A区域在B区域的里面,那么我们认定A是B的子节点,如果A和B没有父子关系,他们处于同一Y坐标,那么他们可以认为是兄弟节点,如果他们的区域是一致的,那么他们其中之一是可以被忽略的,至于忽略谁,就要看谁附带的信息更有价值,比如A的带有文本或class是Image,显然A就更有价值,忽略B。

按照上面的大致逻辑,我们可以构造一个自己的控件树,这样是否可以提高兼容性?

实际上我做了测试,用云测Testin的700+个手机做了验证,在未使用本方案之前,通过了98台设备,使用本方案我测试了两次,第一次通过223,第二次是194次,提高了一倍

使用本方案之前

image-20180817194907798

使用本方案之后

image-20180817194831153

image-20180817194933148

有一些效果,但是还不够o(╥﹏╥)o

最后我想问

  1. 谷歌的UIAutomator2.0测试框架在WebView上测试是很坑爹的,也是特别难解的,为什么不能让我们自定义渲染逻辑呢?
  2. 有哪位同学有更好的方式?能够兼容上千款不同的设备不同的版本?

Android自动化·细数UIAutomator的坑·UIAutomator渲染WebView控件树在不同手机上的差异

发表于 2018-08-13 | 阅读次数:
字数统计: 457 字 | 阅读时长 ≈ 2 分钟

我想只有Testin云测才会遇到这样的问题,云测的自动化技术是要抹掉手机的差异性的,就是说一套脚本可以在不同的手机产商不同的手机版本上成功运行,而云测会遇到很多很多各种各样因为手机产商与版本的差异导致脚本不兼容的问题,而今天我讲的是最近发现的UIAutomator在WebView控件树渲染在不同手机上的差异。

Testin云测已跨越自动化测试的万水千山,欢迎来测!

阅读全文 »

android自动化研发日志 - 细数UIAutomator缺点 - 1.0和2.0的区别

发表于 2018-08-13 | 阅读次数:
字数统计: 617 字 | 阅读时长 ≈ 2 分钟

Hi,我是云测自动化研发工程师,关于我可以看这个链接:一只误入歧途的资深自动化研发(待写)

系列文章:细数UIAutomator缺点(待写)

专题:android自动化测试(待写)

关于云测的自动化测试技术:我不说你肯定不知道原来Testin云测自动化技术在某种程度上讲已经超越了谷歌(待写)


综述

本文讨论的是关于UIAutomator版本的吐槽,我们都知道UIAutomator分为两个版本,1.0和2.0

如下是两者的对比

1.0 2.0
最低Android版本分界线 大于或等于16 大于或等于18
运行包形式 jar apk
权限 shell级别 自身apk权限赋予

UIAutomator1.0

官网已经没有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/目录下
# yourjarclass是你要执行的测试方法,例如com.test.YourTestClass#functionname
adb shell uiautomator runtest yourtest.jar -c yourjarclass#function

运行起来后,我们用命令查看UIAutomator1.0的进程是shell的

chengmingdembp:Downloads cmlanche$ adb shell ps | grep uia
shell 4101 4098 2048608 61680 futex_wait 7f81656170 S uiautomator
chengmingdembp:Downloads cmlanche$

所以它的权限是比较高的,启动之后便可以执行,也不需要安装,虽然它在这方面很便利,但它的获取控件信息的能力很鸡肋,只能获取到一个AccessibilityNodeInfo的root节点,而实际上,多root的情况是普遍存在的,尤其是5.0以后的android版本。

虽然它很鸡肋,但是它可以用来做安装UIAutomator2.0之前的操作,UIAutomator2.0需要自动安装,那么1.0的话就必须安装了,用它来自动点击UIAutomator2.0的安装对话框,在2.0启动之前的所有安装与权限框处理过程,都可以用1.0来做。

UIAutomator2.0

2.0是一个安装包的形式来做测试的,它拥有什么权限需要你自己去设定,谷歌现在官方只支持2.0,就说明谷歌对它有足够的重视。

官网:https://developer.android.com/training/testing/ui-automator

更好上网请用:expressvpn

2.0加入了Instrument支持,它的执行命令类似这样的:

# 详情请到官网学习
adb shell am instrument -w -r -e debug false -e class ....

你真的了解java的lambda吗?- java lambda用法与源码分析

发表于 2018-07-22 | 阅读次数:
字数统计: 2,784 字 | 阅读时长 ≈ 13 分钟

用法

示例:最普遍的一个例子,执行一个线程

new Thread(() -> System.out.print("hello world")).start();

->我们发现它指向的是Runnable接口

@FunctionalInterface
public interface Runnable {
/**
* When an object implementing interface <code>Runnable</code> is used
* to create a thread, starting the thread causes the object's
* <code>run</code> method to be called in that separately executing
* thread.
* <p>
* The general contract of the method <code>run</code> is that it may
* take any action whatsoever.
*
* @see java.lang.Thread#run()
*/
public abstract void run();
}

分析

  1. ->这个箭头是lambda表达式的关键操作符

  2. ->把表达式分成两截,前面是函数参数,后面是函数体。

  3. Thread的构造函数接收的是一个Runnable接口对象,而我们这里的用法相当于是把一个函数当做接口对象传递进去了,这点理解很关键,这正是函数式编程的含义所在。

  4. 我们注意到Runnable有个注解@FunctionalInterface,它是jdk8才引入,它的含义是函数接口。它是lambda表达式的协议注解,这个注解非常重要,后面做源码分析会专门分析它的官方注释,到时候一目了然。

    /* @jls 4.3.2. The Class Object
    * @jls 9.8 Functional Interfaces
    * @jls 9.4.3 Interface Method Body
    * @since 1.8
    */
    @Documented
    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.TYPE)
    public @interface FunctionalInterface {}
阅读全文 »

聊一聊JavaFx中的TextFormatter以及一元操作符UnaryOperator

发表于 2018-07-21 | 分类于 javafx | 阅读次数:
字数统计: 1,435 字 | 阅读时长 ≈ 6 分钟

直击主题:它在JavaFx中可以实现什么效果

它可以格式化输入文本的内容,可以允许输入哪种值,可以规定光标的位置,例如可以实现一个输入框只允许输入数字,

例如textfield表示输入框对象,那么设置格式化内容的话就应该像这样子:textfield.setTextformatter(new TextFormatter<String>(IntegerFilter)), 而其中IntegerFilter就是只允许输入数字的过滤器,它的代码是怎样的呢?

/**
* Created by cmlanche on 2017/7/10.
* 整数过滤器
* 应用:比如使一个输入框只能输入数字
*/
public class IntegerFilter implements UnaryOperator<TextFormatter.Change> {
private final static Pattern DIGIT_PATTERN = Pattern.compile("\\d*");

@Override
public TextFormatter.Change apply(TextFormatter.Change change) {
return DIGIT_PATTERN.matcher(change.getText()).matches() ? change : null;
}
}

DIGIT_PATTERN大家都能看出来它是正则表达式,是匹配文本是否是整数的表达式。

apply方法中的实现的意思是,只要符合整数就返回change,否则返回null

阅读全文 »

Unable to start monitor 4454, An other instance is problaly using the same port

发表于 2018-07-18 | 阅读次数:
字数统计: 95 字 | 阅读时长 ≈ 1 分钟

最近两个月启动IDEA一直这个错误,终于今天忍不住了,找了下解决这个问题的方法

造成IDEA启动失败。

阅读全文 »

解决Android Robotium(Instrumentation)初始化时getActivity阻塞的问题

发表于 2018-07-17 | 阅读次数:
字数统计: 385 字 | 阅读时长 ≈ 2 分钟

如果应用没有启动,阻塞了

这种情况getActivity肯定会阻塞的,你需要调用startActivity启动起来:

getInstrumentation().getTargetContext().startActivity(intent);

如果在Robotium中还是没启动,你就需要借助外力来启动它了,比如命令:

am start .... // 代码未写完整,意思就是你需要借助am的命令来启动应用
阅读全文 »

Bloogle开发日记 | 制作一个滚动大纲的前端网页

发表于 2018-07-11 | 阅读次数:
字数统计: 568 字 | 阅读时长 ≈ 2 分钟

从零教学怎么制作一个滚动大纲

阅读全文 »

腾讯云建站主机的一次奇妙之旅

发表于 2018-06-21 | 阅读次数:
字数统计: 610 字 | 阅读时长 ≈ 2 分钟

十星主机 - 腾讯云建站主机

体验过无数个主机产商的虚拟主机服务,今天我把最佳虚拟主机产商颁给腾讯云,因为它给我太多惊喜。

惊喜1:配置极高

腾讯云建站主机只配置了三款,基础版、专业版、旗舰版,而且网页空间最低都是40G起步,CPU独享,内存独享,不限流量,比阿里云独享的配置都高。

惊喜2:自动开启SSL数字证书,并且是免费的,浏览器https绿色标识

在购买建站主机后,会有一个默认的临时域名,你会发现证书就已经签发好了,例如我购买签发的临时域名是247915467.mylightsite.com,打开后会发现自动变成https,非常棒。当你绑定域名(注意必须是在腾讯购买的域名,如果不是可以把域名转移到腾讯云来)后会自动给这个域名签发证书,自动开启https访问,例如我绑定的域名是elementor.net.cn。

惊喜3:Wordpress建站主机自动安装Wordpress

当你购买wordpress建站主机,wordpress你会发现已经安装好了,已经可以访问了。

惊喜4:香港主机免备案

这个其实也不算什么惊喜,因为所有的相关主机都是免备案的,但是我原先以为腾讯的主机如果是在中国大陆开展业务都是要备案的,香港主机是不需要的。

惊喜5:价格低

基础班单年售价5折,只要294元,买两年4折,只要470元。而且初次购买建站主机可以领取一个购买域名送30元代金券礼包,相当于再优惠30元,这太优惠了。相比已经很便宜的阿里云独享香港主机经济版(单年售价298元,两年538元),还要优惠,并且配置更好(主要是数据空间要更好很多,腾讯云是40G,阿里云是5G)。Elementor中文网就买了两年的,这样优惠更多。

腾讯主机Review:Hostreport.cn

腾讯云年终钜惠:cloud.tencent.com

关于我

  1. 一个不想命运低头的黑衣剑士
  2. 个人博客:cmlanche.com
  3. 我的产品:主机深度评测网
  4. CSDN个人主页:cmlanche
  5. SegmentFault个人主页:cmlanche
  6. 博客园个人主页:cmlanche
1…4567
cmlanche

cmlanche

70 日志
11 分类
85 标签
RSS
GitHub Weibo
友链
  • 面包多(Online Sell)
  • 找主机网
  • Jason
  • CodeSpots
  • 运维咖啡吧
  • KuoLu
  • 包子
  • vps导航
  • Congz.club
  • 冯言疯语
© 2019 cmlanche
由 Hexo 强力驱动
|
主题 — NexT.Pisces v5.1.3