• 【转】以 java 为例,总结下 appium 里的一方法的使用心得


    转自:http://testerhome.com/topics/1043

    1、关于没有name,没有ID的元素的定位---通用篇
    解题思路:
    因为没有name,id;其实剩下的选择已不多,要么xpath,要么className。xpath木有好印象(稳定性不高,加之1.0x后需要写全路径,相当崩溃),我决定十分个人色彩的建议使用className。
    具体方法:
    用className获取所有该类型的元素;
    根据元素的位置确定元素的index;
    获取目标元素。
    示例:

    1. <span style="white-space:pre">    </span>//获取ImageView的所有元素  
    2.     List<WebElement> lis = driver.findElementsByClassName("android.widget.ImageView");  
    3.     //获取列表中第一个元素  
    4.     WebEelement targetEle = lis.get(0);  

    进阶:

    你可以自己定义一个className的常量,然后封装个方法,提供大家使用:

     

     
    1. public List<WebElement> getAllImges(){  
    2.     List<WebElement> lis = driver.findElementsByClassName(AndroidClassName.IMAGEVIEW);  
    3.     return lis;  
    4. }  

    使用的时候,就只需要调用此方法就可以了

    此方法的好处:通吃的方法,基本可解决定位的问题;能解决多语言(自然语言)的困扰;
    缺点:因为系统需要去获取List,就目前来看,运行效率不是很高,那直接是可以用肉眼看的到的速度在跑。。。

    2、关于没有name,没有ID的元素的定位---特用篇
    因为是特用,所以需要对页面元素做进一步的分析,找出其中的特性。这些特性主要为className,index,以及clickable等属性。
    场景1:同一个页面有10个ImageView对象,而我们的目标元素的index为4,而同为ImageView且index为4的页面只有2个。那我们就可以根据这2个条件来组合查询条件,提高效率。
    示例:

     
    1. List<WebElement> lis = driver.findElementsByAndroidUIAutomator("new UiSelector().className("+"android.widget.ImageView"+").index(4)");  



    基于这个场景可以封装一个方法:

    1. public List<WebElement> getElementsByClassAndIndex(String classname,int index){  
    2.     List<WebElement> lis =null;  
    3.     lis = driver.findElementsByAndroidUIAutomator("new UiSelector().className("+classname+").index("+index+")");  
    4.     return lis;  
    5. }  

    场景2:同一个页面有10个ImageView对象,而其中index为4的有5个,而这时我们发现我们的目标元素的是clickable的。然后review页面发现,同时满足上述条件的只有2个。那么。。。
    示例:

     
    1. List<WebElement> lis = driver.findElementsByAndroidUIAutomator("new UiSelector().className("+"android.widget.ImageView"+").index(4).clickable(true)");  

    同样可以封装一个方法:

     
    1. public List<WebElement> getElementsByClassAndIndexAndClickable(String classname,int index){  
    2.     List<WebElement> lis =null;  
    3.     lis = driver.findElementsByAndroidUIAutomator("new UiSelector().className("+classname+").index("+index+").clickable(true)");  
    4.     return lis;  
    5. }  

    场景3:在分析页面元素的时候发现,页面相对比较简单,而且其中只有目标元素的index为4.
    示例:
    driver.findElementByAndroidUIAutomator("new UiSelector().index("+index+")");
    同样得到一个方法

     
    1. public WebElement getElementByIndex(int index){  
    2. <span style="white-space:pre">    </span>return driver.findElementByAndroidUIAutomator("new UiSelector().index("+index+")");  
    3. }  



    3、关于输入框有默认text,且当你选中时,不会清空的清空的处理。
    类似的情况,用element.clear()是没有效果的。那怎么办呢? 不急,appium提供了很多的操作,直击不行,我们就上组合拳。
    示例:

     
    1. public void clear(WebElement el){  
    2.     //选中输入框  
    3.     el.click();   
    4.     //将光标移到最后  
    5.     driver.sendKeyEvent(123);  
    6.     //获取字符串长度  
    7.     String txt = el.getText();   
    8.     for(int i=0;i<txt.length();i++){  
    9.         driver.sendKeyEvent(67);//一个个的删除。。。。。  
    10.     }  
    11. }  

    4、关于UiAutomator无法识别的元素
    整体思路:不要忘了咱的手机是可以点击的。
    获取相对坐标,点击,就这么简单。(不用绝对坐标是保证程序能在不同的分辨率下运行)
    下面一起讨论下相对坐标的获取:找一个页面,这个页面上有相关的元素的位置与目标位置类似,或者根据这些元素能获取到目标的大致位置。
    上段代码,帮助理解

     
    1. public List<Point> getFileMngPoint(){  
    2.     List<Point> list = new ArrayList<Point>();  
    3.     WebElement scrol = driver.findElementByClassName(AndroidClassName.HORIZONTALSCROLL);  
    4.     List<WebElement> imgs = scrol.findElements(By.className(AndroidClassName.IMAGEVIEW));  
    5.     //以上仅获取类似位置的元素  
    6.     Point e0 = getCenterPoint(imgs.get(0));  
    7.     Point e1 = getCenterPoint(imgs.get(1), imgs.get(2));  
    8.     Point e2 = getCenterPoint(imgs.get(3));  
    9.     Point e4 = getCenterPoint(imgs.get(2),imgs.get(3));  
    10.     Point e5 = getCenterPoint(getElementsByClassAndIndexAndClickable(AndroidClassName.IMAGEVIEW, 0).get(4));  
    11.     //以上获取元素的中心坐标,相关方法是自己写的  
    12.     list.add(e0);  
    13.     list.add(e1);  
    14.     list.add(e2);  
    15.     list.add(e4);  
    16.     list.add(e5);  
    17.     return list;  
    18. }  

    思考:
    关于使用className的方法时,如果我们的list能在页面加载完成之后就能被缓存起来,那么其运行效率还能提高不少

  • 相关阅读:
    tfboys——tensorflow模块学习(二)
    瑞丽熵(renyi entropy)
    ELBO 与 KL散度
    tfboys——tensorflow模块学习(一)
    tf.InteractiveSession()与tf.Session()
    论-多租户技术
    商业级项目——基金客户端的架构设计与开发(下)(附源码)
    商业级项目——基金客户端的架构设计与开发(上)
    猜拳游戏案例
    动态数组的实现案例
  • 原文地址:https://www.cnblogs.com/wxll/p/6112716.html
Copyright © 2020-2023  润新知