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測試環境搭建
- 請移步: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參數方法
- 平臺就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);
5、定位控件
- 定位控件有兩種方法
- 請移步:Appium學前準備
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單元測試框架展現加斷言的腳本