【问题标题】:How to find parent element based on its child element using XPath如何使用 XPath 根据其子元素查找父元素
【发布时间】:2019-12-08 13:47:19
【问题描述】:

我正在创建一个函数来返回给定元素的 XPath。为此,我需要找到一种方法来获取给定子元素的父元素。

我想知道是否有这样的方法:

AndroidElement parentElement = childElement.findElement(By.xpath("SOME_XPATH_value"));

思路是根据已知的子元素获取父元素。

使用 WebElement 时可以正常工作,但使用 AndroidElement 时就不行了。

编辑 这是页面的 XML:

<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
<hierarchy index="0" class="hierarchy" rotation="0" width="1080" height="1812">
  <android.widget.FrameLayout index="0" package="io.testproject.demo" class="android.widget.FrameLayout" text="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[0,0][1080,1812]" displayed="true">
    <android.widget.LinearLayout index="0" package="io.testproject.demo" class="android.widget.LinearLayout" text="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[0,0][1080,1812]" displayed="true">
      <android.widget.FrameLayout index="0" package="io.testproject.demo" class="android.widget.FrameLayout" text="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[0,72][1080,1065]" displayed="true">
        <android.view.ViewGroup index="0" package="io.testproject.demo" class="android.view.ViewGroup" text="" resource-id="io.testproject.demo:id/decor_content_parent" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[0,72][1080,1065]" displayed="true">
          <android.widget.FrameLayout index="0" package="io.testproject.demo" class="android.widget.FrameLayout" text="" resource-id="io.testproject.demo:id/action_bar_container" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[0,72][1080,240]" displayed="true">
            <android.view.ViewGroup index="0" package="io.testproject.demo" class="android.view.ViewGroup" text="" resource-id="io.testproject.demo:id/action_bar" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[0,72][1080,240]" displayed="true">
              <android.widget.TextView index="0" package="io.testproject.demo" class="android.widget.TextView" text="TestProject Demo" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[48,115][526,196]" displayed="true" />
            </android.view.ViewGroup>
          </android.widget.FrameLayout>
          <android.widget.FrameLayout index="1" package="io.testproject.demo" class="android.widget.FrameLayout" text="" resource-id="android:id/content" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[0,240][1080,1065]" displayed="true">
            <android.view.ViewGroup index="0" package="io.testproject.demo" class="android.view.ViewGroup" text="" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[0,240][1080,1065]" displayed="true">
              <android.widget.ScrollView index="0" package="io.testproject.demo" class="android.widget.ScrollView" text="" resource-id="io.testproject.demo:id/scrollView" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[24,240][1056,874]" displayed="true">
                <android.widget.LinearLayout index="0" package="io.testproject.demo" class="android.widget.LinearLayout" text="" resource-id="io.testproject.demo:id/name_components" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[24,240][1056,874]" displayed="true">
                  <android.widget.TextView index="0" package="io.testproject.demo" class="android.widget.TextView" text="Full Name" resource-id="io.testproject.demo:id/labelFullName" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[24,240][1056,297]" displayed="true" />
                  <android.widget.EditText index="1" package="io.testproject.demo" class="android.widget.EditText" text="Enter your Full Name" resource-id="io.testproject.demo:id/name" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="true" long-clickable="true" password="false" scrollable="false" selected="false" bounds="[24,297][1056,433]" displayed="true" />
                  <android.widget.TextView index="2" package="io.testproject.demo" class="android.widget.TextView" text="Password" resource-id="io.testproject.demo:id/labelPassword" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[24,433][1056,490]" displayed="true" />
                  <android.widget.EditText index="3" package="io.testproject.demo" class="android.widget.EditText" text="Enter your password" resource-id="io.testproject.demo:id/password" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" long-clickable="true" password="true" scrollable="false" selected="false" bounds="[24,490][1056,628]" displayed="true" />
                  <android.widget.TextView index="4" package="io.testproject.demo" class="android.widget.TextView" text="Hint: password is 12345" resource-id="io.testproject.demo:id/labelPasswordHint" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[24,628][1056,685]" displayed="true" />
                  <android.widget.Button index="5" package="io.testproject.demo" class="android.widget.Button" text="LOGIN" resource-id="io.testproject.demo:id/login" checkable="false" checked="false" clickable="true" enabled="true" focusable="true" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[24,730][1056,874]" displayed="true" />
                </android.widget.LinearLayout>
              </android.widget.ScrollView>
            </android.view.ViewGroup>
          </android.widget.FrameLayout>
        </android.view.ViewGroup>
      </android.widget.FrameLayout>
    </android.widget.LinearLayout>
  </android.widget.FrameLayout>
</hierarchy>

所以,例如,我想获取以下的父元素:

<android.widget.TextView index="0" package="io.testproject.demo" class="android.widget.TextView" text="Full Name" resource-id="io.testproject.demo:id/labelFullName" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[24,240][1056,297]" displayed="true" />

应该是:

<android.widget.LinearLayout index="0" package="io.testproject.demo" class="android.widget.LinearLayout" text="" resource-id="io.testproject.demo:id/name_components" checkable="false" checked="false" clickable="false" enabled="true" focusable="false" focused="false" long-clickable="false" password="false" scrollable="false" selected="false" bounds="[24,240][1056,874]" displayed="true">

【问题讨论】:

  • 你能发布html/xml吗?
  • 嗨@JackFleeting,我已将页面的XML 添加到原始帖子中。谢谢!

标签: android xpath android-uiautomator appium-android


【解决方案1】:

尝试使用以下作为您的 xpath 表达式,看看它是否有效:

//hierarchy//*[local-name()='android.widget.TextView'][@resource-id="io.testproject.demo:id/labelFullName"]/parent::*

或者只是

//hierarchy//android.widget.TextView[@resource-id="io.testproject.demo:id/labelFullName"]/parent::*

【讨论】:

  • 我正在尝试寻找更通用的解决方案。我的目的是创建一个返回给定元素的 XPath 的方法。此方法的一个参数是元素本身(WebElement),我正在尝试找到一种方法来基于它获取其父级。例如 childElement.findElement(By.xpath(".."));我正在尝试找到一种使其适用于 Android 的方法。对于网络来说,它运行良好
猜你喜欢
  • 2018-07-09
  • 1970-01-01
  • 2015-04-03
  • 1970-01-01
  • 2021-05-07
  • 1970-01-01
  • 1970-01-01
  • 2020-04-25
  • 1970-01-01
相关资源
最近更新 更多