123
返回列表 发新帖
楼主: AlexQin

[转载] appium简明教程

[复制链接]
论坛徽章:
1056
紫蜘蛛
日期:2015-09-22 15:53:22紫蜘蛛
日期:2015-10-15 13:48:52紫蜘蛛
日期:2015-10-15 14:45:48紫蜘蛛
日期:2015-10-15 14:47:47紫蜘蛛
日期:2015-10-15 14:48:45九尾狐狸
日期:2015-09-22 15:53:22九尾狐狸
日期:2015-10-15 13:50:37九尾狐狸
日期:2015-10-15 14:45:48九尾狐狸
日期:2015-10-15 14:47:47九尾狐狸
日期:2015-10-15 14:48:45
21#
 楼主| 发表于 2017-4-27 09:07 | 只看该作者
appium简明教程(8)——那些工具

monitor.bat(hierarchyviewer.bat已经不赞成继续使用了)
该文件位于your_andriod_sdk_pathtools下面。以乙醇的机器为例,其位于E:adt-bundle-windows-x86-20131030sdktools下。
该工具可以帮我们找到android控件的content-description,为以后的find_element_by_accessibility_id 定位方法做参数使用。
关于什么是content-description,可以参考官方文档

好,露个脸。

uiautomatorviewer.bat
该文件位于your_andriod_sdk_pathtools下面。以乙醇的机器为例,其位于E:adt-bundle-windows-x86-20131030sdktools下。
该工具主要用来查看控件的属性,比如resource id,class name等。
该工具也可查看被测app的appPackage(Desired Capabilities中使用)。
爆照。
好了,是不是感觉还缺了点什么呢?
确实如此,被测app的appActivity怎么获取呢?
下一讲我们详细讲解如何获取被测app的appActivity。



使用道具 举报

回复
论坛徽章:
1056
紫蜘蛛
日期:2015-09-22 15:53:22紫蜘蛛
日期:2015-10-15 13:48:52紫蜘蛛
日期:2015-10-15 14:45:48紫蜘蛛
日期:2015-10-15 14:47:47紫蜘蛛
日期:2015-10-15 14:48:45九尾狐狸
日期:2015-09-22 15:53:22九尾狐狸
日期:2015-10-15 13:50:37九尾狐狸
日期:2015-10-15 14:45:48九尾狐狸
日期:2015-10-15 14:47:47九尾狐狸
日期:2015-10-15 14:48:45
22#
 楼主| 发表于 2017-4-27 09:12 | 只看该作者
appium简明教程(9)——如何获取android app的Activity
有时候在appium的Desired Capabilities中需要指定被测app的appActivity,下面的方法可能会对你有所帮助。
方法一
如有你有待测项目的源码,那么直接查看源码就好。如果没有,那么请联系有源码的同学,这是推荐方法。

方法二
如果你没有代码,那么可以反编译该app。
这里将用到2个工具,分别是dex2jar和jd-gui。你可以在这里下载目前为止的最新版本以及示例apk。
我们以工具包里的ContactManager.apk为例,简单介绍一下反编译的流程。
  • 重命名ContactManager.apk为ContactManager.zip并解压得到文件classes.dex;
  • 解压dex2jar-0.0.9.15.zip,并从命令行进入该文件夹;
  • 运行命令
    1. d2j-dex2jar.bat path_toclasses.dex
    复制代码
    在当前文件夹下得到classes-dex2jar.jar;
  • 解压jd-gui-0.3.6.windows.zip得到文件jd-gui.exe;
  • 使用jd-gui.exe打开classes-dex2jar.jar;
嗯,好了,可以尽情欣赏了。上图。
上图所示的ContactManager就是待测app的main activity。

方法三
参考testerhome的这个帖子
使用log查看**(嗯,windows上没grep不幸福,好在有powershell的Select-String,可以拿来勉强一用),直接搬砖。
a、启动待测apk
b、开启日志输出:adb logcat>D:/log.txt
c、关闭日志输出:ctrl+c
d、查看日志
找寻:
  1. Displayed com.mm.android.hsy/.ui.LoginActivity: +3s859ms
  2. appPackage = com.mm.android.hsy
  3. appActivity = .ui.LoginActivity
复制代码

好了,准备活动做的差不多了。下一节乙醇带大家进行控件定位之旅。

使用道具 举报

回复
论坛徽章:
1056
紫蜘蛛
日期:2015-09-22 15:53:22紫蜘蛛
日期:2015-10-15 13:48:52紫蜘蛛
日期:2015-10-15 14:45:48紫蜘蛛
日期:2015-10-15 14:47:47紫蜘蛛
日期:2015-10-15 14:48:45九尾狐狸
日期:2015-09-22 15:53:22九尾狐狸
日期:2015-10-15 13:50:37九尾狐狸
日期:2015-10-15 14:45:48九尾狐狸
日期:2015-10-15 14:47:47九尾狐狸
日期:2015-10-15 14:48:45
23#
 楼主| 发表于 2017-4-27 09:19 | 只看该作者
