Appium 求助 : find_element_by_class_name 无法查找子集中的元素

skytiger0419 · 发布于 2015年07月31日 · 最后由 muwu711 回复于 2016年09月30日 · 1824 次阅读

环境配置

appium版本:1.4
appium-python-client: 采用pip install --upgrade appium-python-client更新到最新
windows7

程序界面示例

上图所示,listview中除英文字母外,每一行的layout id都是com.browan.freeppmobile.android:id/Layout_ContactListItem
右边为一Button组件

功能要求

为了验证右边到底是freep文字 还是空白

验证代码逻辑如下

els = driver.find_elements_by_id('com.browan.freeppmobile.android:id/Layout_ContactListItem')#获取所有可见行数据
try:
    els[0].find_element_by_name('A0_test') # 查找是否存在A0_test的行
    button = els[0].find_element_by_class_name('android.widget.Button') #在所在行寻找button组件
    self.assertFalse(button.is_displayed()) # 是否显示
except:
    self.assertTrue(False)

代码运行情况如下:

  1. 逻辑上应该找不到button才对,实际上找到了
  2. appium中的查找元素,支持在其子集中查找元素? 如目前代码所示,在A0_test所在行,查找button
  3. 还是说els[0].find_element_by_class_name与driver.find_element_by_class_name,实际是一样的效果
共收到 10 条回复
251

@lihuazhang@seveniruby@monkey
怎么修改后,还是无法通过

118

#1楼 @skytiger0419 请使用md来进行编辑

605

答案是:

3. els[0].find_element_by_class_name与driver.find_element_by_class_name,实际是一样的效果
480
对 els 中每个元素 el
{
    打印 el 的文本
    获取 el 下所有的 button 存入 buttons
    打印 buttons 数量
    对 buttons 中每个元素 button
   {
        打印 button 的文本
   }
}
251

@sanlengjingvv
关键是如何获取e1下的文本或者button

for ele in els:
     ele.find_element_by_??     #是一线性布局,怎么获取它下面的button

问题回到 els[0].find_element_by_class_name与driver.find_element_by_class_name实际效果一样,一样的话,还是无法查找线性布局下的子元素,如何定位此元素下的button控件?

96

换个定位方法吧,比如ID或XPATH

251

@julian1610
因为是listview列表,id都是一致的,不能进行区分
目前关键是如何匹配,行文本及button之间的对应关系;
button有的有,有的没有,不能进行一一对应,所以单纯遍历也无法做到;目前想到的只能是找子元素这一出路;
其他想法都否定了

480

1、获取文本ele.get_attribute("用uiautomatorviewer看属性名")
2、java-client 可以找子元素,我不知道 Python 可不可以,但打印出 button 数量就知道可不可以了。
3、Xpath 和 UiSelector 都可以做到“查找指定父元素下的子元素”。

3230

准确的来说Appium 支持在父控件中查找子控件。

在selenium的webelement类中你可以查找到对应的内容:

def find_element_by_class_name(self, name):
        """Finds element within this element's children by class name.

        :Args:
            - name - class name to search for.
        """
        return self.find_element(by=By.CLASS_NAME, value=name)

在Appium python clinet中的WebElement就是继承Selenum的WebElement扩展了在UiAutomator中的accessibility id 以及直接使用Uiautomator的语法规则。

class WebElement(SeleniumWebElement):
    def find_element_by_ios_uiautomation(self, uia_string):
        """Finds an element by uiautomation in iOS.

        :Args:
         - uia_string - The element name in the iOS UIAutomation library

        :Usage:
            driver.find_element_by_ios_uiautomation('.elements()[1].cells()[2]')
        """
        return self.find_element(by=By.IOS_UIAUTOMATION, value=uia_string)

    def find_elements_by_ios_uiautomation(self, uia_string):
        """Finds elements by uiautomation in iOS.

        :Args:
         - uia_string - The element name in the iOS UIAutomation library

        :Usage:
            driver.find_elements_by_ios_uiautomation('.elements()[1].cells()[2]')
        """
        return self.find_elements(by=By.IOS_UIAUTOMATION, value=uia_string)

    def find_element_by_android_uiautomator(self, uia_string):
        """Finds element by uiautomator in Android.

        :Args:
         - uia_string - The element name in the Android UIAutomator library

        :Usage:
            driver.find_element_by_android_uiautomator('.elements()[1].cells()[2]')
        """
        return self.find_element(by=By.ANDROID_UIAUTOMATOR, value=uia_string)

    def find_elements_by_android_uiautomator(self, uia_string):
        """Finds elements by uiautomator in Android.

        :Args:
         - uia_string - The element name in the Android UIAutomator library

        :Usage:
            driver.find_elements_by_android_uiautomator('.elements()[1].cells()[2]')
        """
        return self.find_elements(by=By.ANDROID_UIAUTOMATOR, value=uia_string)

    def find_element_by_accessibility_id(self, id):
        """Finds an element by accessibility id.

        :Args:
         - id - a string corresponding to a recursive element search using the
         Id/Name that the native Accessibility options utilize

        :Usage:
            driver.find_element_by_accessibility_id()
        """
        return self.find_element(by=By.ACCESSIBILITY_ID, value=id)

    def find_elements_by_accessibility_id(self, id):
        """Finds elements by accessibility id.

        :Args:
         - id - a string corresponding to a recursive element search using the
         Id/Name that the native Accessibility options utilize

        :Usage:
            driver.find_elements_by_accessibility_id()
        """
        return self.find_elements(by=By.ACCESSIBILITY_ID, value=id)

    def set_text(self, keys=''):
        """Sends text to the element. Previous text is removed.
        Android only.

        :Args:
         - keys - the text to be sent to the element.

        :Usage:
            element.set_text('some text')
        """
        data = {
            'elementId': self._id,
            'value': [keys]
        }
        self._execute(Command.REPLACE_KEYS, data)
        return self
4221

请问楼主解决该问题了吗?求分享😀

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册