appium簡明教程(轉)

轉:http://www.yangyanxing.com/article/1266.htmlhtml

appium簡明教程(1)——appium和它的哲學世界

什麼是appium?

下面這段介紹來自於appium的官網。java

Appium is an open-source tool you can use to automate mobile native, mobile web, and mobile hybrid applications on iOS and Android platforms. 「Mobile native apps」 are those written using the iOS or Android SDKs. 「Mobile web apps」 are web apps accessed using a mobile browser (Appium supports Safari on iOS and Chrome on Android). 「Mobile hybrid apps」 have a native wrapper around a 「webview」 – a native control that enables interaction with web content. Projects like Phonegap, for example, make it easy to build apps using web technologies that are then bundled into a native wrapper – these are hybrid apps.node

Importantly, Appium is 「cross-platform」: it allows you to write tests against multiple platforms (iOS, Android), using the same API. This enables a large or total amount of code reuse between iOS and Android testsuites.python

咱們能夠從上面的介紹裏得到這樣的一些信息:linux

  • 1,appium是開源的移動端自動化測試框架;
  • 2,appium能夠測試原生的、混合的、以及移動端的web項目;
  • 3,appium能夠測試ios,android應用(固然了,還有firefox os);
  • 4,appium是跨平臺的,能夠用在osx,windows以及linux桌面系統上;

appium的哲學android

Appium was designed to meet mobile automation needs according to a certain philosophy. The key points of this philosophy can be stated as 4 requirements:ios

  1. You shouldn’t have to recompile your app or modify it in any way in order to automate it.
  2. You shouldn’t be locked into a specific language or framework to write and run your tests.
  3. A mobile automation framework shouldn’t reinvent the wheel when it comes to automation APIs.
  4. A mobile automation framework should be open source, in spirit and practice as well as in name!

appium的設計哲學是這樣的:git

  • 1,不須要爲了自動化並且從新編譯或修改測試app;
  • 2,不該該讓移動端自動化測試限定在某種語言和某個具體的框架;也就是說任何人均可以使用本身最熟悉最順手的語言以及框架來作移動端自動化測試;
  • 3,不要爲了移動端的自動化測試而從新發明輪子,從新寫一套驚天動地的api;也就是說webdriver協議裏的api已經夠好了,拿來改進一下就能夠了;
  • 4,移動端自動化測試應該是開源的;

appium的技術架構

appium的設計思想

We meet requirement #2 by wrapping the vendor-provided frameworks in one API, theWebDriver API. WebDriver (aka 「Selenium WebDriver」) specifies a client-server protocol (known as theJSON Wire Protocol). Given this client-server architecture, a client written in any language can be used to send the appropriate HTTP requests to the server. There are already clients written in every popular programming language. This also means that you’re free to use whatever test runner and test framework you want; the client libraries are simply HTTP clients and can be mixed into your code any way you please. In other words, Appium & WebDriver clients are not technically 「test frameworks」 – they are 「automation libraries」. You can manage your test environment any way you like!github

We meet requirement #3 in the same way: WebDriver has become the de facto standard for automating web browsers, and is a W3C Working Draft. Why do something totally different for mobile? Instead we have extended the protocol with extra API methods useful for mobile automation.web

It should be obvious that requirement #4 is a given – you’re reading this because Appium is open source.

首先,爲了可以實現哲學裏描述的第2條,也就是不該該讓移動端自動化測試限定在某種語言和某個具體的框架;也就是說任何人均可以使用本身最熟悉最順手的語言以及框架來作移動端自動化測試;appium選擇了client-server的設計模式。只要client可以發送http請求給server,那麼的話client用什麼語言來實現都是能夠的,這就是appium及webdriver如何作到支持多語言的;

其次,爲了可以實現不要爲了移動端的自動化測試而從新發明輪子,從新寫一套驚天動地的api;也就是說webdriver協議裏的api已經夠好了,拿來改進一下就能夠了;這個思想,appium擴展了webdriver的協議,沒有本身從新去實現一套。這樣的好處是之前的webdriver api可以直接被繼承過來,之前的webdriver各類語言的binding均可以拿來就用,省去了爲每種語言開發一個client的工做量;

最後appium固然是開源的,這也實現了哲學思想裏的最後一點。

 

