Appium自動化測試框架


1.基礎

--appium是一款開源的移動端自動化測試工具,支持ios和android平台上開發的APP

--appium支持跨平台使用,可使用同一套API來寫自動化測試腳本,在ios/android平台上測試,加大了代碼的復用性

--appium支持多語言,Python/Java/Ruby等

--appium真正的工作引擎其實是第三方自動化框架,無需在APP中植入appium特地代碼或第三方代碼

iOS:蘋果的UIAutomation框架

android 4.2+:Google的UIAutomator框架

android 2.3+:Google的Instrumentation框架

--appium把第三方框架封裝成一套API,稱為WebDriver(Selenium WebDriver),指定了客戶端到服務器的協議

--appium擴充了WebDriver的協議,添加了與移動測試自動化相關的API方法

--appium相關概念

C/S架構:客戶-服務器架構,只要客戶端能發送HTTP請求給服務器,客戶端就可使用多種編程語言實現;appium核心是一個Web服務器,該服務器提供了一套REST接口。服務器在收到客戶端命令后,會在移動設備上執行這些命令,后將執行結果放在HTTP響應中並返回客戶端。

會話:自動化總是在名為會話的上下文中進行。客戶端將初始化一個用來和服務器交互的會話,然后發送附有Desired Capabilities的JSON對象參數的POST請求/會話給服務器,服務器就會開始一個自動化的會話,返回一個會話ID,客戶端在得到這個ID后便開始發送后續命令。

Desired Capabilities:一些鍵值對的集合,告訴服務器要啟動怎樣的自動化會話。

Appium服務器:使用Node.js編寫,功能是監聽接口,接收PC客戶端發送的指令,將其轉換為移動設備能識別的指令,后發送給移動設備進行操作,再等待移動設備返回操作結果,並發送給客戶端。服務器可放在PC客戶端,也可放在雲端,默認端口號4723

Appium客戶端:主要指實現了Appium功能的WebDriver協議的客戶端庫,其中提供了一些封裝好的API以支持訪問移動端。客戶端提供了很多語言庫以支持JAVA等編程語言,這些語言庫讓Appium實現了對WebDriver協議的擴展。當使用Appium時,只需要使用這些語言庫代替常規的WebDriver庫就可以了

Appium Desktop:不僅封裝了運行Appium服務器所需的所有依賴元素,還提供了Inspector工具,以方便使用者檢查應用的界面元素的層級,從而簡化測試用例編寫

--Appium工作原理:(Appium基於WebDriver協議,並利用Bootstrap.jar來調用UIAutomator框架,進而執行指令)

編寫客戶端腳本-->開啟Appium服務器-->Appium服務器在收到客戶端請求后,將請求解析為UIAutomator可識別的指令,再將這些指令轉發給Android設備的Bootstrap.jar服務,默認使用4724端口-->調用UIAutomator,在設備上執行自動化測試並將結果返回給Appium服務器-->Appium服務器將執行結果返回給Appium客戶端

--Appium與Selenium

Appium類庫封裝了標准的Selenium客戶端類庫,為用戶提供了所有常見的JSON格式的Selenium命令以及額外的與移動設備控制相關的命令;Appium擴展了WebDriver協議,以前WebDriver API可繼承,Selenium WebDriver可直接拿來用

2.環境搭建

--需要:編程語言(java),appium client, appium server, android sdk, android studio/idea, android模擬器/android手機/iphone手機

--安裝Android SDK

Android SDK是android應用的軟件開發工具包,提供了android api庫和開發工具構建。 https://www.jianshu.com/p/2078112331fb Android SDK的安裝與環境變量配置

http://www.testclass.net/appium_base/appium-base-sdk

--.apk files are for android apps. / .ipa for iOS / Xcode是IOS的開發環境

--安裝java->安裝Android sdk->安裝Android studio(包含了Android sdk和Android模擬器)/IDEA->安裝appium客戶端-->安裝appium(服務器)->安裝android手機驅動(adb devices) / 打開模擬器

3.定位Appium元素的3個利器

--UI Automator Viewer:僅限Android系統

