博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
appium实现截图和清空EditText
阅读量:7050 次
发布时间:2019-06-28

本文共 9021 字,大约阅读时间需要 30 分钟。

前些日子,配置好了appium测试环境,至于环境怎么搭建,参考:

                    知乎Android客户端登陆:

在使用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 is10         // driver name, another is file name11 12         String currentPath = System.getProperty("user.dir"); // get current work13                                                                 // folder14         File scrFile = drivername.getScreenshotAs(OutputType.FILE);15         // Now you can do whatever you need to do with it, for example copy16         // somewhere17         try {18             System.out.println("save snapshot path is:" + currentPath + "/"19                     + filename);20             FileUtils21                     .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 " + currentPath27                     + " folder");28         }29     }

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

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


appium清空EditText(一个坑)

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

这里用到keyEvent,具体内容请参考api 

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

1. 获取文本长度

2. 移动到文本最后

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

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

public static final int 67
public static final int 67

 

public static final int 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
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
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
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"); } }}

  

 这是运行中的两处截图:

 

 

 

 

 

 

 

 

 

 

 

转载地址:http://dnpol.baihongyu.com/

你可能感兴趣的文章
Eclipse自动部署项目到Tomcat的webapps下的有效方法
查看>>
Extjs4快速上手三——实现主界面
查看>>
如何替代Flex?
查看>>
控制属性修改时间,控制时间,联合主键
查看>>
android-包签名
查看>>
Android开发和调试必备工具-SDK Tools
查看>>
【LeetCode】107. Binary Tree Level Order Traversal II (2 solutions)
查看>>
《微软的软件测试之道》读书笔记 之 结构测试技术
查看>>
ASP.NET中Session的个人浅谈
查看>>
数学图形之Kuen Surface
查看>>
统计图表类型选择应用总结&表数据挖掘方法及应用
查看>>
【故障处理】CRS-1153错误处理
查看>>
快来熟练使用 Mac 编程
查看>>
ASP.NET MVC 3 网站优化总结(三)Specify Vary: Accept-Encoding header
查看>>
MVC5 + EF6 简单示例
查看>>
Spring-cloud & Netflix 源码解析:Eureka 服务注册发现接口 ****
查看>>
ORACLE里锁有以下几种模式,v$locked_object,locked_mode
查看>>
【树莓派】Linux 测网速及树莓派源
查看>>
Java用户线程和守护线程
查看>>
[TypeScript] Use the never type to avoid code with dead ends using TypeScript
查看>>