appium簡明教程(2)——appium的基本概念

 

 

Client/Server Architecture

appium的核心實際上是一個暴露了一系列REST API的server。

這個server的功能其實很簡單:監聽一個端口,而後接收由client發送來的command。翻譯這些command,把這些command轉成移動設備能夠理解的形式發送給移動設備,而後移動設備執行完這些command後把執行結果返回給appium server,appium server再把執行結果返回給client。

在這裏client其實就是發起command的設備,通常來講就是咱們代碼執行的機器,執行appium測試代碼的機器。狹義點理解,能夠把client理解成是代碼,這些代碼能夠是java/ruby/python/js的,只要它實現了webdriver標準協議就能夠。

這樣的設計思想帶來了一些好處:

  • 1,能夠帶來多語言的支持;
  • 2,能夠把server放在任意機器上,哪怕是雲服務器均可以;(是的,appium和webdriver天生適合雲測試)

Session

session就是一個會話,在webdriver/appium,你的全部工做永遠都是在session start後才能夠進行的。通常來講,經過POST /session這個URL,而後傳入Desired Capabilities就能夠開啓session了。

開啓session後,會返回一個全局惟一的session id,之後幾乎全部的請求都必須帶上這個session id,由於這個seesion id表明了你所打開的瀏覽器或者是移動設備的模擬器。

進一步思考一下,因爲session id是全局惟一,那麼在同一臺機器上啓動多個session就變成了可能,這也就是selenium gird所依賴的具體理論根據。

本文版權歸乙醇全部,歡迎轉載,但請註明做者與出處,嚴禁用於任何商業用途

Desired Capabilities

Desired Capabilities攜帶了一些配置信息。從本質上講,這個東東是key-value形式的對象。你能夠理解成是java裏的map,python裏的字典,ruby裏的hash以及js裏的json對象。實際上Desired Capabilities在傳輸時就是json對象。

Desired Capabilities最重要的做用是告訴server本次測試的上下文。此次是要進行瀏覽器測試仍是移動端測試?若是是移動端測試的話是測試android仍是ios,若是測試android的話那麼咱們要測試哪一個app? server的這些疑問Desired Capabilities都必須給予解答,不然server不買帳,天然就沒法完成移動app或者是瀏覽器的啓動。

具體例子以下:

For example, we might set the platformName capability to iOS to tell Appium that we want an iOS session, rather than an Android one. Or we might set the safariAllowPopupscapability to true in order to ensure that, during a Safari automation session, we’re allowed to use JavaScript to open up new windows. See the capabilities doc for the complete list of capabilities available for Appium

Appium Server

這就是每次咱們在命令行用appium命令打開的東西。

Appium Clients

因爲原生的webdriver api是爲web端設計的,所以在移動端用起來會有點不三不四。appium官方提供了一套appium client,涵蓋多種語言ruby/java/python,在我看來ruby client是實現最好的。在測試的時候,通常要使用這些client庫去替換原生的webdriver庫。這實際上不是替換,算是client對原生webdriver進行了一些移動端的擴展,加入了一些方便的方法,好比swipe之類,appium client讓咱們能夠更方便的寫出可讀性更好的測試用例。

Appium.app, Appium.exe

appium server的GUI版本,前者用在osx上,後者是windows上。可視化、不須要裝node,能夠看app的UI結構是這個東東的賣點。

 

appium簡明教程(3)——appium的安裝windows版

 

appium的哲學裏有一條就是不從新發明輪子。一樣,官方已經有明確的安裝步驟了,所以在這裏純屬搬磚。

原文地址

感謝testerhome的辛勤翻譯。

本文版權歸乙醇全部,歡迎轉載,但請註明做者與出處,嚴禁用於任何商業用途

限制

若是你在windows上安裝appium,你無法使用預編譯專用於OS X的.app文件,你也將不能測試IOS apps,由於appium依賴OS X專用的庫來支持IOS測試。這意味着你只能經過在mac上來運行IOS的app測試。這點限制挺大。

