1、下載eclipse
2、安裝java 配置環境變量
3、eclipse 安裝adt android development tools
4、android sdk manager 安裝tools 和相應api的sdk版本 (安裝api19,底部extras 安裝了Android Support Library 和Google usb driver) sdk管理器的下載代理用 mirrors.neusoft.edu.cn 80 這個代理還是比較快
5、創建虛擬機(AVD)
3、安裝nodejs 並添加環境變量: 安裝文件名node-v4.1.2-x64.msi
C:\Program Files\nodejs\;
4、安裝appium 執行 npm install -g appium 安裝,但是這種安裝非常慢,而且不知道進度在哪里
下載AppiumForWindows-1.4.0.zip 執行appium-installer.exe安裝
安裝后添加環境變量:
C:\Program Files (x86)\Appium;C:\Program Files (x86)\Appium\node_modules\.bin;
執行appium-doctor 檢查環境是否正常:
C:\Users\dingxz>appium-doctor
Running Android Checks
✔ ANDROID_HOME is set to "D:\software\sdk\android-sdk_r23.0.2-windows\android-sd
k-windows"
✔ JAVA_HOME is set to "C:\Program Files\Java\jdk1.7.0_71."
✔ ADB exists at D:\software\sdk\android-sdk_r23.0.2-windows\android-sdk-windows\
platform-tools\adb.exe
✔ Android exists at D:\software\sdk\android-sdk_r23.0.2-windows\android-sdk-wind
ows\tools\android.bat
✔ Emulator exists at D:\software\sdk\android-sdk_r23.0.2-windows\android-sdk-win
dows\tools\emulator.exe
✔ Android Checks were successful.
✔ All Checks were successful
6、新建一個android application project項目
7、安裝maven
8、 AppiumForWindows_1_4_16_1.zip 下載並安裝更新 下載java-client-3.3.0.jar 並導入
http://appium.io/downloads.html(安裝 AppiumForWindows_1_4_16_1 需要先安裝.net)

https://search.maven.org/#artifactdetails|io.appium|java-client|3.3.0|jar 頁面 有pom例子:
加maven pom 文件:
<dependency>
<groupId>io.appium</groupId>
<artifactId>java-client</artifactId>
<version>3.3.0</version>
</dependency>
實際加了pom.xml 文件中,eclipse 提示:failed to read artifact descriptor for io.appium:java-client:jar:3.3.0

同頁面右邊有完整的例子:
9、啟動appium.exe 點擊launch the appium node server
10、
http://appium.io/ 官網有個sample 的例子

