1. 程式人生 > >iOS appium自動化入門(MAC java)

iOS appium自動化入門(MAC java)

從網上雖然能找到很多關於appium iOS自動化的資料,但許多已經過時了。有用的資訊也較為分散。鑑於自己摸索了這麼長時間,踩過了許多坑,所以寫篇文章整理下appium iOS從入門到會基本的使用的經驗。紀念下我那些白瞎的抓狂時光。網上找到的很

1. appium介紹

appium是目前最為流行的app自動化工具。appium及appium周邊工具有:

  • appium伺服器:appium工具的主體,用來執行我們寫的自動化case程式碼
  • appium-doctor:可用於檢查本地環境中appium依賴的工具和配置是否完備
  • xcuitest:Apple官方支援的iOS平臺上的自動化工具
  • WebDriverAgent(wda):facebook開源的支援iOS自動化的代理工具,底層通過xcuitest來實現自動化。appium的iOS自動化即使用了wda來實現
  • inspector:wda啟動後,可使用啟動後日志中提示的url來訪問該工具,通常為http://localhost:8100/inspector。此工具左邊為iOS設務或模擬器的螢幕對映,中間為元素的層級結構,右邊為某個元素的資訊。
  • appium desktop: 一個桌面工具,可用來啟動appium伺服器和檢視真機或模擬器的頁面元素,檢視到的資訊wda提供的inspector類似。appium可通過npm安裝,也可以通過此dmg安裝。可檢視xpath。npm可以安裝最新的beta版本的appium,dmg一般安裝的是穩定版本的appium。
  • macaca app-inspector:阿里開源的一個工具,可用來檢視真機的頁面元素。比wda的inspector多一個xpath資訊。iOS自動化時,常使用xpath來定位元素。和appium desktop比,沒啥額外的功能。

2. 安裝appium及周邊工具介紹

根據appium github上的入門指導,https://github.com/appium/appium裡的Get Start,安裝appium環境主要分為以下幾步:

  • 安裝appium:可使用npm安裝,也可使用appium桌面安裝包安裝。如果使用ios模擬器來做自動化,因為ios版本通常較新,所以推薦使用npm安裝最新的beta版本的appium。否則可能會出現不能支援的情況。需要注意的事,使用npm install -g appium時,安裝得是最新的穩定版本的appium。安裝beta版本的appium,需要指定具體的版本號。可參看此文章 appium for Mac環境準備篇
      文章中提到速度較慢的解決辦法,除了FQ,還可以嘗試換一個node源。npm configset registry https://registry.npm.taobao.org 推薦使用淘寶的node映象。用國外的映象地址,npm安裝appium的時候會很慢。具體可參考 https://npm.taobao.org 。使用appium desktop安裝也挺方便的,還提供一個inspector。
  • appium-doctor: 安裝命令 cnpm install -g appium-doctor。一開始我使用npm install -g appium-doctor安裝,提示我許可權不足。嘗試使用sudo npm install -g appium-doctor安裝,也還是提示許可權不足。雖然不抱什麼希望,但還是嘗試使用 cnpm install appium-doctor安裝。倒是沒提示有錯誤,但是使用appium-doctor啟動檢查時,報找不到命令。最後發現沒有安裝到全域性造成的呼叫不成功。最後使用npm install -g appium-doctor安裝成功。
  • 特定的driver:常見前端自動化主要有iOS 和 Android裝置。做iOS app自動化,需要安裝The XCUITest Drive(for iOS apps);android需要安裝The UiAutomator2 Driver(for Android apps)。在安裝appium的時候,會帶有這些driver,不需要額外安裝。這篇文章裡,我們主要了解下xcuitest driver。根據appium的xcuitest driver github介紹,使用xctest需要滿足以下條件:
    •   iOS真機和模擬器從iOS 9.3以後開始支援xcuitest這個自動化測試工具。
    •   MAC上的作業系統macOS需要是 10.11 或 10.12,理解成>=10.11就可以吧
    •   Xcode的版本需>=7
    •   Appium的版本需>=1.6
    •   xcuitest driver所需的支援庫需要安裝完備

  在使用xctest之前,app平臺支援的uiautomator。

  • appium client:以上僅安裝了appium伺服器,還需要一個client將我們寫的case程式碼傳送給伺服器。appium支援多種程式語言,各自使用不同的client。如java語言使用java-client;python語言使用python-client。client下載與安裝是通過maven管理的。我們的case工程是一個maven工程,在pom.xml檔案中,加入
