Android,使用Appium,進行自動化測試
:warning:本文描述的是關於Appium,在Mac上面的使用方式。
注意,如果app裡面有WebView,那麼無法通過這個appium,
定點測試Webview 載入的某一個element;這個問題,已經搞2天了,
但是並沒有解決,如果大家有解決方案的話,
懇請賜教!
貼上學習連結:
//appium使用引導 http://www.automationtestinghub.com/appium-tutorial/ //UiScrollable的api https://developer.android.com/reference/android/support/test/uiautomator/UiScrollable
先講其他的也許會很難懂,先給大家最終結果:
手機放在桌子上面,沒人碰它,注意是沒人碰它!,突然之間,微信打開了,在朋友列表,找到你的女朋友,然後給她發了一條訊息,“我門分手吧!”。
Amazing ? ,這就是自動化!
手機上安裝的任何一個app,都能實現這種型別的操作。
比如,開啟精冬,收藏鐵三角SPORT7TW.
再比如,開啟大眾點評,給某一個商家,寫1星差評;
回到主題,我們要做的,其實是自動話測試,並不是給女朋友發訊息。下面分析一下,發訊息這個過程是怎麼實現的。
這段是重點,用Appium進行測試的過程: 用B語言(比如java、js等等)寫一個指令碼B1,B1的具體內容: “啟動微信,進入通訊錄,找到女朋友,發訊息”, 再通過工具A 執行指令碼B1。 然後,你的女朋友,就會收到分手訊息,是不是intereting?
上面的過程如何實現? 第1步, 配置環境 第2步, 寫指令碼 第3步, 準備好手機,並執行指令碼
第1步,如果你是新手,那麼流血是必然的,你會覺得世界非常的不友好
第2步,自動化測試的主體,所有的功能測試都是通過指令碼實現的,雖然你沒有點手機給女朋友發訊息,但是你的指令碼實現了這個發訊息的功能邏輯
第3步,最簡單,也許就是一個回車,也許就是點選一個執行button,在Android Studio 上面就是快捷鍵Command +R。
如何寫指令碼?
產品需求:“啟動微信,進入通訊錄,找到女朋友,發訊息”
轉換為程式碼邏輯:“找到微信Apk的包名、微信lauchActivity的simpleName,啟動微信;找到按鈕‘通訊錄’的id,click這個id;
滑動通訊錄列表,找到女朋友的id或者name,點選女朋友;
啟動軟體盤,輸入內容,點擊發送”,這就是上面的B1指令碼。
上面已經分析了 有3步,作為一個老手,第一步其實也非常簡單,我們今天不講第一步的內容,如果大家有需要,可以上BD或者GG搜尋下,如何配置Appium。
下面進入兩個主體,其一是指令碼語言,
其二是server工具。
第一,指令碼語言
實現B1指令碼,可以用java,javascript,python,objectC任意一種。
本文主要描述java 指令碼語言
首先, 我們看一個比較熟悉的程式碼模型:在webview裡面插入js程式碼:
/** * 其中jsToast是 .js檔案裡面的function, * 作用是彈出alert(Test) */ mWebView.loadUrl("javascript:jsToast(\"Test\")");
腳本里面的語法就跟 "javascript:jsToast("Test")",非常相似:
下面是示例,滑動RecyclerView,到item中的text為“曹操的故事”
MobileElement ele1 = driver.findElement(MobileBy.AndroidUIAutomator( "new UiScrollable("new UiSelector().resourceId(\"cn.t:id/mRecyclerView_id\")) .getChildByText("new UiSelector().className(\"android.widget.TextView\"),\"曹操的故事\")")); driver:非常重要的class,幾乎所有功能都需要用到它 ele1: MobileElement手機元素,在android裡面我門叫它View, 比如TextView,ImageView,類似html裡面的元素, cn.t: app包名 mRecyclerView_id: RecyclerView的id: 曹操的故事: 目標TextView的Text UiScrollable:類似RecyclerView UiSelector:類似View
我們把上面的例子拆解一下,理解起來要容易一些,分為2步
1,初始化RecyclerView RecyclerView:mRecyclerView ="new UiScrollable(new UiSelector().resourceId(\"cn.t:id/mRecyclerView_id\"))"; 2,滑動到"曹操的故事" mRecyclerView.getChildByText(new UiSelector().className(\"android.widget.TextView\"),\"曹操的故事\")
所有的命令都是通過字串的方式進行,上面2步合成一個字串str
MobileElement ele1 =driver.findElement(MobileBy.AndroidUIAutomator(str); 我們就拿到了view= ele1,並且滑動到這個位置
另外,在RecyclerView裡面滑動到某一個位置還有其他方式,比如.scrollIntoView(new UiSelector().text("曹操的故事"),文章頂部有個關於UiScrollable的連結,裡面有具體的api
第二,Server工具
很簡單,安裝Appium.dmg,就行了,並做下面的配置
Server Address:0.0.0.0
Server Port : 4723
Allow Session Override ::ballot_box_with_check:
關於Appium的測試過程就講完了,一句話:寫好指令碼,啟動Appium.dmg,
執行指令碼。
下面貼一份完整的除錯程式碼,功能是:清除快取
package cn.t; import org.openqa.selenium.By; import org.openqa.selenium.remote.DesiredCapabilities; import java.net.URL; import io.appium.java_client.AppiumDriver; import io.appium.java_client.MobileBy; import io.appium.java_client.MobileElement; import io.appium.java_client.android.AndroidDriver; public class Sample { static AppiumDriver<MobileElement> mDriver = null; public static void main(String[] args) { //String udid="ce19171899941ca80c7e"; String udid = "192.168.1.105:5555"; String dName = "Samsung Android Note10"; mDriver = initDriver(udid, dName); byCache(mDriver); } public static AppiumDriver<MobileElement> initDriver(String udid, String dName) { DesiredCapabilities caps = new DesiredCapabilities(); caps.setCapability("deviceName", dName); caps.setCapability("platformName", "Android"); caps.setCapability("platformVersion", "8.0.0"); caps.setCapability("udid", udid); caps.setCapability("appPackage", "cn.t"); caps.setCapability("appActivity", "cn.t.activity.AeActivity"); caps.setCapability("noReset", "true"); AppiumDriver<MobileElement> driver = null; try { driver = new AndroidDriver<MobileElement>(new URL("http://0.0.0.0:4723/wd/hub"), caps); } catch (Exception e) { } return driver; } public static AppiumDriver<MobileElement> byCache(AppiumDriver<MobileElement> driver) { try { //點選進入設定頁面 Thread.sleep(2000); driver.findElement(By.id("tvSetting")).click(); //點選清空按鈕 Thread.sleep(2000); MobileElement eleClear = driver.findElement(By.id("tvSubmit")); eleClear.click(); //終止Appiumservice Thread.sleep(2000); driver.quit(); } catch (Exception e) { } return driver; } }
。。。。