中文 Appium API 文件
阿新 • • 發佈:2019-02-04
該文件是Testerhome官方翻譯的
源地址:https://github.com/appium/appium/tree/master/docs/cn
官方網站上的:http://appium.io/slate/cn/master/?ruby#about-appium
中文Appium API 文件
第一章:關於appium
1.1 appium客戶端
客戶端類庫列表及Appium服務端支援
這些類庫封裝了標準Selenium客戶端類庫,為使用者提供所有常見的JSON 格式selenium命令以及額外的移動裝置控制相關的命令,如多點觸控手勢和螢幕朝向。
Appium客戶端類庫實現了Mobile JSON Wire Protocol(一個標準協議的官方擴充套件草稿)和W3C Webdriver spec(一個傳輸不可預知的自動化協議,該協議定義了MultiAction 介面)的元素。
Appium 服務端定義了官方協議的擴充套件,為Appium 使用者提供了方便的介面來執行各種裝置動作,例如在測試過程中安裝/解除安裝app。這就是為什麼我們需要Appium 特定的客戶端,而不是通用的Selenium 客戶端。當然,Appium 客戶端類庫只是增加了一些功能,而實際上這些功能就是簡單的擴充套件了Selenium 客戶端,所以他們仍然可以用來執行通用的selenium會話。
語言/框架 Github版本庫以及安裝指南
Ruby https://github.com/appium/ruby_lib
Python https://github.com/appium/python-client
Java https://github.com/appium/java-client
JavaScript (Node.js) https://github.com/admc/wd
Objective C https://github.com/appium/selenium-objective-c
PHP https://github.com/appium/php-client
C# (.NET) https://github.com/appium/appium-dotnet-driver
RobotFramework https://github.com/jollychang/robotframework-appiumlibrary
1.2 appium介紹
Appium 介紹
Appium 是一個自動化測試開源工具,支援 iOS 平臺和 Android 平臺上的原生應用,web 應用和混合應用。
所謂的“移動原生應用”是指那些用 iOS 或者 Android SDK 寫的應用。所謂的“移動 web 應用”是指使用移動瀏覽器訪問的應用(Appium 支援 iOS 上的 Safari 和 Android 上的 Chrome)。所謂的“混合應用”是指原生程式碼封裝網頁檢視——原生程式碼和 web 內容互動。比如,像 Phonegap,可以幫助開發者使用網頁技術開發應用,然後用原生程式碼封裝,這些就是混合應用。
重要的是,Appium 是一個跨平臺的工具:它允許測試人員在不同的平臺(iOS,Android)使用同一套API來寫自動化測試指令碼,這樣大大增加了 iOS 和 Android 測試套件間程式碼的複用性。
想知道 Appium 如何支援平臺,版本和自動化形態的詳細資訊,請參見platform support doc。
Appium 的理念
為了滿足移動自動化需求,Appium 遵循著一種哲學,重點體現於以下4個需求:
你無需為了自動化,而重新編譯或者修改你的應用。
你不必侷限於某種語言或者框架來寫和執行測試指令碼。
一個移動自動化的框架不應該在介面上重複造輪子。(移動自動化的介面應該統一)
無論是精神上,還是名義上,都必須開源。
Appium 設計
那麼 Appium 架構是如何實現這個哲學呢?為了滿足第一條,Appium 真正的工作引擎其實是第三方自動化框架。這樣,我們就不需在你的應用裡植入 Appium 相關或者第三方的程式碼。這意味著你測試使用的應用與最終釋出的應用並無二致。我們使用以下的第三方框架:
iOS: 蘋果的 UIAutomation
Android 4.2+: Google's UiAutomator
Android 2.3+: Google's Instrumentation. (Instrumentation由單獨的專案Selendroid提供支援 )
為了滿足第二點,我們把這些第三方框架封裝成一套 API,WebDriver API.WebDriver(也就是 "Selenium WebDriver") 指定了客戶端到服務端的協議。
(參見 JSON Wire Protocol)。使用這種客戶端-服務端的架構,我們可以使用任何語言來編寫客戶端,向服務端傳送恰當的 HTTP 請求。
目前已經實現了大多數流行語言版本的客戶端,這意味著你可以使用任何測試套件或者測試框架。客戶端庫就是簡單的HTTP 客戶,可以以任何你喜歡的方式潛入你的程式碼。換句話說,Appium 和 WebDriver 客戶端不是技術意義上的“測試框架”,而是“自動化庫”。你可以在你的測試環境中隨意使用這些自動化庫!
事實上 WebDriver 已經成為 web 瀏覽器自動化的標準,也成了 W3C 的標準 —— W3C Working Draft。我們又何必為移動做一個完全不同的呢?所以我們擴充了WebDriver 的協議,在原有的基礎上新增移動自動化相關的 API 方法,這也滿足了第三條理念。
第四條就不用說了,Appium 是開源的。
Appium 概念
C/S 架構<br/>
Appium 的核心是一個 web 伺服器,它提供了一套 REST 的介面。它收到客戶端的連線,監聽到命令,接著在移動裝置上執行這些命令,然後將執行結果放在 HTTP響應中返還給客戶端。事實上,這種客戶端/服務端的架構給予了許多的可能性:比如我們可以使用任何實現了該客戶端的語言來寫我們的測試程式碼。比如我們可以把服務端放在不同
的機器上。比如我們可以只寫測試程式碼,然後使用像 Sauce Labs 這樣的雲服務來解釋命令。
Session<br/>
自動化始終圍繞一個session進行,客戶端初始化一個seesion(會話)來與服務端互動,不同的語言有不同的實現方式,但是他們最終都是傳送為一個POST請求給服務端,請求中包含一個JSON物件,被稱作“desired capabilities”。此時,服務端就會開啟一個自動化的 session,然後返回一個 session ID,session ID將會被使用者傳送後續的命令。
Desired Capabilities<br/>
Desired capabilities 是一些鍵值對的集合 (比如,一個 map 或者 hash),客戶端將這些鍵值對發給服務端,告訴服務端我們想要怎麼測試。比如,我們可以把platformName capability 設定為 iOS,告訴 Appium 服務端,我們想要一個iOS 的 session,而不是一個 Android 的。我們也可以設定 safariAllowPopups capability 為 true,確保在 Safari 自動化 session 中,我們可以使用 javascript 來開啟新視窗。參見 capabilities 文件,檢視完整的 capabilities 列表。
Appium Server<br/>
Appium server 是用 Node.js 寫的。我們可以用原始碼編譯或者從 NPM 直接安裝。
Appium 服務端<br/>
Appium 服務端有很多語言庫 Java, Ruby, Python, PHP, JavaScript 和 C#,這些庫都實現了
Appium 對 WebDriver 協議的擴充套件。當使用 Appium 的時候,你只需使用這些庫代替常規的 WebDriver 庫就可以了。
你可以從這裡看到所有的庫的列表。
Appium.app, Appium.exe<br/>
我們提供了 GUI 封裝的 Appium 服務端下載,它封裝了執行 Appium服務端的所有依賴,而不需要擔心怎樣安裝Node.js。其中還包括一個Inspector工具,可以幫助你檢查應用的介面層級,這樣寫測試用例時更方便。
Getting Started
恭喜!你現在有足夠的知識來使用 Appium 了。 來我們回到 getting started doc 繼續瞭解更加
細節的需求和指南。
第二章:進階指南
2.1 selenium配置
Selenium Grid
使用 <b>"--nodeconfig"</b> 伺服器引數,你可以在本地 selenium grid 裡註冊你的 appium 伺服器。
> node . -V --nodeconfig /path/to/nodeconfig.json
在 node 的配置檔案裡,你需要定義 <b>"browserName"</b>,<b>"version"</b> 和 <b>"platform"</b>。
基於這些引數,selenium grid 會將你的測試定向到正確的裝置上去。你還需要配置你的 <b>host</b> 詳細資訊和
<b>selenium grid</b> 的詳細資訊。你可以在 <a href="http://code.google.com/p/selenium/source/browse/java/server/src/org/openqa/grid/common/defaults/GridParameters.properties">這裡</a> 找到詳細的引數列表和描述資訊。
一旦你啟動了 appium 伺服器並且在 grid 裡註冊了資訊,你會在 grid 控制檯發現你的裝置:
"http://<b><grid-ip-adress></b>:<b><grid-port></b>/grid/console"
Grid 配置檔案例子
{
"capabilities":
[
{
"browserName": "<e.g._iPhone5_or_iPad4>",
"version":"<version_of_iOS_e.g._6.1>",
"maxInstances": 1,
"platform":"<platform_e.g._MAC_or_ANDROID>"
}
],
"configuration":
{
"cleanUpCycle":2000,
"timeout":30000,
"proxy": "org.openqa.grid.selenium.proxy.DefaultRemoteProxy",
"url":"http://<host_name_appium_server_or_ip-address_appium_server>:<appium_port>/wd/hub",
"maxSession": 1,
"register": true,
"registerCycle": 5000,
"hubPort": <grid_port>,
"hubHost": "<Grid_host_name_or_grid_ip-address>"
}
}
可以在 <a href="http://selenium.googlecode.com/git/docs/api/java/org/openqa/selenium/Platform.html">這裡</a>檢視有效的 platform 引數。
如果沒有給出url、host和 port,配置會自動指向本地:whatever-port-Appium-started-on。
如果你的Appium服務和Selenium Grid服務沒有執行在同一臺機器上,為確保Selenium Grid連線正常,請在你的host & url docs上使用外部其它名稱或IP地址,而非localhost 和 127.0.0.1
2.2 自動化混合應用
自動化混合應用
Appium 其中一個理念就是你不能為了測試應用而修改應用。為了符合這個方法學,我們可以使用 Selenium 測試傳統 web 應用的方法來測試混合 web 應用 (比如,iOS 應用裡的元素 "UIWebView" ),這是有可能的。這裡會有一些技術性的複雜,Appium 需要知道你是想測試原生部分呢還是web部分。幸運的是,我們還能遵守 WebDriver 的協議。
混合 iOS 應用
混合 Android 應用
自動化混合 iOS 應用
在你的 Appium 測試裡,你需要以下幾步來和 web 頁面交涉:
前往到應用裡 web 檢視啟用的部分。
呼叫 GET session/:sessionId/window_handles
這會返回一個我們能訪問的 web 檢視的 id 的列表。
使用你想訪問的這個 web 檢視的 id 作為引數,呼叫 POST session/:sessionId/window
(這會將你的 Appium session 放入一個模式, 在這個模式下,所有的命令都會被解釋成自動化web檢視而不是原生的部分。比如,當你執行 getElementByTagName,它會在 web 檢視的 DOM 上操作,而不是返回 UIAElements。當然,一個 Webdriver 的方法只能在一個上下文中有意義,所以如果在錯誤的上下文,你會收到錯誤資訊。)
如果你想停止 web 檢視的自動化,回到原生部分,你可以簡單地使用 execute_script 呼叫 "mobile: leaveWebView" 方法來離開 web 層。
在 iOS 真機上執行
appium 使用一個遠端偵錯程式建立連線來實現和 web 檢視的互動。當在模擬器上執行下面例子的時候,我們可以直接建立連線,因為模擬器和 appium 伺服器在同一臺機器上。
當在真機上執行用例時,appium 無法直接訪問 web 檢視,所以我們需要通過 USB 線纜來建立連線。我們使用 ios-webkit-debugger-proxy建立連線。
使用 brew 安裝最新的 ios-webkit-debug-proxy。在終端執行一下命令:
# 如果你沒有安裝 brew 的話,先安裝 brew。
> ruby -e "$(curl -fsSL https://raw.github.com/mxcl/homebrew/go/install)"
> brew update
> brew install ios-webkit-debug-proxy
你也可以通過 git 克隆專案來自己安裝最新版本:
# Please be aware that this will install the proxy with the latest code (and not a tagged version).
> git clone https://github.com/google/ios-webkit-debug-proxy.git
> cd ios-webkit-debug-proxy
> ./autogen.sh
> ./configure
> make
> sudo make install
一旦安裝好了, 你就可以啟動代理:
# 將udid替換成你的裝置的udid。確保埠 27753 沒有被佔用
# remote-debugger 將會使用這個埠。
> ios_webkit_debug_proxy -c 0e4b2f612b65e98c1d07d22ee08678130d345429:27753 -d
<b>注意:</b> 這個 ios-webkit-debug-proxy 需要 <b>"web inspector"</b> 開啟著以便建立連線。在 <b> settings > safari > advanced </b> 裡開啟它。請注意 web inspector <b>在 iOS6 時候加入的</b> 以前的版本沒有。
Wd.js Code example
// 假設我們已經有一個初始化好了的 `driver` 物件。
driver.elementByName('Web, Use of UIWebView', function(err, el) { // 找到按鈕,開啟 web 檢視
el.click(function(err) { // 引導到 UIWebView
driver.windowHandles(function(err, handles) { // 得到能訪問的檢視列表。
driver.window(handles[0], function(err) { // 因為只有一個,所以選擇第一個。
driver.elementsByCss('.some-class', function(err, els) { // 通過 css 拿到元素。
els.length.should.be.above(0); // 肯定有元素。
els[0].text(function(elText) { // 得到第一個元素的文字。
elText.should.eql("My very own text"); // 比較匹配文字。
driver.execute("mobile: leaveWebView", function(err) { // 離開web檢視上下文。
// 如果你想的話,做一些原生應用的操作。
driver.quit(); // 退出。
});
});
});
});
});
});
});
想看到具體的上下文,請看該node 的例子
*我們正在完善 web 檢視下面的方法。加入我們!
Wd.java 程式碼例子
//配置 webdriver 並啟動 webview 應用。
DesiredCapabilities desiredCapabilities = new DesiredCapabilities();
desiredCapabilities.setCapability("device", "iPhone Simulator");
desiredCapabilities.setCapability("app", "http://appium.s3.amazonaws.com/WebViewApp6.0.app.zip");
URL url = new URL("http://127.0.0.1:4723/wd/hub");
RemoteWebDriver remoteWebDriver = new RemoteWebDriver(url, desiredCapabilities);
// 切換到最新的web檢視
for(String winHandle : remoteWebDriver.getWindowHandles()){
remoteWebDriver.switchTo().window(winHandle);
}
//在 guinea-pig 頁面用 id 和 元素互動。
WebElement div = remoteWebDriver.findElement(By.id("i_am_an_id"));
Assert.assertEquals("I am a div", div.getText()); //驗證得到的文字是否正確。
remoteWebDriver.findElement(By.id("comments")).sendKeys("My comment"); //填寫評論。
//離開 webview,回到原生應用。
remoteWebDriver.executeScript("mobile: leaveWebView");
//關閉應用。
remoteWebDriver.quit();
Wd.rb cucumber 的例子
TEST_NAME = "Example Ruby Test"
SERVER_URL = "http://127.0.0.1:4723/wd/hub"
APP_PATH = "https://dl.dropboxusercontent.com/s/123456789101112/ts_ios.zip"
capabilities =
{
'browserName' => 'iOS 6.0',
'platform' => 'Mac 10.8',
'device' => 'iPhone Simulator',
'app' => APP_PATH,
'name' => TEST_NAME
}
@driver = Selenium::WebDriver.for(:remote, :desired_capabilities => capabilities, :url => SERVER_URL)
## 這裡切換到最近一個視窗是因為在我們的例子裡這個視窗一直是 webview。其他的用例裡,你需要自己指定。
## 執行 @driver.window_handles,檢視 appium 的日誌,找出到底哪個視窗是你要的,然後找出相關的數字。
## 然後用 @driver.switch_to_window(number),切換過去。
Given(/^I switch to webview$/) do
webview = @driver.window_handles.last
@driver.switch_to.window(webview)
end
Given(/^I switch out of webview$/) do
@driver.execute_script("mobile: leaveWebView")
end
# 你可以使用 CSS 選擇器在你的 webview 裡來選擇元素
And(/^I click a webview button $/) do
@driver.find_element(:css, ".green_button").click
end
用 ruby 除錯 web 檢視:
我在我的幫助類裡建立了一個快速方法來定位web元素,無論它在哪一個視窗檢視。
(這非常有幫助,特別是你的 webview 的 id 變化或者你用同一份程式碼來測試 Android 和 iOS。)
https://gist.github.com/feelobot/7309729
自動化混合 Android 應用
Appium 通過 Chromedriver 內建混合應用支援。Appium 也可以使用 Selendroid 做為 4.4 之前的裝置對 webview 支援的背部引擎。(你需要在 desired capability 裡指定 "device": "selendroid")。然後:
前往你應用裡 web 檢視啟用的部分。
用 "WEBVIEW" 做視窗控制代碼呼叫 POST session/:sessionId/window , 比如 driver.window("WEBVIEW")。
(這會將你的 Appium session 放入一個模式, 在這個模式下,所有的命令都會被解釋成自動化web檢視而不是原生的部分。比如,當你執行 getElementByTagName,它會在 web 檢視的 DOM 上操作,而不是返回 UIAElements。當然,一個 Webdriver 的方法只能在一個上下文中有意義,所以如果在錯誤的上下文,你會收到錯誤資訊。)
如果要停止web上下文裡的自動化,回到原生部分的自動化,簡單地使用 "NATIVE_APP" 呼叫 window 方法。比如 driver.window("NATIVE_APP")。
注意:我們可以像上面說的,使用同樣的策略。然而,Selendroid 使用 WEBVIEW/NATIVE_APP 視窗設定策略。 Appium 常規的混合支援也使用這種策略。
Wd.js 程式碼例子
// 假設我們已經初始化了一個 `driver` 例項。
driver.window("WEBVIEW", function(err) { // 選擇唯一的 WebView
driver.elementsByCss('.some-class', function(err, els) { // 通過 CSS 取得元素
els.length.should.be.above(0); // 驗證元素存在
els[0].text(function(elText) { // 得到第一個元素的文字
elText.should.eql("My very own text"); // 驗證文字內容
driver.window("NATIVE_APP", function(err) { // 離開 webview 上下文
// 可以做些原生應用的測試
driver.quit(); // 關閉 webdriver
});
});
});
});
Wd.java 程式碼例子
//配置 webdriver 並啟動 webview 應用。
DesiredCapabilities desiredCapabilities = new DesiredCapabilities();
desiredCapabilities.setCapability("device", "Selendroid");
desiredCapabilities.setCapability("app", "/path/to/some.apk");
URL url = new URL("http://127.0.0.1:4723/wd/hub");
RemoteWebDriver remoteWebDriver = new RemoteWebDriver(url, desiredCapabilities);
// 切換到最新的web檢視
remoteWebDriver.switchTo().window("WEBVIEW");
//在 guinea-pig 頁面用 id 和 元素互動。
WebElement div = remoteWebDriver.findElement(By.id("i_am_an_id"));
Assert.assertEquals("I am a div", div.getText()); //驗證得到的文字是否正確。
remoteWebDriver.findElement(By.id("comments")).sendKeys("My comment"); //填寫評論。
//離開 webview,回到原生應用。
remoteWebDriver.switchTo().window("NATIVE_APP");
//關閉應用。
remoteWebDriver.quit();
2.3 用例遷移
把appium 0.18.x上的測試用例集遷移到appium1.x上
Appium 1.0 已經從先前的版本中移除了一部分過時的特性, 這個指導文件會幫助你瞭解使用Appium 1.0需要做的具體改變.
新的客戶端庫
你需要關注的最大的改變是利用新的appium的client libraries來替換原生的WebDriver ciients. 訪問Appium client list 去尋找符合你自己程式語言的客戶端庫吧. 在每個客戶端的網站上都可以找到用於整合到你程式碼中的依賴庫相關介紹和下載
基本上, 你需要做如下的改變(以Python作為例子)
用
from appium import webdriver
替換原來的:
from selenium import webdriver
新的適配引數
下面的適配引數將不再使用
* device
* version
取而代之的是利用下面的配置引數
platformName ("iOS" 或者 "Android")
platformVersion (你希望測試的os版本)
deviceName (你想用的裝置, 比如 "iPhone Simulator")
automationName ("Selendroid" 如果你想使用Selendroid的話, 否則可以省略)
app 配置引數保持不變, 但是特指非瀏覽器的app, 如果你想使用類似Safari或者Chrome這樣的瀏覽器, 你需要設定browserName. 這代表app和browserName是互斥的.
我們把appium的配置引數都規範為駝峰拼寫法(camelCase), 這代表著原來的app-package或者app-wait-activity現在會變成appPackage和appWaitActivity. 當然目前android的app package和activity都已經是自動探測了, 大部分情況下你可以省略這兩個配置項.
新的定位方式
我們已經移除了下面的定位方式
name
tag name
我們增加了accessibility_id定位方法去做過去name做的事情. 具體的細節還得跟你使用的Appium客戶端庫有關.
tag name已經被替換為class name. 所以想通過UI的型別來定位某個元素, 你需要使用class name定位方式
關於class name和xpath的定位方式: 現在需要使用完整的全類名, 這意味著如果你有一個如下的定位用的xpath
//table/cell/button
現在需要改成
//UIATableView/UIATableCell/UIAButton
如果是android的話, button需要改變成android.widget.Button
我們也增加了如下的定位方式
-ios uiautomation
-android uiautomator
根據你使用的客戶端去相應的使用新的定位方式
使用xml, 不再是json了
App source方法先前返回JSON, 現在修改成返回XML. 所以如果你有程式碼是依賴解析app source的, 那麼就需要更新
通過context支援混合應用, 不再是window了
以前混合app的切換支援是通過"windows"
window_handles
window
switch_to.window
現在Appium支援"context" 概念了, 要獲得當前環境下所有的上下文(contexts), 或者特定的context, 你可以用
driver.contexts
current = driver.context
在這些context之間切換, 可以使用
driver.switch_to.context("WEBVIEW")
沒有了execute_script("mobile: xxx")
所有的mobile:方法都已經被移除, 並且被替換為appium client libraries的原生方法. 這意味著如果一個方法呼叫原來的方式是
driver.execute("mobile: lock", [5])
現在需要更新為
driver.lock(5)
在這個地方lock已經變成了原生的客戶端方法. 當然具體的呼叫細節在不同的客戶端庫中的實現可能會有所差別.
特別需要注意的是, 手勢(gesture)方法已經被替換為TouchAction / MultiAction API, 它允許更強大通用的組合手勢的自動化. 可以參考你的客戶端庫的具體用法.
這就是全部啦, 祝遷移愉快
(文件由testerhome.com翻譯, 歡迎更多熱愛技術的同學加入到翻譯中來, We Love Appium)
2.4 appium設定
Settings
Settings 是 Appium 引入的一個新的概念。 它目前還沒有被納入 Mobile JSON Wire Protocol 及 Webdriver 標準之中。
Settings 是一種用來配置 Appium 伺服器的方式。
Settings 有以下特點:
- 可變的,它在同一會話中是可以被修改的。
- 唯一的,它在被測應用會話中是唯一的。 它在每建立一個新會話時會被重置。
- 可控的,它在自動化測試過程中控制著 Appium 伺服器的執行。 它們不會被用來控制被測應用或被測終端。
在 Android 環境中 以 ignoreUnimportantViews 設定舉例,該引數在 Android 環境中可以被設定成忽略所有與當前檢視無關的元素,它將使測試過程更加有效率。 然而當我們希望能夠訪問被忽略的元素時,我們必須在將 ignoreUnimportantViews 設定成 true 後,重新修改成 false 。
另外也可以通過 Settings 配置讓 Appium 忽略所有當前不可見的元素。
Settings 可以通過以下 API 方法進行配置:
POST /session/:sessionId/appium/settings
以 JSON 格式提交 key:value 鍵值對形式的Settings配置。
{
settings: {
ignoreUnimportantViews : true
}
}
GET /session/:sessionId/appium/settings
以 JSON 格式返回當前所有 Settings 配置。
{
ignoreUnimportantViews : true
}
其它 Settings 配置參考
"ignoreUnimportantViews" -該引數值為 true 或 false。 如果你希望能夠儘量減少測試過程的互動確認過程,或希望測試指令碼能更快的執行,可以在 Android 終端環境下使用 setCompressedLayoutHeirarchy() 引數。它將忽略所有被標記為 IMPORTANT_FOR_ACCESSIBILITY_NO 或 IMPORTANT_FOR_ACCESSIBILITY_AUTO(以及那些被認為不是很重要的系統元素)的元素。
第三章:appium 設定
3.1 加速器管理
Intel® 硬體加速器管理
如果你發現android模擬器太慢, 並且你的系統執行在Intel® 的cpu上. 那麼你可以嘗試下HAXM, HAXM能夠讓你充分利用硬體虛擬化技術來加速android模擬器。
要安裝HAXM, 你可以開啟Android SDK Manager, 你可以在Extras中發現這個安裝選項;
你可以在Intel官方網站找到所有相關的文件;
這將需要x86的模擬映象;
利用Intel的包來安裝HAXM; Android SDK Manager有時候會安裝不成功,這主要取決於你安裝的版本是否相容。
3.2 android 設定
Android Setup
使用前,你需要安裝node.js(版本大於等於0.10)。 請參照 instructions for your flavor of linux。
當node.js安裝成功後,請安裝 Android SDK。
執行'android' tool(位於SDK,tool檔案目錄下)。
執行'android' tool 來安裝大於等於Level 17的API。
(如果你想從Appium的原始碼來執行,可在真機或者模擬器上用 Apache Ant 來編譯bootstrap jar包)。
最後,將環境變數$ANDROID_HOME設定為 Android SDK 的路徑。例如,如果你將Android SDK 解壓到 /usr/local/adt/,你需要把這個路徑加到你的shell環境變數中去:
export ANDROID_HOME="/usr/local/adt/sdk"
現在就可以啟動Appium了!如果你在原始碼中執行Appium請執行
./reset.sh --android 版本從Appium checkout會安裝所有的依賴。
老版本的額外安裝
當android的版本是2.3到4.1的時候,appium用的是selendroid。 當它檢測到時低版本時,它會自動應用Selendroid。但是需要配置一些額外的設定如果從source執行。
已經安裝 Maven 3.1.1 或更新 (mvn)
執行 ./reset.sh --selendroid 從checkout的Appium原始碼
(執行Appium Android 測試)
在Linux上執行,啟動一個API大於等於level17的AVD。 在原始檔目錄下執行 (appium) 在安裝好 NPM, 或者 node。如果你選擇的是從原始碼方式執行。
參照 server documentation 來了解所有命令和引數。
注意
Android 加速模擬器需要存在,它有自己的侷限性,如果想了解更多,請看這裡 page。
如果你想執行任何Appium的測試,或者任何強大的命令,確保你的 hw.battery=yes 在 AVD's config.ini檔案中。
Selendroid 需要你APP中的如下許可權: <uses-permission android:name="android.**permission.INTERNET"/>, 如果你在使用selendroid或者低版本的android(如版本2.3到4.1),請確保你的App已設定internet許可權。
3.3 部署iOS app 到手機上
部署iOS app 到手機上
準備在真機上執行appium測試, 需要如下準備:
用特殊的裝置引數來構建app
使用 fruitstrap, 這是一個第三方程式,可以用來部署你構建的app到手機上
Xcodebuild 命令的引數:
新的引數執行指定設定. 參考 developer.apple.com:
xcodebuild [-project projectname] [-target targetname ...]
[-configuration configurationname] [-sdk [sdkfullpath | sdkname]]
[buildaction ...] [setting=value ...] [-userdefault=value ...]
這有一個資料來參考可用的設定
CODE_SIGN_IDENTITY (Code Signing Identity)
介紹: 識別符號,指定一個簽名。
例如: iPhone Developer
PROVISIONING_PROFILE 已經從可用的的命令中消失了,但還是有必要設定的。
在xcodebuild命令中設定 "CODE_SIGN_IDENTITY" & "PROVISIONING_PROFILE":
xcodebuild -sdk <iphoneos> -target <target_name> -configuration <Debug> CODE_SIGN_IDENTITY="iPhone Developer: Mister Smith" PROVISIONING_PROFILE="XXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX"
成功的話, app會構建到如下目錄 <app_dir>/build/<configuration>-iphoneos/<app_name>.app
用Fruitstrap進行部署
clone一個fruitstrap的fork版本在ghughes version ,這個已經不再維護. 已確認該fork可用unprompted fork, 但是其它的據說也可用。
clone成功的話, 執行 make fruitstrap
然後, 然後複製生成的 fruitstrap到app的所在的目錄或上級目錄下。
執行fruitstrap 通過輸入以下命令 (命令是否可用依賴於你fork的 fruitstrap):
./fruitstrap -d -b <PATH_TO_APP> -i <Device_UDID>
如果是為了持續整合,你可以發現很有用的方法來記錄fruitstrap命令列和日誌檔案中的記錄, 像這樣:
./fruitstrap -d -b <PATH_TO_APP> -i <Device_UDID> 2>&1 | tee fruit.out
在node服務啟動前fruitstrap進行需要被結束, 一個方法是掃描fruitstrap的輸出來得知app完成啟動。 有一個有效的方法是通過一個Rakefile 和一個 go_device.sh 指令碼:
bundle exec rake ci:fruit_deploy_app | while read line ; do
echo "$line" | grep "text to identify successful launch"
if [ $? = 0 ]
then
# Actions
echo "App finished launching: $line"
sleep 5
kill -9 `ps -aef | grep fruitstrap | grep -v grep | awk '{print $2}'`
fi
done
一旦fruitstrap的程序被結束, node 服務就可以啟動並且appium測試可以被執行!
下一步:
在真機上執行appium
3.4 Android併發測試
Android併發測試
Appium提供了在一臺裝置上啟動多個Android會話的方案,而這個方案需要你輸入不同的指令來啟動多個Appium服務來實現。
啟動多個Android會話的重要指令包括:
-p Appium的主要埠
-U 裝置id
-bp Appium bootstrap埠
--chromedriver-port chromedriver埠(當使用了webviews或者chrome)
--selendroid-port selendroid埠(當使用了selendroid)
更多引數的解釋詳見 here。
如果我們有兩臺裝置,裝置ID分別為43364和32456,我們應該用下面的命令啟動來兩個不同的Appium服務:
node . -p 4492 -bp 2251 -U 32456
node . -p 4491 -bp 2252 -U 43364
只要你的Appium和Appium bootstrap埠介於0和65536即可,並且保證是兩個不同的埠以便兩個Appium服務不會監聽相同的埠。確認你的-u引數繫結正確的裝置ID。這可以讓Appium知道連線哪臺裝置,所以引數一定要準確。
如果你用了chromedriver或selendroid,不同的服務要設定不同的埠。
iOS併發測試
不幸的是,IOS不能進行本地併發測試。跟Android不一樣,IOS在同一時間只能啟動一個版本的模擬器來執行多個測試。
如果你想在IOS上進行併發測試,你需要用到Sauce。只需上傳你的Appium測試指令碼到Sauce,它就可以按照你的設定執行多個IOS或Android的併發測試。在Sauce上執行測試的更多資訊,詳見here。
3.5 Appium支援的平臺
Appium支援的平臺
Appium支援很多的執行平臺和測試方式(包括原生、混合應用、內嵌瀏覽器、真機、模擬器等)。這篇文件主要用來讓大家明確在使用
Appimu的時候支援的平臺版本和上述測試方式的必備條件。
iOS平臺支援
請移步到Running on OS X: iOS 。這裡介紹了在iOS系統下使用Appium的必備條件和安裝說明。
版本號:6.1,7.0,以及7.1。
支援裝置:iPhone模擬器,iPad模擬器以及iPhones和iPads真機。
是否支援原生應用:支援。同時支援模擬器中除錯應用版本和正確簽名的真機ipa。其他相關支援由蘋果的UIAutomation框架提供。
是否支援內建移動瀏覽器:支援。Safari瀏覽器已經通過測試。對於真機,則需要安裝除錯工具ios-webkit-remote-debugger。很遺憾,對於Safari的原生介面的自動化是不支援的。更多資訊請移步至mobile web doc 。
是否支援混合應用:支援。同樣對於真機需要安裝除錯工具ios-webkit-remote-debugger,更多詳情請移步至hybrid doc 檢視詳情。
是否支援在同一個session中執行多個應用的自動化:不支援。
是否支援同時再多個裝置上執行自動化:不支援。
是否支援第三方提供應用:只支援在模擬器上有限的第三方應用(例如:喜好設定、地圖等)。
是否支援自定義的、非標準UI控制元件的自動化:僅支援很少一部分。最好對控制元件新增可識別資訊,以方便對元素進行一些基礎的自動化操作。
Android平臺支援
請移步至 Running on OS X: Android,Running on Windows,或者Running on Linux 獲得在不同作業系統下android平臺對appium的支援和安裝配置文件。
支援版本:android 2.3平臺及以上。
android 4.2平臺及以上通過Appium自有的UiAutomator類庫支援。預設在自動化後臺。
從android 2.3到4.3平臺,Appium是通過繫結Selendroid,實現自動化測試的,你可以到android開發社群的Instrumentation。(儀表盤)中檢視相關介紹。Selendroid擁有一套不同的命令列和不同的profile檔案(這部分差距正在逐步縮小)。要獲得在後臺執行自動化的許可權,需要配置automationName 元件的值為 Selendroid。
支援的裝置:Android模擬器和Android真機。
是否支援原生應用:支援。
是否支援內建移動瀏覽器:支援(除了使用Selendroid後臺執行的情況)。通過代理方式繫結到Chromedriver來執行自動化測試。在android4.2和4.3版本中,只有在官方版本的谷歌瀏覽器或者Chromium下才能執行自動化測試。伴隨著android 4.4+版本的出現。自動化測試則可以執行在內建瀏覽器的應用程式。但是需要在測試裝置環境下安裝Chrome/Chromium/瀏覽器。請移步至mobile web doc 獲取更多詳情。
是否支援混合應用: 支援。請移步至hybrid doc參考相關文件。
通過預設的Appium的後臺支援android 4.4以上的版本。
通過Selendroid的後臺支援android 2.3以上的版本。
是否支援在同一個session中執行多個應用的自動化:支援(但是不支援使用Selendroid後臺的場景)。
是否支援同時再多個裝置上執行自動化:支援,。儘管Appium必須要啟動另一個埠即通過新增引數的方式執行命令列,例如--port,--bootstrap-port(或者--selendroid-port)或者--chromedriver-port。更多詳情請移步至server args doc。
是否支援第三方應用自動化:支援(但是不支援Selendroid後臺執行的場景)。
是否支援自定義的、非標準UI控制元件的自動化:不支援。
3.6 Appium在真機上
Appium在真機上
Appium已經初步支援真機測試。
如果要在真機上執行測試,你將要做如下準備:
1.一個蘋果的開發者ID和有效的開發者對應的配置檔案和簽名檔案
2.一臺iPad或者iPhone
你要測試的應用的原始碼
一臺安裝了XCode和XCode Command Line Developer Tools的Mac機器
Provisioning Profile
要在真機上測試就需要一個有效的iOS開發者的Distribution Certificate and Provisioning Profile。你可以在這個上面找到配置這些的相關資訊Apple documentation
同樣的,你還需要對你的應用簽名,更多的資訊可以檢視sign your app.
你必須使用Xcode的執行按鈕來安裝你的應用
使用Appium執行你的測試
一旦你的裝置和應用設定好了之後,你就能夠用如下的命令在你的機器上執行測試:
node . -U <UDID> --app <bundle_id>
這將會啟動Appium並且開始在真機上測試應用。
疑問解答思路
確認UDID已經正確的在xcode organizar或itunes中設定了。很長的字串(20多個字串) 0.確認你測試程式碼中的測試物件裝置的設定
再次確認你從instruments啟動你的自動化測試
確認instruments已經關閉
3.7 在 Linux 上執行 Appium
在 Linux 上執行 Appium
限制
如果你在 Linux 上使用 Appium, 那麼你沒法使用已經構建好的 '.app',那是為 OS X 準備的。 另外由於 Appium 在測試 iOS 應用時 依賴 OS X 特有的庫, 所以你也沒有辦法測試在 Linux 上測試 iOS 應用。
配置
首先,安裝版本高於或等於 0.8 的 nodejs。可以根據 instructions for your flavor of linux 進行安裝。
安裝好了 node.js 之後,安裝 Android SDK。 你會需要執行 android adb 等工具,這些工具都在 SDK 裡包含了, 你要做的是配置環境變數。當然你要確保你的 API level 大於等於 17。 你也需要使用 Ant 來構建 bootstrap jar 以便 Appium 使用它來測試 Android 應用。
最後, 設定 $ANDROID_HOME 為你的 Android SDK 的路徑。比如, 你將 Android SDK 解壓在 /usr/local/adt/, 那你就要將如下新增到你的 .bashrc 或 .zshrc 或 .bash_profile 等 shell 配置檔案中去:
export ANDROID_HOME="/usr/local/adt/sdk
現在你可以執行 Appium 了, 在你 checkout 出來的 Appium 目錄裡, 執行 .reset.sh --android, 它會幫助你安裝好所有的依賴。
執行 Appium
執行測試前, 你需要啟動一個 API Level 大於等於 17 的 Android 模擬器或者連線一個系統是 4.1 以上的 Android 真機。然後在 Appium 目錄執行
node .
你可以在 server documentation 找到所有的命令列引數。
備註
There exists a hardware accelerated emulator for android, it has it's own limitations. For more information you can check out this Android 有一些硬體加速的模擬器,這些模擬器有自己的限制。你可以在 page 找到更多的資訊。
確保你使用的 AVD 裡面的 config.ini 有這條指令 hw.battery=yes。
3.8 在 Mac OS X 上使用 Appium
在 Mac OS X 上使用 Appium
在 OS X 上, Appium 支援 iOS 和 Android 測試
系統配置 (iOS)
Appium 需要 Mac OS X 10.7, 推薦 10.8。 (經過測試, 10.9 也能工作。)
確保 Xcode 和 iOS SDK 都已經安裝好了。 (當前 Appium 支援 Xcode 4.6.3/iOS 6.1 和 Xcode 5/iOS 7.0。 注意不推薦在基於 Xcode 5 下且低於 7.0 的 iOS 版本進行測試。 參照下篇可以獲取更多資訊)
你需要授權 iOS 模擬器的使用。如果你是通過 NPM 安裝的 Appium,那麼你可以執行 sudo authorize_ios (authorize_ios)是來自 Appium npm 包裡的一個二進位制執行檔案。如果你是從原始碼執行 Appium,那麼你可以簡單的使用 sudo grunt authorize。如果你使用Appium.app, 那你只要用介面來操作。
如果你使用的是Xcode 6,在啟動Appium之前,你需要開啟模擬器,並且在你需要進行輸入文字的操作之前,必須先將輸入法提前調出。你可以通過點選輸入區域或通過快捷鍵command-K來將軟鍵盤喚出。
Xcode 6中,有一個Devices的模組(command-shift-2可喚出)。你必須確保Appium 的capabilities引數中,所使用到的deviceName要存在於Devices裡。換句話說,如果capabilities中的deviceName為"iPhone 5s",platformVersion為"8.0",那麼你必須確保Devices中要存在那麼一個裝置是"iOS8系統的iPhone5s",否則Appium將不知道使用哪一個裝置進行測試。
在iOS8設定中的開發者選項裡面,你可以開啟或關閉UIAutomation。如果你的是iOS8裝置,請在執行Appium之前,確保UIAutomation是開啟狀態的。
使用多種 iOS SDK 進行測試
Appium 使用蘋果提供的 instruments 來啟動 iOS 模擬器,預設它會使用當前安裝的 Xcode 和該 Xcode 下安裝好的最高版本的 iOS SDK。這就意味著如果你想測試 iOS 6.1, 但是你安裝了 iOS 7.0, 那麼 Appium 會強制使用 7.0 的模擬器。 唯一的方法就是安裝多個Xcode,然後在安裝不同的 SDK。然後在啟動 Appium 前,切換到你要測試的特定的版本。
另外,我們發現 Xcode 5 上的 iOS 6.1 測試,會很慢而且不穩定。所以我們推薦,如果要在 6.1 及 6.1 以下版本的 iOS 上進行測試,請使用 Xcode 4.6.3。如果要在 iOS 7.0 上測試,請使用 Xcode 5。假設我們的 Xcode 5 在 /Applications/Xcode.app, Xcode 4.6 在 /Applications/Xcode-4.6.app,我們就可以用下面的命令來切換到 Xcode 4.6 來為 iOS 6.1 測試做準備。
sudo xcode-select -switch /Applications/Xcode-4.6.app/Contents/Developer/
如果要回到 Xcode 5 的話,我們再執行一次:
sudo xcode-select -switch /Applications/Xcode.app/Contents/Developer/
系統配置 (Android)
在Mac OSX 上執行Android專案所需要的配置,與Linux的配置方法是一致的,請參考 Android setup docs。
3.9 在Windows上執行Appium
在Windows上執行Appium
侷限性
如果你在windows上安裝appium,你沒法使用預編譯專用於OS X的.app檔案,你也將不能測試IOS apps,因為appium依賴OS X專用的庫來支援IOS測試。這意味著你只能通過在mac上來執行IOS的app測試。這點限制挺大。
開始安裝
安裝nodejs 0.8版本及以上, 通過官方的安裝程式來安裝。
安裝android的sdk包,(http://developer.android.com/sdk/index.html), 執行依賴sdk中的'android'工具。並確保你安裝了Level17或以上的版本api。設定ANDROID_HOME系統變數為你的Android SDK路徑,並把tools platform-tools兩個目錄加入到系統的Path路徑裡。因為這裡麵包含有一些執行命令
安裝java的JDK,並設定JAVA_HOME 變數為你的JDK目錄。
安裝Apache Ant
或者直接使用Android Windows SDK自帶的ant,地址在eclipse\plugins目錄,你需要把這個目錄加到你的系統PATH變數中
安裝Apache Maven. 並且設定M2HOME和M2環境變數,把M2環境變數新增到你的系統PATH變數中。
安裝Git. 確保你安裝了windows下的Git,以便可以執行常用的command命令
現在,你已經下載安裝了所有的依賴,開始執行
reset.bat
執行Appium
要在windows上執行測試用例,你需要先啟動Android模擬器或者連線上一個API Level17以上的android真機。然後在命令列執行appium。
如果你是使用原始碼執行Appium的,請在你所安裝的appium目錄下執行node.js命令:
node .
備註
在windows系統下執行appium.app時,需要使用管理員許可權;當你通過原始碼的形式執行Appium時,也需要使用管理員許可權啟動CMD。
在windows系統下執行Android專案時,啟動Appium時請帶上--no-reset或--full-reset命令。
有一個硬體加速模擬器用於android,但是它有自己的一些限制,如果你想了解更多,請參考頁面
確保在你的AVD的config.ini中有一個配置項為hw.battery=yes
最簡略的安裝方式
出於對官方文件的尊重,我按照原文翻譯,如下介紹我的安裝心得。官方提到的一些工具,其實並不需要安裝。
下面介紹我已經測試過的安裝和使用過程
安裝appium
安裝nodejs
使用npm安裝appium,npm install -g appium
執行appium
啟動appium,直接執行appium 即可。
更新appium
通過npm install -g appium 來更新appium即可
如果有任何疑問,歡迎到testerhome.com來交流
3.10 Appium 故障排除
Appium 故障排除
當你遇到問題時,請不要急著將問題提交到Github,也不用急著發到appium-discuss discussion group,也許你可以在本文中找到答案。
常見問題解決辦法
確保你的每一個步驟都是遵循 入門指南 來做的。
確保你的系統配置正確。(例如:Xcode是否升級到了最新版本,Android SDK是否有設定到環境變數ANDROID_HOME中去。)
確保你的應用存放路徑沒有錯誤。
Appium.app執行出現問題的解決辦法
升級Appium.app後重新開啟即可解決。如果提示你不能升級,則需要重新下載Appium.app,下載地址:appium.io
通過原始碼啟用Appium出現問題的解決辦法
使用git pull拉取最新原始碼,確保執行的程式碼是當前最新版本。
針對你所自動化的平臺,執行reset.sh命令:
命令 說明
./reset.sh # all
./reset.sh --ios # ios-only
./reset.sh --android # android-only
./reset.sh --selendroid # selendroid-only
當你需要下載以及構建測試應用時,執行reset.sh時你需要用到--dev指令。
你也可以使用appium-doctor來自動檢測你的環境依賴都是否正常。如果你是使用原始碼執行,則需要使用到bin/appium-doctor.js或node bin/appium-doctor.js。
當你將Android SDK升級到22後,可能出現如下錯誤: {ANDROID_HOME}/tools/ant/uibuild.xml:155: SDK does not have any Build Tools installed. 這是因為在Android SDK 22中,platform 和 build 工具被分拆到他們各自的SDK管理包中去了。你需要確保你的機器上正確安裝了build-tools 和 platform-tools。
Android常見問題解決辦法
確保 Android 模擬器啟動並執行著。
出現裝置連線問題時,執行adb kill-server && adb devices是非常有效的。它能夠幫助重置和連線Android裝置。
請確保環境變數 ANDROID_HOME 指向的是正確的Android SDK的路徑。
IOS常見問題解決方案
確保Instruments.app是關閉的。
如果你是使用模擬器執行的,請不要將真機裝置連線電腦。
確保模擬器或真機中,設定裡面的accessibility輔助功能是關閉狀態的。
確保App是編譯在當前執行的模擬器上。
確保App是編譯在合適的模擬器(或真機)上,不然會出現posix spawn的報錯。(比如:執行在debug模式下的模擬器)
如果你曾經用 sudo 執行過 Appium, 你需要先刪除/tmp/instruments_sock, 執行sudo rm /tmp/instruments_sock。然後在不適用SUDO的情況下再次啟動Appium即可。
第一次執行Appium時,需要對Instruments進行授權。不然的話會經常彈出對話方塊要求你輸入密碼。如果你從原始碼執行 Appium,你只需在主分支上執行sudo grunt authorize來回避該彈窗。如果用 npm 安裝的話,執行 sudo authorize_ios 即可。注意,當你每次安裝了新版本的xcode,你都需要重複以上操作。
如果檢查路徑正確,但仍然報 iOS Simulator failed to install the application.的錯誤的時候,請嘗試重啟你的電腦。
Webview/Hybrid/Safari 應用支援
確保真機上的'Web Inspector'為開啟狀態。
確保打開了Safari的開發模式。(Safari - Advance Preferences- Developer menu for simulators)
確保由client library提供的Appium命令-context能夠正常得對contexts進行切換。
當你嘗試開啟代理的時候,出現如下錯誤:select_port() failed,請參考discussion
FirefoxOS常見問題解決辦法
確保 Boot-to-Gecko 模擬器啟動並執行著。
確保模擬器的螢幕是亮著並無鎖屏的(可能需要重啟 B2G).
到社群尋求幫助
若通過上述方法你的問題依然沒有得到解決,你可以:
如果你的 Appium 無法正常工作,然後錯誤資訊不夠清晰,歡迎加入 discussion group中發表你的問題,你的問題需要包括以下內容:
你是如何執行Appium的?(Appium.app, npm, source)
你使用的是什麼作業系統?
你使用的是什麼裝置?版本是什麼? (i.e. Android 4.4, or iOS 7.1)
你使用的是真機還是模擬器?
給出你得到的客戶端和服務端的出錯日誌 (比如,"我的Python程式碼中報瞭如下錯誤:balabala,在Appium server中的輸出內容如連結中所示")
除了上述, 貼出 Appium 伺服器端的輸出也非常重要,特別是執行在 verbose 模式。這樣我們可以分析診斷問題在哪裡。
如果你確信你發現的是一個BUG,請到issue tracker中提交一個issue,並將BUG的內容描述清楚。
已知問題
如果你從 Node 官網安裝的 Node,那需要你使用 sudo 執行 npm。 但這麼做並不是非常理想。請嘗試從 n 獲取node 或執行brew install node來安裝 。
Webview通過代理可以支援iOS真機裝置,請參考discussion
有時候, iOS 的 UI 元素在定位到之後幾毫秒會突然變得無效。這會導致一個類似(null) cannot be tapped的錯誤。唯一的解決方法就是把finding-and-acting的程式碼放到 retry 塊裡。
如果你是通過MacPorts安裝了Node和Npm,你必須確保MacPorts的bin資料夾已經被新增到環境變數PATH中去,不然Appium會出現難以找到可執行node的情況。
特定的錯誤
Action Error Resolution
Running reset.sh xcodebuild: error: SDK "iphonesimulator6.1" cannot be located 安裝 iPhone 6.1 SDK 或者 使用單獨的 SDK 構建 待測應用 比如: grunt buildApp:UICatalog:iphonesimulator5.1
Running reset.sh Warning: Task "setGitRev" not found. Use --force to continue. 使用git submodule update --init更新模組並再次執行reset.sh
Running reset.sh [ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:2.3.2:compile (default-compile) on project selendroid-server: Compilation failure [ERROR] Failure executing javac, but could not parse the error: [ERROR] [ERROR] [ERROR] The system is out of resources. [ERROR] Consult the following stack trace for details. [ERROR] java.lang.StackOverflowError export MAVEN_OPTS="-Xms1024m -Xmx2048m -Xss2048k"
Running ios test [INST STDERR] posix spawn failure; aborting launch 你的應用沒有正確編譯在模擬器或真機上。
Running mobile safari test error: Could not prepare mobile safari with version '7.1' 你可能需要在此執行授權指令碼以保證使iOS SDK檔案為可寫狀態。 E.g., sudo authorize_ios
第四章:appium執行
4.1 從原始碼執行Appium
##從原始碼執行Appium
你想要從原始碼執行 Appium 並幫助修復 bug 和新增新的特性麼?很好! fork 這個專案,做一點更改,並且傳送一個請求吧!
另外,在工作之前請先看下我們的程式碼風格指南。請在傳送請求前,確保單元測試與功能測試都測試通過;
關於如何執行測試的更多資訊,請繼續閱讀!
首先確保你閱讀並遵循 README 中的安裝說明。
###從原始碼配置Appium
Appium 的安裝,包含在你的測試程式碼與裝置/模擬器之間來回傳送訊息的 Appium 服務端,和一個用任何存在且相容Appium的語言編寫的測試指令碼。
執行一個 Appium 伺服器例項,然後進行你的測試。
快速開始的方式:
$ git clone https://github.com/appium/appium.git
$ cd appium
$ ./reset.sh
$ sudo ./bin/authorize-ios.js # for ios only
$ node .
Appium 開發環境搭建
確保你安裝了 ant,maven,adb 並且將他們加入到了系統環境變數 PATH 中,與此同時你還需要安裝 android-16 sdk(Selendroid) 和android-19 sdk。
從你本地倉庫的命令列提示,使用下邊的命令安裝如下包(如果你沒有使用homebrew包管理器安裝 node,則你可能不得不使用 sudo 許可權執行npm):
npm install -g mocha
npm install -g grunt-cli
node bin/appium-doctor.js --dev
./reset.sh --dev
前兩個命令安裝測試和構建工具(如果你已經通過 Homebrew 包管理器安裝了 node.js 就不需要 sudo 了)。
第三個命令驗證所有的依賴關係是否設定正確(由於依賴關係構建 Appium 不同於簡單的執行 Appium ),
第四個命令安裝所有程式依賴關係和構建支援二進位制檔案和測試應用程式。
reset.sh 也是建議先從 master 上 pull 下改變後的內容再執行命令。
執行 reset.sh 加上 --dev 標誌同時安裝 git hooks 以確保程式碼質量在提交時是被儲存過的。
此時,你可以啟動 Appium 服務:
node .
檢視完整的服務文件引數列表the server documentation
想要實現任務自動化,請檢出Appium Grunt tasks來構建應用程式,安裝程式,生成文件,等等。
搭建iOS執行環境
為了避免啟動 iOS apps 時彈出安全警告,你可以通過以下兩種方法修改 /etc/authorization 檔案:
手動將 /etc/authorization 檔案中 <key>system.privilege.taskport<key/> 下緊跟 <allow-root> 的元素改成 <true/>。
執行以下grunt命令來自動修改 /etc/authorization 檔案:
sudo ./bin/authorize-ios.js
然後再執行以下命令:
./reset.sh --ios --dev
現在你的 appium 例項已經準備就緒,執行 node . 來啟動 appium server.
搭建android執行環境
Bootstrap 通過執行以下命令來啟動 android:
./reset.sh --android --dev
如果你想執行Selendroid 來支援2.3這樣的舊的android平臺,執行以下命令:
./reset.sh --selendroid --dev
確保你有且只有一個 Android 模擬器或者真機在執行,舉個例子,在其它的裝置上執行此命令(假設 emulator 命令已經在你的 path 中了)需執行:
emulator -avd <MyAvdName>
現在你可以通過 node . 啟動 Appium server 了。
確保更新到最新版本
由於 Appium 使用一些包的開發版本,所以經常安裝新的 npm 包和升級不同的包是很有必要的。以下命令可以將所有平臺上的包進行更新( --dev 標誌會獲取 npm dev 依賴和 Appium 測試套件中用到的應用程式)。當Appium提示版本更新時,你也可以用以下命令來更新:
./reset.sh --dev
或者你可以只更新指定的平臺:
./reset.sh --ios --dev
./reset.sh --android --dev
./reset.sh --selendroid --dev
執行測試集
首先,看看我們的文件普通情況下執行測試 ,
然後確保你的環境在對應的平臺上已經搭建好了且與你所期望的那樣。
當你的環境搭建好了之後並且你的程式碼是最新的,你可以通過以下的方式來執行單元測試:
grunt unit
你可以在所支援的平臺上執行一些功能測試(確保後 Appium 用 node . 在另外一個視窗中執行):
bin/test.sh
或者你可以通過執行 test.sh 來對指定的平臺環境進行測試:
bin/test.sh --android
bin/test.sh --ios
bin/test.sh --ios7
bin/test.sh --ios71
在提交程式碼時,請執行 grunt 執行一些基本的測試和核對程式碼質量標準的更改,請注意,這可能會自動發生的,
如果你已經執行 reset.sh --dev ,這於你預先提交程式碼的操作所關聯起來的。
grunt lint
> Running "newer:jshint" (newer) task
>
> Running "newer:jshint:files" (newer) task
> No newer files to process.
>
> Running "newer:jshint:test" (newer) task
> No newer files to process.
>
> Running "newer:jshint:examples" (newer) task
> No newer files to process.
>
> Running "jscs:files" (jscs) task
> >> 303 files without code style errors.
執行單獨的測試
如果你有一個 Appium 服務監聽,你可以通過 Mocha 來執行單獨的測試檔案,例如:
DEVICE=ios71 mocha -t 60000 -R spec test/functional/ios/testapp/simple.js
或者單獨的測試集(例如,測試名稱中的單詞 "alert" )
DEVICE=ios6 mocha -t 60000 -R spec --grep "alert" test/functional/ios/uicatalog
對於 windows 作業系統,你可以用 set DEVICE=android 在 cmd 命令列的方式中執行以上所有測試集,例如:
set DEVICE=android
mocha -t 60000 -R spec test/functional/android/apidemos/alerts-specs.js
注意:對於安卓系統,你將需要一個螢幕大小為4.0(400x800)的模擬器/裝置(emulator/device),有些測試集在不同的螢幕大小下可能會失敗。
DEVICE 必須設定為一個有效的值:ios71, ios6, android, selendroid
4.2 appium 開發環境搭建
##從原始碼執行Appium
你想要從原始碼執行 Appium 並幫助修復 bug 和新增新的特性麼?很好! fork 這個專案,做一點更改,並且傳送一個請求吧!
另外,在工作之前請先看下我們的程式碼風格指南。請在傳送請求前,確保單元測試與功能測試都測試通過;
關於如何執行測試的更多資訊,請繼續閱讀!
首先確保你閱讀並遵循 README 中的安裝說明。
###從原始碼配置Appium
Appium 的安裝,包含在你的測試程式碼與裝置/模擬器之間來回傳送訊息的 Appium 服務端,和一個用任何存在且相容Appium的語言編寫的測試指令碼。
執行一個 Appium 伺服器例項,然後進行你的測試。
快速開始的方式:
$ git clone https://github.com/appium/appium.git
$ cd appium
$ ./reset.sh
$ sudo ./bin/authorize-ios.js # for ios only
$ node .
Appium 開發環境搭建
確保你安裝了 ant,maven,adb 並且將他們加入到了系統環境變數 PATH 中,與此同時你還需要安裝 android-16 sdk(Selendroid) 和android-19 sdk。
從你本地倉庫的命令列提示,使用下邊的命令安裝如下包(如果你沒有使用homebrew包管理器安裝 node,則你可能不得不使用 sudo 許可權執行npm):
npm install -g mocha
npm install -g grunt-cli
node bin/appium-doctor.js --dev
./reset.sh --dev
前兩個命令安裝測試和構建工具(如果你已經通過 Homebrew 包管理器安裝了 node.js 就不需要 sudo 了)。
第三個命令驗證所有的依賴關係是否設定正確(由於依賴關係構建 Appium 不同於簡單的執行 Appium ),
第四個命令安裝所有程式依賴關係和構建支援二進位制檔案和測試應用程式。
reset.sh 也是建議先從 master 上 pull 下改變後的內容再執行命令。
執行 reset.sh 加上 --dev 標誌同時安裝 git hooks 以確保程式碼質量在提交時是被儲存過的。
此時,你可以啟動 Appium 服務:
node .
檢視完整的服務文件引數列表the server documentation
想要實現任務自動化,請檢出Appium Grunt tasks來構建應用程式,安裝程式,生成文件,等等。
搭建iOS執行環境
為了避免啟動 iOS apps 時彈出安全警告,你可以通過以下兩種方法修改 /etc/authorization 檔案:
手動將 /etc/authorization 檔案中 <key>system.privilege.taskport<key/> 下緊跟 <allow-root> 的元素改成 <true/>。
執行以下grunt命令來自動修改 /etc/authorization 檔案:
sudo ./bin/authorize-ios.js
然後再執行以下命令:
./reset.sh --ios --dev
現在你的 appium 例項已經準備就緒,執行 node . 來啟動 appium server.
搭建android執行環境
Bootstrap 通過執行以下命令來啟動 android:
./reset.sh --android --dev
如果你想執行Selendroid 來支援2.3這樣的舊的android平臺,執行以下命令:
./reset.sh --selendroid --dev
確保你有且只有一個 Android 模擬器或者真機在執行,舉個例子,在其它的裝置上執行此命令(假設 emulator 命令已經在你的 path 中了)需執行:
emulator -avd <MyAvdName>
現在你可以通過 node . 啟動 Appium server 了。
確保更新到最新版本
由於 Appium 使用一些包的開發版本,所以經常安裝新的 npm 包和升級不同的包是很有必要的。以下命令可以將所有平臺上的包進行更新( --dev 標誌會獲取 npm dev 依賴和 Appium 測試套件中用到的應用程式)。當Appium提示版本更新時,你也可以用以下命令來更新:
./reset.sh --dev
或者你可以只更新指定的平臺:
./reset.sh --ios --dev
./reset.sh --android --dev
./reset.sh --selendroid --dev
執行測試集
首先,看看我們的文件普通情況下執行測試 ,
然後確保你的環境在對應的平臺上已經搭建好了且與你所期望的那樣。
當你的環境搭建好了之後並且你的程式碼是最新的,你可以通過以下的方式來執行單元測試:
grunt unit
你可以在所支援的平臺上執行一些功能測試(確保後 Appium 用 node . 在另外一個視窗中執行):
bin/test.sh
或者你可以通過執行 test.sh 來對指定的平臺環境進行測試:
bin/test.sh --android
bin/test.sh --ios
bin/test.sh --ios7
bin/test.sh --ios71
在提交程式碼時,請執行 grunt 執行一些基本的測試和核對程式碼質量標準的更改,請注意,這可能會自動發生的,
如果你已經執行 reset.sh --dev ,這於你預先提交程式碼的操作所關聯起來的。
grunt lint
> Running "newer:jshint" (newer) task
>
> Running "newer:jshint:files" (newer) task
> No newer files to process.
>
> Running "newer:jshint:test" (newer) task
> No newer files to process.
>
> Running "newer:j
源地址:https://github.com/appium/appium/tree/master/docs/cn
官方網站上的:http://appium.io/slate/cn/master/?ruby#about-appium
中文Appium API 文件
第一章:關於appium
1.1 appium客戶端
客戶端類庫列表及Appium服務端支援
這些類庫封裝了標準Selenium客戶端類庫,為使用者提供所有常見的JSON 格式selenium命令以及額外的移動裝置控制相關的命令,如多點觸控手勢和螢幕朝向。
Appium客戶端類庫實現了Mobile JSON Wire Protocol(一個標準協議的官方擴充套件草稿)和W3C Webdriver spec(一個傳輸不可預知的自動化協議,該協議定義了MultiAction 介面)的元素。
Appium 服務端定義了官方協議的擴充套件,為Appium 使用者提供了方便的介面來執行各種裝置動作,例如在測試過程中安裝/解除安裝app。這就是為什麼我們需要Appium 特定的客戶端,而不是通用的Selenium 客戶端。當然,Appium 客戶端類庫只是增加了一些功能,而實際上這些功能就是簡單的擴充套件了Selenium 客戶端,所以他們仍然可以用來執行通用的selenium會話。
語言/框架 Github版本庫以及安裝指南
Ruby https://github.com/appium/ruby_lib
Python https://github.com/appium/python-client
Java https://github.com/appium/java-client
JavaScript (Node.js) https://github.com/admc/wd
Objective C https://github.com/appium/selenium-objective-c
PHP https://github.com/appium/php-client
C# (.NET) https://github.com/appium/appium-dotnet-driver
RobotFramework https://github.com/jollychang/robotframework-appiumlibrary
1.2 appium介紹
Appium 介紹
Appium 是一個自動化測試開源工具,支援 iOS 平臺和 Android 平臺上的原生應用,web 應用和混合應用。
所謂的“移動原生應用”是指那些用 iOS 或者 Android SDK 寫的應用。所謂的“移動 web 應用”是指使用移動瀏覽器訪問的應用(Appium 支援 iOS 上的 Safari 和 Android 上的 Chrome)。所謂的“混合應用”是指原生程式碼封裝網頁檢視——原生程式碼和 web 內容互動。比如,像 Phonegap,可以幫助開發者使用網頁技術開發應用,然後用原生程式碼封裝,這些就是混合應用。
重要的是,Appium 是一個跨平臺的工具:它允許測試人員在不同的平臺(iOS,Android)使用同一套API來寫自動化測試指令碼,這樣大大增加了 iOS 和 Android 測試套件間程式碼的複用性。
想知道 Appium 如何支援平臺,版本和自動化形態的詳細資訊,請參見platform support doc。
Appium 的理念
為了滿足移動自動化需求,Appium 遵循著一種哲學,重點體現於以下4個需求:
你無需為了自動化,而重新編譯或者修改你的應用。
你不必侷限於某種語言或者框架來寫和執行測試指令碼。
一個移動自動化的框架不應該在介面上重複造輪子。(移動自動化的介面應該統一)
無論是精神上,還是名義上,都必須開源。
Appium 設計
那麼 Appium 架構是如何實現這個哲學呢?為了滿足第一條,Appium 真正的工作引擎其實是第三方自動化框架。這樣,我們就不需在你的應用裡植入 Appium 相關或者第三方的程式碼。這意味著你測試使用的應用與最終釋出的應用並無二致。我們使用以下的第三方框架:
iOS: 蘋果的 UIAutomation
Android 4.2+: Google's UiAutomator
Android 2.3+: Google's Instrumentation. (Instrumentation由單獨的專案Selendroid提供支援 )
為了滿足第二點,我們把這些第三方框架封裝成一套 API,WebDriver API.WebDriver(也就是 "Selenium WebDriver") 指定了客戶端到服務端的協議。
(參見 JSON Wire Protocol)。使用這種客戶端-服務端的架構,我們可以使用任何語言來編寫客戶端,向服務端傳送恰當的 HTTP 請求。
目前已經實現了大多數流行語言版本的客戶端,這意味著你可以使用任何測試套件或者測試框架。客戶端庫就是簡單的HTTP 客戶,可以以任何你喜歡的方式潛入你的程式碼。換句話說,Appium 和 WebDriver 客戶端不是技術意義上的“測試框架”,而是“自動化庫”。你可以在你的測試環境中隨意使用這些自動化庫!
事實上 WebDriver 已經成為 web 瀏覽器自動化的標準,也成了 W3C 的標準 —— W3C Working Draft。我們又何必為移動做一個完全不同的呢?所以我們擴充了WebDriver 的協議,在原有的基礎上新增移動自動化相關的 API 方法,這也滿足了第三條理念。
第四條就不用說了,Appium 是開源的。
Appium 概念
C/S 架構<br/>
Appium 的核心是一個 web 伺服器,它提供了一套 REST 的介面。它收到客戶端的連線,監聽到命令,接著在移動裝置上執行這些命令,然後將執行結果放在 HTTP響應中返還給客戶端。事實上,這種客戶端/服務端的架構給予了許多的可能性:比如我們可以使用任何實現了該客戶端的語言來寫我們的測試程式碼。比如我們可以把服務端放在不同
的機器上。比如我們可以只寫測試程式碼,然後使用像 Sauce Labs 這樣的雲服務來解釋命令。
Session<br/>
自動化始終圍繞一個session進行,客戶端初始化一個seesion(會話)來與服務端互動,不同的語言有不同的實現方式,但是他們最終都是傳送為一個POST請求給服務端,請求中包含一個JSON物件,被稱作“desired capabilities”。此時,服務端就會開啟一個自動化的 session,然後返回一個 session ID,session ID將會被使用者傳送後續的命令。
Desired Capabilities<br/>
Desired capabilities 是一些鍵值對的集合 (比如,一個 map 或者 hash),客戶端將這些鍵值對發給服務端,告訴服務端我們想要怎麼測試。比如,我們可以把platformName capability 設定為 iOS,告訴 Appium 服務端,我們想要一個iOS 的 session,而不是一個 Android 的。我們也可以設定 safariAllowPopups capability 為 true,確保在 Safari 自動化 session 中,我們可以使用 javascript 來開啟新視窗。參見 capabilities 文件,檢視完整的 capabilities 列表。
Appium Server<br/>
Appium server 是用 Node.js 寫的。我們可以用原始碼編譯或者從 NPM 直接安裝。
Appium 服務端<br/>
Appium 服務端有很多語言庫 Java, Ruby, Python, PHP, JavaScript 和 C#,這些庫都實現了
Appium 對 WebDriver 協議的擴充套件。當使用 Appium 的時候,你只需使用這些庫代替常規的 WebDriver 庫就可以了。
你可以從這裡看到所有的庫的列表。
Appium.app, Appium.exe<br/>
我們提供了 GUI 封裝的 Appium 服務端下載,它封裝了執行 Appium服務端的所有依賴,而不需要擔心怎樣安裝Node.js。其中還包括一個Inspector工具,可以幫助你檢查應用的介面層級,這樣寫測試用例時更方便。
Getting Started
恭喜!你現在有足夠的知識來使用 Appium 了。 來我們回到 getting started doc 繼續瞭解更加
細節的需求和指南。
第二章:進階指南
2.1 selenium配置
Selenium Grid
使用 <b>"--nodeconfig"</b> 伺服器引數,你可以在本地 selenium grid 裡註冊你的 appium 伺服器。
> node . -V --nodeconfig /path/to/nodeconfig.json
在 node 的配置檔案裡,你需要定義 <b>"browserName"</b>,<b>"version"</b> 和 <b>"platform"</b>。
基於這些引數,selenium grid 會將你的測試定向到正確的裝置上去。你還需要配置你的 <b>host</b> 詳細資訊和
<b>selenium grid</b> 的詳細資訊。你可以在 <a href="http://code.google.com/p/selenium/source/browse/java/server/src/org/openqa/grid/common/defaults/GridParameters.properties">這裡</a> 找到詳細的引數列表和描述資訊。
一旦你啟動了 appium 伺服器並且在 grid 裡註冊了資訊,你會在 grid 控制檯發現你的裝置:
"http://<b><grid-ip-adress></b>:<b><grid-port></b>/grid/console"
Grid 配置檔案例子
{
"capabilities":
[
{
"browserName": "<e.g._iPhone5_or_iPad4>",
"version":"<version_of_iOS_e.g._6.1>",
"maxInstances": 1,
"platform":"<platform_e.g._MAC_or_ANDROID>"
}
],
"configuration":
{
"cleanUpCycle":2000,
"timeout":30000,
"proxy": "org.openqa.grid.selenium.proxy.DefaultRemoteProxy",
"url":"http://<host_name_appium_server_or_ip-address_appium_server>:<appium_port>/wd/hub",
"maxSession": 1,
"register": true,
"registerCycle": 5000,
"hubPort": <grid_port>,
"hubHost": "<Grid_host_name_or_grid_ip-address>"
}
}
可以在 <a href="http://selenium.googlecode.com/git/docs/api/java/org/openqa/selenium/Platform.html">這裡</a>檢視有效的 platform 引數。
如果沒有給出url、host和 port,配置會自動指向本地:whatever-port-Appium-started-on。
如果你的Appium服務和Selenium Grid服務沒有執行在同一臺機器上,為確保Selenium Grid連線正常,請在你的host & url docs上使用外部其它名稱或IP地址,而非localhost 和 127.0.0.1
2.2 自動化混合應用
自動化混合應用
Appium 其中一個理念就是你不能為了測試應用而修改應用。為了符合這個方法學,我們可以使用 Selenium 測試傳統 web 應用的方法來測試混合 web 應用 (比如,iOS 應用裡的元素 "UIWebView" ),這是有可能的。這裡會有一些技術性的複雜,Appium 需要知道你是想測試原生部分呢還是web部分。幸運的是,我們還能遵守 WebDriver 的協議。
混合 iOS 應用
混合 Android 應用
自動化混合 iOS 應用
在你的 Appium 測試裡,你需要以下幾步來和 web 頁面交涉:
前往到應用裡 web 檢視啟用的部分。
呼叫 GET session/:sessionId/window_handles
這會返回一個我們能訪問的 web 檢視的 id 的列表。
使用你想訪問的這個 web 檢視的 id 作為引數,呼叫 POST session/:sessionId/window
(這會將你的 Appium session 放入一個模式, 在這個模式下,所有的命令都會被解釋成自動化web檢視而不是原生的部分。比如,當你執行 getElementByTagName,它會在 web 檢視的 DOM 上操作,而不是返回 UIAElements。當然,一個 Webdriver 的方法只能在一個上下文中有意義,所以如果在錯誤的上下文,你會收到錯誤資訊。)
如果你想停止 web 檢視的自動化,回到原生部分,你可以簡單地使用 execute_script 呼叫 "mobile: leaveWebView" 方法來離開 web 層。
在 iOS 真機上執行
appium 使用一個遠端偵錯程式建立連線來實現和 web 檢視的互動。當在模擬器上執行下面例子的時候,我們可以直接建立連線,因為模擬器和 appium 伺服器在同一臺機器上。
當在真機上執行用例時,appium 無法直接訪問 web 檢視,所以我們需要通過 USB 線纜來建立連線。我們使用 ios-webkit-debugger-proxy建立連線。
使用 brew 安裝最新的 ios-webkit-debug-proxy。在終端執行一下命令:
# 如果你沒有安裝 brew 的話,先安裝 brew。
> ruby -e "$(curl -fsSL https://raw.github.com/mxcl/homebrew/go/install)"
> brew update
> brew install ios-webkit-debug-proxy
你也可以通過 git 克隆專案來自己安裝最新版本:
# Please be aware that this will install the proxy with the latest code (and not a tagged version).
> git clone https://github.com/google/ios-webkit-debug-proxy.git
> cd ios-webkit-debug-proxy
> ./autogen.sh
> ./configure
> make
> sudo make install
一旦安裝好了, 你就可以啟動代理:
# 將udid替換成你的裝置的udid。確保埠 27753 沒有被佔用
# remote-debugger 將會使用這個埠。
> ios_webkit_debug_proxy -c 0e4b2f612b65e98c1d07d22ee08678130d345429:27753 -d
<b>注意:</b> 這個 ios-webkit-debug-proxy 需要 <b>"web inspector"</b> 開啟著以便建立連線。在 <b> settings > safari > advanced </b> 裡開啟它。請注意 web inspector <b>在 iOS6 時候加入的</b> 以前的版本沒有。
Wd.js Code example
// 假設我們已經有一個初始化好了的 `driver` 物件。
driver.elementByName('Web, Use of UIWebView', function(err, el) { // 找到按鈕,開啟 web 檢視
el.click(function(err) { // 引導到 UIWebView
driver.windowHandles(function(err, handles) { // 得到能訪問的檢視列表。
driver.window(handles[0], function(err) { // 因為只有一個,所以選擇第一個。
driver.elementsByCss('.some-class', function(err, els) { // 通過 css 拿到元素。
els.length.should.be.above(0); // 肯定有元素。
els[0].text(function(elText) { // 得到第一個元素的文字。
elText.should.eql("My very own text"); // 比較匹配文字。
driver.execute("mobile: leaveWebView", function(err) { // 離開web檢視上下文。
// 如果你想的話,做一些原生應用的操作。
driver.quit(); // 退出。
});
});
});
});
});
});
});
想看到具體的上下文,請看該node 的例子
*我們正在完善 web 檢視下面的方法。加入我們!
Wd.java 程式碼例子
//配置 webdriver 並啟動 webview 應用。
DesiredCapabilities desiredCapabilities = new DesiredCapabilities();
desiredCapabilities.setCapability("device", "iPhone Simulator");
desiredCapabilities.setCapability("app", "http://appium.s3.amazonaws.com/WebViewApp6.0.app.zip");
URL url = new URL("http://127.0.0.1:4723/wd/hub");
RemoteWebDriver remoteWebDriver = new RemoteWebDriver(url, desiredCapabilities);
// 切換到最新的web檢視
for(String winHandle : remoteWebDriver.getWindowHandles()){
remoteWebDriver.switchTo().window(winHandle);
}
//在 guinea-pig 頁面用 id 和 元素互動。
WebElement div = remoteWebDriver.findElement(By.id("i_am_an_id"));
Assert.assertEquals("I am a div", div.getText()); //驗證得到的文字是否正確。
remoteWebDriver.findElement(By.id("comments")).sendKeys("My comment"); //填寫評論。
//離開 webview,回到原生應用。
remoteWebDriver.executeScript("mobile: leaveWebView");
//關閉應用。
remoteWebDriver.quit();
Wd.rb cucumber 的例子
TEST_NAME = "Example Ruby Test"
SERVER_URL = "http://127.0.0.1:4723/wd/hub"
APP_PATH = "https://dl.dropboxusercontent.com/s/123456789101112/ts_ios.zip"
capabilities =
{
'browserName' => 'iOS 6.0',
'platform' => 'Mac 10.8',
'device' => 'iPhone Simulator',
'app' => APP_PATH,
'name' => TEST_NAME
}
@driver = Selenium::WebDriver.for(:remote, :desired_capabilities => capabilities, :url => SERVER_URL)
## 這裡切換到最近一個視窗是因為在我們的例子裡這個視窗一直是 webview。其他的用例裡,你需要自己指定。
## 執行 @driver.window_handles,檢視 appium 的日誌,找出到底哪個視窗是你要的,然後找出相關的數字。
## 然後用 @driver.switch_to_window(number),切換過去。
Given(/^I switch to webview$/) do
webview = @driver.window_handles.last
@driver.switch_to.window(webview)
end
Given(/^I switch out of webview$/) do
@driver.execute_script("mobile: leaveWebView")
end
# 你可以使用 CSS 選擇器在你的 webview 裡來選擇元素
And(/^I click a webview button $/) do
@driver.find_element(:css, ".green_button").click
end
用 ruby 除錯 web 檢視:
我在我的幫助類裡建立了一個快速方法來定位web元素,無論它在哪一個視窗檢視。
(這非常有幫助,特別是你的 webview 的 id 變化或者你用同一份程式碼來測試 Android 和 iOS。)
https://gist.github.com/feelobot/7309729
自動化混合 Android 應用
Appium 通過 Chromedriver 內建混合應用支援。Appium 也可以使用 Selendroid 做為 4.4 之前的裝置對 webview 支援的背部引擎。(你需要在 desired capability 裡指定 "device": "selendroid")。然後:
前往你應用裡 web 檢視啟用的部分。
用 "WEBVIEW" 做視窗控制代碼呼叫 POST session/:sessionId/window , 比如 driver.window("WEBVIEW")。
(這會將你的 Appium session 放入一個模式, 在這個模式下,所有的命令都會被解釋成自動化web檢視而不是原生的部分。比如,當你執行 getElementByTagName,它會在 web 檢視的 DOM 上操作,而不是返回 UIAElements。當然,一個 Webdriver 的方法只能在一個上下文中有意義,所以如果在錯誤的上下文,你會收到錯誤資訊。)
如果要停止web上下文裡的自動化,回到原生部分的自動化,簡單地使用 "NATIVE_APP" 呼叫 window 方法。比如 driver.window("NATIVE_APP")。
注意:我們可以像上面說的,使用同樣的策略。然而,Selendroid 使用 WEBVIEW/NATIVE_APP 視窗設定策略。 Appium 常規的混合支援也使用這種策略。
Wd.js 程式碼例子
// 假設我們已經初始化了一個 `driver` 例項。
driver.window("WEBVIEW", function(err) { // 選擇唯一的 WebView
driver.elementsByCss('.some-class', function(err, els) { // 通過 CSS 取得元素
els.length.should.be.above(0); // 驗證元素存在
els[0].text(function(elText) { // 得到第一個元素的文字
elText.should.eql("My very own text"); // 驗證文字內容
driver.window("NATIVE_APP", function(err) { // 離開 webview 上下文
// 可以做些原生應用的測試
driver.quit(); // 關閉 webdriver
});
});
});
});
Wd.java 程式碼例子
//配置 webdriver 並啟動 webview 應用。
DesiredCapabilities desiredCapabilities = new DesiredCapabilities();
desiredCapabilities.setCapability("device", "Selendroid");
desiredCapabilities.setCapability("app", "/path/to/some.apk");
URL url = new URL("http://127.0.0.1:4723/wd/hub");
RemoteWebDriver remoteWebDriver = new RemoteWebDriver(url, desiredCapabilities);
// 切換到最新的web檢視
remoteWebDriver.switchTo().window("WEBVIEW");
//在 guinea-pig 頁面用 id 和 元素互動。
WebElement div = remoteWebDriver.findElement(By.id("i_am_an_id"));
Assert.assertEquals("I am a div", div.getText()); //驗證得到的文字是否正確。
remoteWebDriver.findElement(By.id("comments")).sendKeys("My comment"); //填寫評論。
//離開 webview,回到原生應用。
remoteWebDriver.switchTo().window("NATIVE_APP");
//關閉應用。
remoteWebDriver.quit();
2.3 用例遷移
把appium 0.18.x上的測試用例集遷移到appium1.x上
Appium 1.0 已經從先前的版本中移除了一部分過時的特性, 這個指導文件會幫助你瞭解使用Appium 1.0需要做的具體改變.
新的客戶端庫
你需要關注的最大的改變是利用新的appium的client libraries來替換原生的WebDriver ciients. 訪問Appium client list 去尋找符合你自己程式語言的客戶端庫吧. 在每個客戶端的網站上都可以找到用於整合到你程式碼中的依賴庫相關介紹和下載
基本上, 你需要做如下的改變(以Python作為例子)
用
from appium import webdriver
替換原來的:
from selenium import webdriver
新的適配引數
下面的適配引數將不再使用
* device
* version
取而代之的是利用下面的配置引數
platformName ("iOS" 或者 "Android")
platformVersion (你希望測試的os版本)
deviceName (你想用的裝置, 比如 "iPhone Simulator")
automationName ("Selendroid" 如果你想使用Selendroid的話, 否則可以省略)
app 配置引數保持不變, 但是特指非瀏覽器的app, 如果你想使用類似Safari或者Chrome這樣的瀏覽器, 你需要設定browserName. 這代表app和browserName是互斥的.
我們把appium的配置引數都規範為駝峰拼寫法(camelCase), 這代表著原來的app-package或者app-wait-activity現在會變成appPackage和appWaitActivity. 當然目前android的app package和activity都已經是自動探測了, 大部分情況下你可以省略這兩個配置項.
新的定位方式
我們已經移除了下面的定位方式
name
tag name
我們增加了accessibility_id定位方法去做過去name做的事情. 具體的細節還得跟你使用的Appium客戶端庫有關.
tag name已經被替換為class name. 所以想通過UI的型別來定位某個元素, 你需要使用class name定位方式
關於class name和xpath的定位方式: 現在需要使用完整的全類名, 這意味著如果你有一個如下的定位用的xpath
//table/cell/button
現在需要改成
//UIATableView/UIATableCell/UIAButton
如果是android的話, button需要改變成android.widget.Button
我們也增加了如下的定位方式
-ios uiautomation
-android uiautomator
根據你使用的客戶端去相應的使用新的定位方式
使用xml, 不再是json了
App source方法先前返回JSON, 現在修改成返回XML. 所以如果你有程式碼是依賴解析app source的, 那麼就需要更新
通過context支援混合應用, 不再是window了
以前混合app的切換支援是通過"windows"
window_handles
window
switch_to.window
現在Appium支援"context" 概念了, 要獲得當前環境下所有的上下文(contexts), 或者特定的context, 你可以用
driver.contexts
current = driver.context
在這些context之間切換, 可以使用
driver.switch_to.context("WEBVIEW")
沒有了execute_script("mobile: xxx")
所有的mobile:方法都已經被移除, 並且被替換為appium client libraries的原生方法. 這意味著如果一個方法呼叫原來的方式是
driver.execute("mobile: lock", [5])
現在需要更新為
driver.lock(5)
在這個地方lock已經變成了原生的客戶端方法. 當然具體的呼叫細節在不同的客戶端庫中的實現可能會有所差別.
特別需要注意的是, 手勢(gesture)方法已經被替換為TouchAction / MultiAction API, 它允許更強大通用的組合手勢的自動化. 可以參考你的客戶端庫的具體用法.
這就是全部啦, 祝遷移愉快
(文件由testerhome.com翻譯, 歡迎更多熱愛技術的同學加入到翻譯中來, We Love Appium)
2.4 appium設定
Settings
Settings 是 Appium 引入的一個新的概念。 它目前還沒有被納入 Mobile JSON Wire Protocol 及 Webdriver 標準之中。
Settings 是一種用來配置 Appium 伺服器的方式。
Settings 有以下特點:
- 可變的,它在同一會話中是可以被修改的。
- 唯一的,它在被測應用會話中是唯一的。 它在每建立一個新會話時會被重置。
- 可控的,它在自動化測試過程中控制著 Appium 伺服器的執行。 它們不會被用來控制被測應用或被測終端。
在 Android 環境中 以 ignoreUnimportantViews 設定舉例,該引數在 Android 環境中可以被設定成忽略所有與當前檢視無關的元素,它將使測試過程更加有效率。 然而當我們希望能夠訪問被忽略的元素時,我們必須在將 ignoreUnimportantViews 設定成 true 後,重新修改成 false 。
另外也可以通過 Settings 配置讓 Appium 忽略所有當前不可見的元素。
Settings 可以通過以下 API 方法進行配置:
POST /session/:sessionId/appium/settings
以 JSON 格式提交 key:value 鍵值對形式的Settings配置。
{
settings: {
ignoreUnimportantViews : true
}
}
GET /session/:sessionId/appium/settings
以 JSON 格式返回當前所有 Settings 配置。
{
ignoreUnimportantViews : true
}
其它 Settings 配置參考
"ignoreUnimportantViews" -該引數值為 true 或 false。 如果你希望能夠儘量減少測試過程的互動確認過程,或希望測試指令碼能更快的執行,可以在 Android 終端環境下使用 setCompressedLayoutHeirarchy() 引數。它將忽略所有被標記為 IMPORTANT_FOR_ACCESSIBILITY_NO 或 IMPORTANT_FOR_ACCESSIBILITY_AUTO(以及那些被認為不是很重要的系統元素)的元素。
第三章:appium 設定
3.1 加速器管理
Intel® 硬體加速器管理
如果你發現android模擬器太慢, 並且你的系統執行在Intel® 的cpu上. 那麼你可以嘗試下HAXM, HAXM能夠讓你充分利用硬體虛擬化技術來加速android模擬器。
要安裝HAXM, 你可以開啟Android SDK Manager, 你可以在Extras中發現這個安裝選項;
你可以在Intel官方網站找到所有相關的文件;
這將需要x86的模擬映象;
利用Intel的包來安裝HAXM; Android SDK Manager有時候會安裝不成功,這主要取決於你安裝的版本是否相容。
3.2 android 設定
Android Setup
使用前,你需要安裝node.js(版本大於等於0.10)。 請參照 instructions for your flavor of linux。
當node.js安裝成功後,請安裝 Android SDK。
執行'android' tool(位於SDK,tool檔案目錄下)。
執行'android' tool 來安裝大於等於Level 17的API。
(如果你想從Appium的原始碼來執行,可在真機或者模擬器上用 Apache Ant 來編譯bootstrap jar包)。
最後,將環境變數$ANDROID_HOME設定為 Android SDK 的路徑。例如,如果你將Android SDK 解壓到 /usr/local/adt/,你需要把這個路徑加到你的shell環境變數中去:
export ANDROID_HOME="/usr/local/adt/sdk"
現在就可以啟動Appium了!如果你在原始碼中執行Appium請執行
./reset.sh --android 版本從Appium checkout會安裝所有的依賴。
老版本的額外安裝
當android的版本是2.3到4.1的時候,appium用的是selendroid。 當它檢測到時低版本時,它會自動應用Selendroid。但是需要配置一些額外的設定如果從source執行。
已經安裝 Maven 3.1.1 或更新 (mvn)
執行 ./reset.sh --selendroid 從checkout的Appium原始碼
(執行Appium Android 測試)
在Linux上執行,啟動一個API大於等於level17的AVD。 在原始檔目錄下執行 (appium) 在安裝好 NPM, 或者 node。如果你選擇的是從原始碼方式執行。
參照 server documentation 來了解所有命令和引數。
注意
Android 加速模擬器需要存在,它有自己的侷限性,如果想了解更多,請看這裡 page。
如果你想執行任何Appium的測試,或者任何強大的命令,確保你的 hw.battery=yes 在 AVD's config.ini檔案中。
Selendroid 需要你APP中的如下許可權: <uses-permission android:name="android.**permission.INTERNET"/>, 如果你在使用selendroid或者低版本的android(如版本2.3到4.1),請確保你的App已設定internet許可權。
3.3 部署iOS app 到手機上
部署iOS app 到手機上
準備在真機上執行appium測試, 需要如下準備:
用特殊的裝置引數來構建app
使用 fruitstrap, 這是一個第三方程式,可以用來部署你構建的app到手機上
Xcodebuild 命令的引數:
新的引數執行指定設定. 參考 developer.apple.com:
xcodebuild [-project projectname] [-target targetname ...]
[-configuration configurationname] [-sdk [sdkfullpath | sdkname]]
[buildaction ...] [setting=value ...] [-userdefault=value ...]
這有一個資料來參考可用的設定
CODE_SIGN_IDENTITY (Code Signing Identity)
介紹: 識別符號,指定一個簽名。
例如: iPhone Developer
PROVISIONING_PROFILE 已經從可用的的命令中消失了,但還是有必要設定的。
在xcodebuild命令中設定 "CODE_SIGN_IDENTITY" & "PROVISIONING_PROFILE":
xcodebuild -sdk <iphoneos> -target <target_name> -configuration <Debug> CODE_SIGN_IDENTITY="iPhone Developer: Mister Smith" PROVISIONING_PROFILE="XXXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX"
成功的話, app會構建到如下目錄 <app_dir>/build/<configuration>-iphoneos/<app_name>.app
用Fruitstrap進行部署
clone一個fruitstrap的fork版本在ghughes version ,這個已經不再維護. 已確認該fork可用unprompted fork, 但是其它的據說也可用。
clone成功的話, 執行 make fruitstrap
然後, 然後複製生成的 fruitstrap到app的所在的目錄或上級目錄下。
執行fruitstrap 通過輸入以下命令 (命令是否可用依賴於你fork的 fruitstrap):
./fruitstrap -d -b <PATH_TO_APP> -i <Device_UDID>
如果是為了持續整合,你可以發現很有用的方法來記錄fruitstrap命令列和日誌檔案中的記錄, 像這樣:
./fruitstrap -d -b <PATH_TO_APP> -i <Device_UDID> 2>&1 | tee fruit.out
在node服務啟動前fruitstrap進行需要被結束, 一個方法是掃描fruitstrap的輸出來得知app完成啟動。 有一個有效的方法是通過一個Rakefile 和一個 go_device.sh 指令碼:
bundle exec rake ci:fruit_deploy_app | while read line ; do
echo "$line" | grep "text to identify successful launch"
if [ $? = 0 ]
then
# Actions
echo "App finished launching: $line"
sleep 5
kill -9 `ps -aef | grep fruitstrap | grep -v grep | awk '{print $2}'`
fi
done
一旦fruitstrap的程序被結束, node 服務就可以啟動並且appium測試可以被執行!
下一步:
在真機上執行appium
3.4 Android併發測試
Android併發測試
Appium提供了在一臺裝置上啟動多個Android會話的方案,而這個方案需要你輸入不同的指令來啟動多個Appium服務來實現。
啟動多個Android會話的重要指令包括:
-p Appium的主要埠
-U 裝置id
-bp Appium bootstrap埠
--chromedriver-port chromedriver埠(當使用了webviews或者chrome)
--selendroid-port selendroid埠(當使用了selendroid)
更多引數的解釋詳見 here。
如果我們有兩臺裝置,裝置ID分別為43364和32456,我們應該用下面的命令啟動來兩個不同的Appium服務:
node . -p 4492 -bp 2251 -U 32456
node . -p 4491 -bp 2252 -U 43364
只要你的Appium和Appium bootstrap埠介於0和65536即可,並且保證是兩個不同的埠以便兩個Appium服務不會監聽相同的埠。確認你的-u引數繫結正確的裝置ID。這可以讓Appium知道連線哪臺裝置,所以引數一定要準確。
如果你用了chromedriver或selendroid,不同的服務要設定不同的埠。
iOS併發測試
不幸的是,IOS不能進行本地併發測試。跟Android不一樣,IOS在同一時間只能啟動一個版本的模擬器來執行多個測試。
如果你想在IOS上進行併發測試,你需要用到Sauce。只需上傳你的Appium測試指令碼到Sauce,它就可以按照你的設定執行多個IOS或Android的併發測試。在Sauce上執行測試的更多資訊,詳見here。
3.5 Appium支援的平臺
Appium支援的平臺
Appium支援很多的執行平臺和測試方式(包括原生、混合應用、內嵌瀏覽器、真機、模擬器等)。這篇文件主要用來讓大家明確在使用
Appimu的時候支援的平臺版本和上述測試方式的必備條件。
iOS平臺支援
請移步到Running on OS X: iOS 。這裡介紹了在iOS系統下使用Appium的必備條件和安裝說明。
版本號:6.1,7.0,以及7.1。
支援裝置:iPhone模擬器,iPad模擬器以及iPhones和iPads真機。
是否支援原生應用:支援。同時支援模擬器中除錯應用版本和正確簽名的真機ipa。其他相關支援由蘋果的UIAutomation框架提供。
是否支援內建移動瀏覽器:支援。Safari瀏覽器已經通過測試。對於真機,則需要安裝除錯工具ios-webkit-remote-debugger。很遺憾,對於Safari的原生介面的自動化是不支援的。更多資訊請移步至mobile web doc 。
是否支援混合應用:支援。同樣對於真機需要安裝除錯工具ios-webkit-remote-debugger,更多詳情請移步至hybrid doc 檢視詳情。
是否支援在同一個session中執行多個應用的自動化:不支援。
是否支援同時再多個裝置上執行自動化:不支援。
是否支援第三方提供應用:只支援在模擬器上有限的第三方應用(例如:喜好設定、地圖等)。
是否支援自定義的、非標準UI控制元件的自動化:僅支援很少一部分。最好對控制元件新增可識別資訊,以方便對元素進行一些基礎的自動化操作。
Android平臺支援
請移步至 Running on OS X: Android,Running on Windows,或者Running on Linux 獲得在不同作業系統下android平臺對appium的支援和安裝配置文件。
支援版本:android 2.3平臺及以上。
android 4.2平臺及以上通過Appium自有的UiAutomator類庫支援。預設在自動化後臺。
從android 2.3到4.3平臺,Appium是通過繫結Selendroid,實現自動化測試的,你可以到android開發社群的Instrumentation。(儀表盤)中檢視相關介紹。Selendroid擁有一套不同的命令列和不同的profile檔案(這部分差距正在逐步縮小)。要獲得在後臺執行自動化的許可權,需要配置automationName 元件的值為 Selendroid。
支援的裝置:Android模擬器和Android真機。
是否支援原生應用:支援。
是否支援內建移動瀏覽器:支援(除了使用Selendroid後臺執行的情況)。通過代理方式繫結到Chromedriver來執行自動化測試。在android4.2和4.3版本中,只有在官方版本的谷歌瀏覽器或者Chromium下才能執行自動化測試。伴隨著android 4.4+版本的出現。自動化測試則可以執行在內建瀏覽器的應用程式。但是需要在測試裝置環境下安裝Chrome/Chromium/瀏覽器。請移步至mobile web doc 獲取更多詳情。
是否支援混合應用: 支援。請移步至hybrid doc參考相關文件。
通過預設的Appium的後臺支援android 4.4以上的版本。
通過Selendroid的後臺支援android 2.3以上的版本。
是否支援在同一個session中執行多個應用的自動化:支援(但是不支援使用Selendroid後臺的場景)。
是否支援同時再多個裝置上執行自動化:支援,。儘管Appium必須要啟動另一個埠即通過新增引數的方式執行命令列,例如--port,--bootstrap-port(或者--selendroid-port)或者--chromedriver-port。更多詳情請移步至server args doc。
是否支援第三方應用自動化:支援(但是不支援Selendroid後臺執行的場景)。
是否支援自定義的、非標準UI控制元件的自動化:不支援。
3.6 Appium在真機上
Appium在真機上
Appium已經初步支援真機測試。
如果要在真機上執行測試,你將要做如下準備:
1.一個蘋果的開發者ID和有效的開發者對應的配置檔案和簽名檔案
2.一臺iPad或者iPhone
你要測試的應用的原始碼
一臺安裝了XCode和XCode Command Line Developer Tools的Mac機器
Provisioning Profile
要在真機上測試就需要一個有效的iOS開發者的Distribution Certificate and Provisioning Profile。你可以在這個上面找到配置這些的相關資訊Apple documentation
同樣的,你還需要對你的應用簽名,更多的資訊可以檢視sign your app.
你必須使用Xcode的執行按鈕來安裝你的應用
使用Appium執行你的測試
一旦你的裝置和應用設定好了之後,你就能夠用如下的命令在你的機器上執行測試:
node . -U <UDID> --app <bundle_id>
這將會啟動Appium並且開始在真機上測試應用。
疑問解答思路
確認UDID已經正確的在xcode organizar或itunes中設定了。很長的字串(20多個字串) 0.確認你測試程式碼中的測試物件裝置的設定
再次確認你從instruments啟動你的自動化測試
確認instruments已經關閉
3.7 在 Linux 上執行 Appium
在 Linux 上執行 Appium
限制
如果你在 Linux 上使用 Appium, 那麼你沒法使用已經構建好的 '.app',那是為 OS X 準備的。 另外由於 Appium 在測試 iOS 應用時 依賴 OS X 特有的庫, 所以你也沒有辦法測試在 Linux 上測試 iOS 應用。
配置
首先,安裝版本高於或等於 0.8 的 nodejs。可以根據 instructions for your flavor of linux 進行安裝。
安裝好了 node.js 之後,安裝 Android SDK。 你會需要執行 android adb 等工具,這些工具都在 SDK 裡包含了, 你要做的是配置環境變數。當然你要確保你的 API level 大於等於 17。 你也需要使用 Ant 來構建 bootstrap jar 以便 Appium 使用它來測試 Android 應用。
最後, 設定 $ANDROID_HOME 為你的 Android SDK 的路徑。比如, 你將 Android SDK 解壓在 /usr/local/adt/, 那你就要將如下新增到你的 .bashrc 或 .zshrc 或 .bash_profile 等 shell 配置檔案中去:
export ANDROID_HOME="/usr/local/adt/sdk
現在你可以執行 Appium 了, 在你 checkout 出來的 Appium 目錄裡, 執行 .reset.sh --android, 它會幫助你安裝好所有的依賴。
執行 Appium
執行測試前, 你需要啟動一個 API Level 大於等於 17 的 Android 模擬器或者連線一個系統是 4.1 以上的 Android 真機。然後在 Appium 目錄執行
node .
你可以在 server documentation 找到所有的命令列引數。
備註
There exists a hardware accelerated emulator for android, it has it's own limitations. For more information you can check out this Android 有一些硬體加速的模擬器,這些模擬器有自己的限制。你可以在 page 找到更多的資訊。
確保你使用的 AVD 裡面的 config.ini 有這條指令 hw.battery=yes。
3.8 在 Mac OS X 上使用 Appium
在 Mac OS X 上使用 Appium
在 OS X 上, Appium 支援 iOS 和 Android 測試
系統配置 (iOS)
Appium 需要 Mac OS X 10.7, 推薦 10.8。 (經過測試, 10.9 也能工作。)
確保 Xcode 和 iOS SDK 都已經安裝好了。 (當前 Appium 支援 Xcode 4.6.3/iOS 6.1 和 Xcode 5/iOS 7.0。 注意不推薦在基於 Xcode 5 下且低於 7.0 的 iOS 版本進行測試。 參照下篇可以獲取更多資訊)
你需要授權 iOS 模擬器的使用。如果你是通過 NPM 安裝的 Appium,那麼你可以執行 sudo authorize_ios (authorize_ios)是來自 Appium npm 包裡的一個二進位制執行檔案。如果你是從原始碼執行 Appium,那麼你可以簡單的使用 sudo grunt authorize。如果你使用Appium.app, 那你只要用介面來操作。
如果你使用的是Xcode 6,在啟動Appium之前,你需要開啟模擬器,並且在你需要進行輸入文字的操作之前,必須先將輸入法提前調出。你可以通過點選輸入區域或通過快捷鍵command-K來將軟鍵盤喚出。
Xcode 6中,有一個Devices的模組(command-shift-2可喚出)。你必須確保Appium 的capabilities引數中,所使用到的deviceName要存在於Devices裡。換句話說,如果capabilities中的deviceName為"iPhone 5s",platformVersion為"8.0",那麼你必須確保Devices中要存在那麼一個裝置是"iOS8系統的iPhone5s",否則Appium將不知道使用哪一個裝置進行測試。
在iOS8設定中的開發者選項裡面,你可以開啟或關閉UIAutomation。如果你的是iOS8裝置,請在執行Appium之前,確保UIAutomation是開啟狀態的。
使用多種 iOS SDK 進行測試
Appium 使用蘋果提供的 instruments 來啟動 iOS 模擬器,預設它會使用當前安裝的 Xcode 和該 Xcode 下安裝好的最高版本的 iOS SDK。這就意味著如果你想測試 iOS 6.1, 但是你安裝了 iOS 7.0, 那麼 Appium 會強制使用 7.0 的模擬器。 唯一的方法就是安裝多個Xcode,然後在安裝不同的 SDK。然後在啟動 Appium 前,切換到你要測試的特定的版本。
另外,我們發現 Xcode 5 上的 iOS 6.1 測試,會很慢而且不穩定。所以我們推薦,如果要在 6.1 及 6.1 以下版本的 iOS 上進行測試,請使用 Xcode 4.6.3。如果要在 iOS 7.0 上測試,請使用 Xcode 5。假設我們的 Xcode 5 在 /Applications/Xcode.app, Xcode 4.6 在 /Applications/Xcode-4.6.app,我們就可以用下面的命令來切換到 Xcode 4.6 來為 iOS 6.1 測試做準備。
sudo xcode-select -switch /Applications/Xcode-4.6.app/Contents/Developer/
如果要回到 Xcode 5 的話,我們再執行一次:
sudo xcode-select -switch /Applications/Xcode.app/Contents/Developer/
系統配置 (Android)
在Mac OSX 上執行Android專案所需要的配置,與Linux的配置方法是一致的,請參考 Android setup docs。
3.9 在Windows上執行Appium
在Windows上執行Appium
侷限性
如果你在windows上安裝appium,你沒法使用預編譯專用於OS X的.app檔案,你也將不能測試IOS apps,因為appium依賴OS X專用的庫來支援IOS測試。這意味著你只能通過在mac上來執行IOS的app測試。這點限制挺大。
開始安裝
安裝nodejs 0.8版本及以上, 通過官方的安裝程式來安裝。
安裝android的sdk包,(http://developer.android.com/sdk/index.html), 執行依賴sdk中的'android'工具。並確保你安裝了Level17或以上的版本api。設定ANDROID_HOME系統變數為你的Android SDK路徑,並把tools platform-tools兩個目錄加入到系統的Path路徑裡。因為這裡麵包含有一些執行命令
安裝java的JDK,並設定JAVA_HOME 變數為你的JDK目錄。
安裝Apache Ant
或者直接使用Android Windows SDK自帶的ant,地址在eclipse\plugins目錄,你需要把這個目錄加到你的系統PATH變數中
安裝Apache Maven. 並且設定M2HOME和M2環境變數,把M2環境變數新增到你的系統PATH變數中。
安裝Git. 確保你安裝了windows下的Git,以便可以執行常用的command命令
現在,你已經下載安裝了所有的依賴,開始執行
reset.bat
執行Appium
要在windows上執行測試用例,你需要先啟動Android模擬器或者連線上一個API Level17以上的android真機。然後在命令列執行appium。
如果你是使用原始碼執行Appium的,請在你所安裝的appium目錄下執行node.js命令:
node .
備註
在windows系統下執行appium.app時,需要使用管理員許可權;當你通過原始碼的形式執行Appium時,也需要使用管理員許可權啟動CMD。
在windows系統下執行Android專案時,啟動Appium時請帶上--no-reset或--full-reset命令。
有一個硬體加速模擬器用於android,但是它有自己的一些限制,如果你想了解更多,請參考頁面
確保在你的AVD的config.ini中有一個配置項為hw.battery=yes
最簡略的安裝方式
出於對官方文件的尊重,我按照原文翻譯,如下介紹我的安裝心得。官方提到的一些工具,其實並不需要安裝。
下面介紹我已經測試過的安裝和使用過程
安裝appium
安裝nodejs
使用npm安裝appium,npm install -g appium
執行appium
啟動appium,直接執行appium 即可。
更新appium
通過npm install -g appium 來更新appium即可
如果有任何疑問,歡迎到testerhome.com來交流
3.10 Appium 故障排除
Appium 故障排除
當你遇到問題時,請不要急著將問題提交到Github,也不用急著發到appium-discuss discussion group,也許你可以在本文中找到答案。
常見問題解決辦法
確保你的每一個步驟都是遵循 入門指南 來做的。
確保你的系統配置正確。(例如:Xcode是否升級到了最新版本,Android SDK是否有設定到環境變數ANDROID_HOME中去。)
確保你的應用存放路徑沒有錯誤。
Appium.app執行出現問題的解決辦法
升級Appium.app後重新開啟即可解決。如果提示你不能升級,則需要重新下載Appium.app,下載地址:appium.io
通過原始碼啟用Appium出現問題的解決辦法
使用git pull拉取最新原始碼,確保執行的程式碼是當前最新版本。
針對你所自動化的平臺,執行reset.sh命令:
命令 說明
./reset.sh # all
./reset.sh --ios # ios-only
./reset.sh --android # android-only
./reset.sh --selendroid # selendroid-only
當你需要下載以及構建測試應用時,執行reset.sh時你需要用到--dev指令。
你也可以使用appium-doctor來自動檢測你的環境依賴都是否正常。如果你是使用原始碼執行,則需要使用到bin/appium-doctor.js或node bin/appium-doctor.js。
當你將Android SDK升級到22後,可能出現如下錯誤: {ANDROID_HOME}/tools/ant/uibuild.xml:155: SDK does not have any Build Tools installed. 這是因為在Android SDK 22中,platform 和 build 工具被分拆到他們各自的SDK管理包中去了。你需要確保你的機器上正確安裝了build-tools 和 platform-tools。
Android常見問題解決辦法
確保 Android 模擬器啟動並執行著。
出現裝置連線問題時,執行adb kill-server && adb devices是非常有效的。它能夠幫助重置和連線Android裝置。
請確保環境變數 ANDROID_HOME 指向的是正確的Android SDK的路徑。
IOS常見問題解決方案
確保Instruments.app是關閉的。
如果你是使用模擬器執行的,請不要將真機裝置連線電腦。
確保模擬器或真機中,設定裡面的accessibility輔助功能是關閉狀態的。
確保App是編譯在當前執行的模擬器上。
確保App是編譯在合適的模擬器(或真機)上,不然會出現posix spawn的報錯。(比如:執行在debug模式下的模擬器)
如果你曾經用 sudo 執行過 Appium, 你需要先刪除/tmp/instruments_sock, 執行sudo rm /tmp/instruments_sock。然後在不適用SUDO的情況下再次啟動Appium即可。
第一次執行Appium時,需要對Instruments進行授權。不然的話會經常彈出對話方塊要求你輸入密碼。如果你從原始碼執行 Appium,你只需在主分支上執行sudo grunt authorize來回避該彈窗。如果用 npm 安裝的話,執行 sudo authorize_ios 即可。注意,當你每次安裝了新版本的xcode,你都需要重複以上操作。
如果檢查路徑正確,但仍然報 iOS Simulator failed to install the application.的錯誤的時候,請嘗試重啟你的電腦。
Webview/Hybrid/Safari 應用支援
確保真機上的'Web Inspector'為開啟狀態。
確保打開了Safari的開發模式。(Safari - Advance Preferences- Developer menu for simulators)
確保由client library提供的Appium命令-context能夠正常得對contexts進行切換。
當你嘗試開啟代理的時候,出現如下錯誤:select_port() failed,請參考discussion
FirefoxOS常見問題解決辦法
確保 Boot-to-Gecko 模擬器啟動並執行著。
確保模擬器的螢幕是亮著並無鎖屏的(可能需要重啟 B2G).
到社群尋求幫助
若通過上述方法你的問題依然沒有得到解決,你可以:
如果你的 Appium 無法正常工作,然後錯誤資訊不夠清晰,歡迎加入 discussion group中發表你的問題,你的問題需要包括以下內容:
你是如何執行Appium的?(Appium.app, npm, source)
你使用的是什麼作業系統?
你使用的是什麼裝置?版本是什麼? (i.e. Android 4.4, or iOS 7.1)
你使用的是真機還是模擬器?
給出你得到的客戶端和服務端的出錯日誌 (比如,"我的Python程式碼中報瞭如下錯誤:balabala,在Appium server中的輸出內容如連結中所示")
除了上述, 貼出 Appium 伺服器端的輸出也非常重要,特別是執行在 verbose 模式。這樣我們可以分析診斷問題在哪裡。
如果你確信你發現的是一個BUG,請到issue tracker中提交一個issue,並將BUG的內容描述清楚。
已知問題
如果你從 Node 官網安裝的 Node,那需要你使用 sudo 執行 npm。 但這麼做並不是非常理想。請嘗試從 n 獲取node 或執行brew install node來安裝 。
Webview通過代理可以支援iOS真機裝置,請參考discussion
有時候, iOS 的 UI 元素在定位到之後幾毫秒會突然變得無效。這會導致一個類似(null) cannot be tapped的錯誤。唯一的解決方法就是把finding-and-acting的程式碼放到 retry 塊裡。
如果你是通過MacPorts安裝了Node和Npm,你必須確保MacPorts的bin資料夾已經被新增到環境變數PATH中去,不然Appium會出現難以找到可執行node的情況。
特定的錯誤
Action Error Resolution
Running reset.sh xcodebuild: error: SDK "iphonesimulator6.1" cannot be located 安裝 iPhone 6.1 SDK 或者 使用單獨的 SDK 構建 待測應用 比如: grunt buildApp:UICatalog:iphonesimulator5.1
Running reset.sh Warning: Task "setGitRev" not found. Use --force to continue. 使用git submodule update --init更新模組並再次執行reset.sh
Running reset.sh [ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:2.3.2:compile (default-compile) on project selendroid-server: Compilation failure [ERROR] Failure executing javac, but could not parse the error: [ERROR] [ERROR] [ERROR] The system is out of resources. [ERROR] Consult the following stack trace for details. [ERROR] java.lang.StackOverflowError export MAVEN_OPTS="-Xms1024m -Xmx2048m -Xss2048k"
Running ios test [INST STDERR] posix spawn failure; aborting launch 你的應用沒有正確編譯在模擬器或真機上。
Running mobile safari test error: Could not prepare mobile safari with version '7.1' 你可能需要在此執行授權指令碼以保證使iOS SDK檔案為可寫狀態。 E.g., sudo authorize_ios
第四章:appium執行
4.1 從原始碼執行Appium
##從原始碼執行Appium
你想要從原始碼執行 Appium 並幫助修復 bug 和新增新的特性麼?很好! fork 這個專案,做一點更改,並且傳送一個請求吧!
另外,在工作之前請先看下我們的程式碼風格指南。請在傳送請求前,確保單元測試與功能測試都測試通過;
關於如何執行測試的更多資訊,請繼續閱讀!
首先確保你閱讀並遵循 README 中的安裝說明。
###從原始碼配置Appium
Appium 的安裝,包含在你的測試程式碼與裝置/模擬器之間來回傳送訊息的 Appium 服務端,和一個用任何存在且相容Appium的語言編寫的測試指令碼。
執行一個 Appium 伺服器例項,然後進行你的測試。
快速開始的方式:
$ git clone https://github.com/appium/appium.git
$ cd appium
$ ./reset.sh
$ sudo ./bin/authorize-ios.js # for ios only
$ node .
Appium 開發環境搭建
確保你安裝了 ant,maven,adb 並且將他們加入到了系統環境變數 PATH 中,與此同時你還需要安裝 android-16 sdk(Selendroid) 和android-19 sdk。
從你本地倉庫的命令列提示,使用下邊的命令安裝如下包(如果你沒有使用homebrew包管理器安裝 node,則你可能不得不使用 sudo 許可權執行npm):
npm install -g mocha
npm install -g grunt-cli
node bin/appium-doctor.js --dev
./reset.sh --dev
前兩個命令安裝測試和構建工具(如果你已經通過 Homebrew 包管理器安裝了 node.js 就不需要 sudo 了)。
第三個命令驗證所有的依賴關係是否設定正確(由於依賴關係構建 Appium 不同於簡單的執行 Appium ),
第四個命令安裝所有程式依賴關係和構建支援二進位制檔案和測試應用程式。
reset.sh 也是建議先從 master 上 pull 下改變後的內容再執行命令。
執行 reset.sh 加上 --dev 標誌同時安裝 git hooks 以確保程式碼質量在提交時是被儲存過的。
此時,你可以啟動 Appium 服務:
node .
檢視完整的服務文件引數列表the server documentation
想要實現任務自動化,請檢出Appium Grunt tasks來構建應用程式,安裝程式,生成文件,等等。
搭建iOS執行環境
為了避免啟動 iOS apps 時彈出安全警告,你可以通過以下兩種方法修改 /etc/authorization 檔案:
手動將 /etc/authorization 檔案中 <key>system.privilege.taskport<key/> 下緊跟 <allow-root> 的元素改成 <true/>。
執行以下grunt命令來自動修改 /etc/authorization 檔案:
sudo ./bin/authorize-ios.js
然後再執行以下命令:
./reset.sh --ios --dev
現在你的 appium 例項已經準備就緒,執行 node . 來啟動 appium server.
搭建android執行環境
Bootstrap 通過執行以下命令來啟動 android:
./reset.sh --android --dev
如果你想執行Selendroid 來支援2.3這樣的舊的android平臺,執行以下命令:
./reset.sh --selendroid --dev
確保你有且只有一個 Android 模擬器或者真機在執行,舉個例子,在其它的裝置上執行此命令(假設 emulator 命令已經在你的 path 中了)需執行:
emulator -avd <MyAvdName>
現在你可以通過 node . 啟動 Appium server 了。
確保更新到最新版本
由於 Appium 使用一些包的開發版本,所以經常安裝新的 npm 包和升級不同的包是很有必要的。以下命令可以將所有平臺上的包進行更新( --dev 標誌會獲取 npm dev 依賴和 Appium 測試套件中用到的應用程式)。當Appium提示版本更新時,你也可以用以下命令來更新:
./reset.sh --dev
或者你可以只更新指定的平臺:
./reset.sh --ios --dev
./reset.sh --android --dev
./reset.sh --selendroid --dev
執行測試集
首先,看看我們的文件普通情況下執行測試 ,
然後確保你的環境在對應的平臺上已經搭建好了且與你所期望的那樣。
當你的環境搭建好了之後並且你的程式碼是最新的,你可以通過以下的方式來執行單元測試:
grunt unit
你可以在所支援的平臺上執行一些功能測試(確保後 Appium 用 node . 在另外一個視窗中執行):
bin/test.sh
或者你可以通過執行 test.sh 來對指定的平臺環境進行測試:
bin/test.sh --android
bin/test.sh --ios
bin/test.sh --ios7
bin/test.sh --ios71
在提交程式碼時,請執行 grunt 執行一些基本的測試和核對程式碼質量標準的更改,請注意,這可能會自動發生的,
如果你已經執行 reset.sh --dev ,這於你預先提交程式碼的操作所關聯起來的。
grunt lint
> Running "newer:jshint" (newer) task
>
> Running "newer:jshint:files" (newer) task
> No newer files to process.
>
> Running "newer:jshint:test" (newer) task
> No newer files to process.
>
> Running "newer:jshint:examples" (newer) task
> No newer files to process.
>
> Running "jscs:files" (jscs) task
> >> 303 files without code style errors.
執行單獨的測試
如果你有一個 Appium 服務監聽,你可以通過 Mocha 來執行單獨的測試檔案,例如:
DEVICE=ios71 mocha -t 60000 -R spec test/functional/ios/testapp/simple.js
或者單獨的測試集(例如,測試名稱中的單詞 "alert" )
DEVICE=ios6 mocha -t 60000 -R spec --grep "alert" test/functional/ios/uicatalog
對於 windows 作業系統,你可以用 set DEVICE=android 在 cmd 命令列的方式中執行以上所有測試集,例如:
set DEVICE=android
mocha -t 60000 -R spec test/functional/android/apidemos/alerts-specs.js
注意:對於安卓系統,你將需要一個螢幕大小為4.0(400x800)的模擬器/裝置(emulator/device),有些測試集在不同的螢幕大小下可能會失敗。
DEVICE 必須設定為一個有效的值:ios71, ios6, android, selendroid
4.2 appium 開發環境搭建
##從原始碼執行Appium
你想要從原始碼執行 Appium 並幫助修復 bug 和新增新的特性麼?很好! fork 這個專案,做一點更改,並且傳送一個請求吧!
另外,在工作之前請先看下我們的程式碼風格指南。請在傳送請求前,確保單元測試與功能測試都測試通過;
關於如何執行測試的更多資訊,請繼續閱讀!
首先確保你閱讀並遵循 README 中的安裝說明。
###從原始碼配置Appium
Appium 的安裝,包含在你的測試程式碼與裝置/模擬器之間來回傳送訊息的 Appium 服務端,和一個用任何存在且相容Appium的語言編寫的測試指令碼。
執行一個 Appium 伺服器例項,然後進行你的測試。
快速開始的方式:
$ git clone https://github.com/appium/appium.git
$ cd appium
$ ./reset.sh
$ sudo ./bin/authorize-ios.js # for ios only
$ node .
Appium 開發環境搭建
確保你安裝了 ant,maven,adb 並且將他們加入到了系統環境變數 PATH 中,與此同時你還需要安裝 android-16 sdk(Selendroid) 和android-19 sdk。
從你本地倉庫的命令列提示,使用下邊的命令安裝如下包(如果你沒有使用homebrew包管理器安裝 node,則你可能不得不使用 sudo 許可權執行npm):
npm install -g mocha
npm install -g grunt-cli
node bin/appium-doctor.js --dev
./reset.sh --dev
前兩個命令安裝測試和構建工具(如果你已經通過 Homebrew 包管理器安裝了 node.js 就不需要 sudo 了)。
第三個命令驗證所有的依賴關係是否設定正確(由於依賴關係構建 Appium 不同於簡單的執行 Appium ),
第四個命令安裝所有程式依賴關係和構建支援二進位制檔案和測試應用程式。
reset.sh 也是建議先從 master 上 pull 下改變後的內容再執行命令。
執行 reset.sh 加上 --dev 標誌同時安裝 git hooks 以確保程式碼質量在提交時是被儲存過的。
此時,你可以啟動 Appium 服務:
node .
檢視完整的服務文件引數列表the server documentation
想要實現任務自動化,請檢出Appium Grunt tasks來構建應用程式,安裝程式,生成文件,等等。
搭建iOS執行環境
為了避免啟動 iOS apps 時彈出安全警告,你可以通過以下兩種方法修改 /etc/authorization 檔案:
手動將 /etc/authorization 檔案中 <key>system.privilege.taskport<key/> 下緊跟 <allow-root> 的元素改成 <true/>。
執行以下grunt命令來自動修改 /etc/authorization 檔案:
sudo ./bin/authorize-ios.js
然後再執行以下命令:
./reset.sh --ios --dev
現在你的 appium 例項已經準備就緒,執行 node . 來啟動 appium server.
搭建android執行環境
Bootstrap 通過執行以下命令來啟動 android:
./reset.sh --android --dev
如果你想執行Selendroid 來支援2.3這樣的舊的android平臺,執行以下命令:
./reset.sh --selendroid --dev
確保你有且只有一個 Android 模擬器或者真機在執行,舉個例子,在其它的裝置上執行此命令(假設 emulator 命令已經在你的 path 中了)需執行:
emulator -avd <MyAvdName>
現在你可以通過 node . 啟動 Appium server 了。
確保更新到最新版本
由於 Appium 使用一些包的開發版本,所以經常安裝新的 npm 包和升級不同的包是很有必要的。以下命令可以將所有平臺上的包進行更新( --dev 標誌會獲取 npm dev 依賴和 Appium 測試套件中用到的應用程式)。當Appium提示版本更新時,你也可以用以下命令來更新:
./reset.sh --dev
或者你可以只更新指定的平臺:
./reset.sh --ios --dev
./reset.sh --android --dev
./reset.sh --selendroid --dev
執行測試集
首先,看看我們的文件普通情況下執行測試 ,
然後確保你的環境在對應的平臺上已經搭建好了且與你所期望的那樣。
當你的環境搭建好了之後並且你的程式碼是最新的,你可以通過以下的方式來執行單元測試:
grunt unit
你可以在所支援的平臺上執行一些功能測試(確保後 Appium 用 node . 在另外一個視窗中執行):
bin/test.sh
或者你可以通過執行 test.sh 來對指定的平臺環境進行測試:
bin/test.sh --android
bin/test.sh --ios
bin/test.sh --ios7
bin/test.sh --ios71
在提交程式碼時,請執行 grunt 執行一些基本的測試和核對程式碼質量標準的更改,請注意,這可能會自動發生的,
如果你已經執行 reset.sh --dev ,這於你預先提交程式碼的操作所關聯起來的。
grunt lint
> Running "newer:jshint" (newer) task
>
> Running "newer:jshint:files" (newer) task
> No newer files to process.
>
> Running "newer:jshint:test" (newer) task
> No newer files to process.
>
> Running "newer:j