開始安裝

  1. 安裝nodejs 0.8版本及以上, 經過官方的安裝程序來安裝。
  2. 安裝android的sdk包,(http://developer.android.com/sdk/index.html), 運行依賴sdk中的'android'工具。並確保你安裝了Level17或以上的版本api。設置ANDROID_HOME系統變量爲你的Android SDK路徑,並把tools platform-tools兩個目錄加入到系統的Path路徑裏。由於這裏麪包含有一些執行命令
  3. 安裝java的JDK,並設置JAVA_HOME 變量爲你的JDK目錄。
  4. 安裝Apache Ant 或者直接使用Android Windows SDK自帶的ant,地址在eclipseplugins目錄,你須要把這個目錄加到你的系統PATH變量中
  5. 安裝Apache Maven. 而且設置M2HOME和M2環境變量,把M2環境變量添加到你的系統PATH變量中。
  6. 安裝Git. 確保你安裝了windows下的Git,以即可以運行經常使用的command命令

如今,你已經下載安裝了全部的依賴,開始運行 reset.bat

運行Appium

要在windows上運行測試用例,你須要先啓動Android模擬器或者鏈接上一個API Level17以上的android真機。 而後在命令行運行appium node .

備註
  • 你必須帶上--no-reset和--full-reset標記,以用於windows上的android
  • 有一個硬件加速模擬器用於android,可是它有本身的一些限制,若是你想了解更多,請參考頁面
  • 確保在你的AVD的config.ini中有一個配置項爲hw.battery=yes
最簡略的安裝方式

出於對官方文檔的尊重,我按照原文翻譯,以下介紹個人安裝心得。官方提到的一些工具,其實並不須要安裝。 下面介紹我已經測試過的安裝和使用過程

安裝appium
  1. 安裝nodejs

二、使用npm安裝appium,npm install -g appium

注意:在某些狀況下,appium安裝的時候並不會把appium的路徑放進系統的PATH裏,這時候須要手工去加一下。

運行appium

啓動appium,直接運行appium 便可。

更新appium

經過npm install -g appium 來更新appium便可

 

appium簡明教程(4)——appium client的安裝

 

appium client是對webdriver原生api的一些擴展和封裝。它能夠幫助咱們更容易的寫出用例,寫出更好懂的用例。

appium client是配合原生的webdriver來使用的,所以兩者必須配合使用缺一不可。

從本節開始,教程的內容將涵蓋3個語言,ruby/python/java。

本文版權歸乙醇全部,歡迎轉載,但請註明做者與出處,嚴禁用於任何商業用途

安裝appium client

ruby篇(必定要在線安裝)

ruby的appium client叫作appium lib,爲何是這樣就不解釋了,總之是歷史緣由。

首先update rubygem和bundler(說老實話,真的不須要,但官方文檔上這麼寫)

gem update --system ;
gem update bundler
 

而後使用gem安裝

gem uninstall -aIx appium_lib ;(這個也不是必須的)
gem install --no-rdoc --no-ri appium_lib
python篇(儘可能在線安裝)

推薦使用pip安裝

pip install Appium-Python-Client
固然了也能夠在Pipy上下載源碼安裝
tar -xvf Appium-Python-Client-X.X.tar.gz(windows上用7zip能夠解壓)
cd Appium-Python-Client-X.X
python setup.py install

最後,也能夠經過github安裝(要git客戶端)

git clone git@github.com:appium/python-client.git
cd python-client
python setup.py install
java篇(在線安裝)

java的話用maven安裝就能夠了

<dependency>
  <groupId>io.appium</groupId>
  <artifactId>java-client</artifactId>
  <version>1.3.0</version>
</dependency>

固然了,也能夠本身下載jar包,請自行選擇最新版本。

 

appium簡明教程(5)——appium client方法一覽

 

appium client擴展了原生的webdriver client方法

下面以java代碼爲例,簡單過一下appium client提供的適合移動端使用的新方法

  • resetApp()
  • getAppString()
  • sendKeyEvent()
  • currentActivity()
  • pullFile()
  • pushFile()
  • pullFolder()
  • hideKeyboard()
  • runAppInBackground()
  • performTouchAction()
  • performMultiTouchAction()
  • tap()
  • swipe()
  • pinch()
  • zoom()
  • getNamedTextField()
  • isAppInstalled()
  • installApp()
  • removeApp()
  • launchApp()
  • closeApp()
  • endTestCoverage()
  • lockScreen()
  • shake()
  • complexFind()
  • scrollTo()
  • scrollToExact()
  • openNotifications()
  • Context Switching: .context(), .getContextHandles(), getContext())

