appium移動端自動化測試

1、Appium簡介

  • appium是一款開源的,跨平臺的UI自動化測試工具
  • 適用於測試原生的或者混合型的移動APP
  • 支持IOS,Android,Firefox OS等平臺,同時該框架支持JAVA,Python,PHP等語言編寫的測試腳本。
  • Appium與Selenium
    appium類庫封裝了標準Selenium客戶端類庫,爲用戶提供全部常見的JSON格式selenium命令以及額外的移動設備控制相關的命令,如多點觸控手勢和屏幕朝向。

2、appium運行原理

  • client端也就是咱們 test script,即selenium(webdriver)測試腳本。
  • 中間是Appium服務,Appium啓動一個Server(4723端口),它提供了一套REST的接口,Appium Server接收web driver client標準rest請求,解析請求內容,調用對應的框架響應操做。
  • appium server會把請求轉發給中間件Bootstrap.jar (它是用java寫的,安裝在手機上)Bootstrap監聽4724端口並接收appium 的命令,最終經過調用UiAutomator的命令來實現。
  • 最後Bootstrap將執行的結果返回給appium server。
  • appium server再將結果返回給客戶端。
    在這裏插入圖片描述

3、Appium測試環境搭建

4、腳本開發基本步驟

1. DesiredCapabilities

DesiredCapabilities類提供了一些key value的對象,它告訴appium server這樣一些信息:java

  • 須要測試的平臺是什麼:「platformName」,「Android」
  • 須要測試的設備名(序列號)是什麼:「deviceName」,「Android Emulator」
  • 須要測試的平臺版本是:「platformVersion」,「4.4.4」
  • 須要測試的應用程序(包及首頁activity)
    設備上app是否須要重複安裝:「noReset」,「true」
    程序的包名:「appPackage」,「com.xiaomi.shop」
    活動頁:「appActivity」,「com.xiaomi.shop2.activity.MainActivity」


好比:android

// 獲取設備和app的信息
	DesiredCapabilities des = new DesiredCapabilities();
	des.setCapability("platformName","Android");//平臺
	des.setCapability("deviceName","Android Emulator");//設備名
	des.setCapability("platformVersion","4.4.4");//版本號
	des.setCapability("noReset","true");//不重複安裝
	des.setCapability("appPackage","com.xiaomi.shop");//包名
	//活動頁
	des.setCapability("appActivity","com.xiaomi.shop2.activity.MainActivity");

2. 獲取DesiredCapabilities參數方法

  1. 平臺就android\ios\firefoxos
  2. 獲取設備名,就填:「Android Emulator」
  3. 獲取包名和活動頁:
    1. 使用aapt工具,查看針對有apk安裝包的狀況,aapt工具在E:\ADT-bundle-windows-x86_64-20140321\adt-bundle-windows-x86_64-20140321\sdk\build-tools\android-4.4.2裏
      aapt dump badging d:\\test.apk
    2. 使用adb查看,要先打開app,而後輸入如下命令
      adb shell dumpsys window w | findstr mCurrent
  4. 須要測試的平臺版本號
    adb shell getprop ro.build.version.release

3. 建立appuim對象

  • 須要在main函數的()旁邊加上異常處理throws MalformedURLException, InterruptedException
  • 如下代碼爲常規寫法:
    AppiumDriver driver = new AppiumDriver(new URL("http://127.0.0.1:4723/wd/hub"),des);

5、定位控件

6、元素識別方法

  • appium也是以webdriver爲基礎的,對於元素的定位也基本一致,只是增長一些更適合移動平臺的獨特方式

1. id定位

  • 主要看resource id的值:
  • 函數: driver.findElementById(resource_id的值);
  • 好比:
String str1 = dr.findElementById("com.xiaomi.shop.plugin.homepage:id/main_bottom_tab_discovery_text").getAttribute("text");

2. class定位

  • 主要看class的值
  • 函數: driver.findElementByClassName(class的值);
  • 好比:
String str2 = dr.findElementByClassName("android.widget.TextView").getAttribute("text");

3. AndroidUIAutomator定位

  • 主要看text的值
  • 函數: driver.findElementByAndroidUIAutomator(「text(\」中文\」)」);
  • 好比:
String str3=dr.findElementByAndroidUIAutomator("text(\"手機\")").getAttribute("text");

4. Accessibility ID定位

  • 主要看content-desc的值
  • 函數: driver.findElementByAccessibilityId(content-desc的值);
  • 好比:
String str4=dr.findElementByAccessibilityId("XXX").getAttribute("text");

