转载来源:appium-girls-tutorial.pdf
Appium介绍
是一个自动化测试开源工具,支持Android平台和iOS平台上原生应用、web应用和混合应用的测试。
- 移动原生应用:用iOS或Android SDK写的应用
- 移动Web应用:用浏览器访问的应用,Appium 支持 iOS 上的Safari 和 Android 上的 Chrome
- 混合应用:指原生代码封装网页视图,原生代码和 web 内容交互。比如,在微信里查看网页
重要:它允许测试人员在不同的平台(iOS,Android)使用同一套API来写自动化测试脚本,从而增加了 iOS 和 Android 测试套件间代码的复用性。
Appium 设计
appium使用苹果和谷歌官方提供的测试框架,所以不需要在被测应用中植入appium相关或第三方代码。
iOS:苹果的UIAutomation
Android4.2+: Google的UiAutomator
Android2.3+: Google的Instrumentation
Appium 概念
C/S架构
Appium的核心是一个web服务器,它提供了一套REST接口。它收到客户端连接,监听到命令,接着在移动设备上执行这些命令,最后将执行结果放在http响应中返回给客户端。
优点:可以使用任何实现了该客户端的语言编写测试代码
Session
自动化始终围绕一个session。
客户端初始化一个session与服务端交互(不同语言有不同的实现方式),最终发送一个post请求给服务端,请求中包含一个JSON对象,被称为“desired capabilities”。此时,服务端会开启一个自动化的session,然后返回一个session ID,此session ID被用于发送后续命令。
Desired Capabilities
是一些键值对的集合,客户端将这些键值对发给服务端,告诉服务端我们想要怎么测试。
比如,我们可以把 platformName 这个 capability 设置为 iOS ,告诉 Appium 服务端,我们想要一个iOS 的 session,而不是一个 Android 的。我们也可以设置 safariAllowPopups 这个 capability 为 true ,确保在 Safari 自 动化 session 中,我们可以使用 javascript 来打开新窗口。
Appium Server
Appium Server是用Node.js编写的一个服务器,可以用源码编译或从NPM安装
Appium Client
Appium Client有很多语言库,包括Java/Ruby/Python/PHP/JavaScript/C#,这些库实现了appium对web driver协议的扩展
Appium.app和Appium.exe
官网提供了GUI封装的的appium服务器的下载,它封装了运行appium服务端的所有依赖。
Appium安装
安装JDK 并设置环境变量
命令行输入java -version,出现如下结果则安装成功
java version “1.7.0_79”安装Android SDK 并设置环境变量
命令行输入adb devices,出现如下结果则安装成功
List of devices attached
daemon not running. starting it now on port 5037安装Nodejs
命令行输入node -v,若输入版本号,则安装成功安装appium
2种方式:1) 使用npm安装 2)使用appium官方安装包安装验证安装
1)若是官方包安装:点击nappium-doctor图标检查当前appium安装是否完善
2)若是npm安装:在命令行输入appium-doctor
Appium for Windows环境搭建:
http://www.cnblogs.com/tobecrazy/p/4562199.html
Appium for iOS 环境搭建:
配置IDE
根据个人偏好,选择相应IDE工具,此处用eclipse。
配置 Appium Java Client
1) 下载appium官网提供的java jar
Appium java client及Selenium Javastand aloneserver
2) 将两个jar包引入到新建的java项目中,从而可以使用jar包中的方法
启动Appium Server
两种方式:
1) 命令行启动
- 1.1) npm安装的appium,只需输入appium,如下
$ appium
info: Welcome to Appium v1.4.16 (REV ae6877eff263066b26328d457bd285c0cc62430d) info: Appium REST http interface listener started on 0.0.0.0:4723
info: Console LogLevel: debug
info: Welcome to Appium v1.4.16 (REV ae6877eff263066b26328d457bd285c0cc
表明目前启动的 appium 版本,在这里我们可以看到使用的版本是 1.4.16 ,对应版本库里 面的 reversion 号是 ae6877eff263066b26328d457bd285c0cc62430d
info: Appium REST http interface listener started on 0.0.0.0:4723
说明监听的地址及端口。这个地址就是 Appium Server 的入口, 0.0.0.0 表示监听本机所有 ip 地址。我们将会在后续编写脚本时用到它。
info: Console LogLevel: debug
表示我们当前的日志级别是 debug 。这也是 appium 日志的默认级别。
- 1.2) 图形化界面安装的appium
找到启动命令目录,mac默认在/Applications,输入如下:
/Applications/Appium.app/Contents/Resources/node_modules/appium/build/lib/main.js
2) 图形化界面启动appium
点击launch即可
学习 DesiredCapabilities
DesiredCapabilities简介
DesiredCapabilities重要作用是:启动session时传递配置信息给appium server,如启动模式、apk/app配置、package/activity配置、浏览器配置、键盘配置等。
DesiredCapabilities关键字
unicodeKeyboard 是否在测试过程中切换到能支持多国语言输入的输入法 true 表示是,false 表示否
Session简介
session是指我们的测试脚本从打开应用到最终执行完毕关闭应用的整个过程。
从申请到退出一个session的整个过程如下:
public class DemoWithoutJunit{
public static void main(String[] args) throws MalformedURLException{
...
// 打开应用,也可以称为 “申请一个 session”
AndroidDriver driver = new AndroidDriver<>(new URL("http://127.0.0.1:4723/wd/hub", desiredCapabilities));
// 此处的所有代码处于一个 session 中。
...
// 关闭应用,也可以称为 “退出一个 session”
driver.quit();
Desired Capabilities使用
通过设置desired capabilities安装并启动指定应用
第一步,记录被测apk的绝对地址。如c:\test
第二步,eclipse中新建类OpenAndCloseApplication,如下
public class OpenAndCloseApplication {
public static void main(String[] args) {
// TODO Auto-generated method stub
} }
第三步,在main方法中设置desired capabilities,让测试脚本知道我们在什么环境下测试
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.setCapability("app","你的 apk 绝对路径");
capabilities.setCapability("unicodeKeyboard", true);
capabilities.setCapability("resetKeyboard", true);
}
第四步,加入打开应用及关闭应用的代码
...
capabilities.setCapability("platformVersion", "4.4"); capabilities.setCapability("app","你的 apk 绝对路径");
// 根据 Desired Capabilities 打开应用
AndroidDriver driver = new AndroidDriver<>(new URL("http://127.0.0.1:4723/wd/hub, capabilities"))
// 什么都不做,程序暂停5秒
Thread.sleep(5000);
// 关闭应用
driver.quit();
}
最后,手机连接电脑或启动模拟器,启动appium server,运行刚才的测试代码
元素定位
使用UIAutomatorViewer工具
Android SDK自动工具,路径Android/sdk/tools/bin/uiautomatorviewer
find_elements方法讲解
文本定位
driver.findElementByAndroidUIAutomator("new UiSelector().text(\"Add note\")");
id定位
driver.findElement(By.id("id is me));
name定位
driver.findElement(By.name("name is me"));
className定位
driver.findElement(By.className("className is me")
xpath定位
driver.findElementByXPath("//android.widget.TextView[contains(@text,'is xpathname')]");
List遍历
List textFieldList = driver.findElements(By.className(“android.widget.EditText”));
textFieldList.get(0).click();
组合定位
driver.findElement(By.className(“android.widget.EditText”)).findElements(By.id(“com.testerhome.appiumgirl.todolist:id/etNewItem”));
编写脚本
1. 编写你的第一个测试脚本
2. 使用Junit组织你的脚本
3. 在脚本中加入隐式等待,应对不稳定的网络环境
第一个完整测试脚本
在Eclipse 里面创建的项目里面添加一个名为 app 的文件夹,并把
ToDoList 应用放到里面
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;
import io.appium.java_client.android.AndroidDriver;
public class OpenAndCloseApplication {
public static void main(String[] args) throws MalformedURLException, InterruptedException {
// Install and open application
File classpathRoot = new File(System.getProperty("user.dir"));
File appDir = new File(classpathRoot, "app/");
File app = new File(appDir, "ToDoList.apk");
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability("deviceName", "55dd55cb");
capabilities.setCapability("platformName", "Android");
capabilities.setCapability("platformVersion", "6.0.1");
capabilities.setCapability("app", app.getAbsolutePath());
capabilities.setCapability("unicodeKeyboard", true);
capabilities.setCapability("resetKeyboard", true);
AndroidDriver<WebElement> 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.testerhome.appiumgirl.todolist:id/etNewItem")).click();
// 什么都不做,程序暂停5秒
Thread.sleep(5000);
driver.quit();
}
}