--Inspector:Android & IOS

--Chrome瀏覽器的ADB插件,主要用於基於瀏覽器的Web應用

4.Desired Capabilities

--Desired Capabilities在啟動session時必須提供

--Desired Capabilities本質上是key value的對象,客戶端將這些鍵值對發給服務端,告訴服務端啟動怎樣的會話

--Appium的Desired Capabilities是擴展了webdriver的Desired Capabilities的,一般需指定以下配置

platformName---使用哪種移動平台,ios, Android, FirefoxOS

deviceName--指定真機或模擬器的設備名稱,如Nexus_5X_API_29

automationName---使用哪種自動化引擎,appium(默認)or Selendroid  (非必須)/ UiAutomator2(目前公司用這個)

platformVersion---指定平台的系統版本,如Android平台,版本為5.1

appPackage---待測app的包名, 如com.example.android.myapp, com.android.settings

appActivity---待測app的活動名,如MainActivity, .Setting。注意:原生app的話要在activity前加"."

app---安裝包路徑,若android指定了appPackage和appActivity,則不需要該參數 (非必須)

browserName---使用的瀏覽器名稱,Chrome/Safari (非必須)

noReset---不重置應用,false(默認)或true (非必須)

--如何獲取deviceName

cmd-->adb shell getprop ro.product.model

--如何獲取platformVersion

cmd-->adb shell getprop ro.build.version.release

--如何獲取appPackage/appActivity

情況一:提供被測應用的APK包(適用於Android系統)

使用AAPT構建工具(C:\Users\yoyo\Android-SDK\build-tools\31.0.0\aapt.exe)

命令:cmd->aapt dump badging apk 包名,如 aapt dump badging apk fengkuangshuiguodazhan_112.apk

情況二:提供安裝了被測應用的手機設備

cmd-->adb logcat | grep Displayed

5.Android Studio學習教程

Android Studio 簡介丨慕課網教程 (imooc.com)

6.界面元素(控件)的定位

常見控件:文本框、按鈕、單選、復選框、滾動條、進度條等

定位單個元素

--driver.findElement(By.id("com.android.calculator2:id/formula")) --- resource-id 就是我們理解的id屬性 --driver.findElement(By.name("9")) --- text就是我們要查找的name WebElement button = driver.findElement(By.className("android.widget.Button")); --- 對應於class屬性 driver.findElement(By.xpath("//android.widget.Button[contains(@text,'7')]")).click(); //7 driver.findElement(By.xpath("//android.widget.Button[contains(@content-desc,'times')]")).click(); //* 出現class相同情況下可用控件的屬性值區分 java driver.findElementByAccessibilityId("plus").click(); --- Accessibility id就是contentDescription屬性, 就是content-desc (ByClassName/CssSelector/Id/LinkText/Name/PartialLinkText/TagName/Xpath)

--根據坐標定位元素 driver.tap([(936,1776)],10) 第一個參數是要操作的坐標,第二個是單擊操作的時長,默認毫秒

