Appium+Eclipse+Genymotion模拟器安装部署Word下载.docx
《Appium+Eclipse+Genymotion模拟器安装部署Word下载.docx》由会员分享,可在线阅读,更多相关《Appium+Eclipse+Genymotion模拟器安装部署Word下载.docx(24页珍藏版)》请在冰豆网上搜索。
九、下载、导入虚拟机
由于我的环境没有网络因此需要下载离线Genymobile虚拟机包(XX云盘中有),如果有网络可以通过“Add”新建虚拟机;
下载后使用“OracleVMVirtualBox”将该虚拟机导入,导入后在Genymobile工具中即可看到该模拟器。
一十、Eclipse打开模拟器
在Eclipse中点击快捷菜单中的Genymobile图标或按钮Ctrl+6即可打开模拟器选择窗口,选中某一模拟器,点击Start即可启动该模拟器。
一十一、导入Appium支撑包(java-client-3.3.0.jar)
使用Maven库导入appium支撑java-client包,在POM.xml文件中输入以下内容:
<
dependency>
<
groupId>
io.appium<
/groupId>
artifactId>
java-client<
/artifactId>
version>
3.3.0<
/version>
<
/dependency>
注:
如果是手动下载java-client-3.3.0.jar包,也可将其配置到Maven库中,方法如下:
方法一、
Maven如何手动添加jar包到本地Maven仓库
ApacheMaven,是一个软件(特别是Java软件)项目管理及自动构建工具,由Apache软件基金会所提供。
基于项目对象模型(缩写:
POM)概念,Maven利用一个中央信息片断能管理一个项目的构建、报告和文档等步骤。
曾是Jakarta项目的子项目,现为独立Apache项目。
大家肯定遇到过想在pom文件中加入自己开发的依赖包,这些包肯定是不是在Maven仓库(http:
//repo1.maven.org/maven2/)的。
那我们怎么将那些不存在Maven仓库中的包加入到本地的Maven库中呢?
很简单。
这里以IKAnalyzer.jar包为例进行讲解。
第一步:
将IKAnalyzer.jar包存放在一个文件夹中,比如mylib文件夹
第二步:
建立一个IKAnalyzer.jar包相关的pom.xml文件,需要在pom.xml文件中定义其maven坐标及其相应的依赖代码即可,同样将pom文件存放在上述jar文件同一文件夹下,IKAnalyzer.jar坐标及依赖代码如下:
projectxmlns="
http:
//maven.apache.org/POM/4.0.0"
xmlns:
xsi="
//www.w3.org/2001/XMLSchema-instance"
xsi:
schemaLocation="
//maven.apache.org/POM/4.0.0
//maven.apache.org/xsd/maven-4.0.0.xsd"
>
<
modelVersion>
4.0.0<
/modelVersion>
org.wltea.ik-analyzer<
ik-analyzer<
3.2.8<
name>
IKAnalyzer3<
/name>
description>
Adictionaryandgrammar-basedChinesesegmenter<
/description>
dependencies>
org.apache.lucene<
lucene-core<
3.0.3<
optional>
true<
/optional>
org.apache.solr<
solr-core<
1.4.1<
junit<
3.8.2<
scope>
test<
/scope>
lucene-analyzers<
lucene-smartcn<
/dependencies>
/project>
第三步:
打开CMD,进入到mylib文件夹,运行下面的命令:
mvninstall:
install-file\
-Dfile=IKAnalyzer3.2.8.jar\
-DgroupId=org.wltea.ik-analyzer\
-DartifactId=ik-analyzer\
-Dversion=3.2.8\
-Dpackaging=jar
方法二、
这样你就可以将IKAnalyzer3.2.8.jar安装到您本地的Maven仓库中了,你可以根据你的实际情况修改上面的参数即可。
之后你可以在pom.xml文件中通过以下依赖在项目中引入自定义的jar包,如下:
当然你也可以不将IKAnalyzer3.2.8.jar发布到您本地的Maven库中,而是通过下面的配置引入,效果和上面的差不多:
org.wltea<
IKAnalyzer<
systemPath>
C:
\Users\yangping\Desktop\a\IKAnalyzer3.2.8.jar<
/systemPath>
一十二、获取androidapp的Activity
有时候在appium的DesiredCapabilities中需要指定被测app的appActivity,下面的方法可能会对你有所帮助。
方法一
如有你有待测项目的源码,那么直接查看源码就好。
如果没有,那么请联系有源码的同学,这是推荐方法。
方法二
如果你没有代码,那么可以反编译该app。
这里将用到2个工具,分别是dex2jar和jd-gui。
你可以在这里下载目前为止的最新版本以及示例apk。
我们以工具包里的ContactManager.apk为例,简单介绍一下反编译的流程。
∙1,重命名ContactManager.apk为ContactManager.zip并解压得到文件classes.dex;
∙2,解压dex2jar-0.0.9.15.zip,并从命令行进入该文件夹;
∙3,运行命令
d2j-dex2jar.batpath_to\classes.dex
在当前文件夹下得到classes-dex2jar.jar;
∙4,解压jd-gui-0.3.6.windows.zip得到文件jd-gui.exe;
∙5,使用jd-gui.exe打开classes-dex2jar.jar;
嗯,好了,可以尽情欣赏了。
上图。
上图所示的ContactManager就是待测app的mainactivity。
方法三
使用log查看大法(嗯,windows上没grep不幸福,好在有powershell的Select-String,可以拿来勉强一用),直接搬砖。
∙a、启动待测apk
∙b、在DOS命令行中开启日志输出:
adblogcat>
D:
/log.txt
∙c、关闭日志输出:
ctrl+c
∙d、查看日志找寻:
Displayedcom.mm.android.hsy/.ui.LoginActivity:
+3s859ms
appPackage=com.mm.android.hsy
appActivity=.ui.LoginActivity
一十三、元素定位
下面主要是针对自己的了解和学习,简单的总结下关于AppiumnativeAPP上的一些元素定位方法的使用以及通过UIAutomatorViewer定位页面以后,如果从上面定位到你想使用的元素。
元素定位工具:
..\adt-bundle-windows-x86_64-20140321\sdk\tools\uiautomatorviewer.bat
启动"
uiautomatorviewer.bat"
,我们能得到入下图所示的
点击红色图标,"
DeviceScreenshotwithCompressedHierarchy"
来获取当前模拟器或真机中当前的页面,从而能获取到对应的对象元素值,它也是分为Classname、Id、xpath等等来进行元素定位的,如果你熟悉Selenium,那么这块就不会陌生了,因为Appium仅仅只是在Selenium2的基础上封装了一层AppiumServer,方便来和移动端进行交互。
具体的元素定位,接下来继续总结。
以淘宝为例,来进行元素的定位。
打开UIAutomatorViewer
Appium和Webdriver有一点区别在元素定位的方法上,见下面代码:
//有点需要注意的是,findElementByAccessibilityId在Selenium上是不带这个方法的,所以只能用Appium提供的封装方法
driver.findElementByAccessibilityId("
"
);
//Selenium不带这个方法
//下面的形式Appium都能使用
driver.findElementByClassName("
calssName"
driver.findElement(By.className("
className"
));
FindElementByID
针对taobao,购物车的定位。
通过ID定位,打开UIAutomatorViewer,nodedetail下找到标签是“resource-id”—>
”com.taobao.taobao:
id/tv_title”
driver.findElementById("
com.taobao.taobao:
id/tv_title"
FindElementByClassname
针对taobao,购物车的定位:
通过classname定位(一般情况下,最好不要通过classname来进行元素的定位,避免出现重复),打开UIAutomatorViewer,nodedetail下找到标签是“class”—>
“android.widget.TextView”
driver.findElementByClassName("
android.widget.TextView"
FindElementByName
通过name定位,打开UIAutomatorViewer,nodedetail下找到标签是“text”—>
“购物车”
driver.findElementByName("
购物车"
FindElementByAccessibilityId
针对谷歌浏览器打开的XX首页,搜索按钮的定位:
通过AccessibilityId定位,打开UIAutomatorViewer,nodedetail下找到标签是“content-desc”—>
“XX一下”
XX一下"
一十四、实例(通讯录管理工具)
以下是通讯录管理工具的实例(必须部署有TestNG):
packageAndroidTest;
importio.appium.java_client.android.AndroidDriver;
import.URL;
importjava.util.List;
importjunit.framework.Assert;
importorg.openqa.selenium.By;
importorg.openqa.selenium.WebElement;
importorg.openqa.selenium.remote.CapabilityType;
importorg.openqa.selenium.remote.DesiredCapabilities;
importorg.testng.annotations.AfterTest;
importorg.testng.annotations.BeforeTest;
importorg.testng.annotations.Test;
publicclassContacts{
privateAndroidDriver<
WebElement>
driver;
@BeforeTest
publicvoidsetUp()throwsException{
//设置apk的路径
/*
*FileclasspathRoot=newFile(System.getProperty("
user.dir"
File
*appDir=newFile(classpathRoot,"
apps"
Fileapp=newFile(appDir,
*"
ContactManager.apk"
*/
//设置自动化相关参数
DesiredCapabilitiescapabilities=newDesiredCapabilities();
capabilities.setCapability(CapabilityType.BROWSER_NAME,"
capabilities.setCapability("
platformName"
"
Android"
deviceName"
AndroidEmulator"
//设置安卓系统版本
platformVersion"
4.4.2"
//设置apk路径
//capabilities.setCapability("
app"
app.getAbsolutePath());
//设置app的主包名和主类名
appPackage"
com.android.contacts"
appActivity"
.activities.PeopleActivity"
//初始化
driver=newAndroidDriver<
(newURL("
//127.0.0.1:
4723/wd/hub"
),capabilities);
}
//新建联系人
@Test
publicvoidcreateContact(){
//没有联系人时创建联系人
//driver.findElement(By.id("
com.android.contacts:
id/create_contact_button"
)).click();
//已创建过联系人后点新增联系人
driver.findElement(By.id("
id/menu_add_contact"
//获取所有EditText元素
List<
textFieldsList=driver.findElementsByClassName("
android.widget.EditText"
//输入姓名
textFieldsList.get(0).sendKeys("
dongkang"
//输入电话
textFieldsList.get
(1).sendKeys("
11121252121"
//输入邮箱
textFieldsList.get
(2).sendKeys("
Test@"
//输入地址
textFieldsList.get(3).sendKeys("
ZhongGuanCunRuanJianYuan"
//点击完成
id/save_menu_item"
//验证是否新增成功
Assert.assertTrue(driver.findElement(By.id("
id/name"
)).getText().equals("
dongkang14"
//导出通讯录
publicvoiddaoChu(){
//更多按钮
imageButtonList=driver.findElementsByClassName("
android.widget.ImageButton"
imageButtonList.get(0).click();
//点导入/导出
driver.findElementsByClassName("
).get(4).click();
//点击导出通讯录
textViewList=driver.findElementsByClassName("
textViewList.get
(2).click();
//确定导出
android:
id/button1"
//滑动状态栏,查看通知信息
driver.swipe(0,0,100,100,2);
//验证是否导出成功
Assert.assertTrue(driver.findElementsByClassName("
).get
(2).getText().contains("
已顺利导出"
@AfterTest
publicvoidtearDown()throwsException{
driver.