所谓Launcher,指的是安卓的桌面管理程序,全部的应用图标都放在launcher上面。事实上这是一个非常easy的样例,仅仅是为了验证几点想法而已。

1.实验目的

做这个试验的目的有二

  • 尝试下窗口滑动函数swipe的使用
  • 好奇到底能不能正常的对安卓的Launcher进行指定package和activity进行測试

2.实验背景

过程是打算使用appium来启动launcher,然后滑动窗体去获取在第三个桌面的sdk自带应用”Notes“。

例如以下图所看到的


3. 试验步骤

3.1 获得launcher的package和activity两个capabilities

能够通过HierarchyViewer直接查看获得

3.2 编码实现

  1. package majcit.com.AppiumDemo;
  2.  
  3. import io.appium.java_client.android.AndroidDriver;
  4.  
  5. import java.net.URL;
  6. import org.junit.Test;
  7. import org.junit.After;
  8. import org.junit.Before;
  9. import org.openqa.selenium.Dimension;
  10. import org.openqa.selenium.NoSuchElementException;
  11. import org.openqa.selenium.Point;
  12. import org.openqa.selenium.WebElement;
  13. import org.openqa.selenium.remote.DesiredCapabilities;
  14.  
  15. import static org.hamcrest.Matchers.*;
  16. import static org.hamcrest.MatcherAssert.assertThat;
  17.  
  18. /**
  19. * Unit test for simple App.
  20. */
  21. public class LauncherTest {
  22. /**
  23. * Create the test case
  24. *
  25. * @param testName name of the test case
  26. */
  27. private AndroidDriver driver;
  28.  
  29. @Before
  30. public void setUp() throws Exception {
  31. // set up appium
  32. //File classpathRoot = new File(System.getProperty("user.dir"));
  33. //File appDir = new File(classpathRoot, "apps");
  34. //File app = new File(appDir, "NotePad.apk");
  35. DesiredCapabilities capabilities = new DesiredCapabilities();
  36. capabilities.setCapability("deviceName","Android");
  37. //capabilities.setCapability("platformVersion", "4.2");
  38. //capabilities.setCapability("platformName", "Android");
  39. //capabilities.setCapability("app", app.getAbsolutePath());
  40. capabilities.setCapability("appPackage", "com.miui.home");
  41. capabilities.setCapability("appActivity", "com.miui.home.launcher.Launcher");
  42. //capabilities.setCapability("appActivity", ".NotesList");
  43. //capabilities.setCapability("autoLaunch", "false");
  44. //capabilities.setCapability("noReset", true);
  45. driver = new AndroidDriver(new URL("http://127.0.0.1:4723/wd/hub"), capabilities);
  46. }
  47.  
  48. @After
  49. public void tearDown() throws Exception {
  50. driver.quit();
  51. }
  52.  
  53. @Test
  54. public void launchNotePad() throws InterruptedException{
  55.  
  56. WebElement el = null;
  57. WebElement screen = null;
  58. Point point = null;
  59. Dimension size = null;
  60.  
  61. boolean found = false;
  62. int pageCount = 3; //Assume that there are totally 3 screens to be swiped.
  63.  
  64. int xStart = -1;
  65. int yStart = -1;
  66. int xEnd = -1;
  67. int yEnd = -1;
  68.  
  69. //Get the start and end coordinates for swipe
  70. Thread.sleep(3000);
  71. screen = driver.findElementById("com.miui.home:id/cell_layout");
  72. point = screen.getLocation();
  73. size = screen.getSize();
  74. xEnd = point.getX();
  75. yEnd = point.getY() + size.getHeight()/2;
  76. xStart = point.getX() + size.getWidth() - 5;
  77. yStart = yEnd;
  78.  
  79. System.out.println("starX:" + xStart +"\nstartY:" + yStart + "\nendX:" + xEnd + "\nendY:" + yEnd);
  80.  
  81. //本来想通过推断屏幕上的几个小圆点来推断到底有多少个屏幕的,但发觉xPath根本不起效,父文件夹感觉根本起不了定位作用,仅仅有最后的//android.widget.ImageView起效,所以一下找出75个元素。
  82.  
  83. /*
  84. List<WebElement> pageImages = driver.findElementsByXPath("//android.view.View/android.widget.LinearLayout/android.widget.ImageView");
  85. assertThat(pageImages.size(),is(3));
  86. for (WebElement e: pageImages) {
  87. e.click();
  88. }
  89. */
  90.  
  91. //Swipe all screens till get the expected control
  92. int currentPage = 0;
  93. while (found == false && currentPage < pageCount) {
  94. found = true;
  95.  
  96. currentPage += 1;
  97.  
  98. try {
  99. el = driver.findElementByName("Notes");
  100. }catch (NoSuchElementException e) {
  101. found = false;
  102. System.out.println(e);
  103. }
  104.  
  105. if (found == true)
  106. break;
  107.  
  108. driver.swipe(xStart, yStart, xEnd, yEnd, 100);
  109. Thread.sleep(1000);
  110. }
  111.  
  112. assertThat(found,is(true));
  113. assertThat(el,notNullValue());
  114.  
  115. el.click();
  116.  
  117. }
  118.  
  119. }

步骤说明大概例如以下:

  • 准备好必须的capabilities传送给appiumserver端。注意指定app,由于我们不须要又一次安装Launcher
  • 找到代表整个屏幕的控件,然后通过获取它的location和size属性来计算出滑动開始和结束的坐标。

    注意開始的坐标假设是屏幕的边界,须要调整下像素(样例中是减去5个像素)以防出错。

  • 通过滑动遍历每一个页面直到找到目标控件为止。

 