(該方法不建議使用,因為該方法對坐標有嚴重的依賴,若換了手機/模擬器,分辨率不同就會導致腳本失敗

driver.findElementByAndroidUIAutomator("new UiSelector().resourceId(\"com.hsbc.mobilebanking.insurance.sampleapp:id/dev\")").click();

driver.findElementByAndroidUIAutomator("new UiSelector().className(\"android.widget.Button\")").click();

IOS: iosClassChain();  / iosPredicateString();

定位多個元素

List<WebElement> listElement = driver.findElements(By.className(("android.widget.Button")));
listElement.get(0).click();

7.元素操作

TouchAction操作(輔助類)

TouchAction action = new TouchAction(driver);

1.按壓控件(通過手指按壓手機屏幕的某個位置) press(WebElement el) / 坐標點(x,y) press(int x, int y)

action.press(e1).release().perform()

action.press(x=0,y=308).release().perform()

--release()結束的行動取消屏幕上的指針

--perform()執行的操作發送到服務器的命令操作

2.長按控件 longPress(WebElement el, Duration duration) 以毫秒為單位,1000表示一秒鍾 action.longPress(e1,1000).perform();

3.點擊控件 tap(WebElement el)

action.tap(e1).perform();

4.移動 movTo(WebElement el, int x, int y) 將指針(光標)從過去指向指定的元素或點

action.moveTo(1 ,302).perform().release();

5.暫停 action.wait(1000); 單位為毫秒

模擬鍵盤操作

1.driver.findElements(By.name("Name")).sendKeys("jack");

2.pressKeyCode()方法為android特有

--driver.pressKeyCode(29); // 字母“a”

--driver.pressKeyCode(AndroidKeyCode.HOME);

上下文操作

上下文操作主要針對混合應用,混合應用就是APP里嵌入網頁。Android上的瀏覽器就屬於混合應用
1.獲取當前上下文 String cc = driver.getContext(); (cc = "NATIVE_APP')
2.獲取所有上下文句柄 getContextHandles();
3.調用 context () 方法,實參指定上下文的名稱,切換到特定的上下文中。 java driver.context (‘NATIVE_APP’) 

其他操作

1.當前Activity(Android only)
String ca = driver.currentActivity();

2.driver.findElement(By.id("com.android.calculator2:id/formula")).sendKeys() 模擬鍵盤輸入文本

3.拖拽操作 driver.drag_and_drop(e1,e2); //待修正

4.滑動 模擬用戶滑動。將控件或元素從一個位置(x,y)拖動到另一個位置(x,y)

WebElement e1 = driver.findElementById("com.android.systemui:id/slider");
int xpoint = e1.getLocation().getX();
int ypoint = e1.getLocation().getY();
int xmindpoint = xpoint + e1.getSize().getWidth()/2;
driver.swipe(xpoint,ypoint,xmindpoint,ypoint,0);

5.拉出文件,從設備中拉出文件 driver.pullFile('Library/AddressBook/AddressBook.sqlitedb')

6.推送文件,推動文件到設備中去 pushFile(String remotePath, byte[] base64Data)
String content = "some data for the file"; byte[] data = Base64.encodeBase64(content.getBytes()); driver.pushFile("sdcard/test.txt", data);

7.多點操作(圖片放大/縮小)

使用MultiAction類來實現多點操作(待補充)

8.手勢密碼(待補充)

TouchAction(driver).press(x=363,y=524).wait(1500).move_to(x=111,y=222).wait(1000).move_to...release().perform();

8.系統操作

driver.isLocked() 檢測屏幕是否已鎖屏

--在iOS設備可以設置熄屏一段時間。Android上面不帶參數,所以熄屏之后就不會再點亮屏幕了

driver.lockDevice(1000); // iOS driver.lockDevice(); //Android

driver.unlockDevice() 解鎖屏幕

driver.hideKeyboard() 隱藏系統鍵盤

9.應用操作

driver.installApp("D:\android\apk\ContactManager.apk"); --- 安裝應用到設備中去,需要apk包的路徑

driver.isAppInstalled('com.example.android.apis'); --- 檢查應用是否安裝,需要傳應用包的名字,返回true/false

activateAPP() 啟動android應用,參數為應用包名。如果應用未運行,則打開應用,若應用在后台,在將應用重新置於前台

java driver.removeApp("com.example.android.apis"); --- 刪除應用 ,從設備中刪除一個應用

closeApp() --- 關閉應用,默認關閉當前打開的應用,不需要入參,將應用置於后台,可通過launchApp()再次啟動

driver.closeApp(); driver.launchApp(); 重新啟動應用,該方法需要配合closeApp()使用的

driver.runAppInBackground(2); 將應用置於后台,需要入參,需要指定應用置於后台的時長

driver.resetApp(); --- 應用重置,重置當前被測程序到初始化狀態,該方法不需要入參

安裝和卸載應用

前提是模擬器已啟動;

模擬器或真機上安裝應用,.apk放到sdk的platform-tools目錄(與adb同一級別)-->cmd(cd C:\software\Android\Android\Sdk\platform-tools)-->adb install new_aos_app.apk

卸載應用 adb uninstall com.mobilebanking.hsbc.insurance.sampleapp(應用的包名)

10.Appium的其他功能

10.1 Appium的三種等待方式(針對頁面的元素沒有出現而無法定位元素)

(1)強制等待 Thread.sleep(3000);

(2) 顯示等待 根據條件是否滿足來決定是否終止等待,若在指定等待時間內發現元素,則無須等到指定等待時間即可提前終止輪詢,繼續執行后面語句,若等待時間找不到元素則拋出異常NoSuchElementException

WebDriverWait wait = new WebDriverWait(driver,3,1); 每1s檢測一次,最多檢測3s wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("kw66")));