appium简明教程(10)——控件定位基础
狭义上讲,UI级的自动化测试就是让机器代替人去点来点去的过程。
但机器去点什么(点上面还是点左边),怎么点(是长按还是轻触),这些东西是必须由代码的编写者所指示清楚的。
控件定位就是解决机器点什么的问题的。
一般说来,我们可以这样告诉机器:去点登陆按钮
机器很笨,它并不知道什么是登陆按钮。因为登陆按钮是自然语言的描述。
如果你让一个人去点登陆按钮,那么他其实也是要经过一系列的脑补以后才可以做这件事的。
这个脑补的过程还原如下:
这个一定是个按钮
这个按钮一定在被测的应用上
这个按钮大概上面有登陆这个文字信息
嗯,还真有一个,那么点吧。

这就是人探索性测试的一个简单过程。一般来说,如果你给出的信息不太充分,人类还是可以通过一系列的探索性思维去理解你的描述的。这个属于心理学的问题,不展开解释。
但是机器并不是人,如果你给出的描述不精确的话,机器是不会自发性的进行探索和脑补的。
因此控件定位就是精确的描述控件特征并告诉机器的过程。

控件的特征就是控件的属性,我们可以通过上一讲中的uiautomatorviewer去获取。
在appium的定位世界里,下面这些方法是可以为我们使用的。也就是说,我们通过下面几个约定好的方式,按照webdriver和appium的DSL(自行搜索并理解)进行控件特征的描述和定位。
继承自webdriver的方法,也就是通过这3个特征可以定位控件
  • find by “class” (i.e., ui component type,andorid上可以是android.widget.TextView)
  • find by “xpath” (i.e., an abstract representation of a path to an element, with certain constraints,由于appium的xpath库不完备的原因,这个不太推荐)
  • find by “id”(android上是控件的resource id)

Mobile JSON Wire Protocol 协议中定义的方法,更适合移动设备上的控件定位
  • -ios uiautomation: a string corresponding to a recursive element search using the UIAutomation library (iOS-only)
  • -android uiautomator: a string corresponding to a recursive element search using the UiAutomator Api (Android-only)
  • accessibility id: a string corresponding to a recursive element search using the Id/Name that the native Accessibility options utilize.

在appium 的client对Mobile JSON Wire Protocol中定义的方法进行了封装,使其调用起来更加方便

ruby篇
  1. find_element :accessibility_id, 'Animation'
  2. find_elements :accessibility_id, 'Animation'
  3. find_element :uiautomator, 'new UiSelector().clickable(true)'
  4. find_elements :uiautomator, 'new UiSelector().clickable(true)'
复制代码

当然了,你也可以使用原生的webdriver方法
  1. find_element id: ‘resource_id’
复制代码

另外,ruby lib里提供了一些非常好用的简便方法来进行控件的定位,好写,好读。
  • text(value_or_index) :Find the first TextView that contains value or by index. If int then the TextView at that index is returned.
  • button(value_or_index):Find the first button that contains value or by index. If int then the button at that index is returned
    更多请看这里

python篇
  1. el = self.driver.find_element_by_android_uiautomator('new UiSelector().description("Animation")')
  2. self.assertIsNotNone(el)
  3. els = self.driver.find_elements_by_android_uiautomator('new UiSelector().clickable(true)')
  4. self.assertIsInstance(els, list)
  5. el = self.driver.find_element_by_accessibility_id('Animation')
  6. self.assertIsNotNone(el)
  7. els = self.driver.find_elements_by_accessibility_id('Animation')
  8. self.assertIsInstance(els, list)
复制代码

总的来说就是在driver里增加了
  • find_element_by_accessibility_id
  • find_elements_by_accessibility_id
  • find_element_by_android_uiautomator
  • find_element_by_android_uiautomator
    等方法

java篇
前面也讲过了,新增了这些方法
  1. findElementByAccessibilityId()
  2. findElementsByAccessibilityId()
  3. findElementByIosUIAutomation()
  4. findElementsByIosUIAutomation()
  5. findElementByAndroidUIAutomator()
  6. findElementsByAndroidUIAutomator()
复制代码

讨论:从上面可以看出来,python 和 java client对移动端控件定位的封装是比较初级的。ruby lib中封装了很多方便和简洁的方法,因此可以看出,使用ruby lib是优于python和java的选择。当然,如果忽略性能的话。
下一节我们开始具体看下如何用resource id去定位控件。






使用道具 举报

回复
论坛徽章:
1056
紫蜘蛛
日期:2015-09-22 15:53:22紫蜘蛛
日期:2015-10-15 13:48:52紫蜘蛛
日期:2015-10-15 14:45:48紫蜘蛛
日期:2015-10-15 14:47:47紫蜘蛛
日期:2015-10-15 14:48:45九尾狐狸
日期:2015-09-22 15:53:22九尾狐狸
日期:2015-10-15 13:50:37九尾狐狸
日期:2015-10-15 14:45:48九尾狐狸
日期:2015-10-15 14:47:47九尾狐狸
日期:2015-10-15 14:48:45
24#
 楼主| 发表于 2017-4-27 09:23 | 只看该作者
