如何通过appium在win7上使用android模拟器测试android应用?
本编文章参考了大量网络现存文章,并根据自己的实际情况编写。希望对想用appium的初学者能有所帮助!
一、为什么选择appium ?
依托 WebDriver 意味着你可以押宝在一个已经成为事实上标准的独立,自由和开放的协议.而不会被限制在任何的专利中
如果在没有使用Appium的情况,你使用了Apple的UIAutomation库就只能通过Javascript,并且只能通过Instruments application插桩应用来运行你的测试. 同样的,在Google的UiAutomator体系下,你只能用Java写你的测试案例. Appium最终开启了跨平台原生移动自动化的可能.
二、win7上搭建appium环境
两种 方式:
第一种:
ANDROID_HOME
to be your Android SDK path and add the tools and platform-tools folders to your PATH variable.JAVA_HOME
to your JDK folder.
> npm install -g appium > npm install wd > appium > node your-appium-test.js如果你不通过node方式执行js来进行测试的话,前两步就是安装appium(确切的说第一步是安装appium,第二步是安装 selenium webdriver),第三步是启动,安装完成后,直接appium启动即可。但是在实践中,appium从0.16.0在两天之内更新到0.17.3,速度非常快,而且不知道什么原因,执行第一步安装appium后,总是会出错,不是签名错误,就是.net framework框架需要更新。重试了许多次也可能不行,偶尔一次成功了,启动appium后,监听的地址却是0.0.0.0,而不是希望的127.0.0.1 。这个问题可能和网络和机器配置有关系。等appium官网成熟了以后,或许会好。具体情况希望大家能研究出个完整的解决方案。
第 二种:直接下载appium for windows,这个在github上根本下载不下来(不太承认是我网络问题。。。) 。所以找到一个csdn上的下载链接,http://download.csdn.net/download/llf0726/6798087 (下载需要1分,呵呵。),这个版本是0.12.3,可以使用。
三 、Android SDK安装
按照 win7上安装appium第一种方式中的第二步的链接下载最新的android SDK,解压到某个目录,如C:\adt-bundle-windows-x86_64-20131030 ,然后配置系统环境变量,增加ANDROID_HOME,值:C:\adt-bundle-windows-x86_64-20131030\sdk;添加系统path路径:%ANDROID_HOME%\platform-tools;%ANT_HOME%\bin; OK。
四 、eclipse安装ADT插件和启动android模拟器
eclipse -帮助-安装新软件-添加:
ADT Plugin
https://dl-ssl.google.com/android/eclipse/
安装 完成后,别忘了eclipse中设置android SDK目录,我的是:C:\adt-bundle-windows-x86_64-20131030\sdk
启动 android模拟器:
eclipse -窗口-AVDM(Android Virtual Devices Manager)-New:
AVD Name : 启一个你自己的名字(我的是sdfs);选择一个皮肤(Skin),SD Card 设置一个值:(我的是512);OK。
点击 Start-Launch 启动android模拟器
五 、eclipse中新建maven工程
pom.xml中要有这两个依赖:
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>2.39.0</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<!--<scope>test</scope> -->
</dependency>
我的工程目录:
其中 apps是新建的文件夹,用来存放我们要测试的app应用,两个应用均可从网上下载。
我们的测试类写在androidtest.androidtest下面(因为用了junit框架),其中AndroidContactsTest.java的内容如下:
package androidtest.androidtest; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.openqa.selenium.*; import org.openqa.selenium.interactions.HasTouchScreen; import org.openqa.selenium.interactions.TouchScreen; import org.openqa.selenium.remote.CapabilityType; import org.openqa.selenium.remote.DesiredCapabilities; import org.openqa.selenium.remote.RemoteTouchScreen; import org.openqa.selenium.remote.RemoteWebDriver; import java.io.File; import java.net.URL; import java.util.List; public class AndroidContactsTest { private WebDriver driver; @Before public void setUp() throws Exception { // set up appium File classpathRoot = new File(System.getProperty("user.dir")); File appDir = new File(classpathRoot, "apps/ContactManager"); File app = new File(appDir, "ContactManager.apk"); DesiredCapabilities capabilities = new DesiredCapabilities(); capabilities.setCapability("device","Android"); capabilities.setCapability(CapabilityType.BROWSER_NAME, ""); capabilities.setCapability(CapabilityType.VERSION, "4.4"); capabilities.setCapability(CapabilityType.PLATFORM, "WINDOWS"); capabilities.setCapability("app", app.getAbsolutePath()); capabilities.setCapability("app-package", "wandal.activity"); capabilities.setCapability("app-activity", ".WelcomeActivity"); driver = new SwipeableWebDriver(new URL("http://127.0.0.1:4723/wd/hub"), capabilities); } @After public void tearDown() throws Exception { driver.quit(); } @Test public void addContact(){ // WebElement el = driver.findElement(By.name("Add Contact")); // el.click(); List<WebElement> textFieldsList = driver.findElements(By.className("android.widget.ImageButton")); textFieldsList.get(0).click(); // textFieldsList.get(0).sendKeys("Some Name"); // textFieldsList.get(2).sendKeys("Some@example.com"); // driver.findElement(By.name("Save")).click(); } public class SwipeableWebDriver extends RemoteWebDriver implements HasTouchScreen { private RemoteTouchScreen touch; public SwipeableWebDriver(URL remoteAddress, Capabilities desiredCapabilities) { super(remoteAddress, desiredCapabilities); touch = new RemoteTouchScreen(getExecuteMethod()); } @Override public TouchScreen getTouch() { return touch; } } }
要注意:
capabilities.setCapability("app-package", "wandal.activity"); capabilities.setCapability("app-activity", ".WelcomeActivity");
这两行中的package和activity的值是如何来的,我们要通过对所要测试的应用进行反编译,使用apktool工具
下载地址 :http://download.csdn.net/download/guiguzi1110/4865276
解压后,
这三个文件要放到同一个目录下,然后再cmd中执行apktool d E:\xxx.apk E:\xxx1\
进入xxx1目录下面,会发现有个AndroidManifest.xml,打开这个文件
包名在这里看:
<manifest android:versionCode="12" android:versionName="2.6.0.0.0" package="com.xxx.xxx"
一般位于XML定义的下一行
启动Activity在这里看,带有LAUNCHER关键字
<activity android:theme="@*android:style/Theme.NoTitleBar" android:label="@string/app_name" android:name="com.xxx.xxx.SplashActivity" android:launchMode="singleTop" android:screenOrientation="portrait" android:configChanges="keyboardHidden|orientation">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
那么,本例中就是com.xxx.xxx.SplashActivity
使用apktool工具反编译的时候,有时候会报 java.lang.OutOfMemoryError: Java heap space错误我的解决办法是:编辑apktool.bat文件,在最后一行jar后面加入 -Xmn16m -Xms64m -Xmx128m
OK,不报错了,正常反编译。
六、运行工程
1.启动appium,双击appium的图标,点Launch,可以看到如下界面:
2.eclipse中启动android模拟器(启动较慢,耐心等待,大概2分钟后,呵呵),然后解锁:
android 模拟器中安装和删除应用的方法(可能会用到:)):
现在 我们就可以启动我们的maven工程执行看自动化效果了:
eclipse 中右键你要运行的类,然后选择运行-junit测试(第一次会让你选择是用eclipse junit还是android的junit,我选后者),然后就可以看到效果了:
appium会先安装这个应用,然后进行自动化操作,然后退出到原始页。
那 么我们如何识别android模拟器上的元素呢?
android SDK 有个工具uiautomatorviewer,在cmd中启动它,就可以捕获正在运行的模拟器的界面元素了。
至于 如何识别元素,就是selenium-webdriver的使用了,详细可以参考:http://wenku.baidu.com/link?url=q5fqut_O-pCyG9w5ubCxbF-38PyqccCfdy4ZCkA4L2XMCrfl58tCE-jkt41v3w516R42rtjCluDfm87trrXojX11dLru-lGYAG2CwaQ9o1O