<dependency>
    <groupId>io.appium</groupId>
    <artifactId>java-client</artifactId>
    <version>6.0.0-BETA4</version>
    <scope>test</scope>
</dependency>
  • WebDriverAgent(wda)  appium下載完成後,會自帶一個wda。appium主要使用wda與ios裝置進行通訊。不知道為什麼,放在appium目錄下的wda工程不能編譯通過,但同樣的目錄放在其他地方就編譯成功了。還沒研究出來原因。不過這倒也不影響我們正常使用appium。

3. 執行

我們要執行一個demo case來驗證本地環境。首先,我們要有一個可用的真機或模擬器。其次,我們要把被測app安裝上去。第三,我們需要知道app上的元素如何定位。第四,我們寫一個test case來完成一些操作,再驗證某個測試點。第五,啟動appium伺服器。第六,執行case。

3.1 真機 VS 模擬器

iOS自動化,即可以跑在模擬器上,也可以跑在真機上。如果對ios自動化或開發不熟悉,我推薦從模擬器開始。這樣門檻會低一點。

3.1.1 真機

因為跑在真機上的app需要使用證書籤名,所以執行自動化的時候,需要對使用的wda使用與app相同的簽名進行重簽名。如何進行重簽名呢?具體可以參考這篇文章《前端app自動化相關》裡關於webdriveragent重簽名的部分。啟動wda的時候,除用命令列外,也可以點選工具欄中的Product - Test 或在/usr/local/lib/node_modules/appium/node_modules/appium-xcuitest-driver目錄下執行 xcodebuild -project WebDriverAgent.xcodeproj -scheme WebDriverAgentRunner test命令。

除重簽名外,真機使用的機器也需要加入到簽名使用的證書下。否則也無法成功執行wda。真機上安裝的包以.ipa為字尾。

如果未重簽名,appium會提示Unable to launch WebDriverAgent because of xcodebuild failure: xcodebuild failed with code 65,讓我們去看https://github.com/appium/appium-xcuitest-driver/blob/master/docs/real-device-config.md這裡的指導。我發現如果中使用單純的wda,按這個文件裡的方式可走通。但是在appium裡wda,完全按這個來,就會有各種錯誤…… 比如,使用./Scripts/bootstrap.sh -d 這個命令的時候,就會發現wda編譯不通過。後來發現,直接使用原目錄下的WebDriverAgent.xcodeproj,修改證書為個人證書,修改WebDriverAgentRunner的bundle為唯一,重新編譯就能成功了。再使用xcodebuild -project WebDriverAgent.xcodeproj -scheme WebDriverAgentRunner -destination 'id=<udid>' test能就成功連線真機了。

3.1.2 模擬器

安裝在模擬器上的app不需要簽名,所以在模擬器上執行環境搭建會稍微簡單一些。因為被測app是公司的app,所以我先使用xcode將原始碼編譯通過後,使其執行在某個選中的模擬器,如iPhone 8 Plus。至此,模擬器上有了我的被測app。模擬器上安裝的包以.app為字尾。可以在xcode的編譯結果中找到本地.app包的位置。自動化的時候需要使用。

3.2 iOS元素定位