作者

自主博客

微信

CSDN

天地会珠海分舵

http://techgogogo.com

服务号:TechGoGoGo

扫描码:

http://blog.csdn.net/zhubaitian



Appium測试安卓Launcher以滑动窗口获得目标应用的更多相关文章

  1. 【转】Appium测试安卓Launcher以滑动窗体获得目标应用

    原文地址:http://blog.csdn.net/zhubaitian/article/details/39755553 所谓Launcher,指的是安卓的桌面管理程序,所有的应用图标都放在laun ...

  2. Appium - WebView測试(Android)

    Appium - WebView測试 作者: Max.Bai 时间: 2015/07 Appium - WebView測试(Android) 如今App都是混合型的.有原生的也包括WebView的,a ...

  3. (4.5.4)Android測试TestCase单元(Unit test)測试和instrumentationCase单元測试

    Android单元和instrumentation单元測试 Developing Android unit and instrumentation tests Android的单元測试是基于JUnit ...

  4. [DeeplearningAI笔记]卷积神经网络3.1-3.5目标定位/特征点检测/目标检测/滑动窗口的卷积神经网络实现/YOLO算法

    4.3目标检测 觉得有用的话,欢迎一起讨论相互学习~Follow Me 3.1目标定位 对象定位localization和目标检测detection 判断图像中的对象是不是汽车--Image clas ...

  5. MAC中在eclipse luna上搭建移动平台自己主动化測试框架(UIAutomator/Appium/Robotium/MonkeyRunner)关键点记录

    这几天由于原来在用的hp laptop的电池坏掉了,机器一不小心就断电.所以仅仅能花时间在自己的mackbook pro上又一次搭建整套环境.大家都知道搭建好开发环境是个非常琐碎须要耐心的事情,特别是 ...

  6. Appium IOS 自己主动化測试初探

    手机平台的自己主动化測试工具非常多,之前研究过了安卓和苹果的原生自己主动化測试框架.经一些同事介绍,貌似Appium是个不错的工具. 想记录一下研究的结果,也算是篇干货的文章 在网上也看了一些视频.个 ...

  7. iOS自己主动化測试的那些干货

    前言 假设有測试大佬发现内容不正确.欢迎指正,我会及时改动. 大多数的iOS App(没有持续集成)迭代流程是这种 也就是说.測试是公布之前的最后一道关卡.假设bug不能在測试中发现,那么bug 就会 ...

  8. 【Android开发-6】了解内情,我们须要一些调试和測试手段

    前言:人生不可能十全十美,总会有些遗憾存在,经历过遗憾,我们才懂的什么是生活. 程序也一样.追求完美,就必定会有经历bug存在的时候. 经历过不断的bug磨练.我们技术才会不断的成长.对于调试bug, ...

  9. Android单元測试之JUnit

    随着近期几年測试方面的工作慢慢火热起来.常常看见有招聘測试project师的招聘信息.在Java中有单元測试这么一个JUnit 方式,Android眼下主要编写的语言是Java,所以在Android开 ...

随机推荐

  1. N-Queens II leetcode java

    题目: Follow up for N-Queens problem. Now, instead outputting board configurations, return the total n ...

  2. Retrofit 从入门到了解【总结】

    源码:https://github.com/baiqiantao/RetrofitDemo.git 参考:http://www.jianshu.com/p/308f3c54abdd Retrofit入 ...

  3. 用于Web开发的8 个最好的跨平台编辑器

    1) Best Cross Platform IDE - Brackets Brackets是一个在前端Web开发和设计人员中最流行的开放源码IDE/代码编辑器之一.它拥有一些实用工具能够将HTML ...

  4. 一键切换皮肤的解决思想及iframe嵌套时寻找下级iframe的方法

    项目中有个一键切换皮肤的功能,感觉还不错,记录下,就是各颜色样式设置起来太复杂了,不知道有没有更简便的方法: 1.切换皮肤结构层 <li title="<s:text name= ...

  5. Oracle密码过期设置和修改密码问题

    Oracle密码过期设置和修改密码问题 学习了:https://jingyan.baidu.com/article/ce09321b5608612bff858ff3.html sqlplus / as ...

  6. kindle 电子书去除DRM

    DRM,Digital Rights Management,数字版权管理. amazon购买的图书会下发到你的kindle设备.电子书格式通常为.azw3.里面包括了DRM,仅仅能在你的设备上使用. ...

  7. mysql时间操作函数和存储过程

    因为业务须要统计一批数据.用到关于mysql的时间操作函数和存储过程,问题已经基本解决.把过程记录下: 1. mysql的语句中不支持直接用循环.循环仅仅能在存储过程中使用. 2. 写为文件时,注意一 ...

  8. windows 用户变量和系统变量的差别

    点击"我的电脑→属性→高级系统设置"标签的"环境变量"button,出现"环境变量"对话框,假设当前是以Administrator登录系统的 ...

  9. hdu-悼念512汶川大地震遇难同胞——珍惜现在,感恩生活

    http://acm.hdu.edu.cn/showproblem.php?pid=2191 Problem Description 急!灾区的食物依然短缺! 为了挽救灾区同胞的生命,心系灾区同胞的你 ...

  10. BIO、NIO、AIO差别

    网上非常多IO资料,对新手来说.越看越晕.依据自己的理解.总结对照了一下BIO.NIO.AIO. BIO:线程发起IO请求,无论内核是否准备好IO操作,从发起请求起,线程一直堵塞,直到操作完毕. 例如 ...