新增的locator

  • findElementByAccessibilityId()
  • findElementsByAccessibilityId()
  • findElementByIosUIAutomation()
  • findElementsByIosUIAutomation()
  • findElementByAndroidUIAutomator()
  • findElementsByAndroidUIAutomator()

這些方法主要覆蓋了3大類:

  • driver擴展:好比增長了resetApp等操做app的方法
  • action擴展:增長一些移動端的特有的action(怎麼描述呢,至關因而移動端 特有的操做),好比swipe,shake(嗯,有了這個方法就可讓代碼幫你搖一搖了)等;
  • locator擴展:增長了一些移動端專屬的定位策略

本文版權歸乙醇全部,歡迎轉載,但請註明做者與出處,嚴禁用於任何商業用途

下一節咱們開始介紹使用appium啓動android模擬器

 

appium簡明教程(6)——啓動appium及android模擬器

 

通常狀況下,咱們都從命令行啓動appium。

windows下,dos命令窗口輸入

appium

若是該命令報錯,那麼請重裝appium

npm install -g appium

若是安裝出錯,請自行更換npm源。

npm -g --registry http://registry.cnpmjs.org  install appium

而後請打開android的模擬器,若是沒有請新建一個虛擬設備。請自行解除設備鎖定(手動把屏幕解鎖了),以防萬一。

本文版權歸乙醇全部,歡迎轉載,但請註明做者與出處,嚴禁用於任何商業用途

下面的代碼以啓動android原生的計算器程序爲例

ruby篇

require 'appium_lib'

caps   = { caps:       { platformName: 'Android', appActivity: '.Calculator', appPackage: 'com.android.calculator2' },
           appium_lib: { sauce_username: nil, sauce_access_key: nil } }
driver = Appium::Driver.new(caps).start_driver

討論:能夠看出ruby lib裏面的Appium::Driver類實際上就是原生的webdriver類的子類,固然了,因爲ruby語法靈活,也可使用monkey patch來實現相似功能。

python篇

 

from appium import webdriver
desired_caps = {}
desired_caps['platformName'] = 'Android'
desired_caps['platformVersion'] = '4.2'
desired_caps['deviceName'] = 'Android Emulator'
desired_caps['appPackage'] = 'com.android.calculator2'
desired_caps['appActivity'] = '.Calculator'

driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)

 

討論:webdriver.Remote實際上就是原生webdriver的子類,另外Remote()構造函數的第一個參數中須要顯示指定appium server監聽的端口

java篇

新建java項目時候,請注意將selenium-webdriver以及appium client的jar包導入

 

import io.appium.java_client.AppiumDriver;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.remote.CapabilityType;
import org.openqa.selenium.remote.DesiredCapabilities;

DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability(CapabilityType.BROWSER_NAME, "");//這句不是必須的
capabilities.setCapability("deviceName","Android Emulator");
capabilities.setCapability("platformVersion", "4.4");
capabilities.setCapability("platformName","Android");
capabilities.setCapability("appPackage", "com.android.calculator2");
capabilities.setCapability("appActivity", ".Calculator");
AppiumDriver driver = new AppiumDriver(new URL("http://127.0.0.1:4723/wd/hub"), capabilities);

 

討論:AppiumDrvier是原生webdriver的子類。

在這裏咱們能夠看到,新建driver的時候必需要指定一個DesiredCapabilities 對象,該對象到底是何方神聖,咱們下一節會仔細講解。

appium簡明教程(7)——Desired Capabilities詳解

 

Desired Capabilities在啓動session的時候是必須提供的。

Desired Capabilities本質上是key value的對象,它告訴appium server這樣一些事情:

  • 本次測試是啓動瀏覽器仍是啓動移動設備?
  • 是啓動andorid仍是啓動ios?
  • 啓動android時,app的package是什麼?
  • 啓動android時,app的activity是什麼?

本文版權歸乙醇全部,歡迎轉載,但請註明做者與出處,嚴禁用於任何商業用途

