篇3                 安卓app自动化测试-搞定界面元素

--lamecho辣么丑

1.1概要

大家好! 我是lamecho(辣么丑),今天是《安卓app自动化测试》的第三篇了,回顾一下前两篇主要是环境的事情,而从本篇开始就没环境什么事了,这座大山算是搬走了。

本篇将对和界面元素相关的内容做讲解,比如,查找元素的几种常见方法,上一篇我们看到的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”元素。大家仔细回味一下这个情况,而且此情况会在实战里经常碰到。好了回过头我们看看上一篇我们的那个对今日头条的操作的demo

driver.find_element_by_id('ab0').click()

while 1:

if driver.current_activity=='com.ss.android.article.base.feature.search.SearchActivity':

break

driver.find_element_by_id('ll').send_keys('lamecho')

driver.find_element_by_id('o9').click()

情况是不是很像,逐条分析一下这几行。在进首页点击了'ab0'后,我们在while循环里对当前的界面activity做判断,如果获取到当前的activity是查找界面的名称,那么我们break退出循环,再去找'll'并给他输入“lamecho”字符串,最后点击'o9'搜索。花这么长的篇幅来说明这个情况,就是要说刚才的那句话“难得不是找元素,而是怎么通过编程的思路去在合适的时间找到对应的元素”。这个时间就是我们在以后的自动化实现上需要去关注和考虑的问题,而找元素那只是自动化必须要有的一个步骤而已。

接下来我们再对find_elements_by_id()和find_elements_by_class_name()做个简要的说明。细心的童鞋可能发现了element变成了复数的形式。所以通过这种方法找出来的元素必定是一个集合,即返回给我们的是个数组(python的叫法是个list)。如果我们的脚本中出现这样的写法你是不能直接使用send_keys()和click()的,因为在python程序里你不能对一个list集合做输入和点击。比如我们这样写:

els= driver.find_elements_by_id('ll')

els[0].send_keys(‘lamecho’)

对找到的els里的第一个元素做输入,第二个就是els[1],以此类推。注意下标开始是从0开始的。

好了,我们的app自动化测试第三篇-搞定界面元素也要结束了。希望大家把文中偏于理论的东西分析理解,自己上手再实现一些demo。下一篇,我们将更多的介绍一下appium中有用的一些方法函数,比如说怎么做界面的滑动,怎么做界面坐标位置的点击,锁屏界面的解锁是如何实现的等等。最后感谢大家耐心读完本篇文章,我是lamecho,辣么丑。

原创文章,转载请注明出处。

欢迎关注我的个人微信号”fire-bug“,了解最新文章或提出你的问题和观点

微博:https://weibo.com/u/6017986584,或搜索‘lamecho好棒’

篇3 安卓app自动化测试-搞定界面元素的更多相关文章

  1. 篇4 安卓app自动化测试-Appium API进阶

    篇4                 安卓app自动化测试-Appium API进阶 --lamecho辣么丑 1.1概要 大家好! 我是lamecho(辣么丑),今天是<安卓app自动化测试& ...

  2. 篇2 安卓app自动化测试-初识python调用appium

    篇2              安卓app自动化测试-初识python调用appium --lamecho辣么丑 1.1概要 大家好!我是lamecho(辣么丑),上一篇也是<安卓app自动化测 ...

  3. sikuli+eclipse对于安卓app自动化测试的应用(第一次写博客,有些语言还不太专业,望海涵)

    Sikuli是什么? 下面是来自于官网的介绍:Sikuli is a visual technology to automate and test graphical user interfaces ...

  4. 安卓App自动化测试环境

    一.appium安装 1.nodejs依赖 2..net framework 3.Appium桌面程序安装 3.1.安装包获取 3.2.安装过程 二.Java_ jdk安装 1.Java_jdk版本说 ...

  5. 读完这篇文章,就基本搞定了Redis数据库

    简单来说Redis就是一个数据库,不过与传统的数据库不同的是Redis的数据是存在内存中的,所以存写速度非常快,因此Redis被广泛应用于缓存方向. 另外,Redis也经常用来做分布式锁.Redis提 ...

  6. Chrome调试模式获取App混合应用H5界面元素

    原文章地址http://blog.csdn.net/qq_19636353/article/details/53731254 浏览器的远程调试工具,使得我们可以通过PC上开启的控制台,调试手机浏览器中 ...

  7. 一篇文章搞定Selenium元素定位/封装/数据驱动

    小伙伴都知道,自动化最重的,又最"难"(因为实战中会碰到定位的各种坑)那就是定位元素.如果不熟练掌握定位,那只怕你比功能测式的小伙伴下班还会要晚!扎心了吧! Selenium常用定 ...

  8. 技术分享 | app自动化测试(Android)--元素定位方式与隐式等待

    原文链接 元素定位是 UI 自动化测试中最关键的一步,假如没有定位到元素,也就无法完成对页面的操作.那么在页面中如何定位到想要的元素,本小节讨论 Appium 元素定位方式. Appium的元素定位方 ...

  9. CSS 轻松搞定标签(元素)居中问题

    在CSS里,标签位置居中一直是困扰Web前端的难题.在本文中,我对这类问题进行了探究和给出了几点建议,供读者参考. 1 行内标签 1.1 水平居中 在父级标签中使用 text-align: cente ...

