Appium架构
Appium是一个C/S 架构,所谓的C/S架构,就是一个Clicent和一个Server端,这个Appium就是那个Server端,我们在一个编辑器中编辑的测试代码就是一个Clicent端。这个Appium为这个客户端提供一套接口,需要注意的一点是,测试代码是不能直接控制我们要测试的机器上的,需要用Appium作为中间的代理去控制。
Appium环境搭建
以安卓的测试环境搭建为例,要测试安卓,安卓是用Java语言开发的,Java环境得安装吧!安卓的开发,sdk肯定少不了吧,Appium是用nodejs写的,nodejs环境肯定少不了吧。说到Appium的安装,其实对于新手来说,可以先不用考虑那种命令行的开发方式,直接去安装那个有图形化界面的软件就好了,Appium各个版本下载地址这个软件包含了Appium运行时的各种依赖,就不用单独再去装Node.js了,安装好了以后,是这样
![](https://img.haomeiwen.com/i3072403/bf3d66cbf87a5999.png)
其他的先不用注意,其中Launch是启动,点击以后,就开启了服务器,点击那个安卓的图标,
![](https://img.haomeiwen.com/i3072403/c9e0a1834377f5e9.png)
我在这里遇到的一个最大的坑,说来惭愧,就是其中的Launch AVD,里面找不到我的连接设备,或者找不到模拟设备,可是用adb devices查看的时候,设备明明都有连接,这里,其实解决方法就是,不用管!不要勾选Launch AVD,Appium会自动的去到连接里设备里执行相应的代码,只不过连接设备在Lanuch AVD这里不显示。最大的坑迈过去以后,后面对我来说,其实就不算很难了,剩下的操作,基本在半天内可以掌握。
对了,查看环境搭建好,可以点击面板上那个医生诊断听胸的那个工具,点击以后会出现如下图片
![](https://img.haomeiwen.com/i3072403/4b8d9edc6e910961.png)
从这张图中,可以看出我的ANDROID_HOME还没有添加到系统环境,所有我们要到环境中去添加,打开终端,
ls -a //列出所有文件
vim .bash_profile
在.bash_profile中添加
export ANDROID_HOME=/YOUR_PATH_TO/android-sdk
export PATH=$ANDROID_HOME/platform-tools:$PATH
export PATH=$ANDROID_HOME/tools:$PATH
然后保存执行
source ~/.bash_profile
配置Java开发环境
我用的是eclipse编写自动化测试代码,这里就拿eclipse举例子好了。具体步骤可以分为三步:
1、新建Java项目
2、下载 Appium java client和 Selenium Java standalone server 这两个jar包。
3、在项目的 build path 中通过 “Add External Archives” 添加第一步下载的两个 jar 文件,以及通过 “Add Library” 添加 Junit4 这个 Library 。我们后续会用到。
添加完成后的 build path 如下图:
![](https://img.haomeiwen.com/i3072403/28b6cf7a0c88a897.png)
牛刀小试
先来个例子体验下学有所用的快感,首先去Appium客户端去Launch,服务器开好以后,就可以写测试代码了,
1、首先,我们在 Eclipse 里面新建一个带有 main 方法的类(勾选“public static void main(String[] args
)”),类名为 OpenAndCloseApplication
。如无意外,建立后的文件内容应该如下:
public class OpenAndCloseApplication {
public static void main(String[] args) {
// TODO Auto-generated method stub
}
}
2、在其中添加Desired Capabilities,这个Desired Capabilities是干什么用的,这个东西是传给Appium服务器的一些参数,告诉服务器,我要在具备这些的条件下,执行测试命令
import org.openqa.selenium.remote.DesiredCapabilities;
import io.appium.java_client.android.AndroidDriver;
...
public static void main(String[] args) {
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability("deviceName", "Android Device");
capabilities.setCapability("platformName", "Android");
capabilities.setCapability("platformVersion", "4.4");
}
这几个Capabilities应该是必须的,少一个你可以试试,根据需要,还可以添加Desired Capabilities
关键字 | 描述 | 实例 |
---|---|---|
platformName | 手机操作系统 | iOS,Android,FirefoxOS |
platformVersion | 手机操作系统版本 | 例如: 7.1, 4.4 |
deviceName | 手机类型或模拟器类型 | iPhone Simulator, iPad Simulator, Android Emulator, Galaxy S4等。在 iOS 上,这个关键字的值必须是使用 instruments -s devices 得到的可使用的设备名称之一。在 Android 上,这个关键字目前不起作用。 |
app | .ipa 或者 .apk(也可以使是包含他们的zip)文件所在的本地绝对路径或者远程路径 | Appium会先尝试安装路径对应的应用在适当的真机或模拟器上。针对Android系统,如果你指定app-package和app-activity(具体见下面)的话,那么就可以不指定app。 |
browserName | 需要进行自动化测试的手机 web 浏览器名称。如果是对应用进行自动化测试,这个关键字的值应为空。 | iOS 系统上可以用 ‘Safari‘ ,Android 系统上可以用 ‘Chrome‘, ‘Chromium‘, 或 ‘Browser‘。 |
automationName | 自动化测试引擎 | Appium,Selendroid |
appActivity | 要从应用包中启动的 Android Activity 名称。 | 它通常需要在前面添加 . (如:使用.MainActivity 而不是 MainActivity) MainActivity, .Settings |
appPackage | 你想运行的Android应用的包名 | 比如com.example.android.myApp |
appWaitActivity | 你想要等待启动的 Android Activity 名称 | SplashActivity |
unicodeKeyboard | 是否在测试过程中切换到能支持多国语言输入的输入法 | true 表示是,false 表示否 |
resetKeyboard | 是否在测试完成后自动切换回原有输入法 | true 表示是,false 表示否 |
3、添加操作应用的代码
...
capabilities.setCapability("platformVersion", "4.4");
// 根据 Desired Capabilities 打开应用
AndroidDriver driver = new AndroidDriver<>(new URL("http://127.0.0.1:4723/wd/hub"), capabilities);
// 什么都不做,程序暂停5秒
Thread.sleep(5000);
// 关闭应用
driver.quit();
}
这个代码是为了好看,放在这里了,可能URL那里会报找不到这个类,这时候可以根据提示引入相应的库,并根据提示调整,加上判断,调整的程序没有错误以后,就可以运行代码了。
元素定位
元素定位一般用UIAutomatorViewer,UIAutomatorViewer是sdk中的一个专门用来定位元素的工具,这种定位方式其实挺常见,和HTML中的XPath用法有些类似。
要使用这个工具,首先要打开,这个工具的位置在\sdk\tools
下,打开就好了,定位当前页面的元素,就可以点击左上角的第二个那个三个手机重叠的按钮
![](https://img.haomeiwen.com/i3072403/9bdde76645989b05.png)
查找元素有若干种方法,其中我自己最常用的是两个:
通过id定位,查看元素的id就是在图中右下角resource—id,那个Button1就是
driver.findElement(By.id("id"));
通过xpath定位
driver.findElementByXPath("//android.widget.TextView[contains(@text,'xpathname')]");
终于可以编写测试脚本
我们在 Eclipse 里面新建一个带有 main 方法的类(勾选“public static void main(String[] args)
”),类名为 ToDoListTest
其中的代码如下:
import io.appium.java_client.android.AndroidDriver;
import io.appium.java_client.android.AndroidElement;
import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.List;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.remote.DesiredCapabilities;
public class ToDoListTest {
public static void main(String[] args) throws MalformedURLException {
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability("deviceName", "Android Device");
capabilities.setCapability("platformName", "Android");
capabilities.setCapability("platformVersion", "4.4");
capabilities.setCapability("appPackage","com.example.mac.button");
capabilities.setCapability("appActivity", ".MainActivity");
capabilities.setCapability("unicodeKeyboard", true);
capabilities.setCapability("resetKeyboard", true);
AndroidDriver driver = new AndroidDriver<>(new URL("http://127.0.0.1:4723/wd/hub"), capabilities);
// Add new item
String itemText="使用 Appium 编写测试脚本";
WebElement editText = driver.findElement(By.id("com.example.mac.button:id/edit1"));
editText.sendKeys(itemText);
WebElement addItemBtn = driver.findElement(By.id("com.example.mac.button:id/Button1"));
addItemBtn.click();
// Check if item is added
List<AndroidElement> appiumItems = driver.findElementsByXPath("//android.widget.EditText[@text='"+itemText+"']");
if (appiumItems.isEmpty()) {
System.out.println("测试失败");
}else{
System.out.println("测试通过");
}
// exist
driver.quit();
}
}
这段代码中其实主要包含三个部分,传Capabilites,添加操作事件,还有就是验证结果。
测试框架Junit
Junit是一个专门用来测试安卓的框架,我们上面的代码是一段具有“普世”价值的代码,但是如果测试用例多了起来,并不好管理,也不好出具测试报告,遇到这种,还是需要工程化的方法来解决,这时候就需要用到框架了。
代码:
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import io.appium.java_client.android.AndroidDriver;
import io.appium.java_client.android.AndroidElement;
import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.List;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.remote.DesiredCapabilities;
public class Junit {
private AndroidDriver driver;
@Before
public void setUp() throws Exception {
// Install and open application
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability("deviceName", "Android Device");
capabilities.setCapability("platformName", "Android");
capabilities.setCapability("platformVersion", "4.4");
capabilities.setCapability("appPackage","com.example.mac.button");
capabilities.setCapability("appActivity", ".MainActivity");
capabilities.setCapability("unicodeKeyboard", true);
capabilities.setCapability("resetKeyboard", true);
driver = new AndroidDriver<>(new URL("http://127.0.0.1:4723/wd/hub"), capabilities);
}
@After
public void tearDown() throws Exception {
driver.quit();
}
@Test
public void addItem(){
String itemText = "使用 Appium 编写测试脚本";
// Add new item
WebElement editText = driver.findElement(By.id("com.example.mac.button:id/edit1"));
editText.sendKeys(itemText);
WebElement addItemBtn = driver.findElement(By.id("com.example.mac.button:id/Button1"));
addItemBtn.click();
// Check if item is added
List<AndroidElement> appiumItems = driver.findElementsByXPath("//android.widget.EditText[@text='"+itemText+"']");
Assert.assertEquals("找不到待办事项 '"+itemText+"'", false, appiumItems.isEmpty());
}
}
其中import了junit,其他的看起来好像差别不大,运行在eclipse上以后,可以在左上角看到,
![](https://img.haomeiwen.com/i3072403/c08f1f138bf42c9b.png)
是不是好看正规了很多
文章参考
gitbook-Appium Girl学习指南
testerhome
网易云课堂0基础上手Appium做安卓自动化测试
网友评论