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"); } } }
这是运行中的两处截图: