转载

appium实现截图和清空EditText

前些日子,配置好了appium测试环境,至于环境怎么搭建,参考: http://www.cnblogs.com/tobecrazy/p/4562199.html

知乎Android客户端登陆: http://www.cnblogs.com/tobecrazy/p/4579631.html

在使用appium的过程中,发现一些appium的坑(后边会详说)。

adb基本命令总结(Android Debug Bridge)

adb 是PC和设备连接的桥梁,可以通过adb对devices进行相关操作

  • adb devices           列出你的devices
  • adb kill-server         杀掉adb服务(如果设备连接出问题,可尝试)
  • adb start-server      重启adb服务
  • adb shell                进入默认device的Linux shell,可以直接执行Linux命令
  • adb shell screenrecord /sdcard/runCase.mp4  录制视频保存,默认3min,也可以加--time-limit 60限制时间 
  • adb install jd.apk      向设备安装app
  • adb pull /sdcard/runCase.mp4 c:// 把手机中文件copy到电脑
  • adb push C://runCase.mp4 /sdcard/          把电脑中文件放到手机     

以上就是一些基本的adb 命令

appium实现截图

由于我有webdriver 的基础,理解起来比较easy,appium截图实际是继承webdriver的

selenium 中使用的是TakesScreenShot接口getScreenShotAs方法,具体实现如下

 1 /**  2      * This Method create for take screenshot  3      *   4      * @author Young  5      * @param drivername  6      * @param filename  7      */  8     public static void snapshot(TakesScreenshot drivername, String filename) {  9         // this method will take screen shot ,require two parameters ,one is 10         // driver name, another is file name 11  12         String currentPath = System.getProperty("user.dir"); // get current work 13                                                                 // folder 14         File scrFile = drivername.getScreenshotAs(OutputType.FILE); 15         // Now you can do whatever you need to do with it, for example copy 16         // somewhere 17         try { 18             System.out.println("save snapshot path is:" + currentPath + "/" 19                     + filename); 20             FileUtils 21                     .copyFile(scrFile, new File(currentPath + "//" + filename)); 22         } catch (IOException e) { 23             System.out.println("Can't save screenshot"); 24             e.printStackTrace(); 25         } finally { 26             System.out.println("screen shot finished, it's in " + currentPath 27                     + " folder"); 28         } 29     }

调用: snapshot((TakesScreenshot) driver, "zhihu_showClose.png");

你可以在捕获异常的时候调用,可以实现错误截图,做测试结果分析很有效

appium清空EditText(一个坑)

在使用appium过程中,发现sendkeys和clear方法并不太好使,只好自己封装模拟手工一个一个删除

这里用到keyEvent,具体内容请参考api http://appium.github.io/java-client/

要删除一段文字,该怎么做:

1. 获取文本长度

2. 移动到文本最后

3. 按下删除按钮,直到和文本一样长度

移动到文本最后: 123删除67

public static final int BACKSPACE 67
public static final int DEL 67
public static final int KEYCODE_MOVE_END 123

实现代码如下:

/**   * This method for delete text in textView   *    * @author Young   * @param text   */  public void clearText(String text) {   driver.sendKeyEvent(123);   for (int i = 0; i < text.length(); i++) {    driver.sendKeyEvent(67);   }  }

整个case的代码贴一下

初始化driver,执行cmd.exe /C adb shell screenrecord /sdcard/runCase.mp4 开始录制测试视频

执行login

执行修改知乎的个人介绍

package com.dbyl.core;  import org.apache.commons.io.FileUtils; import org.openqa.selenium.By; import org.openqa.selenium.OutputType; import org.openqa.selenium.TakesScreenshot; import org.openqa.selenium.WebElement; import org.openqa.selenium.remote.CapabilityType; import org.openqa.selenium.remote.DesiredCapabilities; import org.testng.Assert; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test;  import io.appium.java_client.android.AndroidDriver;  import java.io.File; import java.io.IOException; import java.net.URL; import java.util.List; import java.util.concurrent.TimeUnit;  public class zhiHu {  private AndroidDriver driver;   /**   * @author Young   * @throws IOException   */  public void startRecord() throws IOException {   Runtime rt = Runtime.getRuntime();   // this code for record the screen of your device   rt.exec("cmd.exe /C adb shell screenrecord /sdcard/runCase.mp4");   }   @BeforeClass(alwaysRun = true)  public void setUp() throws Exception {   // set up appium   File classpathRoot = new File(System.getProperty("user.dir"));   File appDir = new File(classpathRoot, "apps");   File app = new File(appDir, "zhihu.apk");   DesiredCapabilities capabilities = new DesiredCapabilities();   capabilities.setCapability(CapabilityType.BROWSER_NAME, "");   capabilities.setCapability("platformName", "Android");   capabilities.setCapability("deviceName", "Android Emulator");   capabilities.setCapability("platformVersion", "4.4");   // if no need install don't add this   capabilities.setCapability("app", app.getAbsolutePath());   capabilities.setCapability("appPackage", "com.zhihu.android");   // support Chinese   capabilities.setCapability("unicodeKeyboard", "True");   capabilities.setCapability("resetKeyboard", "True");   // no need sign   capabilities.setCapability("noSign", "True");   capabilities.setCapability("appActivity", ".ui.activity.GuideActivity");   driver = new AndroidDriver(new URL("http://127.0.0.1:4723/wd/hub"),     capabilities);   startRecord();  }   @Test(groups = { "login" })  public void login() {   // find login button   WebElement loginButton = driver.findElement(By     .id("com.zhihu.android:id/login"));   loginButton.click();    // wait for 20s   driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);    // find login userName and password editText   List<WebElement> textFieldsList = driver     .findElementsByClassName("android.widget.EditText");   textFieldsList.get(0).sendKeys("seleniumcookies@126.com");   textFieldsList.get(1).sendKeys("cookies123");   driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);    // find ok button byName   driver.findElementById("android:id/button1").click();   driver.manage().timeouts().implicitlyWait(90, TimeUnit.SECONDS);    // find keyword 首页 and verify it is display   Assert.assertTrue(driver.findElement(By.name("首页")).isDisplayed());   }   @Test(groups = { "profileSetting" }, dependsOnMethods = "login")  public void profileSetting() {    driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);   // find keyword 首页 and verify it is display   Assert.assertTrue(driver.findElement(By.name("首页")).isDisplayed());   WebElement myButton = driver.findElement(By     .className("android.widget.ImageButton"));   myButton.click();   driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);   driver.swipe(700, 500, 100, 500, 10);   driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);   List<WebElement> textViews = driver     .findElementsByClassName("android.widget.TextView");   textViews.get(0).click();   driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);    driver.findElementById("com.zhihu.android:id/name").click();   driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);    List<WebElement> showClose = driver     .findElementsById("com.zhihu.android:id/showcase_close");   if (!showClose.isEmpty()) {    snapshot((TakesScreenshot) driver, "zhihu_showClose.png");    showClose.get(0).click();   }   Assert.assertTrue(driver     .findElementsByClassName("android.widget.TextView").get(0)     .getText().contains("selenium"));    driver.findElementById("com.zhihu.android:id/menu_people_edit").click();   driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);   WebElement intro = driver     .findElementById("com.zhihu.android:id/introduction");   intro.click();   driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);   WebElement content = driver     .findElementById("com.zhihu.android:id/content");   String text = content.getAttribute("text");   content.click();   clearText(text);   content.sendKeys("Appium Test. Create By Young");    driver.findElementById("com.zhihu.android:id/menu_question_done")     .click();    WebElement explanation = driver     .findElementById("com.zhihu.android:id/explanation");   explanation.click();   driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);   content = driver.findElementById("com.zhihu.android:id/content");   text = content.getAttribute("text");   content.click();   clearText(text);   content.sendKeys("Appium Test. Create By Young. This is an appium type hahahahah");    driver.findElementById("com.zhihu.android:id/menu_question_done")     .click();   snapshot((TakesScreenshot) driver, "zhihu.png");   }   /**   * This method for delete text in textView   *    * @author Young   * @param text   */  public void clearText(String text) {   driver.sendKeyEvent(123);   for (int i = 0; i < text.length(); i++) {    driver.sendKeyEvent(67);   }  }   @AfterClass(alwaysRun = true)  public void tearDown() throws Exception {   driver.quit();  }   /**   * This Method create for take screenshot   *    * @author Young   * @param drivername   * @param filename   */  public static void snapshot(TakesScreenshot drivername, String filename) {   // this method will take screen shot ,require two parameters ,one is   // driver name, another is file name    String currentPath = System.getProperty("user.dir"); // get current work                 // folder   File scrFile = drivername.getScreenshotAs(OutputType.FILE);   // Now you can do whatever you need to do with it, for example copy   // somewhere   try {    System.out.println("save snapshot path is:" + currentPath + "/"      + filename);    FileUtils      .copyFile(scrFile, new File(currentPath + "//" + filename));   } catch (IOException e) {    System.out.println("Can't save screenshot");    e.printStackTrace();   } finally {    System.out.println("screen shot finished, it's in " + currentPath      + " folder");   }  }  }

这是运行中的两处截图:

appium实现截图和清空EditText

appium实现截图和清空EditText

正文到此结束
Loading...