appium实现截图和清空EditText

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 java-client 6.1.0 API

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

1. 获取文本长度

2. 移动到文本最后

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

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

public static final intBACKSPACE67
public static final intDEL67

public static final intKEYCODE_MOVE_END123

 实现代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

/**

 * 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

执行修改知乎的个人介绍

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

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(70050010050010);

        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");

        }

    }

}

  

 这是运行中的两处截图:

​现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
分享他们的经验,还会分享很多直播讲座和技术沙龙
可以免费学习!划重点!开源的!!!
qq群号:485187702【暗号:csdn11】

最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走! 希望能帮助到你!【100%无套路免费领取】

  • 19
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值