一、Appium簡介
- appium是一款開源的,跨平臺的UI自動化測驗工具
- 適用于測驗原生的或者混合型的移動APP
- 支持IOS,Android,Firefox OS等平臺,同時該框架支持JAVA,Python,PHP等語言撰寫的測驗腳本,
- Appium與Selenium
appium類別庫封裝了標準Selenium客戶端類別庫,為用戶提供所有常見的JSON格式selenium命令以及額外的移動設備控制相關的命令,如多點觸控手勢和螢屏朝向,
二、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再將結果回傳給客戶端,

三、Appium測驗環境搭建
- 請移步:Appium學前準備
四、腳本開發基本步驟
1. DesiredCapabilities
DesiredCapabilities類提供了一些key value的物件,它告訴appium server這樣一些資訊:
- 需要測驗的平臺是什么:“platformName”,“Android”
- 需要測驗的設備名(序列號)是什么:“deviceName”,“Android Emulator”
- 需要測驗的平臺版本是:“platformVersion”,“4.4.4”
- 需要測驗的應用程式(包及首頁activity)
設備上app是否需要重復安裝:“noReset”,“true”
程式的包名:“appPackage”,“com.xiaomi.shop”
活動頁:“appActivity”,“com.xiaomi.shop2.activity.MainActivity”
比如:
// 獲取設備和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引數方法
- 平臺就android\ios\firefoxos
- 獲取設備名,就填:“Android Emulator”
- 獲取包名和活動頁:
- 使用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 - 使用adb查看,要先打開app,然后輸入以下命令
adb shell dumpsys window w | findstr mCurrent
- 使用aapt工具,查看針對有apk安裝包的情況,aapt工具在E:\ADT-bundle-windows-x86_64-20140321\adt-bundle-windows-x86_64-20140321\sdk\build-tools\android-4.4.2里
- 需要測驗的平臺版本號
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);
五、定位控制元件
- 定位控制元件有兩種方法
- 請移步:Appium學前準備
六、元素識別方法
- 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");
七、元素操作方法
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()
八、案例
- 在腳本運行前,需要將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單元測驗框架展示加斷言的腳本
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/186485.html
標籤:其他