随机推荐

  1. 3407: [Usaco2009 Oct]Bessie's Weight Problem 贝茜的体重问题

    3407: [Usaco2009 Oct]Bessie's Weight Problem 贝茜的体重问题 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit:  ...

  2. RabbitMQ-从基础到实战(1)— Hello RabbitMQ

    转载请注明出处 1.简介 本篇博文介绍了在windows平台下安装RabbitMQ Server端,并用JAVA代码实现收发消息 2.安装RabbitMQ RabbitMQ是用Erlang开发的,所以 ...

  3. Mysql5.7服务下载安装

    身处MySQL这个圈子,能够切身地感受到大家对MySQL 5.7的期待和热情,似乎每个人都迫不及待的想要了解.学习和使用MySQL 5.7.那么,我们不禁要问,MySQL 5.7到底做了哪些改进,引入 ...

  4. Java中实现短信发送

    最近跟着做公司的项目偶然接触到的,顺势把这个给记录下来,给自己梳理一下. 采用引入第三方工具的方式,网上查了半天,发现简单的实现方式便是注册一个中国网建的账号,新建账号的时候会附带赠几条免费短信,彩信 ...

  5. 使用shape来定义控件的一些显示属性

    Android中常常使用shape来定义控件的一些显示属性,今天看了一些shape的使用,对shape有了大体的了解,稍作总结 先看下面的代码: <shape> <!-- 实心 -- ...

  6. 解决华为手机不打印Log信息的问题

    在之前安装了Android Studio后,发现了一个很苦恼的事情,就是在程序中的写Log语句,不能正常的在Logcat中打印出来,这对于解决程序bug真是一刀切断,让人无从下手,在各种尝试后,首先我 ...

  7. 基于Intranet的零件库管理信息系统设计--part01

    好吧,临近毕业的我,毕业设计还没开始做呢.时间不等人,再过两个月就要答辩了,我得开始做我的毕设了,虽然我现在还没能力完全把毕设做出来,但总得先迈出第一步吧.今天先做一小部分. 话不多说,先来看我得毕业 ...

  8. node.js 模板 ejs 转

    node.js 模板引ejs. 搜了一把推荐用ejs的最多. 速度比对:http://www.cnblogs.com/fengmk2/archive/2011/04/28/2031971.html e ...

  9. Linux中web服务运行情况的方法

    监控一般通过脚本实现,使用定时任务定期执行检测. 1.端口 本地:ss,netstat,lsof 远程:telnet,namp,nc 2.本地进程数 例如: lsof -i:80|wc -l ps - ...

  10. PHP开发人员对JAVA的WEB开发入门(初版-已废弃)

    最近准备对其他部门PHP开发的童鞋做一个对JAVA的培训.知己知彼,百战不殆,我要先了解点PHP,才能确认他们的基础,达到好的授课效果. PHP(原始为Personal Home Page的缩写,后正 ...