Appium的Desired Capabilities是擴展了webdriver的Desired Capabilities的,下面的一些通用配置是須要指定的:
  • automationName:使用哪一種自動化引擎。appium(默認)仍是Selendroid?
  • platformName:使用哪一種移動平臺。iOSAndroid, orFirefoxOS?
  • deviceName:啓動哪一種設備,是真機仍是模擬器?iPhone SimulatoriPad SimulatoriPhone Retina 4-inchAndroid EmulatorGalaxy S4, etc...
  • app:應用的絕對路徑,注意必定是絕對路徑。若是指定了appPackage和appActivity的話,這個屬性是能夠不設置的。另外這個屬性和browserName屬性是衝突的。
  • browserName:移動瀏覽器的名稱。好比Safari' for iOS and 'Chrome', 'Chromium', or 'Browser' for Android;與app屬性互斥。
  • udid:物理機的id。好比1ae203187fc012g。
下面這些屬性是android平臺特定的:
  • appActivity:待測試的app的Activity名字。好比MainActivity, .Settings。注意,原生app的話要在activity前加個"."。
  • appPackage:待測試的app的java package。好比com.example.android.myApp, com.android.settings。

本文主要討論android平臺的appium測試方法和技巧,所以在這裏就不列出ios設備特定的屬性了。

更多信息請參考官方文檔

在這裏咱們發現,咱們常常要獲取app的package和activity名字,那麼有什麼工具可讓咱們方便的獲取到這些信息呢?下一節講回答這個問題。

 

appium簡明教程(8)——那些工具

 

monitor.bat(hierarchyviewer.bat已經不同意繼續使用了)

該文件位於your_andriod_sdk_pathtools下面。以乙醇的機器爲例,其位於E:adt-bundle-windows-x86-20131030sdktools下。

該工具能夠幫咱們找到android控件的content-description,爲之後的find_element_by_accessibility_id 定位方法作參數使用。

關於什麼是content-description,能夠參考官方文檔

本文版權歸乙醇全部,歡迎轉載,但請註明做者與出處,嚴禁用於任何商業用途

好,露個臉。

uiautomatorviewer.bat

該文件位於your_andriod_sdk_pathtools下面。以乙醇的機器爲例,其位於E:adt-bundle-windows-x86-20131030sdktools下。

該工具主要用來查看控件的屬性,好比resource id,class name等。

該工具也可查看被測app的appPackage(Desired Capabilities中使用)。

爆照。

好了,是否是感受還缺了點什麼呢?

確實如此,被測app的appActivity怎麼獲取呢?

下一講咱們詳細講解如何獲取被測app的appActivity。

appium簡明教程(9)——如何獲取android app的Activity

 

有時候在appium的Desired Capabilities中須要指定被測app的appActivity,下面的方法可能會對你有所幫助。

方法一

若有你有待測項目的源碼,那麼直接查看源碼就好。若是沒有,那麼請聯繫有源碼的同窗,這是推薦方法。

本文版權歸乙醇全部,歡迎轉載,但請註明做者與出處,嚴禁用於任何商業用途

方法二

若是你沒有代碼,那麼能夠反編譯該app。

這裏將用到2個工具,分別是dex2jar和jd-gui。你能夠在這裏下載目前爲止的最新版本以及示例apk。

咱們以工具包裏的ContactManager.apk爲例,簡單介紹一下反編譯的流程。

  • 1,重命名ContactManager.apk爲ContactManager.zip並解壓獲得文件classes.dex;
  • 2,解壓dex2jar-0.0.9.15.zip,並從命令行進入該文件夾;
  • 3,運行命令
d2j-dex2jar.bat path_toclasses.dex

在當前文件夾下獲得classes-dex2jar.jar;

  • 4,解壓jd-gui-0.3.6.windows.zip獲得文件jd-gui.exe;
  • 5,使用jd-gui.exe打開classes-dex2jar.jar;

嗯,好了,能夠盡情欣賞了。上圖。

上圖所示的ContactManager就是待測app的main activity。

方法三

參考testerhome的這個帖子

使用log查看大法(嗯,windows上沒grep不幸福,好在有powershell的Select-String,能夠拿來勉強一用),直接搬磚。

a、啓動待測apk

b、開啓日誌輸出:adb logcat>D:/log.txt
c、關閉日誌輸出:ctrl+c

d、查看日誌

找尋:

Displayed com.mm.android.hsy/.ui.LoginActivity: +3s859ms
appPackage = com.mm.android.hsy
appActivity = .ui.LoginActivity

