多个相同classname的控件中查找子控件(父控件text、resource-id为空,classname不是唯一...)

来源:互联网 发布:雾霾吸入 知乎 编辑:程序博客网 时间:2024/06/06 03:38
测试目的:搜索结果中找到联系人名为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都加上会更方便,另外也想过使用坐标的方法点击,应该是要根据屏幕比例确定坐标,不然换了不同分辨率的手机,估计要报错了。


阅读全文
0 0