简介
刚开始看时, 众多小伙伴会觉得这方面实际上在异性兄弟那儿就已经有过介绍以及分享了, 然而事实并非如此, 上次进行介绍与分享的大哥是, 是一款定位工具。而今天所介绍的乃是一个java库, 它能够提供执行自动化测试的各式各样的API。
团队在4.1版本, 也就是API 16中, 推出了一款全新的UI自动化测试工具, 它能帮助开发人员更具效率地完成App的Debug工作, 并且对于测试人员来说同样是极大的喜讯, 究竟为何会这样说呢?

某人, 我刚实施操作之际, 察觉到一个故障, 你所编写的应用程序去打A页面, 接着去打B页面, 偶尔会出现屏幕闪烁的状况。(心里想着: 哎呀, 这个别样的状况)
移动应用开发者发问: "嗯? 存在这样的问题呀", "麻烦你复现拿给我瞅瞅", 其内心暗自琢磨: "瞎声称, 我这般厉害, 我写出的应用怎会存有软件漏洞呢", "肯定是你操作的方式不正确"。
QA: 一番紧促又繁杂忙活不迭的高明操演而终于全然完成之后......"咦, 为何就不再现身露脸了? (内心暗自思忖: 哎呀妈, 这究竟是怎么个状况, 在最为关键的重要时刻竟然掉链子了, 赶紧麻溜溜儿地痛快出来, 直接让我丢尽脸面, 丢得可真是太过分了)"。
开发人员说道: "那你先回去好了, 等复现之后再来告诉我。(其内心独白表现为: 呵呵,这和我心里所设想的是一样的, 我所编写的何以会存在故障呢)"。
几天过去了......
QA呈现出满心欢喜的样子, 提到那个特定的人说"上次的那个问题我已经复现了, 要操作给你看......哎, 我去, 怎么又不出现了!(其内心独白是: 一脸淫笑, 心想我说有bug, 你让我复现, 这下应该能复现出来了, 才刚这么想......额, 又看不到了, 这到底是怎么搞的, 真要气死我了)"。
设备是否存在问题, 你去换另外一个设备再尝试一下, (内心独白: 小瞧你了, 全都已经讲给你听了不存在漏洞你就是不相信非要再次呈现出来)
QA: "宝宝心里是苦的, 然而宝宝不会去说!(其内心独白为: 这个。哎。哎。哎。哎。哎。哎)"。
有了之后:
如下这般提问与回答: "我察觉到了一个程序漏洞, 你所撰写的应用程序, 在开启A页面之后, 接着再去开启B页面, 偶尔的时候便会出现屏幕闪烁的状况。"。
DEV称, "这般容易就行, 需我撰写个测试用例去, 在极短瞬时便可将其解决。(于内心暗自思忖: 一副极为自满的样子)"。
问答: "哇塞, 好厉害, 我的天!(心里暗自想着: 简直太牛叉了, 喜欢得不得了)"。
全剧终!
提供了以下两种工具来支持UI自动化测试:
1、 text定位
有可能存在一些人搞不清楚为啥要说它是终极定位, 并且它和什么存在关联呢? 要是先前撰写了一些脚本, 发觉有的时段一些元素没办法很好地进行定位之时, 那样就需要运用它去定位, 它属于一种极为强有力的定位方式, 其原理是借助自带的类库去寻觅元素, 都依照官方公布出来的方法去找了难道还会找不到吗?
首先和宏哥一起看一下下面的图片:

于上面所呈现的图片当中, 我们摒弃采用封装好的方法, 而是径直运用其去展开定位, 相应结果如下:
1 user = new Uiobject(new UiSelector().text("请输入淘宝账户"))
2 user.setText("test")
看不清这两句表述, 也没什么关系的, 毕竟我们后续要阐述的是针对其已实施封装作业之物的办法, 此处仅给予你瞧一瞧它原始办法有着怎样的做法呈现。首先, 它会依据你的定位讯息生成一个对象出来, 随后, 又再于你所生成的对象之上从事相关的操作。接下来, 我们瞅一瞅在实施过程当中的达成办法:
1 ele = self.driver.find_element_by_android_uiautomator('new UiSelector().text("请输入淘宝账户")')
2 ele.send_keys("123")
将两种代码的写法予以对比, 我们能够发觉, 其相同之处仅仅不过是最后的定位信息是一致的, 也就是: new ().text("请输入淘宝账户"), 那么这句话究竟是什么含义? 简而言之就是依据一定的条件去查找元素, 我们此处的条件乃是text属性为"请输入淘宝账户", 再依据图片去进行理解, 是不是会显得颇为容易? 其元素定位实际上跟那定位并无二致, 或者进而讲它较那定位途径更为多样且更具适用性, 并非仅有这一种形式, 它又不单单只支持根据、id等来实施定位, 况且还支持藉由模糊匹配来实行定位, 这般是不是会让人觉得档次更高呢? 接下来我们对这几种定位方式进行简要解说。
2 、 text模糊定位
通过text的部分信息就能进行定位, 这便是模糊定位, 顾名思义, 我们直接来看代码:
1 ele = self.driver.find_element_by_android_uiautomator('new UiSelector().textContains("请输入淘")')
2 ele.send_keys("123")
于上述的代码里头, 我们仅仅是把.text()的那个方法转变为了.(), 于该方法之中传入模模糊糊的数据便可。瞅见此处, 是不是有人思索过一个问题, 鉴于存在类似的模糊寻觅情形, 那么是否有着仿若正则表达式那样子的查找, 答案当是肯定的, 请看我们接下来的方法。
3、 正则匹配查找
照其意思就是借助正则去达成查找定位, 它同样是凭借text的相关属性来开展正则匹配, 我们就此直接查看代码。
1 ele = self.driver.find_element_by_android_uiautomator('new UiSelector().textMatches("^请输入淘.*")')
2 ele.send_keys("123")
刚才所匹配的部分信息, 对于某些刚刚着手进行测试的小伙伴来讲, 或许还不是特别熟悉, 不过这并没有太大关系, 后续能够去搜索一下正则表达式教程, 略微知晓一番便可行。
4、 定位
这儿的定位, 跟封装好的那种id定位, 是同样的情况, 仅仅这儿把写法予以了改变, 成了这种写法罢了, 瞧瞧下面的代码:
1 1 ele = self.driver.find_element_by_android_uiautomator('new UiSelector().resourceId("com.taobao.taobao:id/aliuser_login_account_et")')
2 2 ele.send_keys('234')
经历上面代码同之前代码彼此对照, 咱们很有可能发觉, 实际上它们开头部分完全是相同的, 只不过在定位这个环节出现了某些变动, 把text变换成就行, 这意指对页面对象属性的那些信息予以变更了, 其余的方法全都一样。接下来对于其余方法, 我就免得白白占用篇幅描述, 仅给大伙展现一个简易的例证。
5、 定位
通过id进行正则匹配定位
1 ele = self.driver.find_element_by_android_uiautomator('new UiSelector().resourceIdMatches(".+aliuser_login_account_et")')
2 ele.send_keys('234')
6、 定位
通过调用 使用进行定位
1 ele = self.driver.find_element_by_android_uiautomator('new UiSelector().className("android.widget.EditText")')
2 ele.send_keys('234')
7、 定位
通过正则匹配进行定位
1 ele = self.driver.find_element_by_android_uiautomator('new UiSelector().classNameMatches (".*EditText")')
2 ele.send_keys('234')
在经过上面的相关知识学习后, 我觉得各位应该是对其定位有了一定程度的知晓了, 然而我要告知大家的是, 这并非全部, 存在着数量繁多的定位方式, 这需要大家于未来持续的学习进程里进行积攒, 我根本没办法把所有的方法都向大家讲述清楚, 此处仅是给大伙一个起始引导, 但是我期望大家于学习定位之际, 并非仅仅关注其定位, 毕竟它也是属于封装范畴内的定位方式, 所以在学习的同时去大略学习一下这个, 是具备较大好处的, 而且对于往后提升自身以及在工作中重新实施封装而言, 有着极大的助益。
8、小结
1、之前运行时工具不存在问题, 今儿加以使用, 在查看某些页面元素的这般操作过程里, 出现了状况, 呈现出Error这样情形, 这个UI这里显示Error, 显示着null, 情况如图所示:

再网上找了很多解决办法依然没解决
宏哥总结了一下原因:
1、该app不支持该页面的截屏功能所以捕捉不到
2、手机需要重启
3、非原装数据线
4、服务异常需要重新连接
5、可以尝试切换USB接口
6、最终能够将手机开发者选项里的USB调试, 把权限撤销掉, 之后再重新去获取。
最后要记着, 先重启一回, 接着再重启一回, 如此这般才能解决所有问题。或许这次出现报错状况了, 然而在重启之后便成功达成了。这种情况通常是找不到可讲理之地的, 哦。