好了,準備活動作的差很少了。下一節乙醇帶你們進行控件定位之旅。

appium簡明教程(10)——控件定位基礎

 

狹義上講,UI級的自動化測試就是讓機器代替人去點來點去的過程。

但機器去點什麼(點上面仍是點左邊),怎麼點(是長按仍是輕觸),這些東西是必須由代碼的編寫者所指示清楚的。

控件定位就是解決機器點什麼的問題的。

通常說來,咱們能夠這樣告訴機器:去點登錄按鈕

機器很笨,它並不知道什麼是登錄按鈕。由於登錄按鈕是天然語言的描述。

若是你讓一我的去點登錄按鈕,那麼他其實也是要通過一系列的腦補之後才能夠作這件事的。

這個腦補的過程還原以下:

這個必定是個按鈕

這個按鈕必定在被測的應用上

這個按鈕大概上面有登錄這個文字信息

嗯,還真有一個,那麼點吧。

這就是人探索性測試的一個簡單過程。通常來講,若是你給出的信息不太充分,人類仍是能夠經過一系列的探索性思惟去理解你的描述的。這個屬於心理學的問題,不展開解釋。

可是機器並非人,若是你給出的描述不精確的話,機器是不會自發性的進行探索和腦補的。

所以控件定位就是精確的描述控件特徵並告訴機器的過程。

本文版權歸乙醇全部,歡迎轉載,但請註明做者與出處,嚴禁用於任何商業用途

控件的特徵就是控件的屬性,咱們能夠經過上一講中的uiautomatorviewer去獲取。

在appium的定位世界裏,下面這些方法是能夠爲咱們使用的。也就是說,咱們經過下面幾個約定好的方式,按照webdriver和appium的DSL(自行搜索並理解)進行控件特徵的描述和定位。

繼承自webdriver的方法,也就是經過這3個特徵能夠定位控件

  • find by "class" (i.e., ui component type,andorid上能夠是android.widget.TextView)
  • find by "xpath" (i.e., an abstract representation of a path to an element, with certain constraints,因爲appium的xpath庫不完備的緣由,這個不太推薦)
  • find by "id"(android上是控件的resource id)

Mobile JSON Wire Protocol 協議中定義的方法,更適合移動設備上的控件定位

  • -ios uiautomation: a string corresponding to a recursive element search using the UIAutomation library (iOS-only)
  • -android uiautomator: a string corresponding to a recursive element search using the UiAutomator Api (Android-only)
  • accessibility id: a string corresponding to a recursive element search using the Id/Name that the native Accessibility options utilize.

在appium 的client對Mobile JSON Wire Protocol中定義的方法進行了封裝,使其調用起來更加方便

ruby篇

find_element :accessibility_id, 'Animation'
find_elements :accessibility_id, 'Animation'
find_element :uiautomator, 'new UiSelector().clickable(true)'
find_elements :uiautomator, 'new UiSelector().clickable(true)'

固然了,你也可使用原生的webdriver方法

find_element id: 'resource_id'

另外,ruby lib裏提供了一些很是好用的簡便方法來進行控件的定位,好寫,好讀。

  • text(value_or_index) :Find the first TextView that contains value or by index. If int then the TextView at that index is returned.
  • button(value_or_index):Find the first button that contains value or by index. If int then the button at that index is returned

更多請看這裏

python篇

複製代碼

el = self.driver.find_element_by_android_uiautomator('new UiSelector().description("Animation")')
self.assertIsNotNone(el)
els = self.driver.find_elements_by_android_uiautomator('new UiSelector().clickable(true)')
self.assertIsInstance(els, list)

el = self.driver.find_element_by_accessibility_id('Animation')
self.assertIsNotNone(el)
els = self.driver.find_elements_by_accessibility_id('Animation')
self.assertIsInstance(els, list)

複製代碼

總的來講就是在driver裏增長了

  • find_element_by_accessibility_id
  • find_elements_by_accessibility_id
  • find_element_by_android_uiautomator
  • find_element_by_android_uiautomator

等方法

java篇

前面也講過了,新增了這些方法

findElementByAccessibilityId()
findElementsByAccessibilityId()
findElementByIosUIAutomation()
findElementsByIosUIAutomation()
findElementByAndroidUIAutomator()
findElementsByAndroidUIAutomator()

