专栏名称: 51Testing软件测试网
51Testing软件测试网,人气最旺的软件测试技术门户,提供软件测试社区交流,软件测试博客,人才服务,测试沙龙,测试杂志,测试资料下载等全方位信息服务,是国内最专业的软件测试就业培训、企业服务供应商...
目录
相关文章推荐
人力资源分享汇  ·  HR经验能力自测,来测试一下你能打多少分? ·  4 天前  
51好读  ›  专栏  ›  51Testing软件测试网

安卓APP自动化测试之搞定界面元素

51Testing软件测试网  · 公众号  · 测试  · 2017-05-18 17:32

正文


  1.1、概要

  本篇将对和界面元素相关的内容做讲解,比如,查找元素的几种常见方法,上一篇我们看到的driver.find_elements_by_id('el')就属于一种;还将介绍如何查看app界面上的元素去做定位,最后还将新手经常遇到的问题做个简单的回答。

  1.2、查找APP界面元素的工具

  我们先来看看如何找到app界面上的元素,以及它有哪些特点需要我们关注的。首先进入我们的android的sdk文件夹,目录为C:\Program Files (x86)\Android\android-sdk\tools

  在tools文件夹下有个uiautomatorviewer.bat批处理文件,点开会运行一个叫UI Automator Viewer的工具。如图   

  接下来将我们的手机连接上电脑,启动手机的app,这里我们继续以今题头条为例子,打开今日头条,然后点击工具左上角的绿色手机图标,等待几秒,结果会出现下图的样子   

  当我们的鼠标点击到'推荐'上时,看右侧的信息。主要关注resource-id,class这两个标识内容将会是我们后面在脚本里定位元素的主要信息。大家可以先自己熟悉一下这个工具,鼠标在不同的元素上切换看看效果。还记得我们在上一篇脚本中的操作步骤吗?第一步是点击我们的'热点'按钮将APP显示内容切换到热点板块,而脚本里是这样实现的

  els=driver.find_elements_by_id('p_')

  els[1].click()

  大家看一下我们'热点'按键的resource-id是什么,同样也是com.ss.android.article.news:id/p_和'推荐'的id一样,同理后面并排的一系列id都是一样的。如果简单来说,我们找到了元素并获取到元素的id后,我们在脚本里只需要这样写就好了

  driver.find_element_by_id('p_')

  如果要操作点击

  driver.find_element_by_id('p_').click()

  但是,我们的实战碰到的情况是什么呢,今日头条的顶部各个模块的元素id都是一样的,这样我们就要根据这个情况,去找id都是'p_'的一个集合,当然集合里的第一个元素就是我们的'推荐'模块,第二个元素就是'热点'模块,以此类推。所以我们的脚本就要这样去写了

  els=driver.find_elements_by_id('p_') #通过find_elements_by_id注意是加s的

  els[1].click()#对els集合的第二个元素进行点击操作。

  1.3、python中查找元素的方法

  工欲善其事必先利其器,这里先推荐大家一个好用的IDE-PyCharm。它的智能补全代码功能非常好用,如下图   

  好了接下来我们来看看appium几个常用的找元素的方法:

  1、find_element_by_id() / find_elements_by_id()

  2、 find_element_by_class_name() / find_elements_by_class_name()

  你没看错,不是我漏写了,就这两种。有些童鞋可能要问了,find开头的方法不是有很多吗?是啊从上面的截图也能看出来,什么by_tag_name、by_name、by_xpath,by_blabla…

  我在这里强调的是常用,好用,实战里用到出现频率最多的就是这两种了。当然在我的下个系列里(学习selenium文章),在web端查找页面元素的方法就会丰富许多。前面提到的

  UI Automator Viewer让大家注意的两个地方就是id和class了。在平时在做培训时,经常会遇到这样的问题,很多人会觉得的找元素好难。当每次结束培训后大家会了解难得不是找元素,而是怎么通过编程的思路去在合适的时间找到对应的元素。因为find方法是死的,就这几种,为什么别人能找到而我找不到?其实这里展现的问题就是很多人忽略掉的问题本质,你要找的页面元素在你的程序执行所在的界面位置吗?

  举个简单的例子,来阐述这个问题的含义:比如app的操作是在点击某个界面的一个元素A后进入下一个界面,我们要对下一个界面的某个元素B再进行点击操作。这时我们的脚本可能是这样写的

  driver.find_element_by_id(A).click()

  driver.find_element_by_id(B).click()

  大家来看看,这样写我们在执行python脚本后会顺利执行吗?答案只有一个Maybe。也许可能不会出错,但多数情况下会报错,返回无法找到元素B。这时看出原因的童鞋就要说了在driver.find_element_by_id(B).click()加上一句driver.implicitly_wait(10)或是sleep,脚本就变成这样

  driver.find_element_by_id(A).click()

  driver.implicitly_wait(10)

  driver.find_element_by_id(B).click()

  好了,这里先解释一下driver.implicitly_wait(10)这句的含义(给初识的筒子普及一下)

  这句的含义是程序等待,等待什么呢?就是等待它的下一句里要找的元素B,直到B被找到为止,当然要加一个期限一万年,呵呵开句玩笑,直到10秒超时。也就是说在10秒内什么时候B出现了程序就会开始继续往下执行。当然这里的超时时间可以任意指定,一般我们指定在10秒是个比较适合的时间。它被称作"智能等待",思维活络的童鞋可能就要问了,难道还有非智能的等待吗?当然有了,那就是我们的time.sleep()方法,在import我们的time包后,time.sleep(10)就是实实在在的让程序等上10秒才继续往下执行代码。好,到这里说出智能等待的童鞋脸上会露出得意的笑啊,得意的笑…我这时也有疑问了,这样写我们在执行python脚本后会顺利执行吗?答案也只有一个,可以,肯定,必须能顺利执行。但是这里要反转了,虽然脚本能够顺利执行,但是最后执行的结果一定是我们想的哪样吗?答案只有一个Maybe。为什么?Why?我们不是做了等待吗,脚本不是也顺利找到B元素了吗?好了公布答案,回到我们的app里,两个界面,A元素在前一个界面,B元素在下一个界面,我们脚本里通过id找到了B,那如果说A元素所在的界面也有一个和B元素同样id的元素呢?最后我们脚本的执行结果就是在第一个界面点击A后紧接着又点击了当前界面的另一个"B"元素。大家仔细回味一下这个情况,而且此情况会在实战里经常碰到。


......

出自《51测试天地》原创测试文章系列(四十五)

 
推荐阅读

点击阅读☞共论移动App测试的坑与“背黑锅”

点击阅读☞手机App安全性测试初探

点击阅读☞老司机手把手带你做 UI 自动化测试

点击阅读☞从 Android测试体系之内存篇

点击阅读☞APP专项测试之内存泄漏

点击左下角“阅读原文”查看全文内容!