(3)隱式等待

implicitly_wait()方法設定等待時間,單位秒,當界面上的全部元素都顯示出來后,才會執行后續語句。若界面全部元素顯示出來所需時間短於等待時間,會提前終止輪詢,執行后面語句;若到了等待時間依然找不到元素,則拋出異常

driver.manage().timeouts().implicitlyWait(2, TimeUnit.SECONDS);

10.2 斷言

10.3 獲取Toast元素的內容

--Toast元素:(一些提示信息)

Toast元素只包含一條簡易消息的提示框,作為浮動窗口,既不能獲得焦點也不能被單擊;存在時間很短,一般3~5s消失;無法被UI Automator View工具定位到

--可借助Xpath表達式字符串來定位Toast元素

10.4模擬滾動條操作 driver.swipe();

10.5捕獲因界面元素定位失敗產生的異常

print(traceback.print_exe());

截圖 driver.save_screenshot("err.png");

Addition:

1.IOS

—操作系統基於XNU內核,應用開發語言為swift(推薦)或objective-c

—ios自動化測試工具(框架):Appium, UIAutomation, XCUITest(目前公司用這個)

—模擬器  .app     真機 .ipa

—Desired Capabilities

{

  "platformName": "iOS",

  "deviceName": "iPhone 11",

  "platformVersion": "13.5",

  "automationName": "XCUITest",

  "udid": "345A96CB-1167-4140-B2E4-953FE0E576A1",

  "app": "/Users/xxxx/Downloads/MDev.app"

}

—模擬器命令:xcrun (Xcode command-line tool runner)

--真機命令

—解壓IPA文件獲取bundle id(待check)

把.ipa文件的后綴重命名為.zip, 解壓.zip壓縮包,會有一個Payload 文件夾. 點開Payload文件夾會有一個.app的文件.
右鍵點擊.app文件 -> Show Package content. 將會打開新的文件夾包含很多文件.
用Xcode打開文件info.plist,就可以找到bundle id, 類似 com…game

—元素定位方式   

othersText = MobileBy.iOSClassChain("**/XCUIElementTypeButton[`label == 'Others'`]");  ---原生支持的定位方式 ios class chain

uniquePageLocator = MobileBy.iOSNsPredicateString("label == 'accessibility_accounts_viewmore_close'");  ---原生支持的定位方式 ios predicate string

xpath, accessibility id, id, name

2.AOS

—操作系統基於Linux內核,應用開發語言Kotlin(推薦)或Java

—aos自動化測試工具(框架):Appium, UIAutomator, UIAutomator2(目前公司用這個)

—模擬器和真機  .apk

—Desired Capabilities

{

  "platformName": "android",

  "deviceName": "Android SDK built for x86",

  "platformVersion": "10.0",

  "automationName", "UiAutomator2"

  "appPackage": "com.xxxx”,

  "appActivity": "com.xxxx”

// “app”:”Users/xxxx/Downloads/MDev.apk”

}

—命令:adb (Android Debug Bridge安卓調試橋:用於電腦端和手機/模擬器之間的通信)

3.集成開發環境

xcode

—Xcode是蘋果公司向開發人員提供的集成開發環境,用於開發macOS, iOS, ipadOS, WatchOS和tvOS的應用程序

IDEA/Eclipse

—基於java的集成開發環境

Android studio

—Android Studio 是谷歌推出的一個Android集成開發工具,基於IDEA


免責聲明!

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



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