討論:從上面能夠看出來,python 和 java client對移動端控件定位的封裝是比較初級的。ruby lib中封裝了不少方便和簡潔的方法,所以能夠看出,使用ruby lib是優於python和java的選擇。固然,若是忽略性能的話。

下一節咱們開始具體看下如何用resource id去定位控件。

appium簡明教程(11)——使用resource id定位

 

上一節乙醇帶你們瞭解了appium的定位策略。實際上appium的控件定位方式是徹底遵照webdriver的mobile擴展協議的。

這一節將分享一下如何使用resource id來定位android策略。

什麼是resource id,這個不屬於本文的範疇,你們能夠點這裏瞭解。

咱們能夠有兩種方式來使用resource id進行定位:

  • 使用 findElement(By.id("resourceId")) 的方式。這也是原生的webdriver定義的方法,不過居然在appium的官方文檔裏沒有說起,屬於隱藏技;
  • 使用 find_elements_by_android_uiautomator('new UiSelector().resourceId("the_id")') 的方式;關於uiautomator定位後面的教程會展開講解;

從上面的代碼片斷能夠看到,使用 find_element_by_id 的方式進行定位是最簡便的。

那麼怎麼獲取控件的resource id呢,使用uiautomatorviewer就能夠了。具體方法以下圖所示。

如今就以上圖所示的android原生計算器程序爲例,看一下每種語言是如何實現點擊【9】這個按鈕的。

目的

點擊計算器上的【9】這個按鈕。該按鈕的id是com.android.calculator2:id/digit6 。先甜後苦,從ruby開始。

本文版權歸乙醇全部,歡迎轉載,但請註明做者與出處,嚴禁用於任何商業用途

Ruby篇

複製代碼

require 'appium_lib'

caps   = { caps:       { platformName: 'Android', appActivity: '.Calculator', appPackage: 'com.android.calculator2' },
           appium_lib: { sauce_username: nil, sauce_access_key: nil, debug: true} }
dr = Appium::Driver.new(caps).start_driver

dr.find_element(id: 'com.android.calculator2:id/digit9').click

複製代碼

Python篇

複製代碼

#coding:utf-8
from appium import webdriver
from time import sleep

desired_caps = {}
desired_caps['platformName'] = 'Android'
desired_caps['platformVersion'] = '4.4'
desired_caps['deviceName'] = 'Android Emulator'
desired_caps['app'] = 'Calculator.apk'
desired_caps['appPackage'] = 'com.android.calculator2'
desired_caps['appActivity'] = '.Calculator'

dr = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
sleep(3)

dr.find_element_by_id('com.android.calculator2:id/digit9').click()

複製代碼

Java篇

複製代碼

//新建一個FindById類位於info.itest.www package下面
package info.itest.www;

import io.appium.java_client.AppiumDriver;
import java.net.MalformedURLException;
import java.net.URL;
import org.openqa.selenium.remote.CapabilityType;
import org.openqa.selenium.remote.DesiredCapabilities;

public class FindById {
    public static void main(String args[]) throws MalformedURLException {
        DesiredCapabilities cap = new DesiredCapabilities();
        cap.setCapability(CapabilityType.BROWSER_NAME, "");
        cap.setCapability("platformName", "Android");
        cap.setCapability("deviceName", "Android Emulator");
        cap.setCapability("platformVersion", "4.4");
        cap.setCapability("appPackage", "com.android.calculator2");
        cap.setCapability("appActivity", ".Calculator");

        AppiumDriver dr = new AppiumDriver(new URL("http://127.0.0.1:4723/wd/hub"), cap);

        dr.findElement(By.id("com.android.calculator2:id/digit9")).click();
    }
}

複製代碼

若是讀者對webdriver很熟悉的話,那麼掌握這個方法是很是簡單的。若是對webdriver不熟悉,那麼能夠參考乙醇的webdriver實用指南,先學習一下webdriver的基礎知識。

這一節咱們寫了一些腳本去進行控件定位,在實際的項目中,這些沒有任何斷言的腳本是基本上沒法完成測試用例的功能的。

先賣個關子,下下一節乙醇將會帶你們寫第一個appium的測試用例。

那麼下一節咱們將學習如何使用class name進行定位。

相關文章
相關標籤/搜索