1、关于没有name,没有ID的元素的定位通用篇 解题思路: 因为没有name,其实剩下的选择已不多,要么xpath,要么className。xpath木有好印象(稳定性不高,加之1。0x后需要写全路径,相当崩溃),我决定十分个人色彩的建议使用className。 具体方法: 用className获取所有该类型的元素; 根据元素的位置确定元素的 获取目标元素。 示例: Llisdriver。findElementsByClassName(android。widget。ImageView);获取ImageView的所有元素 WebEelementtargetElelis。get(0);获取列表中第一个元素 进阶: 你可以自己定义一个className的常量,然后封装个方法,提供大家使用: publicLgetAllImges(){ Llisdriver。findElementsByClassName(AndroidClassName。IMAGEVIEW); } 使用的时候,就只需要调用此方法就可以了 此方法的好处:通吃的方法,基本可解决定位的问题;能解决多语言(自然语言)的困扰; 缺点:因为系统需要去获取List,就目前来看,运行效率不是很高,那直接是可以用肉眼看的到的速度在跑 2、关于没有name,没有ID的元素的定位特用篇 因为是特用,所以需要对页面元素做进一步的分析,找出其中的特性。这些特性主要为className,index,以及clickable等属性。 场景1:同一个页面有10个ImageView对象,而我们的目标元素的index为4,而同为ImageView且index为4的页面只有2个。那我们就可以根据这2个条件来组合查询条件,提高效率。 示例: Llisdriver。findElementsByAndroidUIAutomator(newUiSelector()。className(android。widget。ImageView)。index(4)); 基于这个场景可以封装一个方法: publicLgetElementsByClassAndIndex(Stringclassname,intindex){ L lisdriver。findElementsByAndroidUIAutomator(newUiSelector()。className(classname)。index(index)); } 场景2:同一个页面有10个ImageView对象,而其中index为4的有5个,而这时我们发现我们的目标元素的是clickable的。然后review页面发现,同时满足上述条件的只有2个。那么 示例: Llisdriver。findElementsByAndroidUIAutomator(newUiSelector()。className(android。widget。ImageView)。index(4)。clickable(true)); 同样可以封装一个方法: publicLgetElementsByClassAndIndexAndClickable(Stringclassname,intindex){ L lisdriver。findElementsByAndroidUIAutomator(newUiSelector()。className(classname)。index(index)。clickable(true)); } 场景3:在分析页面元素的时候发现,页面相对比较简单,而且其中只有目标元素的index为4。 示例: driver。findElementByAndroidUIAutomator(newUiSelector()。index(index)); 同样得到一个方法 publicWebElementgetElementByIndex(intindex){ returndriver。findElementByAndroidUIAutomator(newUiSelector()。index(index)); } 3、关于输入框有默认text,且当你选中时,不会清空的清空的处理。 类似的情况,用element。clear()是没有效果的。那怎么办呢?不急,appium提供了很多的操作,直击不行,我们就上组合拳。 示例: publicvoidclear(WebElementel){ el。click();选中输入框 driver。sendKeyEvent(123);将光标移到最后 Stringtxtel。getText();获取字符串长度 for(inti0;txt。length();i){ driver。sendKeyEvent(67);一个个的删除 } } 4、关于UiAutomator无法识别的元素 整体思路:不要忘了咱的手机是可以点击的。 获取相对坐标,点击,就这么简单。(不用绝对坐标是保证程序能在不同的分辨率下运行) 下面一起讨论下相对坐标的获取:找一个页面,这个页面上有相关的元素的位置与目标位置类似,或者根据这些元素能获取到目标的大致位置。 上段代码,帮助理解: publicLgetFileMngPoint(){ LlistnewArrayL(); WebElementscroldriver。findElementByClassName(AndroidClassName。HORIZONTALSCROLL); Limgsscrol。findElements(By。className(AndroidClassName。IMAGEVIEW)); 以上仅获取类似位置的元素 Pointe0getCenterPoint(imgs。get(0)); Pointe1getCenterPoint(imgs。get(1),imgs。get(2)); Pointe2getCenterPoint(imgs。get(3)); Pointe4getCenterPoint(imgs。get(2),imgs。get(3)); Pointe5getCenterPoint(getElementsByClassAndIndexAndClickable(AndroidClassName。IMAGEVIEW,0)。get(4)); 以上获取元素的中心坐标,相关方法是自己写的 list。add(e0); list。add(e1); list。add(e2); list。add(e4); list。add(e5); }