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

进阶:
你可以自己定义一个className的常量,然后封装个方法,提供大家使用:
public List<WebElement> getAllImges(){
List<WebElement> lis = driver.findElementsByClassName(AndroidClassName.IMAGEVIEW);
return lis;
}
使用的时候,就只需要调用此方法就可以了

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

2、关于没有name,没有ID的元素的定位---特用篇
因为是特用,所以需要对页面元素做进一步的分析,找出其中的特性。这些特性主要为className,index,以及clickable等属性。
场景1:同一个页面有10个ImageView对象,而我们的目标元素的index为4,而同为ImageView且index为4的页面只有2个。那我们就可以根据这2个条件来组合查询条件,提高效率。
示例:
List<WebElement> lis = driver.findElementsByAndroidUIAutomator("new UiSelector().className("+"android.widget.ImageView"+").index(4)");
基于这个场景可以封装一个方法:
public List<WebElement> getElementsByClassAndIndex(String classname,int index){
List<WebElement> lis =null;
lis = driver.findElementsByAndroidUIAutomator("new UiSelector().className("+classname+").index("+index+")");
return lis;
}

场景2:同一个页面有10个ImageView对象,而其中index为4的有5个,而这时我们发现我们的目标元素的是clickable的。然后review页面发现,同时满足上述条件的只有2个。那么。。。
示例:
List<WebElement> lis = driver.findElementsByAndroidUIAutomator("new UiSelector().className("+"android.widget.ImageView"+").index(4).clickable(true)");
同样可以封装一个方法:
public List<WebElement> getElementsByClassAndIndexAndClickable(String classname,int index){
List<WebElement> lis =null;
lis = driver.findElementsByAndroidUIAutomator("new UiSelector().className("+classname+").index("+index+").clickable(true)");
return lis;
}

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

3、关于输入框有默认text,且当你选中时,不会清空的清空的处理。
类似的情况,用element.clear()是没有效果的。那怎么办呢? 不急,appium提供了很多的操作,直击不行,我们就上组合拳。
示例:
public void clear(WebElement el){
el.click(); //选中输入框
driver.sendKeyEvent(123);//将光标移到最后
String txt = el.getText(); //获取字符串长度
for(int i=0;i<txt.length();i++){
driver.sendKeyEvent(67);//一个个的删除。。。。。
}
}

4、关于UiAutomator无法识别的元素
整体思路:不要忘了咱的手机是可以点击的。
获取相对坐标,点击,就这么简单。(不用绝对坐标是保证程序能在不同的分辨率下运行)
下面一起讨论下相对坐标的获取:找一个页面,这个页面上有相关的元素的位置与目标位置类似,或者根据这些元素能获取到目标的大致位置。
上段代码,帮助理解:
public List<Point> getFileMngPoint(){
List<Point> list = new ArrayList<Point>();
WebElement scrol = driver.findElementByClassName(AndroidClassName.HORIZONTALSCROLL);
List<WebElement> imgs = scrol.findElements(By.className(AndroidClassName.IMAGEVIEW));
//以上仅获取类似位置的元素
Point e0 = getCenterPoint(imgs.get(0));
Point e1 = getCenterPoint(imgs.get(1), imgs.get(2));
Point e2 = getCenterPoint(imgs.get(3));
Point e4 = getCenterPoint(imgs.get(2),imgs.get(3));
Point e5 = getCenterPoint(getElementsByClassAndIndexAndClickable(AndroidClassName.IMAGEVIEW, 0).get(4));
//以上获取元素的中心坐标,相关方法是自己写的
list.add(e0);
list.add(e1);
list.add(e2);
list.add(e4);
list.add(e5);

return list;
}

 
 

