實現appium的自動化,三步走,具體如下:
第一步:啟動appium的服務端:
可以通過命令行的方式啟動:cmd,然后輸入appium,如下圖
也可以打開桌面程序appium,點擊右上角的運行按鈕,如下圖:
第二步,寫自動化腳步,我這里用eclipse寫的,使用appium的java客戶端,如下圖:
報錯是因為我沒有加載相應的包,加載一下就可以了,如下圖紅圈里面的這些包。(記得把Junit4或者是Testng也加載一下)
我先來說一下我的這個代碼,我采用了MVC框架的思想,分為業務層(M),視圖層(V),數據層(c)。
其中calculator.java文件,放的就是業務層的代碼,在這里,我只關心業務層面,除非業務發生變化,否則我都無需修改寫好的腳本。
po_android.java文件,我放的是頁面元素,頁面元素可以通過E:\ADT\sdk\tools下的uiautomatorviewer.bat程序獲取。
還有一個數據層,當你需要進行數據的參數化時,就需要用到了,比如用10個不同的用戶和密碼進行不斷的登錄和退出。我這里沒有創建數據層,如果需要,建一個data.java即可。
還有就是app目錄,把需要執行的apk包放到這里即可。
顯附上我的代碼:
calculator.java

1 package com; 2 /*問題匯總 3 * 1.觸摸和多點觸摸 4 * 2.等待元素出現時間 5 * 3.多端口多手機進行自動測試 6 * 4.參數化 7 * 5.異常情況不退出程序,繼續執行到完 8 * 9 * */ 10 import java.io.File; 11 import java.net.URL; 12 import java.util.List; 13 14 import org.junit.AfterClass; 15 import org.junit.Assert; 16 import org.junit.BeforeClass; 17 import org.junit.Test; 18 import org.openqa.selenium.By; 19 import org.openqa.selenium.WebElement; 20 import org.openqa.selenium.remote.DesiredCapabilities; 21 22 import io.appium.java_client.AppiumDriver; 23 import io.appium.java_client.TouchAction; 24 import io.appium.java_client.android.AndroidDriver; 25 import page_object.android.po_android; 26 27 import static org.junit.Assert.*; 28 29 public class calculator { 30 private static AppiumDriver<WebElement> driver; 31 private po_android po = new po_android(); 32 @BeforeClass 33 public static void setUp() throws Exception { 34 File classpathRoot = new File(System.getProperty("user.dir")); 35 File appDir = new File(classpathRoot, "/app"); 36 File app = new File(appDir, "mywork.apk"); 37 DesiredCapabilities capabilities = new DesiredCapabilities(); 38 capabilities.setCapability("deviceName","Android Emulator"); 39 capabilities.setCapability("platformVersion", "5.0"); 40 capabilities.setCapability("app", app.getAbsolutePath()); 41 // capabilities.setCapability("appPackage", "org.solovyev.android.calculator"); 42 // capabilities.setCapability("appActivity", ".CalculatorActivity"); 43 capabilities.setCapability("appPackage", "com.witdoing.mywork"); 44 capabilities.setCapability("appActivity", ".view.welcome.WelcomeActivity"); 45 capabilities.setCapability("unicodeKeyboard", "True"); 46 capabilities.setCapability("resetKeyboard", "True"); 47 48 driver = new AndroidDriver<>(new URL("http://127.0.0.1:4723/wd/hub"), capabilities); 49 Thread.sleep(5000); 50 } 51 52 @AfterClass 53 public static void tearDown() throws Exception { 54 driver.quit(); 55 } 56 57 //登錄 58 @Test 59 public void apiDemo01() throws Exception{ 60 Thread.sleep(5000); 61 driver.findElementById(po.logid).clear(); 62 driver.findElementById(po.logid).sendKeys("15850506429"); 63 64 driver.findElementById(po.passwd).clear(); 65 driver.findElementById(po.passwd).sendKeys("654321"); 66 67 driver.findElementById(po.login).click(); 68 69 } 70 71 //訂單 72 @Test 73 public void apiDemo02() throws Exception{ 74 75 driver.findElement(By.id(po.order_layout)).click(); 76 driver.findElementById(po.iv_title_back).click(); 77 78 79 } 80 81 //我做ing 82 @Test 83 public void apiDemo03() throws Exception{ 84 85 driver.findElementById(po.work_layout).click(); 86 driver.findElement(By.id(po.iv_title_back)).click(); 87 88 } 89 90 //設置-關於我做 91 @Test 92 public void apiDemo04() throws Exception{ 93 94 driver.findElementById("com.witdoing.mywork:id/setting_tv").click(); 95 driver.findElement(By.id("com.witdoing.mywork:id/about_tv")).click(); 96 Assert.assertEquals("關於我做",driver.findElementById("com.witdoing.mywork:id/tv_title_text").getText()); 97 Assert.assertEquals("版本 1.0.5", driver.findElementById("com.witdoing.mywork:id/version_tv").getText()); 98 List<WebElement> els = driver.findElementsByClassName("android.widget.TextView"); 99 assertEquals("官方微信: witdoing", els.get(4).getText()); 100 driver.findElementById(po.iv_title_back).click(); 101 } 102 103 //設置-昵稱 104 @Test 105 public void apiDemo05() throws Exception{ 106 driver.findElementById("com.witdoing.mywork:id/nick_tv").click(); 107 driver.findElement(By.id("com.witdoing.mywork:id/nick_edit")).click(); 108 driver.findElement(By.id("com.witdoing.mywork:id/nick_edit")).sendKeys("我的名字叫什么2"); 109 driver.findElementById("com.witdoing.mywork:id/save_btn").click(); 110 driver.findElementById("com.witdoing.mywork:id/dialog_confirm_btn").click(); 111 driver.findElementById(po.iv_title_back).click(); 112 Assert.assertEquals("我的名字叫什么",driver.findElementById("com.witdoing.mywork:id/nick_tv").getText()); 113 driver.findElementById(po.iv_title_back).click(); 114 } 115 116 //設置-寶庫 117 @Test 118 public void apiDemo06() throws Exception{ 119 driver.findElementById("com.witdoing.mywork:id/treasury_layout").click(); 120 List<WebElement> els = driver.findElementsById("com.witdoing.mywork:id/title_tv"); 121 Assert.assertEquals("寶庫新分享了一篇文章[自動化測試問題匯總V3]。", els.get(1).getText()); 122 els.get(1).click(); 123 124 WebElement el = driver.findElementById("com.witdoing.mywork:id/content_img"); 125 TouchAction action = new TouchAction(driver); 126 action.longPress(el).moveTo(100, 120); 127 128 129 Thread.sleep(5000); 130 driver.findElementById(po.iv_title_back).click(); 131 driver.findElementById(po.iv_title_back).click(); 132 133 } 134 135 136 }
po_android.java

1 package page_object.android; 2 3 import org.openqa.selenium.WebElement; 4 import org.openqa.selenium.support.FindBy; 5 6 public class po_android { 7 8 public String logid = "com.witdoing.mywork:id/user_edit" ; 9 public String passwd = "com.witdoing.mywork:id/pwd_edit" ; 10 public String login = "com.witdoing.mywork:id/login_btn" ; 11 public String order_layout = "com.witdoing.mywork:id/order_layout" ; 12 public String iv_title_back = "com.witdoing.mywork:id/iv_title_back" ; 13 public String work_layout = "com.witdoing.mywork:id/work_layout" ; 14 15 16 @FindBy(id="com.witdoing.mywork:id/tv_title_text") 17 public WebElement wzid; 18 19 }
第三步:
手機插入電腦,先安裝一下手機驅動(如果自行安裝失敗的話,可以通過驅動人生進行安裝)。
然后打開命令行cmd,輸入adb查看手機設備是否已經被識別到。
如果識別到了,這時執行eclipse中的運行按鈕,就可以看到手機開始進行自動化測試了。