5. Xpath定位

  • 主要看目標元素的位置
  • 函數:
    findElementByXPath(路徑)
    findElementByXPath(「//*[@resource-id=‘xxx’]」)

String str5 = "/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout[3]/android.widget.LinearLayout/android.widget.TextView";
String str6=dr.findElementByXPath(str5).getAttribute("text");

7、元素操做方法

1. 經常使用操做方法

  • click() 點擊
  • sendKeys() 模擬鍵盤輸入
  • clear() 清除
  • getattribute() 獲取屬性值

2. 針對應用的操做方法

  • 安裝應用:installApp();
  • 卸載應用:removeApp();
  • 關閉應用:closeAPP();
  • 啓動應用:launchApp()
  • 檢查應用是否安裝:isAppInstalled()
  • 將應用置於後臺:runAppInBackground()
  • 應用重置:resetApp()

3. 模擬手勢操做

//須要導包
import io.appium.java_client.TouchAction;

//要生成對象
TouchAction touchAction = new TouchAction(driver);
  • 按壓控件:press()
  • 長按控件:longPress()
  • 點擊控件:tap()
  • 移動:moveTo()
  • 暫停:wait()
  • 結束操做:release()
  • 將操做發送服務器:Perform()

4. 移動設備特有的操做

  • 息屏: lockDevice()
  • 當前Activity:currentActivity()
  • 收起鍵盤:hideKeyboard()
  • 滑動:swipe()
  • 拉出文件:pullFile()
  • 推送文件:pushFile()

8、案例

  • 在腳本運行前,須要將appium成打開狀態,保證adb環境已經配好,虛擬機也必須打開
  • 腳本運行速度很慢,咱們須要耐心等待

1. QQ正式版的登陸與退出

import io.appium.java_client.AppiumDriver;

import java.net.URL;

import org.openqa.selenium.remote.DesiredCapabilities;

public class A02login { 
	public static void main(String[] args) throws Exception { 
		// 獲取設備和app的信息
		DesiredCapabilities des = new DesiredCapabilities();
		des.setCapability("platformName","Android");//平臺
		des.setCapability("deviceName","Android Emulator");//設備名
		des.setCapability("platformVersion","4.4.4");//版本號
		des.setCapability("noReset","true");//不重複安裝
		des.setCapability("appPackage","com.tencent.mobileqq");//包名
		//活動頁
		des.setCapability( "appActivity","com.tencent.mobileqq.activity.LoginActivity");
		
		//建立鏈接appium對象
		AppiumDriver dr = new AppiumDriver(new URL("http://127.0.0.1:4723/wd/hub"),des);
		
		//用戶名
		dr.findElementByAccessibilityId("請輸入QQ號碼或手機或郵箱").clear();
		dr.findElementByAccessibilityId("請輸入QQ號碼或手機或郵箱").sendKeys("1530247895");
		//密碼
		dr.findElementByAccessibilityId("密碼 安全").clear();
		dr.findElementByAccessibilityId("密碼 安全").sendKeys("yangheng123456");
		//登陸
		dr.findElementById("com.tencent.mobileqq:id/login").click();
		
		Thread.sleep(3000);
		//拖動
// dr.swipe(123,764,123,200,2000);
// Thread.sleep(5000);
		
		dr.findElementById("com.tencent.mobileqq:id/conversation_head").click();
		Thread.sleep(1000);
		
		dr.findElementByAndroidUIAutomator("text(\"設置\")").click();
		
		dr.findElementByAndroidUIAutomator("text(\"賬號管理\")").click();
		
		dr.findElementByAndroidUIAutomator("text(\"退出當前賬號\")").click();		
		
		
		dr.findElementById("com.tencent.mobileqq:id/dialogRightBtn").click();
		
		
		Thread.sleep(3000);
		dr.quit();
			
		
	}
}

2. 小米商城購物

import io.appium.java_client.AppiumDriver;

import java.net.URL;

import org.openqa.selenium.remote.DesiredCapabilities;

public class A04XiaoMiShop { 

	public static void main(String[] args) throws Exception { 

		// 獲取設備和app的信息
		DesiredCapabilities des = new DesiredCapabilities();
		des.setCapability("platformName","Android");//平臺
		des.setCapability("deviceName","Android Emulator");//設備名
		des.setCapability("platformVersion","4.4.4");//版本號
		des.setCapability("noReset","true");//不重複安裝
		des.setCapability("appPackage","com.xiaomi.shop");//包名
		//活動頁
		des.setCapability("appActivity","com.xiaomi.shop2.activity.MainActivity");
		
		//建立鏈接appium對象
		AppiumDriver dr = new AppiumDriver(new URL("http://127.0.0.1:4723/wd/hub"),des);
		
		//分類
		dr.findElementById("com.xiaomi.shop.plugin.homepage:id/main_bottom_tab_category_txt").click();
		//電視
		dr.findElementByAndroidUIAutomator("text(\"電視\")").click();
		//激光投影電視
		dr.findElementByAndroidUIAutomator("text(\"激光投影電視\")").click();
		//米家投影儀 青春版2
		dr.findElementByAndroidUIAutomator("text(\"米家投影儀 青春版2\")").click();
		//加入購物車
		dr.findElementByAndroidUIAutomator("text(\"加入購物車\")").click();
		dr.findElementByAndroidUIAutomator("text(\"購物車\")").click();
		Thread.sleep(3000);
		dr.quit();
		
	}

}
  • 以上腳本不涉及斷言,後續會更新Junit單元測試框架展現加斷言的腳本
相關文章
相關標籤/搜索