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


 
 
                    
                
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号