----------------------------------------------appium的一些基本概念----------------------------------------------
appium的核心其實是一個暴露了一系列REST API的server。
這個server的功能其實很簡單:監聽一個端口,然后接收由client發送來的command。翻譯這些command,把這些command轉成移動設備可以理解的形式發送給移動設備,然后移動設備執行完這些command后把執行結果返回給appium server,appium server再把執行結果返回給client。
在這里client其實就是發起command的設備,一般來說就是我們代碼執行的機器,執行appium測試代碼的機器。狹義點理解,可以把client理解成是代碼,這些代碼可以是java/ruby/python/js的,只要它實現了webdriver標准協議就可以。
如何部署和使用Appium,一起來看看吧!
---------------------------------------------------安裝各種組件----------------------------------------------------
一、安裝nodejs0.8版本及以上
下載合適自己機型的版本,Windows下安裝很簡單,一直下一步;
驗證安裝是否成功,Win+R>>cmd->>node - v,如出現類似以下提示,證明安裝成功!
二、安裝配置Java的JDK(Java軟件開發工具包)
地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
下載合適自己機型的版本,Windows下安裝很簡單,一直下一步;
打開jdk的安裝目錄下的bin目錄,里面有許多后綴名為exe的可執行程序,這些都是JDK包含的工具。通過配置JDK的環境變量,我們可以方便地調用這些工具及它們的命令:
javac:Java編譯器,將源代碼轉成字節碼。
jar:打包工具,將相關的類文件打包成一個文件。
javadoc:文檔生成器,從源碼注釋中提取文檔。
jdb:debugger,調試查錯工具。
java:運行編譯后的java程序。
1、JAVA_HOME
新建一個名叫“JAVA_HOME”的用戶變量,如不會請參考:http://my.oschina.net/u/563250/blog/490614
變量值為JDK的安裝目錄,筆者為 C:\Program Files\Java\jdk1.8.0_51
創建好后則可以利用%JAVA_HOME%作為JDK安裝目錄的統一引用路徑;
2、PATH
在已有的環境變量PATH變量值的最后追加 ;%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin
3、CLASSPATH
新建一個名叫“CLASSPATH”的用戶變量, 變量值為 .;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar
注意變量值字符串前面有一個"."表示當前目錄,設置CLASSPATH 的目的,在於告訴Java執行環境,在哪些目錄下可以找到您所要執行的Java程序所需要的類或者包;
驗證安裝是否成功,Win+R>>cmd->>java -version,如出現類似以下提示,證明安裝成功!
三、安裝配置Android的SDK(Android軟件開發工具包)
地址:http://developer.android.com/studio/installing/index.html
僅下載SDK TOOLS安裝工具即可,不必安裝ANDROID STUDIO,我們的測試代碼寫在Eclipse里;打開頁面后首先看到的是Android studio,拉到頁面底部,可以看到Android SDK。
安裝完成后,配置環境變量:
1、ANDROID_HOME
新建一個名叫“ANDROID_HOME”的用戶變量
變量值為Android SDK的安裝目錄,筆者為 C:\Program Files (x86)\android-sdk-windows
2、PATH
在已有的環境變量PATH變量值的最后追加 ;%ANDROID_HOME%\tools;%ANDROID_HOME%\platform-tools
在安裝目錄或開始菜單中找到SDK Manager.exe並打開,工具會自動檢測系統當前安了哪些SDK工具,並獲取各個版本可安裝的SDK,默認情況下只安裝了Tools下的Android SDK Tools;圖中Android SDK Platform-tools是我自行安裝的。除默認已安裝選項外,其他選項可全部選中安裝,也可以選擇相同選項中的一項進行安裝。
獲取可安裝的SDK版本時,國內有牆,有時候會出現獲取失敗的情況,如下圖:
可以通過如下設置解決問題,選擇Tools->>Options打開Android SDK Manager - Settings
將HTTP Proxy Server和HTTP Proxy Port,連接服務器使用的代理地址和端口分別修改為“mirrors.opencas.cn”“80”;
若該地址仍然無法解決問題不正確,請參考該網站獲得更多代理地址,或從該網站上直接手動下載:http://www.androiddevtools.cn/
或者遇到這種錯誤:
Failed to fetch URL https://dl-ssl.google.com/android/repository/addons_list-2.xml, reason: peer not authenticated
Failed to fetch URL https://dl-ssl.google.com/android/repository/repository-7.xml, reason: SSLPeerUnverified peer not authenticated
遇到這種錯誤一般是因為在公司內網,公司內網設置了代理,需要在Android SDK Manager中設置代理為公司代理。
修改代理地址和端口后,選擇Packages->>Reload,重新獲取,等待Android SDK Tools下方提示Done loading packages,即加載完成。選擇需要安裝的SDK,Appium官方推薦API 17及以上的版本都支 持,可以任意安裝一個API 17及以上的版本,選擇右側的Install xx packages;
驗證安裝是否成功,Win+R>>cmd->>android -h,如出現類似以下提示,證明安裝成功!(當然,已經可以正常運行Android SDK Tools,肯定是安裝成功了,不妨再檢查一下)
三、安裝Appium
點擊Download Appium,默認就下載的是AppiumForWindows安裝包,下載完成后,解壓安裝包,運行appium-installer.exe進行安裝;
注:還可以使用node.js的模塊管理工具npm,輸入命令在線安裝(Win+R->>cmd->>npm install -g appium),但在線安裝失敗的幾率比較大,貌似是因為網絡不穩或權限問題無法解壓,還是推薦直接下 載Windows安裝包;
安裝完成后,配置環境變量:
1、PATH
在已有的環境變量PATH變量值的最后追加Appium的安裝bin目錄,筆者為 C:\Program Files (x86)\Appium\node_modules\.bin
驗證安裝是否成功,Win+R>>cmd->>appium,如出現類似以下提示,證明安裝成功!
四、安裝Eclipse
地址:http://www.eclipse.org/downloads/
選擇Eclipse IDE for Java EE Developers,下載合適自己機型的IDE,Eclipse不需要安裝,直接將下載的安裝包解壓,並打開eclipse.exe,選擇一個工作目錄即可;
---------------------------------------------------測試前的准備----------------------------------------------------
一、啟動一個Android模擬器或者連接上一個API 17以上的android真機
(1)打開Android SDK Tools中的AVD Manager,點擊右側的create,新建一個新的AVD(Android Virtual Device),設置AVD的各個屬性,點擊OK;
注:若SDK下載安裝完整,但CPU/ABI一欄無法選擇,被灰掉或禁用,則可能是SDK安裝目錄太長,將SDK拷貝到別的目錄,再次打開AVD Manager.exe,新建一個AVD,CPU/ABI一欄就可以選擇了;
(2)點擊右側的start,選擇Launch,啟動模擬器;
(3)點擊launch后,可能會遇到下圖中的錯誤:(如果沒有遇到請忽略這步)
這是因為電腦系統中Intel Virtualization Technology(VT-x)沒有打開,解決辦法為,在BIOS中開啟Intel Virtualization Technology:在開機時按esc,選擇F10(每個人電腦進入BIOS方法可能不同),選擇Advanced->device->勾上interl virtualization Technology,保存退出。然后到Android SDK安裝文件夾下的extras\intel\Hardware_Accelerated_Execution_Manager運行一下 intelhaxm-android.exe,我的目錄是C:\Program Files (x86)\android-sdk-windows\extras\intel\Hardware_Accelerated_Execution_Manager。再點擊launch就沒有報這個錯誤了,模擬器進入連接狀態,等待一會,可以看到一個手機屏幕。
注:如果手機屏幕為鎖定狀態,一定要滑動屏幕解鎖,否則Appium無法啟動被測試應用程序;啟動后的手機屏幕如下:
二、打開Appium
雙擊桌面上Appium圖標,點擊右上角的Launch the Appium Node Server按鈕;
或:Win+R->>cmd->>appium,啟動Appium Server服務(和上訴方法二選一即可);
三、在Eclipse中配置Selenium、Appium類庫
(1)下載Selenium類庫
client地址:http://selenium-release.storage.googleapis.com/3.0.1/selenium-java-3.0.1.zip
server地址:https://goo.gl/Lyo36k
(確認2016.11.14有效,如無效請訪問http://docs.seleniumhq.org/download/ 進行下載)
(2)下載Appium java版類庫
地址:http://appium.io/downloads.html
選擇java,下載jar包;
(3)在Eclipse中導入
打開Eclipse,新建一個java Project
在新項目上,新建一個Folder,命名為“lib”,將下載的三個類庫“selenium-java-3.0.1.zip”、“selenium-server-standalone-3.0.1.jar”、“java-client-4.1.2.jar”,從文件夾中直接拖放到“lib”下;
全選lib文件夾下的3個類包文件,右鍵->>Build Path->>add to Build Path,這3個類包就會加到Reference Libraries中;
-------------------------------------------------------開始測試--------------------------------------------------------
(1)在項目的src下,新建一個package,在package下新建一個class(筆者的命名分別為“appiumtest”和“demo2”);
在類中輸入以下代碼,代碼內容為,啟動Android模擬器上自帶的Calculator計算器,並分別點擊“1+2=”;
package appiumtest;
import io.appium.java_client.android.AndroidDriver;
import org.openqa.selenium.remote.CapabilityType;
import org.openqa.selenium.remote.DesiredCapabilities;
import java.net.URL;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
public class demo2 {
private AndroidDriver driver;
@Before
public void calc() throws Exception {
DesiredCapabilities capabilities = new DesiredCapabilities();
//capabilities.setCapability(CapabilityType.BROWSER_NAME, "");// 這句不是必須的
capabilities.setCapability("deviceName", "Android Emulator");
capabilities.setCapability("platformVersion", "6.0");
capabilities.setCapability("platformName", "Android");
capabilities.setCapability("appPackage", "com.android.calculator2");
capabilities.setCapability("appActivity", ".Calculator");
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 add() {
driver.findElementByName("1").click();
driver.findElementByName("+").click();
driver.findElementByName("2").click();
driver.findElementByName("=").click();
driver.quit();
}
}
(2)在項目上右鍵->>Run As->>JUnit Test;
(3)測試用例正在運行,查看Appium,輸出了很多運行的日志,查看模擬器,Appium控制模擬器打開了自帶的計算器,並分別點擊“1+2=”,至此部署Appium測試環境已完成並測試成功!接下來就可以開發真正的自動化測試用例啦!
--------------------------------------分割線(Desired Capabilities詳解)-------------------------------------
Desired Capabilities在啟動session的時候是必須提供的,它本質上是key value的對象,它告訴appium server這樣一些事情:
1、本次測試是啟動瀏覽器還是啟動移動設備?
2、是啟動andorid還是啟動ios?
3、啟動android時,app的package是什么?
4、啟動android時,app的activity是什么?
Appium的Desired Capabilities是擴展了webdriver的Desired Capabilities的,下面的一些通用配置是需要指定的:
Capability名稱 | 描述 | 可能的值舉例 |
automationName | 使用哪種自動化引擎(默認:Appium) | Appium ,Selendroid |
platformName | 使用哪種移動平台 | iOS,Android,FirefoxOS |
platformVersion | 移動平台版本 | 7.1,4.4 |
deviceName | 啟動哪種設備?真機還是模擬器 | iPhone Simulator, iPad Simulator,iPhone Retina 4-inch,Android Emulator,Galaxy S4,etc…. On iOS,this should be one of the valid devices returned by instruments with instruments -s devices. On Android this capability is currently ignored. |
app | 應用(.ipa .apk .zip)的絕對路徑或遠程的Http URL | /abs/path/to/my.apk , http://myapp.com/app.ipa |
browserName | 移動瀏覽器的名稱(如果被測應用程序已安裝到移動設備,則可設置為空字符串) | ‘Safari’ for iOS and ‘Chrome’, ‘Chromium’, or ‘Browser’ for Android |
newCommandTimeout | 客戶端退出和結束會話之前,Appium等待從客戶端發來一個新命令的時間,即超時時間(秒) | 60 |
autoLaunch | 是否自動安裝和啟動被測app(默認:true) | true, false |
language | (Sim/Emu-only) Language to set for the simulator / emulator | fr |
locale | (Sim/Emu-only) Locale to set for the simulator / emulator | fr_CA |
udid | 物理機的id | 1ae203187fc012g |
orientation | (Sim/Emu-only) start in a certain orientation | LANDSCAPE,PORTRAIT |
autoWebview | Move directly into Webview context(默認:false) | true, false |
noReset | 在測試前不重置app的狀態(默認:false) | true, false |
fullReset | IOS:刪除整個模擬器目錄;Android:通過卸載app的方式重置app的狀態,而不是僅清除app的數據,在Android設備上,當測試結束后,也會徹底移除app(默認:false) | true, false |
下面這些屬性是android平台特定的(還有很多沒有列出來的可以查看:http://appium.io/documentation.html):
Capability名稱 | 描述 | 可能的值舉例 |
appActivity | 待測試的app的Activity名字,原生app的話要在activity前加個"." | MainActivity, .Settings |
appPackage | 待測試的app的java package | com.example.android.myApp, com.android.settings |
--------------------------------------分割線(工具的使用)-------------------------------------
通過上一節我們發現,要獲取app的package和activity名字,要用什么工具呢?
一、monitor.bat
該文件位於SDK安裝目錄tools下,如筆者在“C:\Program Files (x86)\Android\android-sdk\tools”下,雙擊運行monitor.bat即可運行,該工具可以幫我們找到android控件的content-description,為以后的find_element_by_accessibility_id 定位方法做參數使用,也可查看被測app的appPackage,如下圖。
二、uiautomatorviewer.bat
該文件位於SDK安裝目錄tools下,如筆者在“C:\Program Files (x86)\Android\android-sdk\tools”下,雙擊uiautomatorviewer.bat即可運行,該工具主要用來查看控件的屬性,比如resource id,class name等,也可查看被測app的appPackage(Desired Capabilities中使用)。
使用方法(以計算器為例):將模擬器的打開,點擊左上角綠色的Android小圖標(Device ScreenShot),可以為當前界面UI創建一個帶有控件信息的截圖,將鼠標放在想要的地方,即可看到控件的相關屬性: