appium实现截图和清空EditText
2015-06-21 20:52
281 查看
前些日子,配置好了appium测试环境,至于环境怎么搭建,参考:/article/4969978.html
知乎Android客户端登陆:/article/4969984.html
在使用appium的过程中,发现一些appium的坑(后边会详说)。
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 命令
selenium 中使用的是TakesScreenShot接口getScreenShotAs方法,具体实现如下
调用: snapshot((TakesScreenshot) driver, "zhihu_showClose.png");
你可以在捕获异常的时候调用,可以实现错误截图,做测试结果分析很有效
这里用到keyEvent,具体内容请参考api http://appium.github.io/java-client/
要删除一段文字,该怎么做:
1. 获取文本长度
2. 移动到文本最后
3. 按下删除按钮,直到和文本一样长度
移动到文本最后: 123删除67
实现代码如下:
整个case的代码贴一下
初始化driver,执行cmd.exe /C adb shell screenrecord /sdcard/runCase.mp4 开始录制测试视频
执行login
执行修改知乎的个人介绍
这是运行中的两处截图:
知乎Android客户端登陆:/article/4969984.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方法,具体实现如下
/** * 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"); } }
调用: 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"); } } }
这是运行中的两处截图:
相关文章推荐
- Android OpenGL ES(一)----必备知识
- 关于 android 的 view.getLeft(), getRight(), getTop(), getBottom() 的一些疑惑(坑)解答
- ViewController 的 loadView, viewDidLoad, viewDidUnload 分别是在什么时候调用的?
- iOS-Block的简单使用
- android 4.4删除短信
- Android学习笔记之AndroidManifest.xml文件解析
- android ActionBar
- oc 的优缺点
- AndroidStudio中百度地图接口使用配置相关总结
- 解决android studio ADB无响应的问题:If you'd like to retry,then please manually kill "adb.exe"
- 微信公众平台开发_OAuth2.0网页授权
- 使用touch事件实现手机网页右侧菜单栏拖动显示隐藏
- iOS 音乐类App必备功能:后台播放、锁屏封面、远程播放控制
- android 日历动画的实现
- Unity该插件NGUI学习(1)—— 环境结构
- android fragment的使用
- Android开发遇到的一些小坑洼
- Object基础语法Category、Extension、Protocol
- Android输入网址查看图片
- Android实现ExpandableTextView可扩展TextView