appium简明教程(11)——使用resource id定位
上一节乙醇带大家了解了appium的定位策略。实际上appium的控件定位方式是完全遵守webdriver的mobile扩展协议的。
这一节将分享一下如何使用resource id来定位android策略。
什么是resource id,这个不属于本文的范畴,大家可以点这里了解。
我们可以有两种方式来使用resource id进行定位:
  • 使用 findElement(By.id(“resourceId”)) 的方式。这也是原生的webdriver定义的方法,不过竟然在appium的官方文档里没有提及,属于隐藏技;
  • 使用 find_elements_by_android_uiautomator(‘new UiSelector().resourceId(“the_id”)’) 的方式;关于uiautomator定位后面的教程会展开讲解;
    从上面的代码片段可以看到,使用 find_element_by_id 的方式进行定位是最简便的。

那么怎么获取控件的resource id呢,使用uiautomatorviewer就可以了。具体方法如下图所示。
现在就以上图所示的android原生计算器程序为例,看一下每种语言是如何实现点击【9】这个按钮的。
目的
点击计算器上的【9】这个按钮。该按钮的id是com.android.calculator2:id/digit6 。先甜后苦,从ruby开始。

Ruby篇
  1. require 'appium_lib'
  2. caps   = { caps:{ platformName: 'Android', appActivity: '.Calculator', appPackage: 'com.android.calculator2' },
  3.            appium_lib: { sauce_username: nil, sauce_access_key: nil, debug: true} }
  4. dr = Appium::Driver.new(caps).start_driver
  5. dr.find_element(id: 'com.android.calculator2:id/digit9').click
复制代码

Python篇
  1. #coding:utf-8
  2. from appium import webdriver
  3. from time import sleep
  4. desired_caps = {}
  5. desired_caps['platformName'] = 'Android'
  6. desired_caps['platformVersion'] = '4.4'
  7. desired_caps['deviceName'] = 'Android Emulator'
  8. desired_caps['app'] = 'Calculator.apk'
  9. desired_caps['appPackage'] = 'com.android.calculator2'
  10. desired_caps['appActivity'] = '.Calculator'
  11. dr = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
  12. sleep(3)
  13. dr.find_element_by_id('com.android.calculator2:id/digit9').click()
复制代码

Java篇
  1. //新建一个FindById类位于info.itest.www package下面
  2. package info.itest.www;
  3. import io.appium.java_client.AppiumDriver;
  4. import java.net.MalformedURLException;
  5. import java.net.URL;
  6. import org.openqa.selenium.remote.CapabilityType;
  7. import org.openqa.selenium.remote.DesiredCapabilities;
  8. public class FindById {
  9.     public static void main(String args[]) throws MalformedURLException {
  10.         DesiredCapabilities cap = new DesiredCapabilities();
  11.         cap.setCapability(CapabilityType.BROWSER_NAME, "");
  12.         cap.setCapability("platformName", "Android");
  13.         cap.setCapability("deviceName", "Android Emulator");
  14.         cap.setCapability("platformVersion", "4.4");
  15.         cap.setCapability("appPackage", "com.android.calculator2");
  16.         cap.setCapability("appActivity", ".Calculator");
  17.         AppiumDriver dr = new AppiumDriver(new URL("http://127.0.0.1:4723/wd/hub"), cap);
  18.         dr.findElement(By.id("com.android.calculator2:id/digit9")).click();
  19.     }
  20. }
复制代码

如果读者对webdriver很熟悉的话,那么掌握这个方法是非常简单的。如果对webdriver不熟悉,那么可以参考乙醇的webdriver实用指南,先学习一下webdriver的基础知识。
这一节我们写了一些脚本去进行控件定位,在实际的项目中,这些没有任何断言的脚本是基本上无法完成测试用例的功能的。
先卖个关子,下下一节乙醇将会带大家写第一个appium的测试用例。
那么下一节我们将学习如何使用class name进行定位。



使用道具 举报

回复
论坛徽章:
1056
紫蜘蛛
日期:2015-09-22 15:53:22紫蜘蛛
日期:2015-10-15 13:48:52紫蜘蛛
日期:2015-10-15 14:45:48紫蜘蛛
日期:2015-10-15 14:47:47紫蜘蛛
日期:2015-10-15 14:48:45九尾狐狸
日期:2015-09-22 15:53:22九尾狐狸
日期:2015-10-15 13:50:37九尾狐狸
日期:2015-10-15 14:45:48九尾狐狸
日期:2015-10-15 14:47:47九尾狐狸
日期:2015-10-15 14:48:45
25#
 楼主| 发表于 2017-4-30 23:05 | 只看该作者
good job

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表