实现appium的自动化,三步走,具体如下:
第一步:启动appium的服务端:
可以通过命令行的方式启动:cmd,然后输入appium,如下图
也可以打开桌面程序appium,点击右上角的运行按钮,如下图:
第二步,写自动化脚步,我这里用eclipse写的,使用appium的java客户端,如下图:
报错是因为我没有加载相应的包,加载一下就可以了,如下图红圈里面的这些包。(记得把Junit4或者是Testng也加载一下)
我先来说一下我的这个代码,我采用了MVC框架的思想,分为业务层(M),视图层(V),数据层(c)。
其中calculator.java文件,放的就是业务层的代码,在这里,我只关心业务层面,除非业务发生变化,否则我都无需修改写好的脚本。
po_android.java文件,我放的是页面元素,页面元素可以通过E:ADTsdk ools下的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中的运行按钮,就可以看到手机开始进行自动化测试了。