下載代碼的位置:
package com.saucelabs.appium;
import static org.junit.Assert.assertEquals;
import io.appium.java_client.AppiumDriver;
import io.appium.java_client.android.AndroidDriver;
import java.io.File;
import java.net.URL;
import java.util.List;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.remote.DesiredCapabilities;
public class AndroidTest {
private AppiumDriver<WebElement> driver;
@Before
public void setUp() throws Exception {
File classpathRoot = new File(System.getProperty("user.dir"));
File appDir = new File(classpathRoot, "../../../apps/ApiDemos/bin");
File app = new File(appDir, "ApiDemos-debug.apk");
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability("deviceName","Android Emulator");
capabilities.setCapability("platformVersion", "4.4");
capabilities.setCapability("app", app.getAbsolutePath());
capabilities.setCapability("appPackage", "io.appium.android.apis");
capabilities.setCapability("appActivity", ".ApiDemos");
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 apiDemo(){
WebElement el = driver.findElement(By.name("Animation"));
assertEquals("Animation", el.getText());
el = driver.findElementByClassName("android.widget.TextView");
assertEquals("API Demos", el.getText());
el = driver.findElement(By.name("App"));
el.click();
List<WebElement> els = driver.findElementsByClassName("android.widget.TextView");
assertEquals("Activity", els.get(2).getText());
}
}
11、下載嗶哩嗶哩動畫.apk,
12、配置skd 環境變量, cmd adb 就可以使用了,adb install 該apk
13、啟動android里面的被測試應用。同時啟動 D:\soft\appium\android-sdk_r23.0.2-windows\android-sdk-windows\tools sdk tools 下面的bat文件 hierarchyviewer.bat。
被啟動的應用在hierarchyviewer 里面顯示為粗黑體

14、在測試代碼下里面新建一個AppiumTest 類 復制上面測試例子代碼中的 setup方法到類的main方法中,復制內容如下:
File classpathRoot = new File(System.getProperty("user.dir"));
File appDir = new File(classpathRoot, "../../../apps/ApiDemos/bin");
File app = new File(appDir, "ApiDemos-debug.apk");
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability("deviceName","Android Emulator");
capabilities.setCapability("platformVersion", "4.4");
capabilities.setCapability("app", app.getAbsolutePath());
capabilities.setCapability("appPackage", "io.appium.android.apis");
capabilities.setCapability("appActivity", ".ApiDemos");
driver = new AndroidDriver<>(new URL("
http://127.0.0.1:4723/wd/hub"), capabilities);
復制以后測試類如下:
public static void main(String[] args) throws MalformedURLException {
AppiumDriver driver;
/* // TODO Auto-generated method stub
AndroidDriver driver;
File classpathRoot = new File(System.getProperty("user.dir"));
File appDir = new File(classpathRoot, "apps");
File app = new File(appDir, "BiliPlayer.apk");
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability("deviceName","Android Emulator");
capabilities.setCapability("platformVersion", "4.4");
capabilities.setCapability("app", app.getAbsolutePath());
capabilities.setCapability("appPackage", "io.appium.android.apis");
capabilities.setCapability("appActivity", ".ApiDemos");
driver = new AndroidDriver(new URL("
http://127.0.0.1:4723/wd/hub"), capabilities);
System.out.println("launch");
driver.quit();*/
//設置apk的路徑
File classpathRoot = new File(System.getProperty("user.dir"));
File appDir = new File(classpathRoot, "apps");
File app = new File(appDir, "BiliPlayer.apk");
//設置自動化相關參數
DesiredCapabilities capabilities = new DesiredCapabilities();
/* capabilities.setCapability(CapabilityType.BROWSER_NAME, "");
*/
capabilities.setCapability("deviceName", "emulator-5554");
//設置安卓系統版本
capabilities.setCapability("platformVersion", "4.4");
capabilities.setCapability("platformName", "Android");
//設置apk路徑
capabilities.setCapability("app", app.getAbsolutePath());
//設置app的主包名和主類名 tv.danmaku.bilixl
capabilities.setCapability("appPackage", "tv.danmaku.bilixl");
capabilities.setCapability("appActivity", ".LauncherActivity");
//初始化
driver = new AndroidDriver(new URL("
http://127.0.0.1:4723/wd/hub"),capabilities);
}
執行后提示:
xception in thread "main" org.openqa.selenium.SessionNotCreatedException: A new session could not be created. (Original error: Activity used to start app doesn't exist or cannot be launched! Make sure it exists and is a launchable activity) (WARNING: The server did not provide any stacktrace information)
Command duration or timeout: 26.97 seconds
Build info: version: '2.48.2', revision: '41bccdd10cf2c0560f637404c2d96164b67d9d67', time: '2015-10-09 13:08:06'
System info: host: 'ding', ip: '192.168.56.1', os.name: 'Windows 8.1', os.arch: 'amd64', os.version: '6.3', java.version: '1.8.0_45'
Driver info: io.appium.java_client.android.AndroidDriver
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:422)
at org.openqa.selenium.remote.ErrorHandler.createThrowable(ErrorHandler.java:206)
at org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:158)
at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:647)
at io.appium.java_client.DefaultGenericMobileDriver.execute(DefaultGenericMobileDriver.java:42)
at io.appium.java_client.AppiumDriver.execute(AppiumDriver.java:1)
at io.appium.java_client.android.AndroidDriver.execute(AndroidDriver.java:1)
at org.openqa.selenium.remote.RemoteWebDriver.startSession(RemoteWebDriver.java:247)
at org.openqa.selenium.remote.RemoteWebDriver.<init>(RemoteWebDriver.java:129)
at org.openqa.selenium.remote.RemoteWebDriver.<init>(RemoteWebDriver.java:142)
at io.appium.java_client.DefaultGenericMobileDriver.<init>(DefaultGenericMobileDriver.java:37)
at io.appium.java_client.AppiumDriver.<init>(AppiumDriver.java:161)
at io.appium.java_client.AppiumDriver.<init>(AppiumDriver.java:170)
at io.appium.java_client.android.AndroidDriver.<init>(AndroidDriver.java:82)
at com.test.appium.appiumtraining.AppiumTest.main(AppiumTest.java:65)
網上查詢這個提示是說路徑問題,也不知道具體什么路徑問題。
同時也查找到有人在adb shell中 執行am start 啟動應用,提供的語句為:
/home/chhagan/android/adt/sdk/platform-tools/adb -s emulator-5554 shell "am start -S -a android.intent.action.MAIN -c android.intent.category.LAUNCHER -f 0x10200000 -n com.google.android.gm/.ConversationListActivityGoogleMail"
但是不明白am start 的語句是什么意思,隨查找android am start 命令, 獲得如下信息:
# am start -n {包(package)名}/{包名}.{活動(activity)名稱}
如啟動計算器: am start -n com.android.calculator2/com.android.calculator2.Calculator
這個命令中,需要提供程序的包名和activity 名稱
隨執行命令:
am start -n tv.danmaku.bilixl/tv.danmaku.bilixltv.danmaku.bili.LauncherActivity(這個命令沒有成功啟動)
命令中的: tv.danmaku.bilixl 為包名,tv.danmaku.bilixltv.danmaku.bili.LauncherActivity 為activity 名稱,名稱來着於re-sign 提示

提示為不能啟動:
d:\soft>
adb.exe -s emulator-5554 shell "am start -n tv.danmaku.bilixl/tv.danmaku.bilixltv.danmaku.bili.LauncherActivity"
Starting: Intent { cmp=tv.danmaku.bilixl/tv.danmaku.bilixltv.danmaku.bili.LauncherActivity }
Error type 3
Error: Activity class {tv.danmaku.bilixl/tv.danmaku.bilixltv.danmaku.bili.LauncherActivity} does not exist.
d:\soft>
使用: adb logcat>D:\log.txt 獲取android日志,啟動被測試應用,再查看D:\log.txt 中的記錄, 獲得日志信息:
I/ActivityManager( 367): START u0 {flg=0x10000000 cmp=
tv.danmaku.bilixl/.tv.danmaku.bilixlty.danmaku.bili.LauncherActivity} from pid 2174
讓后用這個包名來啟動,執行命令:
adb.exe -s emulator-5554 shell "am start -n tv.danmaku.bilixl/.tv.danmaku.bilixl
ty.danmaku.bili.LauncherActivity"
d:\soft>adb.exe -s emulator-5554 shell "am start -n tv.danmaku.bilixl/.tv.danmaku.bilixlty.danmaku.bili.LauncherActivity"
Starting: Intent { cmp=tv.danmaku.bilixl/.tv.danmaku.bilixlty.danmaku.bili.LauncherActivity }
Error type 3
Error: Activity class {tv.danmaku.bilixl/tv.danmaku.bilixl.tv.danmaku.bilixlty.danmaku.bili.LauncherActivity} does not exist.
結果也是啟動不成功。
看樣子是獲取包名的數據有問題,再搜索 android 獲取包名 獲得在sdk 相應api版本下面的一個命令
aapt
命令格式為: aapt dump badging xxxx.apk
執行命令:
aapt dump badging D:\soft\appium\android-sdk_r23.0.2-windows\android-sdk-windows\build-tools\19.1.0\BiliPlayer.apk
獲得正在的包名和activity名,如下紅色標記:
D:\soft\appium\android-sdk_r23.0.2-windows\android-sdk-windows\build-tools\19.1.0>aapt dump badging D:\soft\appium\android-sdk_r23.0.2-windows\android-sdk-windows\build-tools\19.1.0\BiliPlayer.apk
package: name='tv.danmaku.bilixl' versionCode='304000' versionName='1.0.0'
sdkVersion:'9'
targetSdkVersion:'21'
uses-permission:'tv.danmaku.bili.permission.MIPUSH_RECEIVE'
uses-permission:'android.permission.INTERNET'
uses-permission:'android.permission.WAKE_LOCK'
uses-permission:'android.permission.WRITE_EXTERNAL_STORAGE'
uses-permission:'android.permission.WRITE_MEDIA_STORAGE'
uses-permission:'android.permission.ACCESS_ALL_EXTERNAL_STORAGE'
uses-permission:'android.permission.ACCESS_NETWORK_STATE'
uses-permission:'android.permission.ACCESS_WIFI_STATE'
uses-permission:'android.permission.READ_PHONE_STATE'
uses-permission:'android.permission.CAMERA'
uses-feature-not-required:'android.hardware.camera'
uses-feature-not-required:'android.hardware.camera.autofocus'
uses-feature-not-required:'android.hardware.touchscreen'
application-label:'嗶哩嗶哩白'
application-label-ja:'嗶哩嗶哩白'
application-label-zh:'嗶哩嗶哩白'
application-label-zh_HK:'嗶哩嗶哩白'
application-label-zh_CN:'嗶哩嗶哩白'
application-label-zh_TW:'嗶哩嗶哩白'
application-icon-120:'res/drawable/ic_launcher.png'
application-icon-160:'res/drawable-mdpi-v4/ic_launcher.png'
application-icon-213:'res/drawable-tvdpi-v4/ic_launcher.png'
application-icon-240:'res/drawable-hdpi-v4/ic_launcher.png'
application-icon-320:'res/drawable-xhdpi-v4/ic_launcher.png'
application-icon-480:'res/drawable-xxhdpi-v4/ic_launcher.png'
application-icon-640:'res/drawable-xxxhdpi-v4/ic_launcher.png'
application: label='嗶哩嗶哩白' icon='res/drawable-mdpi-v4/ic_launcher.png'
l
aunchable-activity: name='tv.danmaku.bili.LauncherActivity' label='嗶哩嗶哩白' icon='res/drawable-mdpi-v4/ic_launcher.png'
uses-permission:'android.permission.READ_EXTERNAL_STORAGE'
uses-implied-permission:'android.permission.READ_EXTERNAL_STORAGE','requested WRITE_EXTERNAL_STORAGE'
uses-feature:'android.hardware.wifi'
uses-implied-feature:'android.hardware.wifi','requested android.permission.ACCESS_WIFI_STATE, android.permission.CHANGE_WIFI_STATE, or android.permission.CHANGE_WIFI_MULTICAST_STATE permission'
uses-feature:'android.hardware.screen.portrait'
uses-implied-feature:'android.hardware.screen.portrait','one or more activities have specified a portrait orientation'
main
other-activities
search
other-services
supports-screens: 'small' 'normal' 'large' 'xlarge'
supports-any-density: 'true'
locales: '--_--' 'ja' 'zh' 'zh_HK' 'zh_CN' 'zh_TW'
densities: '120' '160' '213' '240' '320' '480' '640'
native-code: 'armeabi' 'armeabi-v7a' 'mips' 'x86'
因此,修改am start 命令:
adb.exe -s emulator-5554 shell "am start -n tv.danmaku.bilixl/tv.danmaku.bili.LauncherActivity"
結果如下:
D:\soft\eclipse-mars\workspace\appiumtraining\apps>adb.exe -s emulator-5554 shell "am start -n tv.danmaku.bilixl/tv.danmaku.bili.LauncherActivity"
Starting: Intent { cmp=tv.danmaku.bilixl/tv.danmaku.bili.LauncherActivity }
啟動成功!!!
源來java代碼:
capabilities.setCapability("appPackage", "tv.danmaku.bilixl");
capabilities.setCapability("appActivity", ".LauncherActivity");
修改為
capabilities.setCapability("appPackage", "tv.danmaku.bilixl");
capabilities.setCapability("appActivity", "tv.danmaku.bili.LauncherActivity");
運行腳本,也可以啟動,腳本運行成功
完整啟動腳本java 代碼:
import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import org.openqa.selenium.remote.CapabilityType;
import org.openqa.selenium.remote.DesiredCapabilities;
import io.appium.java_client.AppiumDriver;
import io.appium.java_client.android.AndroidDriver;
public class AppiumTest {
public static void main(String[] args) throws MalformedURLException {
AppiumDriver driver;
File classpathRoot = new File(System.getProperty("user.dir"));
File appDir = new File(classpathRoot, "apps");
File app = new File(appDir, "BiliPlayer.apk");
//設置自動化相關參數
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability(CapabilityType.BROWSER_NAME, "");
capabilities.setCapability("deviceName", "emulator-5554");
//設置安卓系統版本
capabilities.setCapability("platformVersion", "4.4");
capabilities.setCapability("platformName", "Android");
//設置apk路徑 D:\soft\eclipse-mars\workspace\appiumtraining\apps\BiliPlayer.apk
capabilities.setCapability("app", app.getAbsolutePath());
String abc = app.getAbsolutePath();
//設置app的主包名和主類名 tv.danmaku.bilixl
capabilities.setCapability("appPackage", "tv.danmaku.bilixl");
capabilities.setCapability("appActivity", "tv.danmaku.bili.LauncherActivity");
//初始化
driver = new AndroidDriver(new URL("
http://127.0.0.1:4723/wd/hub"),capabilities);
}
}
14、打開ddms
eclipse -> window ->perspective ->open perspective ->other... 選中ddms
ddms 里面可以看到一些android系統的信息
在ddms 頁面 點擊左側:dump view hierarchy for UI Automator 工具,能獲取到android頁面的元素信息

2015-12-26