可以使用appium desktop裡帶的appium inspector來檢視元素資訊,主要有accessibility id, xpath,name,label等。官方示例裡的app(http://appium.s3.amazonaws.com/TestApp7.1.app.zip) 的元素如下圖所示。常用的定位元素有accessibility id,xpath。appium不推薦使用xpath,xpath容易變動,易引起case的不穩定。

3.3 Demo case

3.3.1 Appium desired capability

寫case第一步,即是要連線上安裝有被測app的模擬器或真機裝置。我們需要在capability檔案中指明要連線裝置資訊。檔案內容通過如下:

1234567{"platformName":"iOS","platformVersion":"11.0","deviceName":"iPhone 7","automationName":"XCUITest","app":"/path/to/my.app"}

 當被測app是第三方應用時,在模擬器上,app 應為絕對路徑或指向app或.app.zip檔案的url;無需填udid資訊。在真上執行時,可填app或bundleId資訊,且必須填入真機的udid資訊。當被測app是apple的應用,如safari時,不填app或bundleId,而填"browserName": "Safari"。更多更全的capability內容可見Appium Desired Capabilities

  如果使用appium desktop1.4.1 的inspector,啟動appium(點選start servier。與命令列中使用appium效果相同。若先在命令列中啟動appium,再通過desktop啟動時,會報埠被佔用的錯誤)後,點選右上角的這麼大鏡符號,即進入inspector介面。如果啟動appium時使用預設配置,可選automatic server。需要編輯正確的capability檔案才可連線到被測裝置上。注意,iOS9.3以後的被測系統,需要加入automationName=XCUITest的配置。

連線成功後,即可看到如3.2中展示的頁面元素資訊。

3.3.2 java demo case

Appium API Documents給出了常用的appium api,寫case必備知識呀。 我使用idea程式設計,輸入driver.後,會自動提示所有支援的api。如果有不明白的地方,可以來查官方給出的documents。

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748package com.banma.crowdsource.autotest.cases;import io.appium.java_client.MobileBy;import io.appium.java_client.MobileElement;import io.appium.java_client.ios.IOSDriver;import org.openqa.selenium.WebDriver;import org.openqa.selenium.remote.DesiredCapabilities;import org.testng.Assert;import org.testng.annotations.AfterClass;import org.testng.annotations.BeforeClass;import org.testng.annotations.Test;import java.net.URL;import java.util.concurrent.TimeUnit;publicclassDemoTestCase {WebDriver driver;@BeforeClasspublicvoidsetUp() throws Exception{DesiredCapabilities capabilities =newDesiredCapabilities();capabilities.setCapability("deviceName","iPhone 8 Plus");capabilities.setCapability("platformVersion","11.3");capabilities.setCapability("platformName","iOS");capabilities.setCapability("bundleId","com.xxx.xxx");capabilities.setCapability("automationName","XCUITest");driver =newIOSDriver(newURL("http://0.0.0.0:4723/wd/hub"),capabilities);}@AfterClasspublicvoidtearDown(){driver.quit();}@TestpublicvoidtestDemo1() throws Exception{driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);//隱式等待MobileElement fieldOne = (MobileElement)driver.findElement(By.xpath("//XCUIElementTypeStaticText[@name=\"哈哈哈\"]"));fieldOne.click();MobileElement filedTwo = (MobileElement)driver.findElement(MobileBy.AccessibilityId("完成"));

相關推薦

iOS appium自動化入門MAC java

從網上雖然能找到很多關於appium iOS自動化的資料,但許多已經過時了。有用的資訊也較為分散。鑑於自己摸索了這麼長時間,踩過了許多坑,所以寫篇文章整理下appium iOS從入門到會基本的使用的經驗。紀念下我那些白瞎的抓狂時光。網上找到的很1. appium介紹appiu

Appium環境搭建MAC

cnblogs -1 tool releases 需要 ads ins source 程序 一、環境搭建 (1)安裝node.js brew install node (2)安裝Xcode 測試iOS App需要。打開Finder,在Applications文件夾下,看是否

Docker 入門Mac環境- part 2 容器container

username .py containe define 使用 soc _id nec 軟件 part-2 容器(container) 簡介 Docker架構有三個層面,從高到低如下: stack(棧) services(服務) containers(容器) 現在接觸的

Docker 入門Mac環境- part 4 swarms

ken token shu http code his ade owin -s part-4 Swarms 簡介 這一節主要是介紹一下如何在集群模式下部署docker應用;集群的概念很好理解了,多臺機器共同完成一項任務;和Hadoop那些集群一樣,docker也相當於有一個

Java基礎入門十一之基本數據包裝類以及簡單轉換

數據包 intvalue nbsp 1.5 lse false 永遠 ring jdk 一、 基本數據類型包裝類 引用數據類型一般為基本數據類型首字母大寫,除了int 、char,其中int的引用數據類型類Integer,char的引用數據類型為Character 關

Appium測試環境搭建Win7+java

為什麽 等待 下載 nis admin cut bubuko 系統變量 intel 安裝JDK環境 JDK下載地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html 環境變量配置:新建系統

java基礎原來這麼容易入門詳解

8種基本型別 int 整形 long 長整形 short 段整形 double 雙精度 float 單精度 char 字元型別 boolean 布林型別 byte 位元組型別 2 1995年由sun公司開發的 2009年 由oracle收購 3 2種技術平臺 java SE:標準版 java

appium環境搭建基於安卓mac系統

xxxx 下一步 ont 一個 device 實例名 系統版本 4.4 test 1.需要環境 JDK Python Andriod SDK Node.js Appium Appium-Python-Client Appium-doctor 2.安裝jdk(我的版本是1

java多線程快速入門十一

lee read .get java多線 als pub syn this ble 在方法上面加synchonizd用的是this鎖 package com.cppdy; class MyThread7 implements Runnable { privat

java多執行緒快速入門十一

在方法上面加synchonizd用的是this鎖 package com.cppdy; class MyThread7 implements Runnable { private Integer ticketCount = 100; public boolean falg = tr

java多執行緒快速入門十二

在靜態方法上面加synchonizd用的是位元組碼檔案鎖 package com.cppdy; class MyThread8 implements Runnable { private static Integer ticketCount = 100; public boolea

java多執行緒快速入門十六

ThreadLocal關鍵字實現每個執行緒有自己的變數 package com.cppdy; class Number { private int num; public static ThreadLocal<Integer> threadLocal = new Th

java多執行緒快速入門十八

Lock鎖是JDK1.5之後推出的併發包裡面的關鍵字(注意捕獲異常,釋放鎖) Lock與synchronized的區別   Lock鎖可以人為的釋放鎖(相當於汽車中的手動擋)   synchronized當執行緒執行完畢或者丟擲異常的話,鎖自動釋放(相當於汽車中的自動擋) Condition用法  

java多線程快速入門十八

user static 的區別 con als sync ack pack exceptio Lock鎖是JDK1.5之後推出的並發包裏面的關鍵字(註意捕獲異常,釋放鎖) Lock與synchronized的區別   Lock鎖可以人為的釋放鎖(相當於汽車中的手動擋)   

appium自動化基礎環境配置

APPIUM 基礎環境配置 文章來源:企鵝號 - 全棧軟體測試 1、安裝配置JDK 這個不用多說 常規操作 2、Android SDK 安裝 官方下載地址:https://developer.android.com/studio/index.html?hl=zh-cn 其他地址:

Java程式設計入門1.3Java虛擬機器

機器語言由非常簡單的指令組成,計算機的CPU可以直接執行這些指令。幾乎所有的程式都是用Java、Fortran或C++這樣的高階語言編寫的。由高階語言編寫的程式不能被任何計算機直接執行。首先,必須將其翻譯成機器語言。這種翻譯由一種稱為編譯器的程式完成,編譯器將高階語言翻譯成

JAVA---spring-boot入門圖文教程

Spring Boot可以輕鬆建立獨立的,生產級的基於Spring的應用程式,他的特徵:    1、建立獨立的Spring應用程式    2、直接嵌入Tomcat,Jetty或Undertow(無需部署WAR檔案)&nb

Appium自動化測試之座標介紹

針對一些不好定位元素或者需要滑動操作元素,無可避免的要用到座標去定位和操作,那麼手機的座標是怎麼定義的呢?如圖所示: 可以看出,座標相當於位於數學上座標系的第四象限,X表示橫軸,從左(0開始)向右依次增大;Y表示縱軸,從上(0開始)往下依次增大。這樣你就可以知道每個座標是什麼含義了。

Appium自動化測試之 swipe方法封裝

由於最新版本已不支援swipe方法,所以需要自己手動去封裝一些方法: package com.appiumTest.appiumdemo; import org.openqa.selenium.Dimension; import org.openqa.selenium.Point; im

Appium自動化測試之 常見錯誤

在appium實踐中,會出現各種問題: 1. 初始化driver錯誤 最新版的appium(java-client-5.0.4)呼叫 driver時,請注意語法:AndroidDriver< T> driver=new AndroidDriver< T&g