App控件定位:Android 控件介绍及元素定位方法
<p>本文将分享Android相关基础知识和Android APP控件定位工具的使用方法。<br></p><div class="toc"><div class="toc-container-header">目录</div><ul><li>Android基础知识<ul><li>Android布局</li><li>Android四大组件<ul><li>1、activity</li><li>2、Service</li><li>3、Content Provider</li><li>4、Broadcast Receiver</li></ul></li><li>Android控件</li></ul></li><li>App控件定位<ul><li>uiautomatorviewer定位</li><li>weditor</li><li>Appium inspector工具</li></ul></li><li>用例录制</li><li>Python + Appium启动APP</li></ul></div><p></p>
<h1 id="android基础知识">Android基础知识</h1>
<h2 id="android布局">Android布局</h2>
<p>Android是通过容器的<strong>布局属性</strong>来管理子控件的位置关系(iOS去掉了布局的概念,直接用变量之间的相对关系完成位置的计算),把界面上所有的控件根据他们的间距的大小,摆放在正确的位置。布局是一种可用于放置很多<strong>控件</strong>的容器,通过多层布局嵌套完成一些比较复杂的界面。</p>
<p>Android布局有LinearLayout(线性布局)、RelativeLayout(相对布局)、FrameLayout(帧布局)、AbsoluteLayout(绝对布局)、TableLayout(表格布局)、Grid layout(网格布局)、ConstraintLayout(约束布局)等。布局的内部除了放置控件外,也可以放置布局,通过多层布局的嵌套,我们就能够完成一些比较复杂的界面。</p>
<div align="center"> <img src="https://img2020.cnblogs.com/blog/2229336/202012/2229336-20201220151750107-489322590.png"> </div>
<h2 id="android四大组件">Android四大组件</h2>
<p>Android四大基本组件分别是Activity,Service服务,Content Provider内容提供者,Broadcast Receiver广播接收器。</p>
<h3 id="1activity">1、activity</h3>
<ul>
<li>与用户交互的可视化界面</li>
<li>一个Activity通常就是一个单独的屏幕(窗口)</li>
<li>Activity之间通过Intent进行通信</li>
</ul>
<h3 id="2service">2、Service</h3>
<ul>
<li>service 实现后台运行程序,在后台完成用户指定的操作</li>
<li>通常用于为其他组件提供后台服务或监控其他组件的运行状态。</li>
</ul>
<h3 id="3content-provider">3、Content Provider</h3>
<ul>
<li>content provider 内容提供者,提供程序所需要的数据</li>
<li>只有需要在多个应用程序间共享数据才需要内容提供者,是不同应用程序间共享数据的唯一方式。</li>
</ul>
<h3 id="4broadcast-receiver">4、Broadcast Receiver</h3>
<ul>
<li>监听外部事件的到来(比如来电)</li>
</ul>
<h2 id="android控件">Android控件</h2>
<p>常用的控件:</p>
<ul>
<li>
<p>TextView(文本控件),EditText(可编辑文本控件)</p>
</li>
<li>
<p>Button(按钮),imageButton(图片按钮),ToggIeButton(开关按钮)</p>
</li>
<li>
<p>Image View(图片控件)</p>
</li>
<li>
<p>CheckBox(复选框控件), RadioButton(单选框控件)</p>
</li>
</ul>
<p>元素定位实际上就是定位控件,Android应用的层级结构使用xml编写,xml全名叫可扩展标记语言,类似于HTML,可以看作一个微型的数据库。android系统里安装的每一个app,其信息都被存到一个xml里。</p>
<p>xml定义了节点和属性,每个控件都有它的属性(resourceid, xpath, aid),没有css属性(样式文件和布局xml文件是分开的)。</p>
<p>Android中提供了三种解析XML的方式:DOM(Document Object Model)、SAX(Simple API XML)以及Pull解析方式。DOM解析器在解析XML文档时,会把文档中的所有元素按照其出现的层次关系,解析成一个个Node对象(节点),形成Dom树。DOM允许用户遍历文档树,访问父节点、子节点或者兄弟节点。每个节点具有特定的属性:</p>
<ul>
<li>clickable</li>
<li>content-desc</li>
<li>resource-id</li>
<li>text</li>
<li>bounds</li>
<li>...</li>
</ul>
<h1 id="app控件定位">App控件定位</h1>
<p>对App控件的定位其实就是节点和属性的定位,下面介绍三种UI元素定位工具:</p>
<ul>
<li>Android App可以使用uiautomatorviewer工具进行定位,它是 sdk路径下的一个工具。</li>
<li>基于浏览器技术的weditor 工具</li>
<li>Appium inspector工具</li>
</ul>
<h2 id="uiautomatorviewer定位">uiautomatorviewer定位</h2>
<p>电脑通过无线或者USB连接到手机设备后(或者连接到模拟机),双击uiautomatorviewer.bat打开uiautomatorviewer工具。</p>
<div align="center"> <img src="https://img2020.cnblogs.com/blog/2229336/202012/2229336-20201220151836487-218908966.png"> </div>
<p>点击左上角第二个或者第三个图标获取当前手机APP页面,在右边可以看到app的xml结构树,可以获取到每个节点的详细属性。</p>
<div align="center"> <img src="https://img2020.cnblogs.com/blog/2229336/202012/2229336-20201220151844335-44299238.png"> </div>
<h2 id="weditor">weditor</h2>
<p>weditor是基于浏览器技术的UI查看器,直接在浏览器打开。</p>
<p>项目地址:https://github.com/alibaba/web-editor。</p>
<p>环境要求Python3.6+,通过pip安装:</p>
<pre><code class="language-sh">pip3 install -U weditor # 会安装uiautomator2和facebook-wda两个库,分别支持android和iOS APP。
</code></pre>
<p>在命令窗口输入如下命令运行:</p>
<pre><code class="language-python">$ weditor # 启动server并打开浏览器
</code></pre>
<p>启动后会在浏览器自动访问 http://localhost:17310</p>
<div align="center"> <img src="https://img2020.cnblogs.com/blog/2229336/202106/2229336-20210630212300800-1144615704.png"> </div>
<p>如果你用appium编写APP自动化用例,而使用weditor来查看页面元素。在运行appium用例脚本时需要停止UiAutomator守护服务,因为UiAutomator相关进程会导致appium依赖的uiautomatorviewer 服务无法运行。</p>
<p>关闭方法参考文档 https://github.com/openatx/uiautomator2#stop-uiautomator 。</p>
<h2 id="appium-inspector工具">Appium inspector工具</h2>
<p>打开appium,点击【启动服务器】</p>
<div align="center"> <img src="https://img2020.cnblogs.com/blog/2229336/202012/2229336-20201220151852660-1654085531.png"> </div>
<p>点击右上角搜索标志图标【Start Inspector Session】</p>
<div align="center"> <img src="https://img2020.cnblogs.com/blog/2229336/202012/2229336-20201220151904505-503349745.png"> </div>
<p>编辑Desired Capabilities</p>
<div align="center"> <img src="https://img2020.cnblogs.com/blog/2229336/202012/2229336-20201220151912435-1351266733.png"> </div>
<p>Capability设置:https://appium.io/docs/en/writing-running-appium/caps/</p>
<ul>
<li>platformName:Android或者iOS</li>
<li>deviceName:设备名,127.0.0.1:7555是网易mumu模拟器,开启后需要使用adb命令<code>adb connect 127.0.0.1:7555</code>连接。</li>
<li>appPackage:包名</li>
<li>appActivity:Activity名字</li>
<li>platformVersion:系统版本</li>
<li>automationName:默认使用 uiautomator2(andorid默认使用 uiautomator2,ios默认使用 XCUITest)</li>
<li>noReset:是否在测试前后重置相关环境(例如首次打开弹框,或者是登录信息)</li>
<li>fullReset:执行完全复位:关闭APP,清除APP数据,卸载apk。</li>
<li>unicodeKeyBoard:是否需要输入非英文之外的语言并在测试完成后重置输入法</li>
<li>dontStopAppOnReset:首次启动的时候,不停止app(可以调试或者运行的时候提升运行速度)</li>
<li>skipDeviceInitialization:跳过安装,权限设置等操作(可以调试或者运行的时候提升运行速度)</li>
<li>newCommandTimeout:两条命令的最大间隔时间,默认60s</li>
<li>udid:连接设备的唯一标识</li>
<li>autoGrantPermissions:自动允许/拒绝弹框信息,默认为false,如果noReset为true时,这个参数不生效</li>
</ul>
<p>其他更多参数参考官方文档:https://github.com/appium/appium/blob/master/docs/en/writing-running-appium/caps.md</p>
<p>主要设置好上面介绍的前面6个参数后,点击右下角【Start Session】,可以获取到每个节点的详细属性。</p>
<div align="center"> <img src="https://img2020.cnblogs.com/blog/2229336/202012/2229336-20201220151927447-1835576217.png"> </div>
<h1 id="用例录制">用例录制</h1>
<p>appium desktop可以录制用例,并生成测试代码</p>
<p>点击上方眼睛图标,开始录制,手动点击左边app元素,右边显示了三种元素操作方法:Tap、Send Keys、Clear,选择对应的操作</p>
<div align="center"> <img src="https://img2020.cnblogs.com/blog/2229336/202012/2229336-20201220151937272-701853145.png"> </div>
<p>完成后测试步骤后,点击停止录制,右上角可以看到生成的自动化代码,可以选择Java,Python等语言。</p>
<div align="center"> <img src="https://img2020.cnblogs.com/blog/2229336/202012/2229336-20201220151943847-675433325.png"> </div>
<p>获取到app页面元素属性值后就可以使用appium来进行定位,实现对app的操作。下一篇文章将介绍appium元素定位方法。</p>
<h1 id="python--appium启动app">Python + Appium启动APP</h1>
<p>APP自动化测试关键步骤包括:</p>
<ul>
<li>导入依赖:<br>
<code>from appium import webdriver</code></li>
<li>capabilities设置</li>
<li>初始化 driver<br>
<code>webdriver.remote('http://127.0.0.1:4723/wd/hub', desired_caps)</code></li>
<li>元素定位与操作</li>
<li>断言 assert</li>
</ul>
<p>下面代码实现打开雪球APP,点击输入框,输入”京东“,然后退出。</p>
<pre><code class="language-python">#!/usr/bin/python3
# -*-coding:utf-8-*-
from appium import webdriver
desired_caps = {}
# desired_caps['recreateChromeDriverSessions'] = True
desired_caps['platformName'] = 'Android'
desired_caps['platformVersion'] = '5.1.1'
desired_caps['deviceName'] = '127.0.0.1:7555'
desired_caps['appPackage'] = 'com.xueqiu.android'
desired_caps['automationName'] = 'Uiautomator2'
desired_caps['appActivity'] = '.common.MainActivity'
desired_caps['newCommandTimeout'] = 3000
desired_caps['unicodeKeyboard'] = True
desired_caps['noReset'] = 'true'
desired_caps['dontStopAppOnReset'] = 'true'
desired_caps['skipDeviceInitialization'] = 'true'
driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps)
driver.implicitly_wait(15)
driver.find_element_by_id("com.xueqiu.android:id/tv_search").click()
driver.find_element_by_id("com.xueqiu.android:id/search_input_text").send_keys("京东")
driver.quit()
</code></pre>
<center><b>--THE END--<b></b></b></center><b><b>
<blockquote>
<p>欢迎关注公众号:「测试开发小记」及时接收最新技术文章!</p>
</blockquote>
</b></b><br><br>
来源:https://www.cnblogs.com/hiyong/p/14163653.html
頁:
[1]