App的爬蟲----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 繼續了解更加
細節的需求和指南。

自動化混合應用

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(); // 退出。

 

 

 

 

 

 

 

 

 Appium鍵值配置的地址:https://github.com/appium/appium/blob/master/docs/en/writing-running-appium/caps.md

部分摘要自:https://www.cnblogs.com/111testing/p/7503026.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM