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環境準備篇
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。
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748 | package 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; public class DemoTestCase { WebDriver driver; @BeforeClass public void setUp() throws Exception{ DesiredCapabilities capabilities = new DesiredCapabilities(); 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 = new IOSDriver( new URL( "http://0.0.0.0:4723/wd/hub" ), capabilities); } @AfterClass public void tearDown(){ driver.quit(); } @Test public void testDemo1() 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 swarmsken 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.3):Java虛擬機器機器語言由非常簡單的指令組成,計算機的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 |