appium定位元素java篇【转】的更多相关文章

  1. Appium定位元素

    定位元素规则 和 Selenium Web自动化一样,要操作界面元,必须先定位(选择)元素. Appius是基于 Selenium的,所以和 Selenium代码定位元素的基本规则相同 find el ...

  2. Appium环境搭建Java篇

    1.下载.安装JDK&配置Java环境变量 JDK下载地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html ...

  3. iOSNsPredicate Appium 定位元素

    Appium使用WebDriverAgent之后,新增了一种定位方法iOSNsPredicate,总结了一下使用方法: MobileElement photo = driver.findElement ...

  4. Appium学习路—Android定位元素与操作

    一.常用识别元素的工具 uiautomator:Android SDK自带的一个工具,在tools目录下 monitor:Android SDK自带的一个工具,在tools目录下 Appium Ins ...

  5. Appium Android定位元素与操作

    文章写得很好,转载备用 一.常用识别元素的工具 uiautomator:Android SDK自带的一个工具,在tools目录下 monitor:Android SDK自带的一个工具,在tools目录 ...

  6. appium 使用findElementByAndroidUIAutomator 定位元素示例

    appium 使用findElementByAndroidUIAutomator 定位元素示例 import io.appium.java_client.remote.MobileCapability ...

  7. appium+python自动化49-yaml管理定位元素

    前言 如何高效管理定位元素,这个是很有学问的问题,也是面试必问的[以下纯属个人观点,勿喷!]. 有的人用xml管理页面定位元素,这种逼格略高,但是小编认为学习成本大,贼麻烦. 有的人提到用excel管 ...

  8. Appium Android 元素定位方法 原生+H5

    APPIUM Android 定位方式   1.定位元素应用元素 1.1通过id定位元素 Android里面定位的id一般为resrouce-id: 代码可以这样写: WebElement eleme ...

  9. Appium自动化(10) - appium高级元素定位方式之 UI Automator API 的详解

    如果你还想从头学起Appium,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1693896.html 前言 前面介绍过根据id,clas ...

随机推荐

  1. 【leetcode】Surrounded Regions(middle)☆

    Given a 2D board containing 'X' and 'O', capture all regions surrounded by 'X'. A region is captured ...

  2. 如何:使用PicturBox实现类似淘宝网站图片的局部放大功能

    转载至http://xuzhihong1987.blog.163.com/blog/static/267315872011822113131823/ 概要: 本文将讲述如何使用PictureBox控件 ...

  3. $(inherited) "$(SRCROOT) 修改.a文件的路径 --Library Search Paths

    $(inherited) "$(SRCROOT)/.a文件所在的文件名" //如果有多个.a文件格式就像这样 $(inherited) "$(SRCROOT)/xxxx& ...

  4. October 12th 2016 Week 42nd Wednesday

    Passion is momentary; love is enduring. 激情短暂,真爱长久. What is love? And what is real love? We are alway ...

  5. IIS6与IIS7中如何设置文件过期

    在IIS6中:一. 打开IIS管理器 二. 选中要设置的网站单击属性,打开站点属性菜单 三. 单击HTTP头选项卡 四. 单击 启用内容过期 如:设置30分钟后过期,此时间段后过期项中填30,单位选择 ...

  6. printf 打印 unit32_t

    今天在网上找了老半天终于找到了:printf 打印 uint32_t 类型  uint32_t domainId; printf("\ndomainId=========%lu", ...

  7. C语言字母频率统计

    在进行密码破解时有时候需要得到字母出现的频率信息,下面我将简单的使用C语言来读取一个文件,然后统计该文件内的字母出现的频率. 1.在D盘下新建一个文本文件(文件名为"A.txt") ...

  8. Android高性能ORM数据库DBFlow入门

    DBFlow,综合了 ActiveAndroid, Schematic, Ollie,Sprinkles 等库的优点.同时不是基于反射,所以性能也是非常高,效率紧跟greenDAO其后.基于注解,使用 ...

  9. yii2.0框架安装心得

    yii2.0安装心得 能够搜索到这篇文章的朋友相信是对yii框架有兴趣的,但是我不得不吐槽的是,这个安装过程确实让人头疼,接下来就让大家见证一下这个纠结的过程 根据官网的说法,安装这个框架需要用到co ...

  10. sdut 1592转置矩阵【稀疏矩阵的压缩存储】【快速转置算法】

    转置矩阵 Time Limit: 1000ms   Memory limit: 32768K  有疑问?点这里^_^ 题目链接:http://acm.sdut.edu.cn/sdutoj/proble ...