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

进阶:
你可以自己定义一个className的常量,然后封装个方法,提供大家使用:
public List getAllImges(){
List 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 lis = driver.findElementsByAndroidUIAutomator("new UiSelector().className("+"android.widget.ImageView"+").index(4)");
基于这个场景可以封装一个方法:
public List getElementsByClassAndIndex(String classname,int index){
List lis =null;
lis = driver.findElementsByAndroidUIAutomator("new UiSelector().className("+classname+").index("+index+")");
return lis;
}

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

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

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

关于UiAutomator无法识别的元素的更多相关文章

  1. EF + MySql 错误:配置错误 无法识别的元素“providers”

    “/”应用程序中的服务器错误. 配置错误 说明: 在处理向该请求提供服务所需的配置文件时出错.请检查下面的特定错误详细信息并适当地修改配置文件. 分析器错误消息: 无法识别的元素“providers” ...

  2. HTML5网页如何让所有的浏览器都能识别语义元素标签样式

    浏览器对语义元素的支持情况 如今HTML5愈来愈引发大家的关注了,但目前支持HTML5的浏览器还不是主流,特别是国内用户近50%以上仍旧使用IE6,由于支持HTML5的IE9不支持Xp系统安装,这样未 ...

  3. selenium采用xpath方法识别页面元素

    有些HTML页面中的元素中属性较少,经常有找不到id.class.name等常用属性的时候,这个时候xpath.css就能很好的识别到我们的元素. Firefox和chrome浏览器中均有xpath. ...

  4. selenium采用find_element_by方法识别页面元素

    主要是练习获取页面中的各元素,马克 # coding:utf-8 import time from selenium import webdriver import unittest from pyt ...

  5. Appium 自动化测试(9) -- 在Uiautomator中查看webview元素

    在uiautomator中,直接查看不到webview中的元素,不知道大家遇到过没有?如下 解决方法如下: step0:将uiautomator关闭 step1:在appium 中,设置Android ...

  6. UIAutomation识别UI元素

    MS UI Automation(Microsoft User Interface Automation:UIA)是随.net framework3.0一起发布的,虽然在如今这个几乎每天都有各种新名词 ...

  7. appium -- 页面出现弹窗,关闭后,无法识别页面元素(转)

    原文:https://www.cnblogs.com/leavescy/p/9733001.html; 1. 问题:如图所示:在修改手势密码的过程中,点击了返回按钮后,弹出该弹窗:点击继续设置后,就发 ...

  8. appium -- 页面出现弹窗,关闭后,无法识别页面元素

    1. 问题:如图所示:在修改手势密码的过程中,点击了返回按钮后,弹出该弹窗:点击继续设置后,就发现 driver.getPageSource()获取不到页面元素.在找了一圈无用的资料后,没有什么好的处 ...

  9. appium定位元素java篇【转】

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

随机推荐

  1. RxCocoa, RxSwift, Bond, Interstellar

    While you can use any functional library, I personally prefer RxSwift because I have the most experi ...

  2. OpenCV 学习笔记(0)两幅图像标定配准

    参考教程 依赖opencv扩展库,使用sifi匹配 保存配准信息 "./config/calibratedPara.yaml" #include <iostream> ...

  3. cf1191 解题报告

    cf1191 解题报告 A-简单模拟 脑内算出来让计算机输出 #include <bits/stdc++.h> #define ll long long using namespace s ...

  4. 【POJ3414】Pots

    本题传送门 本题知识点:宽度优先搜素 + 字符串 题意很简单,如何把用两个杯子,装够到第三个杯子的水. 操作有六种,这样就可以当作是bfs的搜索方向了 // FILL(1) 把第一个杯子装满 // F ...

  5. Kibana启动后外网访问不了

    问题 Kibana启动后,使用外网访问 http://ip地址:5601 访问不了日志中最后显示 "statusCode":302 ,在控制台 curl http://localh ...

  6. spring mvc aop拦截controller层获取RequestBody反序列化后参数

    最近,为了解耦,把一逻辑从interceptor抽出来,放在aop中处理,需要得到RequestBody.如下: @Aspect @Configuration public class CheckAs ...

  7. 一个按权重(weight)进行LB的算法

    package netty; import com.google.common.collect.ImmutableList; import lombok.SneakyThrows; import ja ...

  8. 使用Faker来随机生成接近真实数据的数据

    在很多场景我们需要造一些假数据或者mock数据,如果我们写死类似[XXXX]类似的无意义的其实不是很优雅,Faker能提供常用的一些名词的随机数据. 1.引入POM: <dependency&g ...

  9. 二分查找时间复杂度、partition时间复杂度

    二分查找时间复杂度 partition时间复杂度 O(n) = O(n) + O(n/2) + O(n/4)+.... 然后用等比求和公式得出是O(2n),即O(n)

  10. WebGL学习笔记(十五):模板缓冲

    可以用来干啥? 模板缓冲一般用来实现一些地面反射投影和类似镜子的特殊效果,如下: 开启模板缓冲 默认情况下,模板缓冲是关闭的,模板缓冲如果处于关闭状态,运行模板相关的代码不会报错,但是不会出现预期的效 ...