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;
}

转载于:https://www.cnblogs.com/longronglang/p/6135454.html

appium定位元素java篇【转】相关推荐

  1. appium java 点击坐标_appium定位元素java篇【转】

    1.关于没有name,没有ID的元素的定位---通用篇 解题思路: 因为没有name,id:其实剩下的选择已不多,要么xpath,要么className.xpath木有好印象(稳定性不高,加之1.0x ...

  2. Appium定位元素的几种方法总结

    目录 前言 1. 通过id定位 2. 通过className定位 3. 通过AccessibilityId定位 4. 通过xpath定位 4.1 常规定位 4.2 contains模糊定位 4.3 组 ...

  3. Appium 定位元素

    启动Appium服务器,点击放大镜图标 配置Appium参数 启动会话 进入模拟器界面,此界面显示ID,xpath elementId:不能用定位元素 resource-id:不是唯一 开始定位(1. ...

  4. Appium自动化测试元素定位方式

    appium 定位元素  1.appium服务器工具定位 Start inspector Session 2.打开uiautomatorviewer.bat android-sdk-windows(S ...

  5. seleniumpython定位网页元素方法_Python+Selenium 定位元素

    1.摘取网页上所有邮箱 练习场景:在某一个网页上有些字段是我们感兴趣的,我们希望摘取出来,进行其他操作.但是这些字段可能在一个网页的不同地方.例如,我们需要在关于百度页面-联系我们,摘取全部的邮箱. ...

  6. Appium+python自动化(九)- 定位元素工具(义结金兰的两位异性兄弟)(超详解)...

    简介 环境搭建好了,其他方面的知识也准备的差不多了,那么我们就开始下一步元素定位,元素定位宏哥主要介绍如何使用uiautomatorviewer,通过定位到页面上的元素,然后进行相应的点击等操作. 此 ...

  7. python+appium判断元素存在_python自动化测试应用--Appium元素篇

    1.1概要 本篇将对和界面元素相关的内容做讲解,比如,查找元素的几种常见方法,还将介绍如何查看app界面上的元素去做定位,最后还将新手经常遇到的问题做个简单的回答. 1.2 查找app界面元素的工具 ...

  8. appium怎么操作物理返回键_这些Appium常用元素定位技巧,你掌握了几种?

    今天跟大家分享下Appium的元素定位的一些小技巧. Appium对于处理原生的android应用直接通过uiautomatorviewer.bat这个工具来获取元素定位. 在开始appium元素定位 ...

  9. appium手机APP自动化定位元素

    目录 1 什么事手机app自动化,作用和特点 2 自动化原理: 3 定位元素 根据ID 根据CLASS NAME 根据ACCESSIBILITY ID Xpath 1 什么事手机app自动化,作用和特 ...

最新文章

  1. C++ explicit关键字详解(转载)
  2. 虚拟服务器系统一般用那种,虚拟主机 选什么系统
  3. php框架where条件使用,where条件
  4. 利用OpenCV的compareHist函数作直方图的相似度对比的源程序
  5. java设置窗口不可移动_Java – JDialog不可移动
  6. 遮掩java_css之图片下方定位遮掩层
  7. Argument list too long 文件数过多
  8. sql 数据检索后的替换格式化
  9. CXF开发WebService服务器端
  10. 【2019】微软Power BI 每月功能更新系列——Power BI 8月版本功能完整解读
  11. matlab非牛顿流体,可用于常见非牛顿流体的数值模拟方法与流程
  12. java做 binggo,CONTRIBUTING.md
  13. WIndows禁用笔记本键盘
  14. Android 仿QQ好友列表功能实现
  15. Xcelsius 2008 sp3的新部件与新功能
  16. 关于时间的SQL条件查询
  17. echarts 制作图表固定的三个步骤
  18. Mininet系列实验(三):Mininet命令延伸实验扩展
  19. Oracle_登录数据库系统
  20. EBCDIC、ASCII与EBCDIC的关系及相互转化

热门文章

  1. NeurIPS 2020 | 基于“单目标域样本”的领域自适应方法
  2. C语言不挂科之我爱谭浩强——选择填空拿满分(附例题答案和知识点详解)
  3. 自动驾驶使用贝塞尔曲线进行静态障碍物避障测试
  4. java通过url下载缓存_java url 下载
  5. ajax漏洞 console_在实战中可能碰到的几种ajax请求方法详解
  6. android 时间差 秒_Android 根据两个时间戳计算时间差(亲测可用)
  7. linux磁盘划分注意,划分磁盘阵列注意问题
  8. mysql中in和exists的应用场景_mysql中关于in和exists的使用
  9. vue.js表格赋值_vue.js input框之间赋值方法
  10. 近一个月来的学习总结(今天的你比昨天的你进步了吗?)