测试目的:搜索结果中找到联系人名为appium的名片,点击打开详情。
调试时发现,如果直接在当前页面使用
self.driver.find_element_by_name("appium"),查找失败。
此时考虑使用父控件查找子控件。
接下来,
一、首先要找到父控件了。。。
然而搜索结果有多个,并且通过uiautomator看到 ,父控件text、resource-id为空,classname不是唯一的,且classname同为android.view.View的控件不止4个,比如下面的截图中classname同为android.view.View的控件,除了搜索结果同类的有4个外,其他的还有3个,一共有7个。
解决方法1:使用python list存放classname同为android.view.View的控件,遍历list,从父控件中查找子控件,如果子控件的name为appium,则为结果。
name_list= self.driver.find_elements_by_class_name("android.view.View")
for i in name_list:
try:
if i.find_element_by_name("appium"):
name_appium=i.find_element_by_name("appium")
except Exception,e:
print e
name_appium.click()
解决方法2:
另外,通过调试发现
name_list= self.driver.find_elements_by_class_name("android.view.View")
第一个搜索结果,
appium所在的父控件,对应的是name_list中的
name_list[3]
最后一个搜索结果,(上图中的联系人名为appiumtest
所在的父控件),对应的是name_list中的name_list[len(name_list)-1],依据经验,从下往上数,那么第一个搜索结果
,
appium所在的父控件,对应的是
name_list[len(name_list)-4]
,调试后发现确实如此。
这种查找并写死的方法虽然可用于当前页面,实际操作以来效率比较低,并且兼容性不好,比如换了不同的界面有更多相同classname的控件,可能不会是list[3]了;如果搜索结果有5个,那么第一个搜索结果应该是list[len(list)-5]了,需要统计搜索结果的个数,并进一步调试。。。
二、父控件查找子控件,并操作控件
解决方法一中,上面的代码中,已经实现了:
name_appium=i.find_element_by_name("appium")
name_appium.click()
三、小结
遇到上面的情况也算特殊了,如果是在实际项目中,resource-id都加上会更方便,另外也想过使用坐标的方法点击,应该是要根据屏幕比例确定坐标,不然换了不同分辨率的手机,估计要报错了。